int ISampleGrabberCB.SampleCB(double sampleTime, IMediaSample pSample) { var mediaType = new AMMediaType(); /* We query for the media type the sample grabber is using */ int hr = m_sampleGrabber.GetConnectedMediaType(mediaType); var videoInfo = new VideoInfoHeader(); /* 'Cast' the pointer to our managed struct */ Marshal.PtrToStructure(mediaType.formatPtr, videoInfo); /* The stride is "How many bytes across for each pixel line (0 to width)" */ int stride = Math.Abs(videoInfo.BmiHeader.Width * (videoInfo.BmiHeader.BitCount / 8 /* eight bits per byte */)); int width = videoInfo.BmiHeader.Width; int height = videoInfo.BmiHeader.Height; if (m_videoFrame == null) { InitializeBitmapFrame(width, height); } if (m_videoFrame == null) { return(0); } BitmapData bmpData = m_videoFrame.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb); /* Get the pointer to the pixels */ IntPtr pBmp = bmpData.Scan0; IntPtr samplePtr; /* Get the native pointer to the sample */ pSample.GetPointer(out samplePtr); int pSize = stride * height; /* Copy the memory from the sample pointer to our bitmap pixel pointer */ CopyMemory(pBmp, samplePtr, pSize); m_videoFrame.UnlockBits(bmpData); InvokeNewVideoSample(new VideoSampleArgs { VideoFrame = m_videoFrame }); DsUtils.FreeAMMediaType(mediaType); /* Dereference the sample COM object */ Marshal.ReleaseComObject(pSample); return(0); }
/// <summary> /// Gets the video resolution of a pin on a renderer. /// </summary> /// <param name="renderer">The renderer to inspect</param> /// <param name="direction">The direction the pin is</param> /// <param name="pinIndex">The zero based index of the pin to inspect</param> /// <returns>If successful a video resolution is returned. If not, a 0x0 size is returned</returns> protected static Size GetVideoSize(IBaseFilter renderer, PinDirection direction, int pinIndex) { var size = new Size(); var mediaType = new AMMediaType(); IPin pin = DsFindPin.ByDirection(renderer, direction, pinIndex); if (pin == null) { goto done; } int hr = pin.ConnectionMediaType(mediaType); if (hr != 0) { goto done; } /* Check to see if its a video media type */ if (mediaType.formatType != FormatType.VideoInfo2 && mediaType.formatType != FormatType.VideoInfo) { goto done; } var videoInfo = new VideoInfoHeader(); /* Read the video info header struct from the native pointer */ Marshal.PtrToStructure(mediaType.formatPtr, videoInfo); Rectangle rect = videoInfo.SrcRect.ToRectangle(); size = new Size(rect.Width, rect.Height); done: DsUtils.FreeAMMediaType(mediaType); if (pin != null) { Marshal.ReleaseComObject(pin); } return(size); }
/// <summary> /// Gets the video resolution of a pin on a renderer. /// </summary> /// <param name="renderer">The renderer to inspect</param> /// <param name="direction">The direction the pin is</param> /// <param name="pinIndex">The zero based index of the pin to inspect</param> /// <returns>If successful a video resolution is returned. If not, a 0x0 size is returned</returns> protected static Size GetVideoSize(IBaseFilter renderer, PinDirection direction, int pinIndex) { var size = new Size(); var mediaType = new AMMediaType(); IPin pin = DsFindPin.ByDirection(renderer, direction, pinIndex); if (pin == null) goto done; int hr = pin.ConnectionMediaType(mediaType); if (hr != 0) goto done; /* Check to see if its a video media type */ if (mediaType.formatType != FormatType.VideoInfo2 && mediaType.formatType != FormatType.VideoInfo) { goto done; } var videoInfo = new VideoInfoHeader(); /* Read the video info header struct from the native pointer */ Marshal.PtrToStructure(mediaType.formatPtr, videoInfo); Rectangle rect = videoInfo.SrcRect.ToRectangle(); size = new Size(rect.Width, rect.Height); done: DsUtils.FreeAMMediaType(mediaType); return size; }
/// <summary> /// Sets the number of DVD buttons found in the current DVD video /// </summary> /// <param name="buttonCount">The total number of buttons</param> private void SetDvdButtonCount(int buttonCount) { m_dvdButtonCount = buttonCount; if (m_dvdButtonCount == 0) { m_isOverButton = false; InvokeOnOverDvdButton(m_isOverButton); } var mediaType = new AMMediaType(); m_dummyRendererPin.ConnectionMediaType(mediaType); /* Check to see if its a video media type */ if (mediaType.formatType != FormatType.VideoInfo2 && mediaType.formatType != FormatType.VideoInfo) { DsUtils.FreeAMMediaType(mediaType); return; } var videoInfo = new VideoInfoHeader(); /* Read the video info header struct from the native pointer */ Marshal.PtrToStructure(mediaType.formatPtr, videoInfo); /* Get the target rect */ m_renderTargetRect = videoInfo.TargetRect.ToRectangle(); DsUtils.FreeAMMediaType(mediaType); }
/// <summary> /// Sets the capture parameters for the video capture device /// </summary> private bool SetVideoCaptureParameters(ICaptureGraphBuilder2 capGraph, IBaseFilter captureFilter, Guid mediaSubType) { /* The stream config interface */ object streamConfig; /* Get the stream's configuration interface */ int hr = capGraph.FindInterface(PinCategory.Capture, MediaType.Video, captureFilter, typeof(IAMStreamConfig).GUID, out streamConfig); DsError.ThrowExceptionForHR(hr); var videoStreamConfig = streamConfig as IAMStreamConfig; /* If QueryInterface fails... */ if (videoStreamConfig == null) { throw new Exception("Failed to get IAMStreamConfig"); } /* The media type of the video */ AMMediaType media; /* Get the AMMediaType for the video out pin */ hr = videoStreamConfig.GetFormat(out media); DsError.ThrowExceptionForHR(hr); /* Make the VIDEOINFOHEADER 'readable' */ var videoInfo = new VideoInfoHeader(); Marshal.PtrToStructure(media.formatPtr, videoInfo); /* Setup the VIDEOINFOHEADER with the parameters we want */ videoInfo.AvgTimePerFrame = DSHOW_ONE_SECOND_UNIT / FPS; videoInfo.BmiHeader.Width = DesiredWidth; videoInfo.BmiHeader.Height = DesiredHeight; if (mediaSubType != Guid.Empty) { videoInfo.BmiHeader.Compression = new FourCC(mediaSubType).ToInt32(); media.subType = mediaSubType; } /* Copy the data back to unmanaged memory */ Marshal.StructureToPtr(videoInfo, media.formatPtr, false); /* Set the format */ hr = videoStreamConfig.SetFormat(media); /* We don't want any memory leaks, do we? */ DsUtils.FreeAMMediaType(media); if (hr < 0) { return(false); } return(true); }
/// <summary> /// Sets the capture parameters for the video capture device /// </summary> private bool SetVideoCaptureParameters(ICaptureGraphBuilder2 capGraph, IBaseFilter captureFilter, Guid mediaSubType) { /* The stream config interface */ object streamConfig; /* Get the stream's configuration interface */ int hr = capGraph.FindInterface(PinCategory.Capture, MediaType.Video, captureFilter, typeof(IAMStreamConfig).GUID, out streamConfig); DsError.ThrowExceptionForHR(hr); var videoStreamConfig = streamConfig as IAMStreamConfig; /* If QueryInterface fails... */ if (videoStreamConfig == null) { throw new Exception("Failed to get IAMStreamConfig"); } /* The media type of the video */ AMMediaType media; /* Get the AMMediaType for the video out pin */ hr = videoStreamConfig.GetFormat(out media); DsError.ThrowExceptionForHR(hr); /* Make the VIDEOINFOHEADER 'readable' */ var videoInfo = new VideoInfoHeader(); Marshal.PtrToStructure(media.formatPtr, videoInfo); /* Setup the VIDEOINFOHEADER with the parameters we want */ videoInfo.AvgTimePerFrame = DSHOW_ONE_SECOND_UNIT / FPS; videoInfo.BmiHeader.Width = DesiredWidth; videoInfo.BmiHeader.Height = DesiredHeight; if(mediaSubType != Guid.Empty) { videoInfo.BmiHeader.Compression = new FourCC(mediaSubType).ToInt32(); media.subType = mediaSubType; } /* Copy the data back to unmanaged memory */ Marshal.StructureToPtr(videoInfo, media.formatPtr, false); /* Set the format */ hr = videoStreamConfig.SetFormat(media); /* We don't want any memory leaks, do we? */ DsUtils.FreeAMMediaType(media); if (hr < 0) return false; return true; }
int ISampleGrabberCB.SampleCB(double sampleTime, IMediaSample pSample) { var mediaType = new AMMediaType(); /* We query for the media type the sample grabber is using */ int hr = m_sampleGrabber.GetConnectedMediaType(mediaType); var videoInfo = new VideoInfoHeader(); /* 'Cast' the pointer to our managed struct */ Marshal.PtrToStructure(mediaType.formatPtr, videoInfo); /* The stride is "How many bytes across for each pixel line (0 to width)" */ int stride = Math.Abs(videoInfo.BmiHeader.Width * (videoInfo.BmiHeader.BitCount / 8 /* eight bits per byte */)); int width = videoInfo.BmiHeader.Width; int height = videoInfo.BmiHeader.Height; if(m_videoFrame == null) InitializeBitmapFrame(width, height); if (m_videoFrame == null) return 0; BitmapData bmpData = m_videoFrame.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb); /* Get the pointer to the pixels */ IntPtr pBmp = bmpData.Scan0; IntPtr samplePtr; /* Get the native pointer to the sample */ pSample.GetPointer(out samplePtr); int pSize = stride * height; /* Copy the memory from the sample pointer to our bitmap pixel pointer */ CopyMemory(pBmp, samplePtr, pSize); m_videoFrame.UnlockBits(bmpData); InvokeNewVideoSample(new VideoSampleArgs { VideoFrame = m_videoFrame }); DsUtils.FreeAMMediaType(mediaType); /* Dereference the sample COM object */ Marshal.ReleaseComObject(pSample); return 0; }