3

Color Converter DMO ( http://msdn.microsoft.com/en-us/library/windows/desktop/ff819079(v=vs.85).aspx ) を使用して、メディア経由で RBG24 を YV12/NV12 に変換しようとしています。財団。CLSID_CColorConvertDMO を使用してカラー コンバーター DSP のインスタンスを作成し、必要な入力/出力タイプを設定しようとしましたが、GetOutputAvailableTypeおよびによって返されるメディア タイプを使用している場合でも、呼び出しは常に E_INVALIDARG を返しGetInputAvailableTypeます。メディアタイプをNULL次に、メディアの種類が無効であるというエラーが表示されます。これは理にかなっています。私はMSDNの例を見てきました.MSDNでは、利用可能な型を列挙して入力型として設定する人々が同じことをしています. これはコード例なしでは答えにくいことを理解しています。誰も同様の経験をしていない場合は、スニペットを投稿しようとしますが、誰かが同じ問題を経験した可能性がありますか?

4

1 に答える 1

4

この DMO/DSP はデュアル インターフェイスであり、 を備えた DMO とIMediaObjectを備えた MFT の両方IMFTransformです。2 つのインターフェイスには多くの共通点があります。RGB24 から YV12 への変換の初期化をテストするコード スニペットを次に示します。

#include "stdafx.h"
#include <dshow.h>
#include <dmo.h>
#include <wmcodecdsp.h>

#pragma comment(lib, "strmiids.lib")
#pragma comment(lib, "wmcodecdspuuid.lib")

int _tmain(int argc, _TCHAR* argv[])
{
    ATLVERIFY(SUCCEEDED(CoInitialize(NULL)));
    CComPtr<IMediaObject> pMediaObject;
    ATLVERIFY(SUCCEEDED(pMediaObject.CoCreateInstance(CLSID_CColorConvertDMO)));
    VIDEOINFOHEADER InputVideoInfoHeader;
    ZeroMemory(&InputVideoInfoHeader, sizeof InputVideoInfoHeader);
    InputVideoInfoHeader.bmiHeader.biSize = sizeof InputVideoInfoHeader.bmiHeader;
    InputVideoInfoHeader.bmiHeader.biWidth = 1920;
    InputVideoInfoHeader.bmiHeader.biHeight = 1080;
    InputVideoInfoHeader.bmiHeader.biPlanes = 1;
    InputVideoInfoHeader.bmiHeader.biBitCount = 24;
    InputVideoInfoHeader.bmiHeader.biCompression = BI_RGB;
    InputVideoInfoHeader.bmiHeader.biSizeImage = 1080 * (1920 * 3);
    DMO_MEDIA_TYPE InputMediaType;
    ZeroMemory(&InputMediaType, sizeof InputMediaType);
    InputMediaType.majortype = MEDIATYPE_Video;
    InputMediaType.subtype = MEDIASUBTYPE_RGB24;
    InputMediaType.bFixedSizeSamples = TRUE;
    InputMediaType.bTemporalCompression = FALSE;
    InputMediaType.lSampleSize = InputVideoInfoHeader.bmiHeader.biSizeImage;
    InputMediaType.formattype = FORMAT_VideoInfo;
    InputMediaType.cbFormat = sizeof InputVideoInfoHeader;
    InputMediaType.pbFormat = (BYTE*) &InputVideoInfoHeader;
    const HRESULT nSetInputTypeResult = pMediaObject->SetInputType(0, &InputMediaType, 0);
    _tprintf(_T("nSetInputTypeResult 0x%08x\n"), nSetInputTypeResult);
    VIDEOINFOHEADER OutputVideoInfoHeader = InputVideoInfoHeader;
    OutputVideoInfoHeader.bmiHeader.biBitCount = 12;
    OutputVideoInfoHeader.bmiHeader.biCompression = MAKEFOURCC('Y', 'V', '1', '2');
    OutputVideoInfoHeader.bmiHeader.biSizeImage = 1080 * 1920 * 12 / 8;
    DMO_MEDIA_TYPE OutputMediaType = InputMediaType;
    OutputMediaType.subtype = MEDIASUBTYPE_YV12;
    OutputMediaType.lSampleSize = OutputVideoInfoHeader.bmiHeader.biSizeImage;
    OutputMediaType.cbFormat = sizeof OutputVideoInfoHeader;
    OutputMediaType.pbFormat = (BYTE*) &OutputVideoInfoHeader;
    const HRESULT nSetOutputTypeResult = pMediaObject->SetOutputType(0, &OutputMediaType, 0);
    _tprintf(_T("nSetOutputTypeResult 0x%08x\n"), nSetOutputTypeResult);
    // TODO: ProcessInput, ProcessOutput
    pMediaObject.Release();
    CoUninitialize();
    return 0;
}

これは正常に動作し、2 つS_OKの s が出力されるはずです...

于 2013-03-11T16:12:49.380 に答える