Question

I am trying to decode h264 video from my camera I have configured the decoder as follows. I am not able to figure out why GetOutputAvailableType() function returns MF_E_TRANSFORM_TYPE_NOT_SET.I have also noticed that GetStreamIDs() returns E_NOTIMPL. I have checked in msdn it is given "MFT has a fixed number of streams, and \n the stream identifiers are consecutive starting from zero.".Can some body also explain what does this means?

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;`
Was it helpful?

Solution

Before you can get output media type, you have to set input media type. I don't see you are doing this (SetInputType is called with MFT_SET_TYPE_TEST_ONLY).

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top