Example #1
0
// IMFSchemeHandler methods
IFACEMETHODIMP CSchemeHandler::BeginCreateObject( 
        _In_ LPCWSTR pwszURL,
        _In_ DWORD dwFlags,
        _In_ IPropertyStore *pProps,
        _Out_opt_  IUnknown **ppIUnknownCancelCookie,
        _In_ IMFAsyncCallback *pCallback,
        _In_ IUnknown *punkState)
{
    if (pwszURL == nullptr || pCallback == nullptr)
    {
        return E_INVALIDARG;
    }

    if ((dwFlags & MF_RESOLUTION_MEDIASOURCE) == 0)
    {
        return E_INVALIDARG;
    }

    ComPtr<CMediaSource> spSource;
    ComPtr<IMFAsyncResult> spResult;
    HRESULT hr = CMediaSource::CreateInstance(&spSource);

    if (SUCCEEDED(hr))
    {
        ComPtr<IUnknown> spunkSource;
        hr = spSource.As(&spunkSource);
        if (SUCCEEDED(hr))
        {
            hr = MFCreateAsyncResult(spunkSource.Get(), pCallback, punkState, &spResult);
        }
    }

    if (SUCCEEDED(hr))
    {            
        hr = spSource->BeginOpen(pwszURL, &_OnSourceOpenCB, spResult.Get());
    }

    if (SUCCEEDED(hr) && ppIUnknownCancelCookie != nullptr)
    {
        *ppIUnknownCancelCookie = nullptr;
    }

    if (FAILED(hr))
    {
        spSource->Shutdown();
    }

    TRACEHR_RET(hr);
}