0

フレームごとに変化するオーバーレイテキストを表示する目的で、デコーダーとレンダラーの間のDirectShowフィルターグラフに挿入されるインプレース変換フィルターを構築しようとしています。

変換フィルターは機能していますが、レンダラーに渡される画像にテキストを書き込むのに苦労しています。

VMR9で使用する次のテストコードがあります。

#define HR(x) if(FAILED(x)) { return x; }

HRESULT COverlay::Transform(IMediaSample* pSample)
{
    HR(pSample->GetMediaType(&pMt));
    if (pMt)
    {
        // Media type has changed grab the bitmap header so we have frame size etc.
        if (IsEqualGUID(pMt->formattype,FORMAT_VideoInfo))
        {
            VIDEOINFOHEADER* pVInfo = (VIDEOINFOHEADER*)pMt->pbFormat;
            ::memcpy(&bmi,&(pVInfo->bmiHeader),sizeof(BITMAPINFOHEADER));
        }
        else if (IsEqualGUID(pMt->formattype,FORMAT_VideoInfo2))
        {
            VIDEOINFOHEADER2* pVInfo = (VIDEOINFOHEADER2*)pMt->pbFormat;
            ::memcpy(&bmi,&(pVInfo->bmiHeader),sizeof(BITMAPINFOHEADER));
        }
        else
        {
            return S_FALSE;
        }
        DeleteMediaType(pMt);
    }

    IVMRSurface9* pvs = NULL;
    HR(pSample->QueryInterface(IID_IVMRSurface9, (void**)&pvs));

    IDirect3DSurface9* psfc;
    HR(pvs->GetSurface(&psfc));
    IDirect3DDevice9* pdev;
    HR(psfc->GetDevice(&pdev));

    if (_font == NULL)
    {
        // Create a font we can use to draw overlay text
        D3DXFONT_DESC fontDesc = {bmi.biHeight / 18,
                0,
                400,
                0,
                false,
                DEFAULT_CHARSET,
                OUT_TT_PRECIS,
                CLIP_DEFAULT_PRECIS,
            DEFAULT_PITCH,
                L"Arial"
        };

        _fontPosition.top = 0;
        _fontPosition.left = 0;
        _fontPosition.right = abs(bmi.biWidth);
        _fontPosition.bottom = abs(bmi.biHeight);

        HR(D3DXCreateFontIndirect(pdev,&fontDesc,&_font));
    }

    HR(pdev->BeginScene());

    //RECT qtr;
    //qtr.top = 0;
    //qtr.left = 0;
    //qtr.bottom = abs(bmi.biHeight)/4;
    //qtr.right = abs(bmi.biWidth)/4;
    //HR(pdev->ColorFill(psfc,&qtr,D3DCOLOR_ARGB(0xFF,0,0,0)));

    int x = _font->DrawText(NULL,L"Hello", -1, &_fontPosition, DT_CENTER|DT_VCENTER, 0xffffffff);

    HR(pdev->EndScene());

    //HR(pdev->Present(NULL,NULL,NULL,NULL));

    pdev->Release();
    psfc->Release();
    pvs->Release();
}

このコードを使用すると、ビデオの再生中に、ビデオウィンドウを移動またはサイズ変更した場合にのみ、フレームにテキストが表示されます。通常の再生中はテキストが表示されません。ウィンドウを移動またはサイズ変更すると、移動またはサイズ変更が進行中の場合にのみテキストが表示されます。

私はgrapheditを使用して、W764で32ビットモードでグラフを実行しています。

Presentの呼び出しの有無にかかわらずこれを試しましたが、同じ問題が発生します。

小さな長方形を着色するコメント付きコードは、すべての場合に正しく機能します。

H264 NALストリームをffdshowデコーダーにフィードする特注のソースフィルターがあります。ffdshowデコーダーは、VMR9に接続されているオーバーレイフィルター(上記のコードを含む)に接続されています。

異なるポストデコードフレームフォーマットを使用しても問題は変わりません。NV12とRGB32の両方で同じ症状が見られます。

この問題は、D3Dレンダリングパイプラインに関する知識が不足していることにあると思います。テキストオーバーレイを正しく表示する方法を教えてもらえますか?

ありがとう

4

0 に答える 0