Video Processor MFT causes error 'The request is invalid in the current state'

0

I am using Media Foundation to create a webcam viewer. Critical to this application is that the webcam stream is horizontally mirrored. I am using the Video Processor MFT to achieve this. Here's the relevant code to add the MFT:

void tryMirror(IMFPMediaPlayer* pPlayer) {
    IMFTransform* pMFT = NULL;
    IMFVideoProcessorControl* pVPC = NULL;

    HRESULT hr = CoCreateInstance(CLSID_VideoProcessorMFT, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pMFT));
    if (FAILED(hr)) {
        ShowHResultErrorMessage(L"CoCreateInstance(CLSID_VideoProcessorMFT, ...) failed", hr);
        goto done;
    }

    hr = pMFT->QueryInterface(&pVPC);
    if (FAILED(hr)) {
        ShowHResultErrorMessage(L"pMFT->QueryInterface(&pVPC) failed", hr);
        goto done;
    }

    hr = pVPC->SetMirror(MIRROR_HORIZONTAL);
    if (FAILED(hr)) {
        ShowHResultErrorMessage(L"pVPC->SetMirror(MIRROR_HORIZONTAL) failed", hr);
        goto done;
    }

    hr = pPlayer->InsertEffect(pMFT, FALSE);  // Not optional - critical functionality
    if (FAILED(hr)) {
        ShowHResultErrorMessage(L"m_pPlayer->InsertEffect(CLSID_VideoProcessorMFT) failed", hr);
        goto done;
    }

    done:
    SafeRelease(&pMFT);
    SafeRelease(&pVPC);
}

// class CPreview implements IMFPMediaPlayerCallback as follows

void STDMETHODCALLTYPE CPreview::OnMediaPlayerEvent(MFP_EVENT_HEADER* pEventHeader) {
    switch (pEventHeader->eEventType)
    {
        //...
        case MFP_EVENT_TYPE_MEDIAITEM_SET:
            OnMediaItemSet(MFP_GET_MEDIAITEM_SET_EVENT(pEventHeader));
            break;

        case MFP_EVENT_TYPE_PLAY:
            OnMfpPlay(MFP_GET_PLAY_EVENT(pEventHeader));
            break;
    }
}

// Called after I set the webcam media source
void CPreview::OnMediaItemSet(MFP_MEDIAITEM_SET_EVENT* /*pEvent*/)
{
    HRESULT hr = m_pPlayer->Play();
    if (FAILED(hr)) {
        ShowHResultErrorMessage(L"m_pPlayer->Play() failed", hr);
    }
}

void CPreview::OnMfpPlay(MFP_PLAY_EVENT* pEvent) {
    if (FAILED(pEvent->header.hrEvent)) {
        ShowHResultErrorMessage(L"OnMfpPlay failed", pEvent->header.hrEvent);
        WCHAR msg[1000];
        HRESULT hr = StringCbPrintf(msg, sizeof(msg), L"Event type: 0x%X", pEvent->header.eEventType);
        ShowErrorMessage(msg);
        return;
    }
}

void ShowHResultErrorMessage(PCWSTR errContext, HRESULT hrErr) {
    _com_error err(hrErr);
    LPCTSTR hrErrMsg = err.ErrorMessage();
    WCHAR msg[1000];
    HRESULT hr = StringCbPrintf(msg, sizeof(msg), L"%s (HRESULT=0x%X, %s)", errContext, hrErr, hrErrMsg);
    if (SUCCEEDED(hr)) {
        MessageBox(NULL, msg, L"Error", MB_ICONERROR);
    }
}

On my development machine, this program runs without error, exactly as desired. However, on a different user machine, it fails with this error:

OnMfpPlay failed (HRESULT=0xC00D36B2, The request is invalid in the current state.)

That is, this error comes through on the OnMediaPlayerEvent callback of the IMFPMediaPlayerCallback object.

I do know a few things about the machine that this fails on:

  • The user has also run a modified version, with the MFT set to optional, like so: pPlayer->InsertEffect(pMFT, TRUE). In this case, the program runs, but the mirroring MFT has no effect. The error is definitely caused by this MFT.
  • This user is running Windows 10, version 1909. The Video Processor MFT is clearly available. Its API claims to work - all HRESULTs are successful.

This error, "The request is invalid in the current state", could mean anything, and I can't find any way to get more observability. What does 'The request is invalid in the current state' mean? Why is it generated by adding a Video Processor MFT, only on some machines? How can I debug this with a more specific error?

c++
winapi
ms-media-foundation
asked on Stack Overflow Apr 19, 2020 by jameshfisher

0 Answers

Nobody has answered this question yet.


User contributions licensed under CC BY-SA 3.0