Additionnal checks for directshow native code.

cusax-fix
Sebastien Vincent 15 years ago
parent a462400312
commit 02e2cf6808

@ -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;
}

@ -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();
}

Loading…
Cancel
Save