Re: CTransInPlaceFilter woes
- From: Jon E <JonE@xxxxxxxxxxxxxxxxxxxxxxxxx>
- Date: Thu, 13 Mar 2008 02:08:00 -0700
"Tim Roberts" wrote:
Why don't you post the graph building code? We'll see if anything looks
strange. I've done this kind of thing many times.
I've built loads of graphs but never seen this happen. However I've not
often needed to create my own filters. Anyhow, the code :-
----[snip]----------
// This creates a fully working graph minus our filter
hr = m_pCapture->RenderStream( &PIN_CATEGORY_CAPTURE, &MEDIATYPE_Video,
m_pVideoCapture, pGrabber, NULL ) ;
CHECK(hr) ;
// Add our filter
if( TRUE ) // TO DO : Make optional
{
hr = AddScyronTextOverlay( &m_pScyronTextOverlay ) ;
if( FAILED(hr) )
{
pLog->LogMessage( eLOG_NORM, _T("Error : Could not add Scyron text
overlay (is filter installed?)") ) ;
}
else
{
// Locate the video renderer
CComPtr <IBaseFilter> pRenderer ;
hr = Builder.FindRenderer( m_pGraph, MEDIATYPE_Video, TRUE, &pRenderer ) ;
if( FAILED(hr) )
{
ASSERT(false) ;
}
else
{
// Get input and output pin of our filter
CComPtr <IPin> ppinOverlayIn ;
hr = Builder.GetUnconnectedPin( m_pScyronTextOverlay, PINDIR_INPUT,
&ppinOverlayIn ) ;
ASSERT( SUCCEEDED(hr) ) ;
CComPtr <IPin> ppinOverlayOut ;
hr = Builder.GetUnconnectedPin( m_pScyronTextOverlay, PINDIR_OUTPUT,
&ppinOverlayOut ) ;
ASSERT( SUCCEEDED(hr) ) ;
// Split connection to video renderer input
CComPtr <IPin> ppinRenderer ;
hr = Builder.GetConnectedPin( pRenderer, PINDIR_INPUT, &ppinRenderer ) ;
if( SUCCEEDED(hr) )
{
CComPtr <IPin> ppinPreRenderer ;
hr = ppinRenderer->ConnectedTo( &ppinPreRenderer ) ;
ASSERT( SUCCEEDED(hr) ) ;
VERIFY( SUCCEEDED(ppinRenderer->Disconnect()) ) ;
VERIFY( SUCCEEDED(ppinPreRenderer->Disconnect()) ) ;
//
// Now insert our filter
//
#if 1
//hr = ppinPreRenderer->Connect( ppinOverlayIn, NULL ) ;
hr = m_pGraph->Connect( ppinPreRenderer, ppinOverlayIn ) ;
CHECK(hr) ;
AfxMessageBox( _T("Connected filter input ...") ) ;
//hr = ppinOverlayOut->Connect( ppinRenderer, NULL ) ;
m_pGraph->Connect( ppinOverlayOut, ppinRenderer ) ;
CHECK(hr) ;
AfxMessageBox( _T("ConnectedFilterOutput") ) ;
// Above will have disconnected grabber !!... this'll re-connect it
//hr = ppinPreRenderer->Connect( ppinOverlayIn, NULL ) ;
hr = m_pGraph->Connect( ppinPreRenderer, ppinOverlayIn ) ;
CHECK(hr) ;
#else
// This results in everything connected up but it still don't work :-(
hr = m_pCapture->RenderStream( NULL, &MEDIATYPE_Video, pGrabber,
m_pScyronTextOverlay, pRenderer ) ;
CHECK(hr) ;
// For some reason grabber now disconnected. So re-connect it again
hr = m_pCapture->RenderStream( NULL, &MEDIATYPE_Video, pGrabber,
NULL, m_pScyronTextOverlay ) ;
CHECK(hr) ;
#endif
----[/snip/--------
Buried in there are three different methods, IPin::Connect,
IGraphBuilder::Connect and ICaptureGraphBuilder2::RenderStream, all with the
same result.
Also remember that attaching to the graph remotely from Graphedt is not
always benign. It is a useful trick, but it has occasionally caused
unexpected problems for me.
Apart from sometimes GPF'ing during the initial connect phase, I don't
usually find any repercussions providing I'm not doing anything more than
querying pin details.
But using GraphEdt only, my filter behaves correctly, be it a live video
stream (as is case in above example), or playing back a recorded file, works
every time.
Totally stumped.
TTFN,
Jon
.
- References:
- CTransInPlaceFilter woes
- From: Jon E
- Re: CTransInPlaceFilter woes
- From: Tim Roberts
- CTransInPlaceFilter woes
- Prev by Date: Re: RGB24 Output From Decoder
- Next by Date: Re: Using Capture Device fails with VMR9 but succeeds with VideoRenderer
- Previous by thread: Re: CTransInPlaceFilter woes
- Next by thread: WM ASF Reader Access violation
- Index(es):
Relevant Pages
|