GetOutputAvailableType() возвращает MF_E_TRANSFORM_TYPE_NOT_SET

Я пытаюсь декодировать видео h264 с камеры. Я настроил декодер следующим образом. Я не могу понять, почему функция GetOutputAvailableType() возвращает MF_E_TRANSFORM_TYPE_NOT_SET.Я также заметил, что GetStreamIDs() возвращает E_NOTIMPL. Я проверил в msdn, что дано "MFT имеет фиксированное количество потоков, и \n идентификаторы потоков являются последовательными, начиная с нуля.". Может ли какая-то часть также объяснить, что это значит?

HRESULT CH264_decodingDlg::ConfugureDecoder(IMFTransform *pDecoder)
{

HRESULT hr = S_OK;
IMFMediaType* pMediaTypeInput = NULL;


//Creating Input Media Type
hr  = MFCreateMediaType(&pMediaTypeInput);
if (FAILED(hr)) return hr;



DWORD dwIn = 0,dwOut = 0;
hr = pDecoder->GetStreamCount(&dwIn,&dwOut);
if (FAILED(hr)) return hr;
if (dwIn)
{
    DWORD dwInputID[2] ={0} ;
    DWORD dwOutputID[2]= {0};

            hr = pDecoder->GetStreamIDs(dwIn,dwInputID,dwOut,dwOutputID);

    //if (FAILED(hr)) return hr;
    GUID guidCurrent;
    GUID guidMajor;
    for (int i = 0; i< 8; i++)
    {

        hr = pDecoder->GetInputAvailableType(0,i,&pMediaTypeInput);
        hr  = pMediaTypeInput->GetGUID(MF_MT_MAJOR_TYPE, &guidMajor);
        if (guidMajor == MFMediaType_Video)    //safety check
        {
            if (hr == MF_E_NO_MORE_TYPES)
            {
                break;
            }

            hr  = pMediaTypeInput->GetGUID( MF_MT_SUBTYPE, &guidCurrent );

            if ( guidCurrent == MFVideoFormat_H264 )        //m_pVideoSubtype = MEDIASUBTYPE_WVC1
            {
                break;
            }
        }
    }
    // Set MF_MT_MAJOR_TYPE
    hr = pMediaTypeInput->SetGUID(MF_MT_MAJOR_TYPE ,MFMediaType_Video);
    if (FAILED(hr)) return hr;

    // Set MF_MT_SUBTYPE
    hr = pMediaTypeInput->SetGUID(MF_MT_SUBTYPE ,MFVideoFormat_H264);
    if (FAILED(hr)) return hr;

    // Set MF_MT_FRAME_RATE
    UINT32 nNumerator = 30;
    UINT32 nDenominator = 1;
    hr  = MFSetAttributeRatio(pMediaTypeInput,MF_MT_FRAME_RATE ,nNumerator,nDenominator);
    if (FAILED(hr)) return hr;

    // Set MF_MT_FRAME_SIZE
    UINT32 nWidth = 640 ;
    UINT32 nHeight = 480;
    hr = MFSetAttributeSize(pMediaTypeInput, MF_MT_FRAME_SIZE, nWidth, nHeight);
    if (FAILED(hr)) return hr;

    // Set MF_MT_MPEG2_PROFILE
    hr = pMediaTypeInput->SetUINT32(MF_MT_MPEG2_PROFILE, eAVEncH264VProfile_Base);
    if (FAILED(hr)) return hr;

    // Set MF_MT_INTERLACE_MODE
    hr = pMediaTypeInput->SetUINT32(MF_MT_INTERLACE_MODE ,MFVideoInterlace_Progressive);
    if (FAILED(hr)) return hr;

    // Set MF_MT_PIXEL_ASPECT_RATIO 
    hr = MFSetAttributeRatio(pMediaTypeInput,MF_MT_PIXEL_ASPECT_RATIO,1,1);
    if (FAILED(hr)) return hr;

    //Set Input Media Type
    hr = pDecoder->SetInputType(0,pMediaTypeInput,MFT_SET_TYPE_TEST_ONLY);
    if (FAILED(hr)) return hr;

    //Creating Output Media Type
    IMFMediaType* pMediaTypeOutput = NULL;
    hr  = MFCreateMediaType(&pMediaTypeOutput);
    if (FAILED(hr)) return hr;

    hr = pDecoder->GetOutputAvailableType(0,0,&pMediaTypeOutput);
    if (FAILED(hr)) return hr;`

1 ответ

Решение

Прежде чем вы сможете получить тип выходного носителя, вы должны установить тип входного носителя. Я не вижу, что вы делаете это (SetInputType называется с MFT_SET_TYPE_TEST_ONLY).

Другие вопросы по тегам