#include #include #include #include CaptureDeviceGraph::CaptureDeviceGraph() : mVideoFormat(DVENCODERVIDEOFORMAT_NTSC), mDVResolution(DVRESOLUTION_HALF), mSubunitMode(VCRMode), mLogFile("dvcap.log","wb") { SystemTime systemTime; mLogFile.writeLine("*********************************************************************"); mLogFile.writeLine(String(" DVCAPTURE LOG FILE STARTED AT:")+systemTime.toString()); mLogFile.writeLine("*********************************************************************"); } CaptureDeviceGraph::~CaptureDeviceGraph() { if(mVideoWindow.isOkay()) { mVideoWindow->put_Visible(OAFALSE); mVideoWindow->put_Owner(0); } freeFilters(); } void CaptureDeviceGraph::freeFilters() { mGraph.Release(); mCaptureGraphBuilder.Release(); mMediaEvent.Release(); mInputFileFilter.Release(); mDeviceFilter.Release(); mExtDevice.Release(); mExtTransport.Release(); mTimecodeReader.Release(); mVideoWindow.Release(); mDroppedFrames.Release(); } bool CaptureDeviceGraph::buildBasicGraph() { ComResult comResult; if(!initializeGraph()) { error("[CaptureDeviceGraph::buildBasicGraph] Failed to create filter graph."); return false; } if(!addDeviceFilter()) { error("[CaptureDeviceGraph::buildBasicGraph] Failed to add device filter."); return false; } LOG("[CaptureDeviceGraph::buildBasicGraph] mDeviceFilter->QueryInterface(IID_IAMExtTransport,(void**)(IAMExtTransport**)mExtTransport)"); comResult=mDeviceFilter->QueryInterface(IID_IAMExtTransport,(void**)(IAMExtTransport**)mExtTransport); if(!comResult.success()) { error("[CaptureDeviceGraph::buildBasicGraph] Failed to QueryInterface IID_IAMExtTransport."); return false; } LOG("[CaptureDeviceGraph::buildBasicGraph] mDeviceFilter->QueryInterface(IID_IAMExtDevice,(void**)(IAMExtDevice**)mExtDevice)"); comResult=mDeviceFilter->QueryInterface(IID_IAMExtDevice,(void**)(IAMExtDevice**)mExtDevice); if(!comResult.success()) { error("[CaptureDeviceGraph::buildBasicGraph] Failed to QueryInterface IID_IAMExtDevice."); return false; } LOG("[CaptureDeviceGraph::buildBasicGraph] mDeviceFilter->QueryInterface(IID_IAMTimecodeReader,(void**)(IAMTimecodeReader**)mTimecodeReader)"); comResult=mDeviceFilter->QueryInterface(IID_IAMTimecodeReader,(void**)(IAMTimecodeReader**)mTimecodeReader); if(!comResult.success()) { error("[CaptureDeviceGraph::buildBasicGraph] Failed to QueryInterface IID_IAMTimecodeReader."); return false; } mSubunitMode=getDVMode(); return true; } bool CaptureDeviceGraph::initializeGraph() { ComResult comResult; mGraph.Release(); mCaptureGraphBuilder.Release(); mMediaEvent.Release(); mMediaControl.Release(); mVideoWindow.Release(); LOG("[CaptureDeviceGraph::initializeGraph] mGraph.createInstance(CLSID_FilterGraph,IID_IGraphBuilder)"); comResult=mGraph.createInstance(CLSID_FilterGraph,IID_IGraphBuilder); if(!comResult.success()) { error("[CaptureDeviceGraph::initializeGraph] Failed to create CLSID_FilterGraph."); return false; } LOG("[CaptureDeviceGraph::initializeGraph] mCaptureGraphBuilder.createInstance(CLSID_CaptureGraphBuilder2,IID_ICaptureGraphBuilder2)"); comResult=mCaptureGraphBuilder.createInstance(CLSID_CaptureGraphBuilder2,IID_ICaptureGraphBuilder2); if(!comResult.success()) { error("[CaptureDeviceGraph::initializeGraph] Failed to create CLSID_CaptureGraphBuilder2."); return false; } LOG("[CaptureDeviceGraph::initializeGraph] mCaptureGraphBuilder->SetFiltergraph(mGraph)"); comResult=mCaptureGraphBuilder->SetFiltergraph(mGraph); if(!comResult.success()) { error("[CaptureDeviceGraph::initializeGraph] Failed to SetFiltergraph."); return false; } LOG("[CaptureDeviceGraph::initializeGraph] mGraph->QueryInterface(IID_IMediaEventEx,(void**)(IMediaEventEx**)mMediaEvent)"); comResult=mGraph->QueryInterface(IID_IMediaEventEx,(void**)(IMediaEventEx**)mMediaEvent); if(!comResult.success()) { error("[CaptureDeviceGraph::initializeGraph] Failed to QueryInterface IMediaEventEx."); return false; } LOG("[CaptureDeviceGraph::initializeGraph] mGraph->QueryInterface(IID_IMediaControl,(void**)(IMediaControl**)mMediaControl)"); comResult=mGraph->QueryInterface(IID_IMediaControl,(void**)(IMediaControl**)mMediaControl); if(!comResult.success()) { error("[CaptureDeviceGraph::initializeGraph] Failed to QueryInterface IMediaControl."); return false; } LOG("[CaptureDeviceGraph::initializeGraph] mGraph->QueryInterface(IID_IVideoWindow,(void**)(IVideoWindow**)mVideoWindow)"); comResult=mGraph->QueryInterface(IID_IVideoWindow,(void**)(IVideoWindow**)mVideoWindow); if(!comResult.success()) { error("[CaptureDeviceGraph::initializeGraph] Failed to QueryInterface IVideoWindow."); return false; } return true; } bool CaptureDeviceGraph::addDeviceFilter() { ComResult comResult; ComPointer createDevEnum; ComPointer enumMoniker; ComPointer moniker; ULONG nFetched=0; LOG("[CaptureDeviceGraph::addDeviceFilter] createDevEnum.createInstance(CLSID_SystemDeviceEnum,IID_ICreateDevEnum)"); comResult=createDevEnum.createInstance(CLSID_SystemDeviceEnum,IID_ICreateDevEnum); if(!comResult.success()) { error("[CaptureDeviceGraph::addDeviceFilter] Failed to create CLSID_SystemDeviceEnum"); return false; } LOG("[CaptureDeviceGraph::addDeviceFilter] createDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory,(IEnumMoniker**)enumMoniker,0)"); if(!ComResult(createDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory,(IEnumMoniker**)enumMoniker,0)).success()) { error("[CaptureDeviceGraph::addDeviceFilter] createDevEnum->CreateClassEnumerator() Failed."); return false; } if(!enumMoniker.isOkay()) { error("[CaptureDeviceGraph::addDeviceFilter] createDevEnum->CreateClassEnumerator() Failed."); return false; } enumMoniker->Reset(); while(ComResult(enumMoniker->Next(1,(IMoniker**)moniker,&nFetched)).success()) { ComPointer propertyBag; Variant vName; LOG("[CaptureDeviceGraph::addDeviceFilter] moniker->BindToStorage(0,0,IID_IPropertyBag,(void**)(IPropertyBag**)propertyBag)"); comResult=moniker->BindToStorage(0,0,IID_IPropertyBag,(void**)(IPropertyBag**)propertyBag); if(!comResult.success()) { error("[CaptureDeviceGraph::addDeviceFilter] Failed to BindToStorage on moniker"); continue; } LOG("[CaptureDeviceGraph::addDeviceFilter] propertyBag->Read(L\"FriendlyName\",&vName.getVARIANT(),0)"); comResult=propertyBag->Read(L"FriendlyName",&vName.getVARIANT(),0); if(!comResult.success()) { error("[CaptureDeviceGraph::addDeviceFilter] Failed to Read FriendlyName"); continue; } vName.getData(mDeviceName); if(mDeviceName=="Microsoft DV Camera and VCR") { LOG("[CaptureDeviceGraph::addDeviceFilter] moniker->BindToObject(0,0,IID_IBaseFilter,(void**)(IBaseFilter**)mDeviceFilter)"); comResult=moniker->BindToObject(0,0,IID_IBaseFilter,(void**)(IBaseFilter**)mDeviceFilter); if(!comResult.success()) { error("[CaptureDeviceGraph::addDeviceFilter] Failed to Bind DeviceFilter"); return false; } LOG("[CaptureDeviceGraph::addDeviceFilter] mGraph->AddFilter(mDeviceFilter,L\"Filter\")"); comResult=mGraph->AddFilter(mDeviceFilter,L"Filter"); if(!comResult.success()) { error("[CaptureDeviceGraph::addDeviceFilter] Failed to AddFilter"); return false; } break; } } return mDeviceFilter.isOkay(); } CaptureDeviceGraph::DVMode CaptureDeviceGraph::getDVMode(void) { ComResult comResult; LONG deviceType; LOG("[CaptureDeviceGraph::getDVMode] mExtDevice->GetCapability(ED_DEVCAP_DEVICE_TYPE,&deviceType,0)"); comResult=mExtDevice->GetCapability(ED_DEVCAP_DEVICE_TYPE,&deviceType,0); if(!comResult.success()) { error("[CaptureDeviceGraph::getDVMode] mExtDevice->GetCapability(ED_DEVCAP_DEVICE_TYPE,&deviceType,0) Failed.(Non-Fatal)"); return UnknownMode; } switch(deviceType) { case ED_DEVTYPE_VCR : return VCRMode; case ED_DEVTYPE_CAMERA : return CameraMode; case 0 : default : return UnknownMode; } } bool CaptureDeviceGraph::getTapeInfo(void) { ComResult comResult; LONG mediaType; LONG inSignalMode; LOG("[CaptureDeviceGraph::getTapeInfo] mExtTransport->GetStatus(ED_MEDIA_TYPE,&mediaType)"); comResult=mExtTransport->GetStatus(ED_MEDIA_TYPE,&mediaType); if(!comResult.success())return false; if(ED_MEDIA_NOT_PRESENT==mediaType)return false; // fail if no tape installed else { if(ED_MEDIA_DVC!=mediaType)return false; // tape type should be DVC LOG("[CaptureDeviceGraph::getTapeInfo] mExtTransport->GetTransportBasicParameters(ED_TRANSBASIC_INPUT_SIGNAL,&inSignalMode,0)"); comResult=mExtTransport->GetTransportBasicParameters(ED_TRANSBASIC_INPUT_SIGNAL,&inSignalMode,0); if(!comResult.success())return false; switch(inSignalMode) { case ED_TRANSBASIC_SIGNAL_525_60_SD : mAverageTimePerFrame=33; // 33 ms(29.97 FPS) mVideoFormat=DVENCODERVIDEOFORMAT_NTSC; break; case ED_TRANSBASIC_SIGNAL_525_60_SDL : mAverageTimePerFrame=33; // 33 ms(29.97 FPS) mVideoFormat=DVENCODERVIDEOFORMAT_NTSC; break; case ED_TRANSBASIC_SIGNAL_625_50_SD : mAverageTimePerFrame=40; // 40 ms (25 FPS) mVideoFormat=DVENCODERVIDEOFORMAT_PAL; break; case ED_TRANSBASIC_SIGNAL_625_50_SDL : mAverageTimePerFrame=40; // 40 ms (25 FPS) mVideoFormat=DVENCODERVIDEOFORMAT_PAL; break; default : error("[CaptureDeviceGraph::getTapeInfo] unsupported or unrecognized tape format type"); mAverageTimePerFrame=33; break; } } return true; } // DV_Cam(AV Out)->DVSplitter(vid)->DVCodec->VideoWindow // DVSplitter(aud)->Default DirectSound device bool CaptureDeviceGraph::makePreviewGraph(void) { ComResult comResult; mGraphType=GraphPreview; LOG("[CaptureDeviceGraph::makePreviewGraph] mExtTransport->GetTransportBasicParameters(ED_TRANSBASIC_INPUT_SIGNAL,&inSignalMode,0)"); comResult=mCaptureGraphBuilder->RenderStream(&PIN_CATEGORY_PREVIEW,&MEDIATYPE_Interleaved,mDeviceFilter,0,0); if(!comResult.success())return false; return true; } // DV_Cam(AV Out)->SmartTee(capture)->AviMux->FileWriter // SmartTee(preview)->DVSplitter(vid)->DVCodec->VideoWindow // DVSplitter(aud)->Default DirectSound device bool CaptureDeviceGraph::makeDVToFileGraphType1(const BString &pathOutputFileName) { ComPointer ppf; ComPointer pSink; USES_CONVERSION; if(!pathOutputFileName.isOkay()) { error("[CaptureDeviceGraph::makeDVToFileGraphType1] pathOutputFileName is null."); return false; } mGraphType=GraphDVToFile; LOG("[CaptureDeviceGraph::makeDVToFileGraphType1] mCaptureGraphBuilder->SetOutputFileName(&MEDIASUBTYPE_Avi,pathOutputFileName.str(),(IBaseFilter**)ppf,(IFileSinkFilter**)pSink)"); if(!ComResult(mCaptureGraphBuilder->SetOutputFileName(&MEDIASUBTYPE_Avi,pathOutputFileName.str(),(IBaseFilter**)ppf,(IFileSinkFilter**)pSink)).success()) { error("[CaptureDeviceGraph::makeDVToFileGraphType1] SetOutputFileName failed."); return false; } if(!setAviOptions(ppf,INTERLEAVE_NONE))return false; // Connect interleaved stream of MSDV to the AVI Mux/FW LOG("[CaptureDeviceGraph::makeDVToFileGraphType1] mCaptureGraphBuilder->RenderStream(&PIN_CATEGORY_CAPTURE,&MEDIATYPE_Interleaved,mDeviceFilter,0,ppf)"); if(!ComResult(mCaptureGraphBuilder->RenderStream(&PIN_CATEGORY_CAPTURE,&MEDIATYPE_Interleaved,mDeviceFilter,0,ppf)).success()) { error("[CaptureDeviceGraph::makeDVToFileGraphType1] mCaptureGraphBuilder->RenderStream() failed."); return false; } LOG("[CaptureDeviceGraph::makeDVToFileGraphType1] mCaptureGraphBuilder->RenderStream(&PIN_CATEGORY_PREVIEW,&MEDIATYPE_Interleaved,mDeviceFilter,0,0)"); if(!ComResult(mCaptureGraphBuilder->RenderStream(&PIN_CATEGORY_PREVIEW,&MEDIATYPE_Interleaved,mDeviceFilter,0,0)).success()) { error("[CaptureDeviceGraph::makeDVToFileGraphType1] mCaptureGraphBuilder->RenderStream() failed."); return true; // smk test } return true; } bool CaptureDeviceGraph::makeDVToFileGraphNoPreType1(const BString &pathOutputFileName) { ComPointer ppf; ComPointer sink; mGraphType=GraphDVToFileNoPre; USES_CONVERSION; // if(!ComResult(mCaptureGraphBuilder->SetOutputFileName(&MEDIASUBTYPE_Avi,pathOutputFileName.str(),ppf,sink)).success()) LOG("[CaptureDeviceGraph::makeDVToFileGraphNoPreType1] mCaptureGraphBuilder->SetOutputFileName(&MEDIASUBTYPE_Avi,pathOutputFileName.str(),(IBaseFilter**)ppf,(IFileSinkFilter**)sink)"); if(!ComResult(mCaptureGraphBuilder->SetOutputFileName(&MEDIASUBTYPE_Avi,pathOutputFileName.str(),(IBaseFilter**)ppf,(IFileSinkFilter**)sink)).success()) { error("[CaptureDeviceGraph::makeDVToFileGraphNoPreType1] mCaptureGraphBuilder->SetOutputFileName() failed."); return false; } if(!setAviOptions(ppf,INTERLEAVE_NONE))return false; LOG("[CaptureDeviceGraph::makeDVToFileGraphNoPreType1] mCaptureGraphBuilder->RenderStream(&PIN_CATEGORY_CAPTURE,&MEDIATYPE_Interleaved,mDeviceFilter,0,ppf)"); if(!ComResult(mCaptureGraphBuilder->RenderStream(&PIN_CATEGORY_CAPTURE,&MEDIATYPE_Interleaved,mDeviceFilter,0,ppf)).success()) { error("[CaptureDeviceGraph::makeDVToFileGraphNoPreType1] mCaptureGraphBuilder->RenderStream() failed."); return false; } return true; } // FileSource->AVI_Splitter->InfPinTee->DV_Camera // InfPinTee->DVSplitter(vid)->DVDecoder->VideoWIndow // DVSplitter(aud)->Default DirectSound device // the graph we're making is: Async Reader --> AVI SPlitter --> Tee --> MSDV // --> DV Splitter --> DV Decoder --> VidRend // --> AudRend bool CaptureDeviceGraph::makeFileToDVGraphType1(const BString &pathInputFileName) { mGraphType=GraphFileToDV; ComPointer aviSplitter; ComPointer inFTee; USES_CONVERSION; LOG("[CaptureDeviceGraph::makeFileToDVGraphType1] mGraph->AddSourceFilter(pathInputFileName.str(),pathInputFileName.str(),(IBaseFilter**)mInputFileFilter)"); if(!ComResult(mGraph->AddSourceFilter(pathInputFileName.str(),pathInputFileName.str(),(IBaseFilter**)mInputFileFilter)).success()) { error("[CaptureDeviceGraph::makeFileToDVGraphType1] mGraph->AddSourceFilter() Failed."); return false; } LOG("[CaptureDeviceGraph::makeFileToDVGraphType1] aviSplitter.createInstance(CLSID_AviSplitter,IID_IBaseFilter)"); if(!ComResult(aviSplitter.createInstance(CLSID_AviSplitter,IID_IBaseFilter)).success()) { error("[CaptureDeviceGraph::makeFileToDVGraphType1] aviSplitter->createInstance(CLSID_AviSplitter,IID_IBaseFilter) Failed."); return false; } LOG("[CaptureDeviceGraph::makeFileToDVGraphType1] inFTee.createInstance(CLSID_InfTee,IID_IBaseFilter)"); if(!ComResult(inFTee.createInstance(CLSID_InfTee,IID_IBaseFilter)).success()) { error("[CaptureDeviceGraph::makeFileToDVGraphType1] inFTee->createInstance(CLSID_InfTee,IID_BaseFilter) Failed."); return false; } LOG("[CaptureDeviceGraph::makeFileToDVGraphType1] mGraph->AddFilter(aviSplitter,L\"AVI Splitter\")"); if(!ComResult(mGraph->AddFilter(aviSplitter,L"AVI Splitter")).success()) { error("[CaptureDeviceGraph::makeFileToDVGraphType1] mGraph->AddFilter(aviSplitter) Failed."); return false; } LOG("[CaptureDeviceGraph::makeFileToDVGraphType1] mCaptureGraphBuilder->RenderStream(0,0,mInputFileFilter,0,aviSplitter)"); if(!ComResult(mCaptureGraphBuilder->RenderStream(0,0,mInputFileFilter,0,aviSplitter)).success()) { error("[CaptureDeviceGraph::makeFileToDVGraphType1] mCaptureGraphBuilder->RenderStream(..,aviSplitter) Failed."); return false; } LOG("[CaptureDeviceGraph::makeFileToDVGraphType1] mGraph->AddFilter(inFTee,L\"Infinite Tee\")"); if(!ComResult(mGraph->AddFilter(inFTee,L"Infinite Tee")).success()) { error("[CaptureDeviceGraph::makeFileToDVGraphType1] mGraph->AddFilter(inFTee) Failed."); return false; } LOG("[CaptureDeviceGraph::makeFileToDVGraphType1] mCaptureGraphBuilder->RenderStream(0,&MEDIATYPE_Interleaved,aviSplitter,0,inFTee)"); if(!ComResult(mCaptureGraphBuilder->RenderStream(0,&MEDIATYPE_Interleaved,aviSplitter,0,inFTee)).success()) { error("[CaptureDeviceGraph::makeFileToDVGraphType1] mCaptureGraphBuilder->RenderStream(..,inFTee) Failed."); return false; } LOG("[CaptureDeviceGraph::makeFileToDVGraphType1] mCaptureGraphBuilder->RenderStream(0,0,inFTee,0,mDeviceFilter)"); if(!ComResult(mCaptureGraphBuilder->RenderStream(0,0,inFTee,0,mDeviceFilter)).success()) { error("[CaptureDeviceGraph::makeFileToDVGraphType1] mCaptureGraphBuilder->RenderStream(..,mDeviceFilter) Failed."); return false; } LOG("[CaptureDeviceGraph::makeFileToDVGraphType1] mCaptureGraphBuilder->RenderStream(0,0,inFTee,0,0)"); if(!ComResult(mCaptureGraphBuilder->RenderStream(0,0,inFTee,0,0)).success()) { error("[CaptureDeviceGraph::makeFileToDVGraphType1] mCaptureGraphBuilder->RenderStream(..,inFTee,0,0) Failed."); return false; } return true; } //FileSource->AVI_Splitter->DV_Camera // Graph : Async Reader --> AVI Splitter --> MSDV bool CaptureDeviceGraph::makeFileToDVGraphNoPreType1(const BString &pathInputFileName) { mGraphType=GraphFileToDVNoPre; USES_CONVERSION; LOG("[CaptureDeviceGraph::makeFileToDVGraphNoPreType1] mGraph->AddSourceFilter(pathInputFileName.str(),pathInputFileName.str(),(IBaseFilter**)mInputFileFilter)"); if(!ComResult(mGraph->AddSourceFilter(pathInputFileName.str(),pathInputFileName.str(),(IBaseFilter**)mInputFileFilter)).success()) { error("[CaptureDeviceGraph::makeFileToDVGraphNoPreType1] mGraph->AddSourceFilter() Failed."); return false; } LOG("[CaptureDeviceGraph::makeFileToDVGraphNoPreType1] mCaptureGraphBuilder->RenderStream(0,0,mInputFileFilter,0,mDeviceFilter)"); if(!ComResult(mCaptureGraphBuilder->RenderStream(0,0,mInputFileFilter,0,mDeviceFilter)).success()) { error("[CaptureDeviceGraph::makeFileToDVGraphNoPreType1] mCaptureGraphBuilder->RenderStream(0,0,mInputFileFilter,0,mDeviceFilter) Failed."); return false; } return true; } // the graph we're making is: MSDV --> Smart Tee --> DV SPLITTER --> AVI MUX --> File Writer // --> // // --> DV SPLITTER --> DV DEC --> Video Renderer // --> Audio Renderer bool CaptureDeviceGraph::makeDVToFileGraphType2(const BString &pathOutputFileName) { mGraphType=GraphDVToFileType2; ComPointer dvSplitter; ComPointer ppf; ComPointer sink; USES_CONVERSION; LOG("[CaptureDeviceGraph::makeDVToFileGraphType2] dvSplitter.createInstance(CLSID_DVSplitter,IID_IBaseFilter)"); if(!ComResult(dvSplitter.createInstance(CLSID_DVSplitter,IID_IBaseFilter)).success()) { error("[CaptureDeviceGraph::makeDVToFileGraphType2] createInstance(CLSID_DVSplitter,IID_IBaseFilter) Failed"); return false; } LOG("[CaptureDeviceGraph::makeDVToFileGraphType2] mGraph->AddFilter(dvSplitter,L\"DV Splitter\")"); if(!ComResult(mGraph->AddFilter(dvSplitter,L"DV Splitter")).success()) { error("[CaptureDeviceGraph::makeDVToFileGraphType2] mGraph->AddFilter(dvSplitter,L\"DV Splitter\") Failed"); return false; } LOG("[CaptureDeviceGraph::makeDVToFileGraphType2] mCaptureGraphBuilder->SetOutputFileName(&MEDIASUBTYPE_Avi,pathOutputFileName.str(),(IBaseFilter**)ppf,(IFileSinkFilter**)sink)"); if(!ComResult(mCaptureGraphBuilder->SetOutputFileName(&MEDIASUBTYPE_Avi,pathOutputFileName.str(),(IBaseFilter**)ppf,(IFileSinkFilter**)sink)).success()) { error("[CaptureDeviceGraph::makeDVToFileGraphType2] mCaptureGraphBuilder->SetOutputFileName(&MEDIASUBTYPE_Avi,pathOutputFileName.str(),(IBaseFilter**)ppf,(IFileSinkFilter**)sink) Failed"); return false; } if(!setAviOptions(ppf,INTERLEAVE_NONE))return false; LOG("[CaptureDeviceGraph::makeDVToFileGraphType2] mCaptureGraphBuilder->RenderStream(&PIN_CATEGORY_CAPTURE,&MEDIATYPE_Interleaved,mDeviceFilter,dvSplitter,ppf)"); if(!ComResult(mCaptureGraphBuilder->RenderStream(&PIN_CATEGORY_CAPTURE,&MEDIATYPE_Interleaved,mDeviceFilter,dvSplitter,ppf)).success()) { error("[CaptureDeviceGraph::makeDVToFileGraphType2] mCaptureGraphBuilder->RenderStream(&PIN_CATEGORY_CAPTURE,&MEDIATYPE_Interleaved,mDeviceFilter,dvSplitter,ppf) Failed"); return false; } LOG("[CaptureDeviceGraph::makeDVToFileGraphType2] mCaptureGraphBuilder->RenderStream(0,0,dvSplitter,0,ppf)"); if(!ComResult(mCaptureGraphBuilder->RenderStream(0,0,dvSplitter,0,ppf)).success()) { error("[CaptureDeviceGraph::makeDVToFileGraphType2] mCaptureGraphBuilder->RenderStream(0,0,dvSplitter,0,ppf) Failed"); return false; } LOG("[CaptureDeviceGraph::makeDVToFileGraphType2] mCaptureGraphBuilder->RenderStream(&PIN_CATEGORY_PREVIEW,&MEDIATYPE_Interleaved,mDeviceFilter,0,0)"); if(!ComResult(mCaptureGraphBuilder->RenderStream(&PIN_CATEGORY_PREVIEW,&MEDIATYPE_Interleaved,mDeviceFilter,0,0)).success()) { error("[CaptureDeviceGraph::makeDVToFileGraphType2] mCaptureGraphBuilder->RenderStream(&PIN_CATEGORY_PREVIEW,&MEDIATYPE_Interleaved,mDeviceFilter,0,0) Failed"); return false; } return true; } // the graph we're making is: MSDV --> Smart Tee --> DV SPLITTER --> AVI MUX --> File Writer // --> bool CaptureDeviceGraph::makeDVToFileGraphNoPreType2(const BString &pathOutputFileName) { mGraphType=GraphDVToFileNoPreType2; ComPointer dvSplitter; ComPointer ppf; ComPointer sink; USES_CONVERSION; LOG("[CaptureDeviceGraph::makeDVToFileGraphNoPreType2] dvSplitter.createInstance(CLSID_DVSplitter,IID_IBaseFilter)"); if(!ComResult(dvSplitter.createInstance(CLSID_DVSplitter,IID_IBaseFilter)).success()) { error("[CaptureDeviceGraph::makeDVToFileGraphNoPreType2] dvSplitter.createInstance(CLSID_DVSplitter,IID_IBaseFilter) Failed"); return false; } LOG("[CaptureDeviceGraph::makeDVToFileGraphNoPreType2] mGraph->AddFilter(dvSplitter,L\"DV Splitter\")"); if(!ComResult(mGraph->AddFilter(dvSplitter,L"DV Splitter")).success()) { error("[CaptureDeviceGraph::makeDVToFileGraphNoPreType2] mGraph->AddFilter(dvSplitter,L\"DV Splitter\") Failed"); return false; } LOG("[CaptureDeviceGraph::makeDVToFileGraphNoPreType2] mCaptureGraphBuilder->SetOutputFileName(&MEDIASUBTYPE_Avi,pathOutputFileName.str(),(IBaseFilter**)ppf,(IFileSinkFilter**)sink)"); if(!ComResult(mCaptureGraphBuilder->SetOutputFileName(&MEDIASUBTYPE_Avi,pathOutputFileName.str(),(IBaseFilter**)ppf,(IFileSinkFilter**)sink)).success()) { error("[CaptureDeviceGraph::makeDVToFileGraphNoPreType2] mCaptureGraphBuilder->SetOutputFileName(&MEDIASUBSTYPE_Avi,pathOutputFileName.str(),(IBaseFilter**)ppf,(IFileSinkFilter**)sink) Failed"); return false; } LOG("[CaptureDeviceGraph::makeDVToFileGraphNoPreType2] mCaptureGraphBuilder->RenderStream(&PIN_CATEGORY_CAPTURE,&MEDIATYPE_Interleaved,mDeviceFilter,dvSplitter,ppf)"); if(!ComResult(mCaptureGraphBuilder->RenderStream(&PIN_CATEGORY_CAPTURE,&MEDIATYPE_Interleaved,mDeviceFilter,dvSplitter,ppf)).success()) { error("[CaptureDeviceGraph::makeDVToFileGraphNoPreType2] mCaptureGraphBuilder->RenderStream(&PIN_CATEGORY_CAPTURE,&MEDIATYPE_Interleaved,mDeviceFilter,dvSplitter,ppf) Failed"); return false; } LOG("[CaptureDeviceGraph::makeDVToFileGraphNoPreType2] mCaptureGraphBuilder->RenderStream(0,0,dvSplitter,0,ppf)"); if(!ComResult(mCaptureGraphBuilder->RenderStream(0,0,dvSplitter,0,ppf)).success()) { error("[CaptureDeviceGraph::makeDVToFileGraphNoPreType2] mCaptureGraphBuilder->RenderStream(0,0,dvSplitter,0,ppf) Failed"); return false; } if(!setAviOptions(ppf,INTERLEAVE_NONE))return false; return true; } // the graph we need to build is: ASYNC reader --> AVI SPLITTER --> DV MUX --> TEE --> MSDV // --> --> DVSP --> DV DEC --> VR // --> AR bool CaptureDeviceGraph::makeFileToDVGraphType2(const BString &pathInputFileName) { ComPointer dvMux; ComPointer inFTee; ComPointer out; mGraphType=GraphFileToDVType2; USES_CONVERSION; LOG("[CaptureDeviceGraph::makeFileToDVGraphType2] dvMux.createInstance(CLSID_DVMux,IID_IBaseFilter)"); if(!ComResult(dvMux.createInstance(CLSID_DVMux,IID_IBaseFilter)).success()) { error("[CaptureDeviceGraph::makeFileToDVGraphType2] dvMux.createInstance(CLSID_DVMux,IID_IBaseFiler) Failed"); return false; } LOG("[CaptureDeviceGraph::makeFileToDVGraphType2] inFTee.createInstance(CLSID_InfTee,IID_IBaseFilter)"); if(!ComResult(inFTee.createInstance(CLSID_InfTee,IID_IBaseFilter)).success()) { error("[CaptureDeviceGraph::makeFileToDVGraphType2] inFTee.createInstance(CLSID_InfTee,IID_IBaseFilter) Failed"); return false; } LOG("[CaptureDeviceGraph::makeFileToDVGraphType2] mGraph->AddSourceFilter(pathInputFileName.str(),pathInputFileName.str(),(IBaseFilter**)mInputFileFilter)"); if(!ComResult(mGraph->AddSourceFilter(pathInputFileName.str(),pathInputFileName.str(),(IBaseFilter**)mInputFileFilter)).success()) { error("[CaptureDeviceGraph::makeFileToDVGraphType2] mGraph->AddSourceFilter(pathInputFileName.str(),pathInputFileName.str(),(IBaseFilter**)mInputFileFilter) Failed"); return false; } LOG("[CaptureDeviceGraph::makeFileToDVGraphType2] mGraph->AddFilter(dvMux,L\"DV Muxer\")"); if(!ComResult(mGraph->AddFilter(dvMux,L"DV Muxer")).success()) { error("[CaptureDeviceGraph::makeFileToDVGraphType2] mGraph->AddFilter(dvMux,L\"DV Muxer\") Failed"); return false; } LOG("[CaptureDeviceGraph::makeFileToDVGraphType2] mGraph->AddFilter(inFTee,L\"Infinite Tee\")"); if(!ComResult(mGraph->AddFilter(inFTee,L"Infinite Tee")).success()) { error("[CaptureDeviceGraph::makeFileToDVGraphType2] mGraph->AddFilter(inFTee,L\"Infinite Tee\") Failed"); return false; } LOG("[CaptureDeviceGraph::makeFileToDVGraphType2] mCaptureGraphBuilder->RenderStream(0,0,mInputFileFilter,0,dvMux)"); if(!ComResult(mCaptureGraphBuilder->RenderStream(0,0,mInputFileFilter,0,dvMux)).success()) { error("[CaptureDeviceGraph::makeFileToDVGraphType2] mCaptureGraphBuilder->RenderStream(0,0,mInputFileFilter,0,dvMux) Failed"); return false; } LOG("[CaptureDeviceGraph::makeFileToDVGraphType2] mCaptureGraphBuilder->RenderStream(0,0,dvMux,0,inFTee)"); if(!ComResult(mCaptureGraphBuilder->RenderStream(0,0,dvMux,0,inFTee)).success()) { error("[CaptureDeviceGraph::makeFileToDVGraphType2] mCaptureGraphBuilder->RenderStream(0,0,dvMux,0,inFTee) Failed"); return false; } LOG("[CaptureDeviceGraph::makeFileToDVGraphType2] mCaptureGraphBuilder->RenderStream(0,0,inFTee,0,mDeviceFilter)"); if(!ComResult(mCaptureGraphBuilder->RenderStream(0,0,inFTee,0,mDeviceFilter)).success()) { error("[CaptureDeviceGraph::makeFileToDVGraphType2] mCaptureGraphBuilder->RenderStream(0,0,inFTee,0,mDeviceFilter) Failed"); return false; } LOG("[CaptureDeviceGraph::makeFileToDVGraphType2] mCaptureGraphBuilder->FindPin(inFTee,PINDIR_OUTPUT,0,0,true,0,(IPin**)out)"); if(!ComResult(mCaptureGraphBuilder->FindPin(inFTee,PINDIR_OUTPUT,0,0,true,0,(IPin**)out)).success()) { error("[CaptureDeviceGraph::makeFileToDVGraphType2] mCaptureGraphBuilder->FindPin(inFTee,PINDIR_OUTPUT,0,0,true,0,(IPin**)out) Failed"); return false; } LOG("[CaptureDeviceGraph::makeFileToDVGraphType2] mGraph->Render(out)"); if(!ComResult(mGraph->Render(out)).success()) { error("[CaptureDeviceGraph::makeFileToDVGraphType2] mGraph->Render(out) Failed"); return false; } return true; } // the graph we need to build is: ASYNC reader --> AVI SPLITTER --> DV MUX --> MSDV // --> // connect file video stream to DV MUX bool CaptureDeviceGraph::makeFileToDVGraphNoPreType2(const BString &pathInputFileName) { ComPointer dvMux; mGraphType=GraphFileToDVNoPreType2; USES_CONVERSION; LOG("[CaptureDeviceGraph::makeFileToDVGraphNoPreType2] dvMux.createInstance(CLSID_DVMux,IID_IBaseFilter)"); if(!ComResult(dvMux.createInstance(CLSID_DVMux,IID_IBaseFilter)).success()) { error("[CaptureDeviceGraph::makeFileToDVGraphNoPreType2] dvMux.createInstance(CLSID_DVMux,IID_IBaseFilter) Failed"); return false; } LOG("[CaptureDeviceGraph::makeFileToDVGraphNoPreType2] mGraph->AddSourceFilter(pathInputFileName.str(),pathInputFileName.str(),(IBaseFilter**)mInputFileFilter)"); if(!ComResult(mGraph->AddSourceFilter(pathInputFileName.str(),pathInputFileName.str(),(IBaseFilter**)mInputFileFilter)).success()) { error("[CaptureDeviceGraph::makeFileToDVGraphNoPreType2] mGraph->AddSourceFilter(pathInputFileName.str(),pathInputFileName.str(),(IBaseFilter**)mInputFileFilter) Failed"); return false; } LOG("[CaptureDeviceGraph::makeFileToDVGraphNoPreType2] mGraph->AddFilter(dvMux,L\"DV Muxer\")"); if(!ComResult(mGraph->AddFilter(dvMux,L"DV Muxer")).success()) { error("[CaptureDeviceGraph::makeFileToDVGraphNoPreType2] mGraph->AddFilter(dvMux,L\"DV Muxer\") Failed"); return false; } // connect video LOG("[CaptureDeviceGraph::makeFileToDVGraphNoPreType2] mCaptureGraphBuilder->RenderStream(0,0,mInputFileFilter,0,dvMux)"); if(!ComResult(mCaptureGraphBuilder->RenderStream(0,0,mInputFileFilter,0,dvMux)).success()) { error("[CaptureDeviceGraph::makeFileToDVGraphNoPreType2] mCaptureGraphBuilder->RenderStream(0,0,mInputFileFilter,0,dvMux) Failed"); return false; } // connect audio - looks suspicious because this line same as previous LOG("[CaptureDeviceGraph::makeFileToDVGraphNoPreType2] mCaptureGraphBuilder->RenderStream(0,0,mInputFileFilter,0,dvMux)"); if(!ComResult(mCaptureGraphBuilder->RenderStream(0,0,mInputFileFilter,0,dvMux)).success()) { error("[CaptureDeviceGraph::makeFileToDVGraphNoPreType2] mCaptureGraphBuilder->RenderStream(0,0,mInputFileFilter,0,dvMux) Failed"); return false; } LOG("[CaptureDeviceGraph::makeFileToDVGraphNoPreType2] mCaptureGraphBuilder->RenderStream(0,0,dvMux,0,mDeviceFilter)"); if(!ComResult(mCaptureGraphBuilder->RenderStream(0,0,dvMux,0,mDeviceFilter)).success()) { error("[CaptureDeviceGraph::makeFileToDVGraphNoPreType2] mCaptureGraphBuilder->RenderStream(0,0,dvMux,0,mDeviceFilter) Failed"); return false; } return true; } bool CaptureDeviceGraph::setAviOptions(ComPointer &ppf,InterleavingMode interleavingMode) { ComPointer mux; ComPointer interleaving; LOG("[CaptureDeviceGraph::setAviOptions] ppf->QueryInterface(IID_IConfigAviMux,(void**)(IConfigAviMux**)mux)"); if(!ComResult(ppf->QueryInterface(IID_IConfigAviMux,(void**)(IConfigAviMux**)mux)).success()) { error("[CaptureDeviceGraph::setAviOptions] Failed to QueryInterface on IID_IConfigAviMux"); return false; } LOG("[CaptureDeviceGraph::setAviOptions] mux->SetOutputCompatibilityIndex(true)"); if(!ComResult(mux->SetOutputCompatibilityIndex(true)).success()) { error("[CaptureDeviceGraph::setAviOptions] mux->SetOutputCompatibilityIndex failed"); return false; } LOG("[CaptureDeviceGraph::setAviOptions] ppf->QueryInterface(IID_IConfigInterleaving,(void**)(IConfigInterleaving**)interleaving)"); if(!ComResult(ppf->QueryInterface(IID_IConfigInterleaving,(void**)(IConfigInterleaving**)interleaving)).success()) { error("[CaptureDeviceGraph::setAviOptions] QueryInterface IConfigInterleaving failed"); return false; } LOG("[CaptureDeviceGraph::setAviOptions] interleaving->put_Mode(interleavingMode)"); if(!ComResult(interleaving->put_Mode(interleavingMode)).success()) // full,none,half { error("[CaptureDeviceGraph::setAviOptions] interleaving->put_Mode failed"); return false; } return true; } bool CaptureDeviceGraph::getVideoWindowDimensions(int &width,int &height,bool changeResolution,GUIWindow &window) { if(window.isValid()) { if(!getResolutionFromDVDecoderPropertyPage(window,changeResolution))return false; } switch(mDVResolution) { case DVRESOLUTION_FULL: width=DVEncoderWidth; if(DVENCODERVIDEOFORMAT_PAL==mVideoFormat)height=PALDVEncoderHeight; else if(DVENCODERVIDEOFORMAT_NTSC==mVideoFormat)height=NTSCDVEncoderHeight; break; case DVRESOLUTION_HALF: width=DVEncoderWidth/2; if(DVENCODERVIDEOFORMAT_PAL==mVideoFormat)height=PALDVEncoderHeight/2; else if(DVENCODERVIDEOFORMAT_NTSC==mVideoFormat)height=NTSCDVEncoderHeight/2; break; case DVRESOLUTION_QUARTER: width=DVEncoderWidth/4; if(DVENCODERVIDEOFORMAT_PAL==mVideoFormat)height=PALDVEncoderHeight/4; else if(DVENCODERVIDEOFORMAT_NTSC==mVideoFormat)height=NTSCDVEncoderHeight/4; break; case DVRESOLUTION_DC: width = 88; if(DVENCODERVIDEOFORMAT_PAL==mVideoFormat)height=PALDVEncoderHeight/8; else if(DVENCODERVIDEOFORMAT_NTSC==mVideoFormat)height=NTSCDVEncoderHeight/8; break; } return true; } bool CaptureDeviceGraph::getResolutionFromDVDecoderPropertyPage(GUIWindow &window,bool changeResolution) { ComPointer dvDecoder; ComPointer ipDVDec; ComPointer propertyPages; FILTER_INFO filterInfo; LOG("[CaptureDeviceGraph::getResolutionFromDVDecoderPropertyPage] mGraph->FindFilterByName(L\"DV Video Decoder\",(IBaseFilter**)dvDecoder)"); if(!ComResult(mGraph->FindFilterByName(L"DV Video Decoder",(IBaseFilter**)dvDecoder)).success()) { error("[CaptureDeviceGraph::getResolutionFromDVPropertyPage] mGraph->FindFilterByName() Failed."); return false; } LOG("[CaptureDeviceGraph::getResolutionFromDVDecoderPropertyPage] dvDecoder->QueryInterface(IID_ISpecifyPropertyPages,(void**)(ISpecifyPropertyPages**)propertyPages)"); if(!ComResult(dvDecoder->QueryInterface(IID_ISpecifyPropertyPages,(void**)(ISpecifyPropertyPages**)propertyPages)).success()) { error("[CaptureDeviceGraph::getResolutionFromDVPropertyPage] QueryInterface ISpecifyPropertyPages Failed."); return false; } LOG("[CaptureDeviceGraph::getResolutionFromDVDecoderPropertyPage] dvDecoder->QueryFilterInfo(&filterInfo)"); if(!ComResult(dvDecoder->QueryFilterInfo(&filterInfo)).success()) { error("[CaptureDeviceGraph::getResolutionFromDVPropertyPage] dvDecoder->QueryFilterInfo() Failed."); return false; } if(changeResolution) { CAUUID caGUID; propertyPages->GetPages(&caGUID); ::OleCreatePropertyFrame(window, // parent window 0,0, // reserved filterInfo.achName, // caption for dialog box 1, // number of objects (IUnknown**)(IBaseFilter**)dvDecoder, // array of object pointers caGUID.cElems, // number of property pages caGUID.pElems, // array of property page CLSID's 0, // locale identifier 0,0); // reserved ::CoTaskMemFree(caGUID.pElems); } filterInfo.pGraph->Release(); LOG("[CaptureDeviceGraph::getResolutionFromDVDecoderPropertyPage] dvDecoder->QueryInterface(IID_IIPDVDec,(void**)(IIPDVDec**)ipDVDec)"); if(!ComResult(dvDecoder->QueryInterface(IID_IIPDVDec,(void**)(IIPDVDec**)ipDVDec)).success()) { error("[CaptureDeviceGraph::getResolutionFromDVPropertyPage] QueryInterface IIPDVDec Failed"); return false; } LOG("[CaptureDeviceGraph::getResolutionFromDVDecoderPropertyPage] ipDVDec->get_IPDisplay((int*)&mDVResolution)"); if(!ComResult(ipDVDec->get_IPDisplay((int*)&mDVResolution)).success()) { error("[CaptureDeviceGraph::getResolutionFromDVPropertyPage] ipDVDec->get_IPDisplay() Failed."); return false; } return true; } bool CaptureDeviceGraph::startGraph(void) { LOG("[CaptureDeviceGraph::startGraph] mMediaControl->Run()"); if(!ComResult(mMediaControl->Run()).success()) { stopGraph(); error("[CaptureDeviceGraph::startGraph] mMediaControl->Run() Failed."); return false; } return true; } bool CaptureDeviceGraph::stopGraph(void) { LOG("[CaptureDeviceGraph::stopGraph] mMediaControl->Stop()"); if(!ComResult(mMediaControl->Stop()).success()) { error("[CaptureDeviceGraph::stopGraph] mMediaControl->Stop() Failed."); return false; } return true; } bool CaptureDeviceGraph::pauseGraph(void) { LOG("[CaptureDeviceGraph::pauseGraph] mMediaControl->Pause()"); if(!ComResult(mMediaControl->Pause()).success()) { stopGraph(); error("[CaptureDeviceGraph::pauseGraph] mMediaControl->Stop() Failed."); return false; } return true; } bool CaptureDeviceGraph::getTimecode(TIMECODE_SAMPLE &tcSample) { LOG("[CaptureDeviceGraph::getTimecode] mTimecodeReader->GetTimecode(&tcSample)"); if(!ComResult(mTimecodeReader->GetTimecode(&tcSample)).success())return false; return true; } bool CaptureDeviceGraph::setNotifyWindow(GUIWindow &window,int command) { LOG("[CaptureDeviceGraph::setNotifyWindow] mMediaEvent->SetNotifyWindow((LONG_PTR)window.getHandle(),command,0)"); if(!ComResult(mMediaEvent->SetNotifyWindow((LONG_PTR)window.getHandle(),command,0)).success())return false; return true; } bool CaptureDeviceGraph::putOwner(GUIWindow &window) { LOG("[CaptureDeviceGraph::putOwner] mVideoWindow->put_Owner((OAHWND)window.getHandle())"); if(!ComResult(mVideoWindow->put_Owner((OAHWND)window.getHandle())).success())return false; return true; } bool CaptureDeviceGraph::putWindowStyle(int style) { LOG("[CaptureDeviceGraph::putWindowStyle] mVideoWindow->put_WindowStyle(style)"); if(!ComResult(mVideoWindow->put_WindowStyle(style)).success())return false; return true; } bool CaptureDeviceGraph::setVideoWindowPosition(int left,int top,int width,int height) { LOG("[CaptureDeviceGraph::setVideoWindowPosition] mVideoWindow->SetWindowPosition(left,top,width,height)"); if(!ComResult(mVideoWindow->SetWindowPosition(left,top,width,height)).success())return false; return true; } bool CaptureDeviceGraph::setVideoWindowVisible(bool visible) { LOG("[CaptureDeviceGraph::setVideoWindowVisible] mVideoWindow->put_Visible(visible?OATRUE:OAFALSE)"); if(!ComResult(mVideoWindow->put_Visible(visible?OATRUE:OAFALSE)).success())return false; return true; } bool CaptureDeviceGraph::putIAMExtTransportMode(int mode) { if(!mExtTransport.isOkay())return false; LOG("[CaptureDeviceGraph::putIAMExtTransportMode] mExtTransport->put_Mode(mode)"); return mExtTransport->put_Mode(mode); } bool CaptureDeviceGraph::seekAtn(int hour,int minute,int second,int frame) { BYTE rawAVCPkt[8]={0x00,0x20,0x52,0x20,0xff,0xff,0xff,0xff}; // raw AVC for seek atn ULONG searchTrackNumber; ComResult comResult; long iCnt=sizeof(rawAVCPkt); bool returnCode=false; if(DVENCODERVIDEOFORMAT_PAL==mVideoFormat && (frame>25)) { error("[CaptureDeviceGraph::seekAtn] Frame should be less than 25 for PAL"); return false; } if(DVENCODERVIDEOFORMAT_NTSC==mVideoFormat && (frame>30)) { error("[CaptureDeviceGraph::seekAtn] Frame should be less than 30 for NTSC"); return false; } if((hour<26)&&(hour>=0)&&(minute<60)&&(minute>=0)&&(second<60)) { if(40==mAverageTimePerFrame) { searchTrackNumber=((minute*60+second)*25+frame)*12*2; } else // drop two frame every minutes { searchTrackNumber=((minute*60+second)*30+frame-((minute-(minute/10))*2))*10*2; } rawAVCPkt[4]=(BYTE)(searchTrackNumber&0x000000ff); rawAVCPkt[5]=(BYTE)((searchTrackNumber&0x0000ff00) >> 8); rawAVCPkt[6]=(BYTE)((searchTrackNumber&0x00ff0000) >> 16); LOG("[CaptureDeviceGraph::seekAtn] mExtTransport->GetTransportBasicParameters(ED_RAW_EXT_DEV_CMD,&iCnt,(LPOLESTR *)rawAVCPkt)"); comResult=mExtTransport->GetTransportBasicParameters(ED_RAW_EXT_DEV_CMD,&iCnt,(LPOLESTR *)rawAVCPkt); if(!comResult.success()) { if(ERROR_TIMEOUT==comResult.result())::OutputDebugString("ATN Seek returns ERROR_TIMEOUT\n"); else if(ERROR_REQ_NOT_ACCEP==comResult.result())::OutputDebugString(" ATN Seek returns ERROR_REQ_NOT_ACCEP\n"); else if(ERROR_NOT_SUPPORTED==comResult.result())::OutputDebugString(" ATN Seek returns ERROR_NOT_SUPPORTED\n"); else if(ERROR_REQUEST_ABORTED==comResult.result())::OutputDebugString(" ATN Seek returns ERROR_REQUEST_ABORTED\n"); } returnCode=true; } else { error("Invalid Parameter - Time entered should be:\nHour:Minute:Second:Frame"); } return returnCode; } bool CaptureDeviceGraph::nukeInputFileFilter() { Nuker nuker(mGraph); if(!nuker.nukeFilter(mInputFileFilter,true,false)) { LOG("[CaptureDeviceGraph::nukeInputFileFilter] Failed."); return false; } mGraph->RemoveFilter(mInputFileFilter); mInputFileFilter.Release(); return true; } bool CaptureDeviceGraph::nukeDeviceFilter() { Nuker nuker(mGraph); if(!nuker.nukeFilter(mDeviceFilter,true,true)) { LOG("[CaptureDeviceGraph::nukeDeviceFilter] Failed."); return false; } return true; }