/// <summary> /// Gets the current frame size /// </summary> /// <returns>The frame size in a bitmap info header</returns> private BitmapInfoHeader GetFrameSize() { BitmapInfoHeader bmiHeader = null; try { IntPtr pmt = IntPtr.Zero; AMMediaType mediaType = new AMMediaType(); try { // Get the current format info mediaType.formatType = FormatType.VideoInfo2; int hr = _streamConfig.GetFormat(out mediaType); if (hr != 0) { Log.Log.Info("GetFrameSize: FAILED to get format - {0}", hr); Marshal.ThrowExceptionForHR(hr); return(bmiHeader); } // The formatPtr member points to different structures // dependingon the formatType if (mediaType.formatType == FormatType.VideoInfo) { VideoInfoHeader temp = new VideoInfoHeader(); Marshal.PtrToStructure(mediaType.formatPtr, temp); bmiHeader = temp.BmiHeader; } else if (mediaType.formatType == FormatType.VideoInfo2) { VideoInfoHeader2 temp = new VideoInfoHeader2(); Marshal.PtrToStructure(mediaType.formatPtr, temp); bmiHeader = temp.BmiHeader; } else if (mediaType.formatType == FormatType.Mpeg2Video) { MPEG2VideoInfo temp = new MPEG2VideoInfo(); Marshal.PtrToStructure(mediaType.formatPtr, temp); bmiHeader = temp.hdr.BmiHeader; } else if (mediaType.formatType == FormatType.MpegVideo) { MPEG1VideoInfo temp = new MPEG1VideoInfo(); Marshal.PtrToStructure(mediaType.formatPtr, temp); bmiHeader = temp.hdr.BmiHeader; } } finally { Marshal.FreeCoTaskMem(pmt); } } catch (Exception) { Log.Log.Info(" VideoCaptureDevice.getStreamConfigSetting() FAILED "); } return(bmiHeader); }
public static extern void MFInitMediaTypeFromMPEG1VideoInfo( [In] IMFMediaType pMFType, MPEG1VideoInfo pMP1VI, [In] int cbBufSize, [In, MarshalAs(UnmanagedType.LPStruct)] Guid pSubtype );
/// <summary> /// Sets the frame size /// </summary> /// <param name="bmiHeader">The bitmap info header with the frame size</param> /// <returns>true, if it was successful; false otherwise</returns> private bool SetFrameSize(BitmapInfoHeader bmiHeader) { try { IntPtr pmt = IntPtr.Zero; AMMediaType mediaType; try { // Get the current format info int hr = _streamConfig.GetFormat(out mediaType); if (hr != 0) { Log.Log.Info("SetFrameSize: Failed to get the video format - {0}", hr); return(false); } // The formatPtr member points to different structures // dependingon the formatType object formatStruct; if (mediaType.formatType == FormatType.VideoInfo) { VideoInfoHeader temp = new VideoInfoHeader(); Marshal.PtrToStructure(mediaType.formatPtr, temp); temp.BmiHeader = bmiHeader; formatStruct = temp; } else if (mediaType.formatType == FormatType.VideoInfo2) { VideoInfoHeader2 temp = new VideoInfoHeader2(); Marshal.PtrToStructure(mediaType.formatPtr, temp); temp.BmiHeader = bmiHeader; formatStruct = temp; } else if (mediaType.formatType == FormatType.Mpeg2Video) { MPEG2VideoInfo temp = new MPEG2VideoInfo(); Marshal.PtrToStructure(mediaType.formatPtr, temp); temp.hdr.BmiHeader = bmiHeader; formatStruct = temp; } else if (mediaType.formatType == FormatType.MpegVideo) { MPEG1VideoInfo temp = new MPEG1VideoInfo(); Marshal.PtrToStructure(mediaType.formatPtr, temp); temp.hdr.BmiHeader = bmiHeader; formatStruct = temp; } else if (mediaType.formatType == FormatType.None) { Log.Log.Info("SetFrameSize: FAILED no format returned"); return(false); } else { Log.Log.Info("SetFrameSize: FAILED unknown fmt"); return(false); } // PtrToStructure copies the data so we need to copy it back Marshal.StructureToPtr(formatStruct, mediaType.formatPtr, false); // Save the changes hr = _streamConfig.SetFormat(mediaType); if (hr != 0) { Log.Log.Info("SetFrameSize: FAILED to set:{0}", hr); return(false); } } finally { Marshal.FreeCoTaskMem(pmt); } return(true); } catch (Exception) { Log.Log.Info("SetFrameSize: FAILED "); } return(false); }