Using a DirectShow filter without registration, through a private CoCreateInstance

So, I just read this, http://www.gdcl.co.uk/2011/June/UnregisteredFilters.htm .

Tells you how to use filters without registering them. There are two methods: new and using private CoCreateInstance. I am trying to use the CoCreateInstance method.

In the sample from the site, the code is indicated as

IUnknownPtr pUnk; HRESULT hr = CreateObjectFromPath(TEXT("c:\\path\\to\\myfilter.dll"), IID_MyFilter, &pUnk); if (SUCCEEDED(hr)) { IBaseFilterPtr pFilter = pUnk; pGraph->AddFilter(pFilter, L"Private Filter"); pGraph->RenderFile(pMediaClip, NULL); } 

My code is as follows:

 IUnknownPtr pUnk; HRESULT hr = CreateObjectFromPath(TEXT("c:\\filters\\mp4demux.dll"), IID_BaseFilter, &pUnk); if (SUCCEEDED(hr)) { //add functionality } 

I assume that IID_BaseFilter is what I should use, its what I use for other filters. But I was given the error "ClassFactory cannot provide the requested class."

Am I missing something? Any help would be greatly appreciated. Thanks in advance!

EDIT: Code

 IBaseFilter *pSrc = NULL, *pSrc2 = NULL, *pWaveDest = NULL, *pWriter = NULL; IFileSinkFilter *pSink= NULL; IGraphBuilder *pGraph; ICaptureGraphBuilder2 *pBuild; IMediaControl *pControl = NULL; // This example omits error handling. hr = CoCreateInstance(CLSID_CaptureGraphBuilder2, NULL, CLSCTX_INPROC_SERVER, IID_ICaptureGraphBuilder2, (void**)&pBuild); hr = CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (void**)&pGraph); //Initialize the Capture Graph Builder hr = pBuild->SetFiltergraph(pGraph); // Not shown: Use the System Device Enumerator to create the // audio capture filter. hr = pMoniker->BindToObject(0, 0, IID_IBaseFilter, (void**)&pSrc); hr = pGraph->AddFilter(pSrc, L"VideooCap"); hr = pMoniker2->BindToObject(0, 0, IID_IBaseFilter, (void**)&pSrc2); hr = pGraph->AddFilter(pSrc2, L"AudioCap"); IBaseFilter *pMux; //IFileSinkFilter *pSink; hr = pBuild->SetOutputFileName( &MEDIASUBTYPE_Avi, // Specifies AVI for the target file. L"C:\\wav\\Example2.mp4", // File name. &pMux, // Receives a pointer to the mux. NULL); // (Optional) Receives a pointer to the file sink. IUnknownPtr pUnk; //static CLSID const clsid = { 0x025BE2E4, 0x1787, 0x4DA4, { 0xA5,0x85,0xC5,0xB2,0xB9,0xEE,0xB5,0x7C } }; static CLSID const clsid = { 0x5FD85181, 0xE542, 0x4e52, { 0x8D,0x9D,0x5D,0x61,0x3C,0x30,0x13,0x1B } }; //5FD85181-E542-4e52-8D9D5D613C30131B HRESULT hr = CreateObjectFromPath(TEXT("c:\\filters\\mp4mux.dll"), clsid, &pUnk); if (SUCCEEDED(hr)) { IBaseFilterPtr pFilter = pUnk; HRESULT hr = pGraph->AddFilter(pFilter, L"Private Filter"); } hr = pBuild->RenderStream( NULL,//NULL,//&PIN_CATEGORY_CAPTURE, // Pin category. NULL,//&MEDIATYPE_Interleaved,//NULL,//&MEDIATYPE_Audio, // Media type. pSrc, // Capture filter. NULL, // Intermediate filter (optional). pMux); // Mux or file sink filter. hr = pBuild->RenderStream( NULL,//NULL,//&PIN_CATEGORY_CAPTURE, // Pin category. NULL,//&MEDIATYPE_Interleaved,//NULL,//&MEDIATYPE_Audio, // Media type. pSrc2, // Capture filter. NULL, // Intermediate filter (optional). pMux); // Mux or file sink filter. IMediaControl *pMC = NULL; hr = pGraph->QueryInterface(IID_IMediaControl, (void **)&pMC); printf("START"); hr = pMC->Run(); Sleep(4000); hr = pMC->Stop(); printf("END"); CoUninitialize(); } } 
+6
source share
1 answer

You should re-read Using filters without registering . The second parameter is the CLSID , the class identifier, and not the interface identifier ( IBaseFilter ).

For the GDCL MPEG-4 demultiplexer, it looks like this:

 class __declspec(uuid("025BE2E4-1787-4DA4-A585-C5B2B9EEB57C")) GdclMp4Demux; // GDCL Mpeg-4 Demultiplexor ... = CreateObjectFromPath(..., __uuidof(GdclMp4Demux), ...); 
+5
source

Source: https://habr.com/ru/post/918954/


All Articles