private void BuildGraphCaption()
{
// Version 10.1.1.37
int hr = 0;
graphBuilderCaption = (IGraphBuilder)new FilterGraph();
//graph builder
ICaptureGraphBuilder2 pBuilderCaption = (ICaptureGraphBuilder2)new CaptureGraphBuilder2();
hr = pBuilderCaption.SetFiltergraph(graphBuilderCaption);
//Create the media control for controlling the graph
mediaControlCaption = (IMediaControl)graphBuilderCaption;
checkHR(hr, "Can't SetFiltergraph");
Guid CLSID_VBICodec = new Guid("{370A1D5D-DDEB-418C-81CD-189E0D4FA443}"); //VBICodec.ax
Guid CLSID_ffdshowVideoDecoder = new Guid("{04FE9017-F873-410E-871E-AB91661A4EF7}"); //ffdshow.ax
//add AVerMedia 7231 Analog TV Tuner
IBaseFilter pAVerMedia7231AnalogTVTuner = CreateFilter(@"@device:pnp:\\?\pci#ven_1131&dev_7231&subsys_06071461&rev_aa#4&25ba7335&0&00e1#{a799a800-a46d-11d0-a18c-00a02401dcd4}\{62b08a3e-335e-4b30-90f9-2ba400000000}");
System.Threading.Thread.Sleep(200);
hr = graphBuilderCaption.AddFilter(pAVerMedia7231AnalogTVTuner, "AVerMedia 7231 Analog TV Tuner");
checkHR(hr, "Can't add AVerMedia 7231 Analog TV Tuner to graph");
//add AVerMedia 7231 Analog TV Audio
IBaseFilter pAVerMedia7231AnalogTVAudio = CreateFilter(@"@device:pnp:\\?\pci#ven_1131&dev_7231&subsys_06071461&rev_aa#4&25ba7335&0&00e1#{a799a802-a46d-11d0-a18c-00a02401dcd4}\{defe4e8d-584b-446c-89cc-fd1f00000000}");
System.Threading.Thread.Sleep(250);
hr = graphBuilderCaption.AddFilter(pAVerMedia7231AnalogTVAudio, "AVerMedia 7231 Analog TV Audio");
checkHR(hr, "Can't add AVerMedia 7231 Analog TV Audio to graph");
//connect AVerMedia 7231 Analog TV Tuner and AVerMedia 7231 Analog TV Audio
hr = graphBuilderCaption.ConnectDirect(GetPin(pAVerMedia7231AnalogTVTuner, "Analog Audio"), GetPin(pAVerMedia7231AnalogTVAudio, "TVAudio In"), null);
checkHR(hr, "Can't connect AVerMedia 7231 Analog TV Tuner and AVerMedia 7231 Analog TV Audio");
//add AVerMedia 7231 Analog Xbar
IBaseFilter pAVerMedia7231AnalogXbar = CreateFilter(@"@device:pnp:\\?\pci#ven_1131&dev_7231&subsys_06071461&rev_aa#4&25ba7335&0&00e1#{a799a801-a46d-11d0-a18c-00a02401dcd4}\{ed97d48c-e41e-11d5-9964-00e000000000}");
System.Threading.Thread.Sleep(250);
hr = graphBuilderCaption.AddFilter(pAVerMedia7231AnalogXbar, "AVerMedia 7231 Analog Xbar");
checkHR(hr, "Can't add AVerMedia 7231 Analog Xbar to graph");
//connect AVerMedia 7231 Analog TV Tuner and AVerMedia 7231 Analog Xbar
hr = graphBuilderCaption.ConnectDirect(GetPin(pAVerMedia7231AnalogTVTuner, "Analog Video"), GetPin(pAVerMedia7231AnalogXbar, "0: Video Tuner In"), null);
checkHR(hr, "Can't connect AVerMedia 7231 Analog TV Tuner and AVerMedia 7231 Analog Xbar");
//connect AVerMedia 7231 Analog TV Audio and AVerMedia 7231 Analog Xbar
hr = graphBuilderCaption.ConnectDirect(GetPin(pAVerMedia7231AnalogTVAudio, "TVAudio Out"), GetPin(pAVerMedia7231AnalogXbar, "1: Audio Tuner In"), null);
checkHR(hr, "Can't connect AVerMedia 7231 Analog TV Audio and AVerMedia 7231 Analog Xbar");
//add AVerMedia 7231 Analog Capture
pAVerMedia7231AnalogCaptureCaption = CreateFilter(@"@device:pnp:\\?\pci#ven_1131&dev_7231&subsys_06071461&rev_aa#4&25ba7335&0&00e1#{65e8773d-8f56-11d0-a3b9-00a0c9223196}\{bbefb6c7-2fc4-4139-bb8b-a58b00000000}");
hr = graphBuilderCaption.AddFilter(pAVerMedia7231AnalogCaptureCaption, "AVerMedia 7231 Analog Capture");
checkHR(hr, "Can't add AVerMedia 7231 Analog Capture to graph");
System.Threading.Thread.Sleep(250);
//connect AVerMedia 7231 Analog Xbar and AVerMedia 7231 Analog Capture
hr = graphBuilderCaption.ConnectDirect(GetPin(pAVerMedia7231AnalogXbar, "0: Video Decoder Out"), GetPin(pAVerMedia7231AnalogCaptureCaption, "Analog Video In"), null);
checkHR(hr, "Can't connect AVerMedia 7231 Analog Xbar and AVerMedia 7231 Analog Capture");
//connect AVerMedia 7231 Analog Xbar and AVerMedia 7231 Analog Capture
hr = graphBuilderCaption.ConnectDirect(GetPin(pAVerMedia7231AnalogXbar, "1: Audio Decoder Out"), GetPin(pAVerMedia7231AnalogCaptureCaption, "Analog Audio Input"), null);
checkHR(hr, "Can't connect AVerMedia 7231 Analog Xbar and AVerMedia 7231 Analog Capture");
//add Default DirectSound Device
IBaseFilter pDefaultDirectSoundDevice = (IBaseFilter)new DSoundRender();
hr = graphBuilderCaption.AddFilter(pDefaultDirectSoundDevice, "Default DirectSound Device");
checkHR(hr, "Can't add Default DirectSound Device to graph");
IBaseFilter pVBICodec = null;
// VBI CODEC CLOSED CAPTION RELATED
//add VBI Codec
pVBICodec = (IBaseFilter)Activator.CreateInstance(Type.GetTypeFromCLSID(CLSID_VBICodec));
hr = graphBuilderCaption.AddFilter(pVBICodec, "VBI Codec");
checkHR(hr, "Can't add VBI Codec to graph");
//add Smart Tee
IBaseFilter pSmartTee = (IBaseFilter)new SmartTee();
hr = graphBuilderCaption.AddFilter(pSmartTee, "Smart Tee");
checkHR(hr, "Can't add Smart Tee to graph");
SetConfigParms(pBuilderCaption, pAVerMedia7231AnalogCaptureCaption, 0, 720, 480);
//connect AVerMedia 7231 Analog Capture and Smart Tee
hr = graphBuilderCaption.ConnectDirect(GetPin(pAVerMedia7231AnalogCaptureCaption, "Capture"), GetPin(pSmartTee, "Input"), null);
checkHR(hr, "Can't connect AVerMedia 7231 Analog Capture and Smart Tee");
// VBI CODEC CLOSED CAPTION
//connect AVerMedia 7231 Analog Capture and VBI Codec
hr = graphBuilderCaption.ConnectDirect(GetPin(pAVerMedia7231AnalogCaptureCaption, "VBI"), GetPin(pVBICodec, "Input"), null);
checkHR(hr, "Can't connect AVerMedia 7231 Analog Capture and VBI Codec");
//connect AVerMedia 7231 Analog Capture and Default DirectSound Device
hr = graphBuilderCaption.ConnectDirect(GetPin(pAVerMedia7231AnalogCaptureCaption, "Audio"), GetPin(pDefaultDirectSoundDevice, "Audio Input pin (rendered)"), null);
checkHR(hr, "Can't connect AVerMedia 7231 Analog Capture and Default DirectSound Device");
//add ffdshow Video Decoder
IBaseFilter pffdshowVideoDecoder = (IBaseFilter)Activator.CreateInstance(Type.GetTypeFromCLSID(CLSID_ffdshowVideoDecoder));
hr = graphBuilderCaption.AddFilter(pffdshowVideoDecoder, "ffdshow Video Decoder");
checkHR(hr, "Can't add ffdshow Video Decoder to graph");
IBaseFilter pLine21Decoder = null;
//add Line 21 Decoder
pLine21Decoder = (IBaseFilter)new Line21Decoder();
hr = graphBuilderCaption.AddFilter(pLine21Decoder, "Line 21 Decoder");
checkHR(hr, "Can't add Line 21 Decoder to graph");
//connect Smart Tee and ffdshow Video Decoder
hr = graphBuilderCaption.ConnectDirect(GetPin(pSmartTee, "Capture"), GetPin(pffdshowVideoDecoder, "In"), null);
checkHR(hr, "Can't connect Smart Tee and ffdshow Video Decoder"); // Closed CAPT
//connect VBI Codec and Line 21 Decoder
hr = graphBuilderCaption.ConnectDirect(GetPin(pVBICodec, "CC"), GetPin(pLine21Decoder, "XForm In"), null);
checkHR(hr, "Can't connect VBI Codec and Line 21 Decoder");
// CLOSED CAPTION
//add Overlay Mixer
IBaseFilter pOverlayMixer = (IBaseFilter)new OverlayMixer();
hr = graphBuilderCaption.AddFilter(pOverlayMixer, "Overlay Mixer");
checkHR(hr, "Can't add Overlay Mixer to graph");
//connect ffdshow Video Decoder and Overlay Mixer
hr = graphBuilderCaption.ConnectDirect(GetPin(pffdshowVideoDecoder, "Out"), GetPin(pOverlayMixer, "Input0"), null);
checkHR(hr, "Can't connect ffdshow Video Decoder and Overlay Mixer");
//connect Line 21 Decoder and Overlay Mixer
hr = graphBuilderCaption.ConnectDirect(GetPin(pLine21Decoder, "XForm Out"), GetPin(pOverlayMixer, "Input2"), null);
checkHR(hr, "Can't connect Line 21 Decoder and Overlay Mixer");
//CLOSED CAPT
//add Video Renderer
IBaseFilter pVideoRenderer = (IBaseFilter)new VideoRenderer();
hr = graphBuilderCaption.AddFilter(pVideoRenderer, "Video Renderer");
checkHR(hr, "Can't add Video Renderer to graph");
//connect Overlay Mixer and Video Renderer
hr = graphBuilderCaption.ConnectDirect(GetPin(pOverlayMixer, "Output"), GetPin(pVideoRenderer, "Input"), null);
checkHR(hr, "Can't connect Overlay Mixer and Video Renderer");
IReferenceClock returnedClockReference = IsImplementingIReferenceClock(pBuilderCaption, pAVerMedia7231AnalogCaptureCaption);
pVideoRenderer.SetSyncSource(returnedClockReference);
pDefaultDirectSoundDevice.SetSyncSource(returnedClockReference);
#if DEBUG
m_rot = new DsROTEntry(graphBuilderCaption);
#endif
//get the video window from the graph
IVideoWindow videoWindowCaption = null;
videoWindowCaption = (IVideoWindow)graphBuilderCaption;
//Set the owener of the videoWindow to an IntPtr of some sort (the Handle of any control - could be a form / button etc.)
hr = videoWindowCaption.put_Owner(panel2.Handle);
DsError.ThrowExceptionForHR(hr);
//Set the style of the video window
hr = videoWindowCaption.put_WindowStyle(WindowStyle.Child | WindowStyle.ClipChildren);
DsError.ThrowExceptionForHR(hr);
// Position video window in client rect of main application window
hr = videoWindowCaption.SetWindowPosition(0, 0, panel2.Width, panel2.Height);
DsError.ThrowExceptionForHR(hr);
hr = videoWindowCaption.put_Visible(OABool.True);
DsError.ThrowExceptionForHR(hr);
Marshal.FinalReleaseComObject(pBuilderCaption);
pBuilderCaption = null;
for (int i = 0; i < 1000; i++)
{
Application.DoEvents();
}
GC.Collect();
// Reset(timerReSyncVocals);
//MessageBox.Show("OK In BuildGraph");
}