Quantcast
Channel: CodeGuru Forums - Visual C++ Programming
Viewing all articles
Browse latest Browse all 3021

IBaseFilter in FFDSHOW

$
0
0
Hi,

I have an app using DirectShow. There I connect to ffdshow by this code
Code:

    HRESULT hr = S_OK;

    CComPtr<IBaseFilter>    pH264 = NULL;
    CComPtr<IUnknown> pIUnknown;
    hr = CoCreateInstance(CLSID_FFDShow_Decoder, NULL, CLSCTX_INPROC_SERVER, IID_IUnknown, (void**)&pIUnknown);
    RIF(hr);
    hr = pIUnknown->QueryInterface(IID_IBaseFilter, (void**)&pH264);
    RIF(hr);

it worked well, but this week I have tried to updated the ffdshow files to the last version. After it I get the error on pIUnknown->QueryInterface()

Code:

E_NOINTERFACE No such interface supported.

Why? Did not the last ffdshow support IBaseFilter?

PS. The new filter registration:

Code:

regsvr32 /u ffdshow.ax
regsvr32 ffdshow.ax

and new codes modification:

Code:

        HRESULT hr = S_OK;

        CComPtr<IBaseFilter>        pH264 = NULL;
        CComPtr<IBaseFilter> pAudioDecoder = NULL;


        CComPtr<ICreateDevEnum> pSysDevEnum = NULL;
        hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER,
                IID_ICreateDevEnum, (void **)&pSysDevEnum);
        RIF(hr);

        // Obtain a class enumerator for the video compressor category.
        CComPtr<IEnumMoniker> pEnumCat = NULL;
        hr = pSysDevEnum->CreateClassEnumerator(CLSID_LegacyAmFilterCategory, &pEnumCat, 0);

        int nCountComplect = 0;
        if (hr == S_OK)
        {
                // Enumerate the monikers.
                CComPtr<IMoniker> pMoniker = NULL;
                ULONG cFetched;
                while(pEnumCat->Next(1, &pMoniker, &cFetched) == S_OK)
                {
                        CComPtr<IPropertyBag> pPropBag;
                        hr = pMoniker->BindToStorage(0, 0, IID_IPropertyBag,
                                (void **)&pPropBag);
                        if (SUCCEEDED(hr))
                        {
                                // To retrieve the filter's friendly name, do the following:
                                VARIANT varName;
                                VariantInit(&varName);
                                hr = pPropBag->Read(L"FriendlyName", &varName, 0);
                                if (SUCCEEDED(hr))
                                {
                                        // Display the name in your UI somehow.
                                        if (_tcscmp(varName.bstrVal, L"ffdshow Video Decoder") == 0)
                                        {
                                                nCountComplect ++;
                                                hr = pMoniker->BindToObject(NULL, NULL, IID_IBaseFilter,
                                                        (void**)&pH264);
                                                VariantClear(&varName);
                                                RIF(hr);
                                                hr = m_pGraph->AddFilter(pH264, L"FFDShowVideoDecoder");
                                                RIF(hr);
                                                if (nCountComplect == 2)
                                                {
                                                        break;
                                                }
                                                else
                                                {
                                                        pMoniker.Release();
                                                        continue;
                                                }
                                        }
                                        else if (_tcscmp(varName.bstrVal, L"ffdshow Audio Decoder") == 0)
                                        {
                                                nCountComplect ++;
                                                hr = pMoniker->BindToObject(NULL, NULL, IID_IBaseFilter,
                                                        (void**)&pAudioDecoder);
                                                VariantClear(&varName);
                                                RIF(hr);
                                                hr = m_pGraph->AddFilter(pAudioDecoder, L"FFDShowAudioDecoder");
                                                RIF(hr);
                                                if (nCountComplect == 2)
                                                {
                                                        break;
                                                }
                                                else
                                                {
                                                        pMoniker.Release();
                                                        continue;
                                                }
                                        }
                                }
                                VariantClear(&varName);
                                pMoniker.Release();
                        }
                }
        }

did not help.

Please any ideas.

Viewing all articles
Browse latest Browse all 3021