[Sumover-dev] [svn commit] r4075 - in vic/branches/mpeg4: video
sumover-dev at cs.ucl.ac.uk
sumover-dev at cs.ucl.ac.uk
Thu Jun 21 12:55:10 BST 2007
Author: piers
Date: Thu Jun 21 12:55:09 2007
New Revision: 4075
Modified:
vic/branches/mpeg4/vic.2003.vcproj
vic/branches/mpeg4/video/grabber-win32DS.cpp
vic/branches/mpeg4/video/grabber-win32DS.h
Log:
Updates to grabber to cure memory leaks and conform better to COM coding standards.
Modified: vic/branches/mpeg4/vic.2003.vcproj
==============================================================================
--- vic/branches/mpeg4/vic.2003.vcproj (original)
+++ vic/branches/mpeg4/vic.2003.vcproj Thu Jun 21 12:55:09 2007
@@ -273,7 +273,8 @@
Optimization="0"
AdditionalIncludeDirectories=".\;codec;render;rtp;net;win32;video;..\common\src;"..\tk-8.0\win";"..\tk-8.0\generic";"..\tk-8.0\xlib";"..\tcl-8.0\win";"..\tcl-8.0\generic";codec\tmndec;"codec\tmn-x";codec\jpeg;codec\p64;codec\h263"
PreprocessorDefinitions="DEBUG,_DEBUG,_WIN95,NEED_INET_PTON,_WINDOWS,SASR,WIN32,ED_YBITS=4,SIGRET=void,SIGARGS=int,NLAYER=8,USE_DDRAW,WINVER=0x500"
- RuntimeLibrary="5"
+ BasicRuntimeChecks="3"
+ RuntimeLibrary="1"
UsePrecompiledHeader="0"
BrowseInformation="1"
WarningLevel="3"
@@ -290,6 +291,7 @@
LinkIncremental="2"
SuppressStartupBanner="TRUE"
AdditionalLibraryDirectories="..\common\src\Debug;"..\tcl-8.0\win\Debug";"..\tk-8.0\win\Debug";codec\tmndec;"codec\tmn-x";\mssdk\lib;"C:\Program Files\Intel\plsuite\lib\msvc";"C:\Program Files\Intel\plsuite\lib""
+ IgnoreDefaultLibraryNames="LIBCMTD.lib"
GenerateDebugInformation="TRUE"
SubSystem="2"/>
<Tool
Modified: vic/branches/mpeg4/video/grabber-win32DS.cpp
==============================================================================
--- vic/branches/mpeg4/video/grabber-win32DS.cpp (original)
+++ vic/branches/mpeg4/video/grabber-win32DS.cpp Thu Jun 21 12:55:09 2007
@@ -118,7 +118,7 @@
input devices are created. Probably not a good approach, but it is one possibility.
*/
-
+#define _WIN32_DCOM
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
@@ -138,11 +138,6 @@
IBaseFilter *pCaptureFilter[NUM_DEVS];
-
-IAMCrossbar *pXBar = NULL;
- IBaseFilter *pFilter = NULL;
-
-
//#########################################################################
// Class Callback, for video framebuffer callback. See DS Sample Grabber interface docs.
@@ -178,7 +173,7 @@
//#########################################################################
// DirectShowGrabber definition
-DirectShowGrabber::DirectShowGrabber(IBaseFilter *filt) {
+DirectShowGrabber::DirectShowGrabber(IBaseFilter *filt, const char *nick) {
HRESULT hr;
/* Reference: various, including
@@ -189,53 +184,45 @@
debug_msg("new DirectShowGrabber()\n");
svideoPort = -1;
compositePort = -1;
- decimate_ =-1;
+ decimate_ = 2; //default
converter_=0;
cb_mutex_=0;
- crossbar = crossbarCursor = NULL;
+ crossbar_ = crossbarCursor_ = NULL;
+ pNullBaseFilter_=0;
+ pSampleGrabber_=0;
+ pGrabberBaseFilter_=0;
+ pMediaControl_=0;
+ pGraph_=0;
+ pBuild_=0;
pCaptureFilter_ = filt;
+ pXBar_ = NULL;
+ pFilter_ = NULL;
+ capturing_=0;
max_fps_ = 30;
- cb_mutex_ = CreateMutex(NULL, FALSE, NULL);
+ setport("external-in");
- setport("external");
-
- //basewidth_ = CIF_BASE_WIDTH;
- //baseheight_ = CIF_BASE_HEIGHT;
-
- /*
- ZeroMemory(&mt_, sizeof(AM_MEDIA_TYPE));
- mt_.majortype = MEDIATYPE_Video;
- mt_.subtype = MEDIASUBTYPE_RGB24;
- */
-
- /*
+ basewidth_ = NTSC_BASE_WIDTH;
+ baseheight_ = NTSC_BASE_HEIGHT;
+ /*if( is_pal() ) {
+ basewidth_ = PAL_BASE_WIDTH;
+ baseheight_ = PAL_BASE_HEIGHT;
+ } else {
+ basewidth_ = NTSC_BASE_WIDTH;
+ baseheight_ = NTSC_BASE_HEIGHT;
+ }
mt_.majortype = MEDIATYPE_AnalogVideo;
mt_.subtype = MEDIASUBTYPE_AnalogVideo_NTSC_M;
*/
- callback = new Callback();
- callback->grabber = this;
+ // callback mutex
+ cb_mutex_ = CreateMutex(NULL, FALSE, NULL);
+
+ callback_ = new Callback();
+ callback_->grabber = this;
debug_msg("DirectShowGrabber::DirectShowGrabber(): callback created, grabber set\n");
- // Create the Filter Graph Manager
- hr = CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER,
- IID_IGraphBuilder, (void **)&pGraph_);
- if (FAILED(hr)) {
- Grabber::status_=-1;
- return;
- }
- debug_msg("DirectShowGrabber::DirectShowGrabber(): graph instance acquired\n");
-
- // Obtain the interface used to run, stop, and pause the graph
- hr = pGraph_->QueryInterface(IID_IMediaControl, (void **)&pMediaControl_);
- //showErrorMessage(hr);
- if (FAILED(hr)) {
- Grabber::status_=-1;
- return;
- }
- debug_msg("DirectShowGrabber::DirectShowGrabber(): graph media control interface acquired\n");
-
+ // Make a graph builder object we can use for capture graph building
// Create the capture graph builder helper object
hr = CoCreateInstance(CLSID_CaptureGraphBuilder2, NULL, CLSCTX_INPROC_SERVER,
IID_ICaptureGraphBuilder2, (void **)&pBuild_);
@@ -246,6 +233,16 @@
}
debug_msg("DirectShowGrabber::DirectShowGrabber(): graph builder interface acquired\n");
+ // Create the Filter Graph Manager
+ hr = CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER,
+ IID_IGraphBuilder, (void **)&pGraph_);
+ if (FAILED(hr)) {
+ Grabber::status_=-1;
+ return;
+ }
+ debug_msg("DirectShowGrabber::DirectShowGrabber(): graph instance acquired\n");
+
+
// Tell the capture graph builder about the Filter Graph Manager (FGM).
hr = pBuild_->SetFiltergraph(pGraph_);
//showErrorMessage(hr);
@@ -256,9 +253,19 @@
debug_msg("DirectShowGrabber::DirectShowGrabber(): graph associated with builder\n");
// Add the capture filter (obtained by the DirectShowDevice Scanner) to the filter graph
- hr = pGraph_->AddFilter(pCaptureFilter_, L"VicCaptureFilter");
+ //hr = pGraph_->AddFilter(pCaptureFilter_, L"VicCaptureFilter");
+ USES_CONVERSION;
+ hr = pGraph_->AddFilter(pCaptureFilter_, A2W(nick));
//showErrorMessage(hr);
debug_msg("DirectShowGrabber::DirectShowGrabber(): capture filter added to graph\n");
+ //IAMVideoCompression *pVC;
+ /*pCaptureFilter_->AddRef();
+ hr = pBuild_->RenderStream(&PIN_CATEGORY_CAPTURE, &MEDIATYPE_Video,
+ pCaptureFilter_, NULL, NULL);
+
+ hr = pBuild_->FindInterface(&PIN_CATEGORY_CAPTURE,
+ &MEDIATYPE_Video, pCaptureFilter_,
+ IID_IAMVideoCompression, (void **)&pVC);*/
// Set up the Sample Grabber transform filter
hr = CoCreateInstance(CLSID_SampleGrabber, NULL, CLSCTX_INPROC_SERVER,
@@ -272,7 +279,7 @@
//hr = pSampleGrabber_->SetMediaType(&mt_); showErrorMessage(hr);
hr = pSampleGrabber_->SetOneShot(FALSE); //showErrorMessage(hr);
- hr = pSampleGrabber_->SetCallback(callback, 1); //showErrorMessage(hr);
+ hr = pSampleGrabber_->SetCallback(callback_, 1); //showErrorMessage(hr);
hr = pGraph_->AddFilter(pGrabberBaseFilter_,L"VicSampleGrabber"); //showErrorMessage(hr);
// Get the Null Renderer DS default filter
@@ -298,13 +305,12 @@
return;
}
//Not needed as width & height aren't known yet.
- //setCaptureOutputFormat();
+ setCaptureOutputFormat();
if (findCrossbar(pCaptureFilter_)) {
routeCrossbar();
}
-
// We can presumably inspect crossbar==NULL here to determine if we want
// to change the Sample Grabber media type.
ZeroMemory(&mt_, sizeof(AM_MEDIA_TYPE));
@@ -315,17 +321,14 @@
hr = pSampleGrabber_->SetMediaType(&mt_);
//showErrorMessage(hr);
- // Connect the filters
- //hr = pBuild_->RenderStream(&PIN_CATEGORY_CAPTURE, &MEDIATYPE_Video,
- // pCaptureFilter_, pGrabberBaseFilter_, pNullBaseFilter_);
+ // Obtain the interface used to run, stop, and pause the graph
+ hr = pGraph_->QueryInterface(IID_IMediaControl, (void **)&pMediaControl_);
//showErrorMessage(hr);
- //debug_msg("DirectShowGrabber::DirectShowGrabber(): builder render stream\n");
-
if (FAILED(hr)) {
- debug_msg("DirectShowGrabber::DirectShowGrabber(): FAILed to build render stream\n");
- status_=-1;
+ Grabber::status_=-1;
return;
}
+ debug_msg("DirectShowGrabber::DirectShowGrabber(): graph media control interface acquired\n");
}
//--------------------------------
@@ -343,35 +346,33 @@
CloseHandle(cb_mutex_);
// Release COM objects in reverse order of instantiation
- callback->Release();
+ callback_->Release();
+ //delete callback; - done by above Release() call
pNullBaseFilter_->Release();
pSampleGrabber_->Release();
pGrabberBaseFilter_->Release();
- pBuild_->Release();
pMediaControl_->Release();
pGraph_->Release();
- delete callback;
+ pBuild_->Release();
}
//--------------------------------
bool DirectShowGrabber::findCrossbar(IBaseFilter *pCapF) {
HRESULT hr;
- /*IAMCrossbar *pXBar = NULL;
- IBaseFilter *pFilter = NULL;*/
debug_msg("DirectShowGrabber::FindCrossbar()...\n");
hr = pBuild_->FindInterface(&LOOK_UPSTREAM_ONLY, NULL, pCapF, IID_IAMCrossbar,
- (void**)&pXBar);
+ (void**)&pXBar_);
if ( SUCCEEDED(hr) ) {
- addCrossbar(pXBar);
- hr = pXBar->QueryInterface(IID_IBaseFilter, (void**)&pFilter);
+ addCrossbar(pXBar_);
+ hr = pXBar_->QueryInterface(IID_IBaseFilter, (void**)&pFilter_);
if ( SUCCEEDED(hr) ) {
- debug_msg("DirectShowGrabber::FindCrossbar()...Found and added\n");
- findCrossbar(pFilter);
- pFilter->Release();
+ debug_msg("DirectShowGrabber::FindCrossbar()...Found and added\n");
+ //findCrossbar(pFilter_);
+ //pFilter_.Release();
return TRUE;
}
}
@@ -387,13 +388,13 @@
pCross = new Crossbar(xbar);
- if( crossbar == NULL ) {
- crossbar = pCross;
+ if( crossbar_ == NULL ) {
+ crossbar_ = pCross;
}
else {
- crossbarCursor->next = pCross;
+ crossbarCursor_->next = pCross;
}
- crossbarCursor = pCross;
+ crossbarCursor_ = pCross;
}
//-----------------------------
@@ -403,14 +404,14 @@
long output = -1;
long input = -1;
int videoDecoderPort = -1;
- int port;
+ int port;
long related;
long pinType;
IAMCrossbar *xb;
- if( crossbar == NULL ) return;
+ if( crossbar_ == NULL ) return;
- xb = crossbar->getXBar();
+ xb = crossbar_->getXBar();
xb->get_IsRoutedTo(0, &input);
debug_msg("DirectShowGrabber::routeCrossbar(): pin %d is routed to output pin 0\n", input);
@@ -418,35 +419,35 @@
hr = xb->get_PinCounts(&output, &input);
for( int i = 0; i < input; ++i ) {
- xb->get_CrossbarPinInfo(TRUE, i, &related, &pinType);
- if( pinType == PhysConn_Video_SVideo ) {
- svideoPort = i;
- }
- if( pinType == PhysConn_Video_Composite ) {
- compositePort = i;
- }
+ xb->get_CrossbarPinInfo(TRUE, i, &related, &pinType);
+ if( pinType == PhysConn_Video_SVideo ) {
+ svideoPort = i;
+ }
+ if( pinType == PhysConn_Video_Composite ) {
+ compositePort = i;
+ }
}
for( int i = 0; i < output; ++i ) {
- xb->get_CrossbarPinInfo(FALSE, i, &related, &pinType);
- if( pinType == PhysConn_Video_VideoDecoder ) {
- videoDecoderPort = i;
- break;
- }
- }
- if(strcmp(input_port_, "S-Video")==0){
- port = svideoPort;
- }else if(strcmp(input_port_, "Composite")==0){
- port = compositePort;
- }else{
- port = 0;
+ xb->get_CrossbarPinInfo(FALSE, i, &related, &pinType);
+ if( pinType == PhysConn_Video_VideoDecoder ) {
+ videoDecoderPort = i;
+ break;
}
+ }
+ if(strcmp(input_port_, "S-Video")==0){
+ port = svideoPort;
+ }else if(strcmp(input_port_, "Composite")==0){
+ port = compositePort;
+ }else{
+ port = 0;
+ }
if( xb->CanRoute(videoDecoderPort, port) == S_FALSE )
- debug_msg("DirectShowGrabber::routeCrossbar(): cannot route input pin %d to output pin %d\n", port, videoDecoderPort);
+ debug_msg("DirectShowGrabber::routeCrossbar(): cannot route input pin %d to output pin %d\n", port, videoDecoderPort);
else {
- debug_msg("DirectShowGrabber::routeCrossbar() routing pin %d to pin %d\n", port, videoDecoderPort);
- hr = xb->Route(videoDecoderPort, port);
- //showErrorMessage(hr);
+ debug_msg("DirectShowGrabber::routeCrossbar() routing pin %d to pin %d\n", port, videoDecoderPort);
+ hr = xb->Route(videoDecoderPort, port);
+ //showErrorMessage(hr);
}
xb->get_IsRoutedTo(0, &input);
@@ -462,11 +463,12 @@
setCaptureOutputFormat();
hr = pBuild_->RenderStream(&PIN_CATEGORY_CAPTURE, &MEDIATYPE_Video,
pCaptureFilter_, pGrabberBaseFilter_, pNullBaseFilter_);
- // callback mutex
if (SUCCEEDED(hr) )
debug_msg("DirectShowGrabber::DirectShowGrabber(): builder render stream\n");
else {
debug_msg("DirectShowGrabber::DirectShowGrabber(): FAILED to builder render stream: %x\n", hr);
+ // This _usually_ fails because RendersStream has already been called - we should really
+ // diassemble the filterGraph and rebuild it when we change stuff.
//stop();
//return;
}
@@ -499,7 +501,8 @@
hr = pMediaControl_->Stop();
}
//showErrorMessage(hr);
-
+ ReleaseMutex(cb_mutex_);
+
delete converter_;
capturing_ = 0;
converter_ = 0;
@@ -631,7 +634,9 @@
for (int iFormat = 0; iFormat < iCount; iFormat++) {
hr = pConfig->GetStreamCaps(iFormat, &pmtConfig, (BYTE *)&scc);
//showErrorMessage(hr);
- // Need to check for different formats and set up appropriate converter
+ // if pmtConfig->subtype for the capture filter is different from MEDIASUBTYPE_RGB24
+ // (which is set in the SampleGrabber filter) then the FGM should insert an
+ // appropriate converter into the filter graph - provided RenderStream() has not been called.
// e.g // 59565955-0000-0010-8000-00AA00389B71 'UYVY' == MEDIASUBTYPE_UYVY
// for simple firewire cam
if( SUCCEEDED(hr) ) {
@@ -770,7 +775,6 @@
}
}
}
- // XXX: leak. need to deal with this - msp
}
DeleteMediaType(pmtConfig);
}
@@ -834,7 +838,7 @@
setsize();
setCaptureOutputFormat();
start();
- } else if (decimate_!=-1) {
+ } else {
setsize();
setCaptureOutputFormat();
}
@@ -853,7 +857,7 @@
//#########################################################################
// DirectShowCIFGrabber class
-DirectShowCIFGrabber::DirectShowCIFGrabber(IBaseFilter *f) : DirectShowGrabber(f) {
+DirectShowCIFGrabber::DirectShowCIFGrabber(IBaseFilter *f, const char * nick) : DirectShowGrabber(f, nick) {
debug_msg("DirectShowCIFGrabber\n");
}
@@ -900,8 +904,8 @@
DirectShowDevice::DirectShowDevice(char *friendlyName, IBaseFilter *pCapFilt) : InputDevice(friendlyName) {
- attri = new char[100];
- attri[0] = 0;
+ attri_ = new char[100];
+ attri_[0] = 0;
debug_msg("new DirectShowDevice(): friendlyName=%s\n", friendlyName);
directShowFilter_ = pCapFilt;
@@ -909,26 +913,26 @@
attributes_ = "format { 411 } size { large small cif } port { extern-in } type { pal ntsc } ";
DirectShowCIFGrabber o(directShowFilter_);
- strcat(attri, "format { 411 } size { large small cif } type { pal ntsc } port { ");
+ strcat(attri_, "format { 411 } size { large small cif } type { pal ntsc } port { ");
if(o.hasSVideo() || o.hasComposite()){
if(o.hasSVideo()){
- strcat(attri, "S-Video ");
+ strcat(attri_, "S-Video ");
}
if(o.hasComposite()){
- strcat(attri, "Composite ");
+ strcat(attri_, "Composite ");
}
}else{
- strcat(attri, "extern-in ");
+ strcat(attri_, "external-in ");
}
- strcat(attri, "} ");
- attributes_ = attri;
+ strcat(attri_, "} ");
+ attributes_ = attri_;
}
DirectShowDevice::~DirectShowDevice(){
// Release not necessary as smart pointers are used.
//directShowFilter_.Release();
- delete attri;
+ delete attri_;
}
//--------------------------------
@@ -951,7 +955,8 @@
//#########################################################################
// DirectShowScanner class
-DirectShowScanner::DirectShowScanner() {
+DirectShowScanner::DirectShowScanner():pMoniker_(0)
+ {
ICreateDevEnum *pDevEnum = 0;
int hr;
int devNum;
@@ -961,8 +966,8 @@
debug_msg("new DirectShowScanner()\n");
- // Initialize the COM subsystem
- hr=CoInitialize(NULL);
+ // Initialize the COM subsystem - it seems that CoInitializeEx is reccommended with COINIT_MULTITHREADED as the driver will spawn threads.
+ hr=CoInitializeEx(NULL,COINIT_MULTITHREADED);
if (FAILED(hr)) {
debug_msg("Failed COM subsystem initialisation.\n");
return;
@@ -977,7 +982,6 @@
}
IEnumMoniker *pEnum = 0;
- IMoniker *pMoniker = 0;
IPropertyBag *pPropBag = 0;
VARIANT varName;
CLSID clsid;
@@ -993,9 +997,9 @@
// Get the capture filter for each device installed, up to NUM_DEVS devices
for( devNum=0; devNum < NUM_DEVS; ++devNum) {
- if ( pEnum->Next(1, &pMoniker, NULL) == S_OK ) {
+ if ( pEnum->Next(1, &pMoniker_, NULL) == S_OK ) {
- hr = pMoniker->BindToStorage(0, 0, IID_IPropertyBag, (void **)&pPropBag);
+ hr = pMoniker_->BindToStorage(0, 0, IID_IPropertyBag, (void **)&pPropBag);
if (FAILED(hr)) {
debug_msg("Failed to Get propbag bound to storage on DS dev: %d\n", devNum);
continue;
@@ -1007,6 +1011,8 @@
hr = pPropBag->Read(L"FriendlyName", &varName, 0);
if (FAILED(hr)) {
debug_msg("Failed to Get friendly name read on DS dev: %d\n", devNum);
+ VariantClear(&varName);
+ pPropBag->Release();
continue;
}
//showErrorMessage(hr);
@@ -1020,27 +1026,30 @@
// needs work, but don't add drivers that look like VFW drivers - msp
//if( (strstr(nameBuf, "VFW") == NULL) ) {
- hr = pMoniker->BindToObject(0, 0, IID_IBaseFilter, (void **)(pCaptureFilter+devNum));
+ hr = pMoniker_->BindToObject(0, 0, IID_IBaseFilter, (void **)&pCaptureFilter[devNum]);
if (FAILED(hr)) {
debug_msg("Failed to Get friendly name read on DS dev: %d\n", devNum);
+ VariantClear(&varName);
+ pPropBag->Release();
continue;
}
debug_msg("capture filter bound ok= [%d} %s\n", hr, nameBuf);
pCaptureFilter[devNum]->GetClassID(&clsid);
+ VariantClear(&varName);
if (!IsEqualGUID(clsid,CLSID_VfwCapture)) {
+ pMoniker_->AddRef();
debug_msg("Adding capture filter %d\n", hr);
devs_[devNum] = new DirectShowDevice(strdup(nameBuf), pCaptureFilter[devNum]);
} else {
debug_msg("discarding an apparent VFW device= %s\n", nameBuf);
devs_[devNum] = NULL;
+ pMoniker_->Release();
}
- VariantClear(&varName);
pPropBag->Release();
}
}
// Release these objects so COM can release their memory
- pMoniker->Release();
pEnum->Release();
pDevEnum->Release();
}
Modified: vic/branches/mpeg4/video/grabber-win32DS.h
==============================================================================
--- vic/branches/mpeg4/video/grabber-win32DS.h (original)
+++ vic/branches/mpeg4/video/grabber-win32DS.h Thu Jun 21 12:55:09 2007
@@ -71,7 +71,7 @@
class DirectShowGrabber : public Grabber {
public:
- DirectShowGrabber(IBaseFilter *);
+ DirectShowGrabber(IBaseFilter *, const char * nick);
~DirectShowGrabber();
virtual int command(int argc, const char*const* argv);
inline void converter(Converter* v) {
@@ -106,7 +106,7 @@
int max_width_;
int max_height_;
int width_;
- int height_;
+ int height_;
int compositePort;
int svideoPort;
@@ -115,6 +115,7 @@
Converter *converter_;
private:
+ CComPtr<IBaseFilter> pFilter_;
IBaseFilter* pCaptureFilter_;
ISampleGrabber* pSampleGrabber_;
IBaseFilter* pGrabberBaseFilter_;
@@ -123,10 +124,12 @@
IGraphBuilder* pGraph_;
ICaptureGraphBuilder2* pBuild_;
IMediaControl* pMediaControl_;
- AM_MEDIA_TYPE mt_;
- Callback *callback;
- Crossbar *crossbar;
- Crossbar *crossbarCursor;
+ AM_MEDIA_TYPE mt_;
+ Callback *callback_;
+
+ CComPtr<IAMCrossbar> pXBar_;
+ Crossbar *crossbar_;
+ Crossbar *crossbarCursor_;
char input_port_[20];
bool findCrossbar(IBaseFilter *);
void addCrossbar(IAMCrossbar *);
@@ -138,7 +141,7 @@
class DirectShowCIFGrabber : public DirectShowGrabber {
public:
- DirectShowCIFGrabber(IBaseFilter *);
+ DirectShowCIFGrabber(IBaseFilter *, const char *nick = 0 );
~DirectShowCIFGrabber();
protected:
virtual void start();
@@ -187,9 +190,10 @@
protected:
CComPtr<IBaseFilter> directShowFilter_;
+
//IBaseFilter *directShowFilter_;
DirectShowGrabber *directShowGrabber_;
- char *attri;
+ char *attri_;
};
//#########################################################################
@@ -200,4 +204,6 @@
~DirectShowScanner();
protected:
DirectShowDevice *devs_[NUM_DEVS];
+ IMoniker* pMoniker_;
+
};
More information about the Sumover-dev
mailing list