|
From: libvidcap c. m. <lib...@li...> - 2007-09-12 18:05:47
|
Revision: 17
http://libvidcap.svn.sourceforge.net/libvidcap/?rev=17&view=rev
Author: bcholew
Date: 2007-09-12 11:05:45 -0700 (Wed, 12 Sep 2007)
Log Message:
-----------
Add functions to setup and cleanup capture graph foo. Cleanup capture graph foo at bind time and in destructor. Only setup capture graph foo at capture start time if it's not already been done.
Modified Paths:
--------------
trunk/src/directshow/DirectShowSource.cpp
trunk/src/directshow/DirectShowSource.h
Modified: trunk/src/directshow/DirectShowSource.cpp
===================================================================
--- trunk/src/directshow/DirectShowSource.cpp 2007-09-12 13:57:59 UTC (rev 16)
+++ trunk/src/directshow/DirectShowSource.cpp 2007-09-12 18:05:45 UTC (rev 17)
@@ -170,6 +170,8 @@
{
stop();
+ cleanupCaptureGraphFoo();
+
dshowMgr_->unregisterSrcGraph(pMediaEventIF_);
if ( nativeMediaType_ )
@@ -191,130 +193,139 @@
DeleteCriticalSection(&captureMutex_);
}
-int
-DirectShowSource::start()
+void
+DirectShowSource::cleanupCaptureGraphFoo()
{
- HRESULT hr = pFilterGraph_->QueryInterface(IID_IMediaControl,
- (void **)&pMediaControlIF_);
- if ( FAILED(hr) )
- {
- log_error("failed getting Media Control interface (%d)\n", hr);
- return -1;
- }
+ if ( pNullRenderer_ )
+ pNullRenderer_->Release();
+ pNullRenderer_ = 0;
- hr = CoCreateInstance(CLSID_SampleGrabber,
- NULL,
- CLSCTX_INPROC_SERVER,
- IID_IBaseFilter,
- (void **)&pSampleGrabber_);
- if ( FAILED(hr) )
- {
- log_error("failed creating Sample Grabber (%d)\n", hr);
- goto bail_1;
- }
+ if ( pSampleGrabberIF_ )
+ pSampleGrabberIF_->Release();
+ pSampleGrabberIF_ = 0;
- hr = pSampleGrabber_->QueryInterface(IID_ISampleGrabber,
- (void**)&pSampleGrabberIF_);
- if ( FAILED(hr) )
- {
- log_error("failed getting ISampleGrabber interface (%d)\n", hr);
- goto bail_2;
- }
+ if ( pSampleGrabber_ )
+ pSampleGrabber_->Release();
+ pSampleGrabber_ = 0;
- // Capture more than once
- hr = pSampleGrabberIF_->SetOneShot(FALSE);
- if ( FAILED(hr) )
- {
- log_error("failed SetOneShot (%d)\n", hr);
- goto bail_3;
- }
+ if ( pMediaControlIF_ )
+ pMediaControlIF_->Release();
+ pMediaControlIF_ = 0;
+}
- hr = pSampleGrabberIF_->SetBufferSamples(FALSE);
- if ( FAILED(hr) )
+int
+DirectShowSource::setupCaptureGraphFoo()
+{
+ if ( !pMediaControlIF_ )
{
- log_error("failed SetBufferSamples (%d)\n", hr);
- goto bail_3;
- }
+ HRESULT hr = pFilterGraph_->QueryInterface(IID_IMediaControl,
+ (void **)&pMediaControlIF_);
+ if ( FAILED(hr) )
+ {
+ log_error("failed getting Media Control interface (%d)\n", hr);
+ return -1;
+ }
- // set which callback type and function to use
- hr = pSampleGrabberIF_->SetCallback( this, 1 );
- if ( FAILED(hr) )
- {
- log_error("failed to set callback (%d)\n", hr);
- goto bail_3;
- }
+ hr = CoCreateInstance(CLSID_SampleGrabber,
+ NULL,
+ CLSCTX_INPROC_SERVER,
+ IID_IBaseFilter,
+ (void **)&pSampleGrabber_);
+ if ( FAILED(hr) )
+ {
+ log_error("failed creating Sample Grabber (%d)\n", hr);
+ goto bail_1;
+ }
- // Set sample grabber's media type to match that of the source
- hr = pSampleGrabberIF_->SetMediaType(nativeMediaType_);
- if ( FAILED(hr) )
- {
- log_error("failed to set grabber media type (%d)\n", hr);
- goto bail_3;
- }
+ hr = pSampleGrabber_->QueryInterface(IID_ISampleGrabber,
+ (void**)&pSampleGrabberIF_);
+ if ( FAILED(hr) )
+ {
+ log_error("failed getting ISampleGrabber interface (%d)\n", hr);
+ goto bail_2;
+ }
- hr = CoCreateInstance(CLSID_NullRenderer,
- NULL,
- CLSCTX_INPROC_SERVER,
- IID_IBaseFilter,
- (void **)&pNullRenderer_);
+ // Capture more than once
+ hr = pSampleGrabberIF_->SetOneShot(FALSE);
+ if ( FAILED(hr) )
+ {
+ log_error("failed SetOneShot (%d)\n", hr);
+ goto bail_3;
+ }
- if ( FAILED(hr) )
- {
- log_error("failed creating a NULL renderer (%d)\n", hr);
- goto bail_3;
- }
+ hr = pSampleGrabberIF_->SetBufferSamples(FALSE);
+ if ( FAILED(hr) )
+ {
+ log_error("failed SetBufferSamples (%d)\n", hr);
+ goto bail_3;
+ }
- //FIXME: use actual device name
- hr = pFilterGraph_->AddFilter(pSource_, L"Source Device");
- if ( FAILED(hr) )
- {
- log_error("failed to add source (%d)\n", hr);
- goto bail_4;
- }
+ // set which callback type and function to use
+ hr = pSampleGrabberIF_->SetCallback( this, 1 );
+ if ( FAILED(hr) )
+ {
+ log_error("failed to set callback (%d)\n", hr);
+ goto bail_3;
+ }
- hr = pFilterGraph_->AddFilter(pSampleGrabber_, L"Sample Grabber");
- if ( FAILED(hr) )
- {
- log_error("failed to add Sample Grabber to filter graph (%d)\n",
- hr);
- goto bail_4;
- }
+ // Set sample grabber's media type to match that of the source
+ hr = pSampleGrabberIF_->SetMediaType(nativeMediaType_);
+ if ( FAILED(hr) )
+ {
+ log_error("failed to set grabber media type (%d)\n", hr);
+ goto bail_3;
+ }
- hr = pFilterGraph_->AddFilter(pNullRenderer_, L"NullRenderer");
- if ( FAILED(hr) )
- {
- log_error("failed to add null renderer (%d)\n", hr);
- goto bail_4;
- }
+ hr = CoCreateInstance(CLSID_NullRenderer,
+ NULL,
+ CLSCTX_INPROC_SERVER,
+ IID_IBaseFilter,
+ (void **)&pNullRenderer_);
- hr = pCapGraphBuilder_->RenderStream(&PIN_CATEGORY_CAPTURE,
- &MEDIATYPE_Video,
- pSource_,
- pSampleGrabber_,
- pNullRenderer_);
- if ( FAILED(hr) )
- {
- log_error("failed to connect source, grabber "
- "and null renderer (%d)\n", hr);
- goto bail_4;
- }
+ if ( FAILED(hr) )
+ {
+ log_error("failed creating a NULL renderer (%d)\n", hr);
+ goto bail_3;
+ }
- hr = pMediaControlIF_->Run();
+ //FIXME: use actual device name
+ hr = pFilterGraph_->AddFilter(pSource_, L"Source Device");
+ if ( FAILED(hr) )
+ {
+ log_error("failed to add source (%d)\n", hr);
+ goto bail_4;
+ }
- if ( SUCCEEDED(hr) )
- {
- return 0;
- }
+ hr = pFilterGraph_->AddFilter(pSampleGrabber_, L"Sample Grabber");
+ if ( FAILED(hr) )
+ {
+ log_error("failed to add Sample Grabber to filter graph (%d)\n",
+ hr);
+ goto bail_4;
+ }
- log_error("failed to run filter graph for source '%s' (%ul 0x%x)\n",
- sourceContext_->src_info.description, hr, hr);
+ hr = pFilterGraph_->AddFilter(pNullRenderer_, L"NullRenderer");
+ if ( FAILED(hr) )
+ {
+ log_error("failed to add null renderer (%d)\n", hr);
+ goto bail_4;
+ }
- hr = pMediaControlIF_->Stop();
- if ( FAILED(hr) )
- {
- log_error("failed to STOP filter graph (%ul)\n", hr);
+ hr = pCapGraphBuilder_->RenderStream(&PIN_CATEGORY_CAPTURE,
+ &MEDIATYPE_Video,
+ pSource_,
+ pSampleGrabber_,
+ pNullRenderer_);
+ if ( FAILED(hr) )
+ {
+ log_error("failed to connect source, grabber "
+ "and null renderer (%d)\n", hr);
+ goto bail_4;
+ }
}
+ return 0;
+
bail_4:
pNullRenderer_->Release();
pNullRenderer_ = 0;
@@ -334,8 +345,28 @@
}
int
+DirectShowSource::start()
+{
+ if ( setupCaptureGraphFoo() )
+ return -1;
+
+ HRESULT hr = pMediaControlIF_->Run();
+
+ if ( FAILED(hr) )
+ {
+ log_error("failed to run filter graph for source '%s' (%ul 0x%x)\n",
+ sourceContext_->src_info.description, hr, hr);
+
+ return -1;
+ }
+
+ return 0;
+}
+
+int
DirectShowSource::stop()
{
+ int ret = 0;
stoppingCapture_ = true;
EnterCriticalSection(&captureMutex_);
@@ -345,30 +376,17 @@
HRESULT hr = pMediaControlIF_->Stop();
if ( FAILED(hr) )
{
- log_error("failed to STOP the filter graph (%ul)\n", hr);
+ log_error("failed to STOP the filter graph (0x%0x)\n", hr);
+
+ ret = -1;
}
-
- if ( pNullRenderer_ )
- pNullRenderer_->Release();
- pNullRenderer_ = 0;
-
- if ( pSampleGrabberIF_ )
- pSampleGrabberIF_->Release();
- pSampleGrabberIF_ = 0;
-
- if ( pSampleGrabber_ )
- pSampleGrabber_->Release();
- pSampleGrabber_ = 0;
-
- pMediaControlIF_->Release();
- pMediaControlIF_ = 0;
}
LeaveCriticalSection(&captureMutex_);
stoppingCapture_ = false;
- return 0;
+ return ret;
}
int
@@ -409,6 +427,8 @@
vih->bmiHeader.biWidth = fmtNative.width;
vih->bmiHeader.biHeight = fmtNative.height;
+ cleanupCaptureGraphFoo();
+
// set the stream's media type
HRESULT hr = pStreamConfig_->SetFormat(nativeMediaType_);
if ( FAILED(hr) )
Modified: trunk/src/directshow/DirectShowSource.h
===================================================================
--- trunk/src/directshow/DirectShowSource.h 2007-09-12 13:57:59 UTC (rev 16)
+++ trunk/src/directshow/DirectShowSource.h 2007-09-12 18:05:45 UTC (rev 17)
@@ -53,6 +53,8 @@
}
private:
+ int setupCaptureGraphFoo();
+ void cleanupCaptureGraphFoo();
bool checkFormat(const vidcap_fmt_info * fmtNominal,
vidcap_fmt_info * fmtNative,
int formatNum,
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|