From 02e2cf6808ec86313aeb00e515ffbbe4a36e057c Mon Sep 17 00:00:00 2001 From: Sebastien Vincent Date: Wed, 16 Feb 2011 09:54:30 +0000 Subject: [PATCH] Additionnal checks for directshow native code. --- .../windows/directshow/ds_capture_device.cpp | 53 +++++++++++++------ src/native/windows/directshow/ds_manager.cpp | 4 +- 2 files changed, 38 insertions(+), 19 deletions(-) diff --git a/src/native/windows/directshow/ds_capture_device.cpp b/src/native/windows/directshow/ds_capture_device.cpp index 3a0e02115..b4fcb4df9 100644 --- a/src/native/windows/directshow/ds_capture_device.cpp +++ b/src/native/windows/directshow/ds_capture_device.cpp @@ -126,10 +126,24 @@ DSCaptureDevice::DSCaptureDevice(const WCHAR* name) DSCaptureDevice::~DSCaptureDevice() { - /* remove all added filters from filter graph */ - m_filterGraph->RemoveFilter(m_srcFilter); - m_filterGraph->RemoveFilter(m_renderer); - m_filterGraph->RemoveFilter(m_sampleGrabberFilter); + if(m_filterGraph) + { + /* remove all added filters from filter graph */ + if(m_srcFilter) + { + m_filterGraph->RemoveFilter(m_srcFilter); + } + + if(m_renderer) + { + m_filterGraph->RemoveFilter(m_renderer); + } + + if(m_sampleGrabberFilter) + { + m_filterGraph->RemoveFilter(m_sampleGrabberFilter); + } + } /* clean up COM stuff */ if(m_renderer) @@ -141,12 +155,12 @@ DSCaptureDevice::~DSCaptureDevice() { m_sampleGrabber->Release(); } - + if(m_sampleGrabberFilter) { m_sampleGrabberFilter->Release(); } - + if(m_srcFilter) { m_srcFilter->Release(); @@ -192,7 +206,12 @@ bool DSCaptureDevice::setFormat(const VideoFormat& format) size_t bitCount = 0; /* get the current format and change resolution */ - streamConfig->GetFormat(&mediaType); + if(FAILED(streamConfig->GetFormat(&mediaType))) + { + streamConfig->Release(); + return false; + } + videoFormat = (VIDEOINFOHEADER*)mediaType->pbFormat; videoFormat->bmiHeader.biWidth = (LONG)format.width; videoFormat->bmiHeader.biHeight = (LONG)format.height; @@ -262,7 +281,7 @@ bool DSCaptureDevice::initDevice(IMoniker* moniker) { return false; } - + if(m_filterGraph) { /* already initialized */ @@ -299,9 +318,10 @@ bool DSCaptureDevice::initDevice(IMoniker* moniker) /* add source filter to the filter graph */ WCHAR* name = wcsdup(m_name); + ret = m_filterGraph->AddSourceFilterForMoniker(moniker, NULL, name, &m_srcFilter); free(name); - + if(ret != S_OK) { return false; @@ -317,14 +337,14 @@ bool DSCaptureDevice::initDevice(IMoniker* moniker) /* get sample grabber */ ret = m_sampleGrabberFilter->QueryInterface(IID_ISampleGrabber, (void**)&m_sampleGrabber); - + if(ret != S_OK) { return false; } /* and sample grabber to the filter graph */ - m_filterGraph->AddFilter(m_sampleGrabberFilter, L"SampleGrabberFilter"); + ret = m_filterGraph->AddFilter(m_sampleGrabberFilter, L"SampleGrabberFilter"); /* set media type */ /* @@ -344,7 +364,7 @@ bool DSCaptureDevice::initDevice(IMoniker* moniker) /* set renderer */ ret = CoCreateInstance(CLSID_NullRenderer, NULL, CLSCTX_INPROC_SERVER, IID_IBaseFilter, (void**)&m_renderer); - + if(ret != S_OK) { return false; @@ -356,8 +376,7 @@ bool DSCaptureDevice::initDevice(IMoniker* moniker) /* initialize the list of formats this device supports */ initSupportedFormats(); - setFormat(m_formats.front()); - return true; + return setFormat(m_formats.front()); } void DSCaptureDevice::initSupportedFormats() @@ -378,7 +397,7 @@ void DSCaptureDevice::initSupportedFormats() streamConfig->GetNumberOfCapabilities(&nb, &size); allocBytes = new BYTE[size]; - + for(int i = 0 ; i < nb ; i++) { if(streamConfig->GetStreamCaps(i, &mediaType, allocBytes) == S_OK) @@ -441,7 +460,7 @@ bool DSCaptureDevice::buildGraph() } bool DSCaptureDevice::start() -{ +{ if(!m_renderer || !m_sampleGrabberFilter || !m_srcFilter || !m_graphController) { return false; @@ -465,7 +484,7 @@ bool DSCaptureDevice::stop() m_sampleGrabberFilter->Stop(); m_renderer->Stop(); m_graphController->Stop(); - + return true; } diff --git a/src/native/windows/directshow/ds_manager.cpp b/src/native/windows/directshow/ds_manager.cpp index fd697e0da..e39773953 100644 --- a/src/native/windows/directshow/ds_manager.cpp +++ b/src/native/windows/directshow/ds_manager.cpp @@ -166,7 +166,7 @@ void DSManager::initCaptureDevices() captureDevice = new DSCaptureDevice(name.bstrVal); /* wprintf(L"%ws\n", name.bstrVal); */ - if(captureDevice->initDevice(moniker)) + if(captureDevice && captureDevice->initDevice(moniker)) { /* initialization success, add to the list */ m_devices.push_back(captureDevice); @@ -185,7 +185,7 @@ void DSManager::initCaptureDevices() } /* cleanup */ - devEnum->Release(); monikerEnum->Release(); + devEnum->Release(); }