我正在尝试对h.264视频使用intel-media-sdk解码器。这是我初始化解码器的代码:

mfxStatus decoder::initDecoder(HWND window, mfxBitstream *Header) {
    mfxStatus sts = MFX_ERR_NONE;
    mfxVersion ver = { { 0, 1 } };
    mfxVideoParam mfxVideoParams;
    mfxFrameAllocator mfxAllocator;
    mfxFrameAllocResponse mfxResponse;

    sts = m_mfxSession.Init(MFX_IMPL_AUTO_ANY, &ver); //sts = MFX_ERR_NONE

    if (sts == MFX_ERR_NONE) {
        sts = m_mfxSession.SetHandle(MFX_HANDLE_DIRECT3D_DEVICE_MANAGER9,
            m_renderer.initD3d(GetIntelDeviceAdapterNum(), window)); //sts = MFX_ERR_NONE
        if (sts == MFX_ERR_NONE) {
            mfxAllocator.pthis = m_mfxSession;
            sts = m_mfxSession.SetFrameAllocator(&mfxAllocator); //sts = MFX_ERR_NONE
            if (sts == MFX_ERR_NONE) {
                MFXVideoDECODE mfxDEC(m_mfxSession);
                m_mfxVideoDecode = mfxDEC;
                memset(&mfxVideoParams, 0, sizeof(mfxVideoParams));
                mfxVideoParams.mfx.CodecId = MFX_CODEC_AVC;
                mfxVideoParams.IOPattern = MFX_IOPATTERN_OUT_VIDEO_MEMORY;

                sts = m_mfxVideoDecode.DecodeHeader(Header, &mfxVideoParams); //sts = MFX_ERR_NONE
                if (sts == MFX_ERR_NONE) {
                    memset(&m_mfxRequest, 0, sizeof(m_mfxRequest));
                    sts = m_mfxVideoDecode.QueryIOSurf(&mfxVideoParams, &m_mfxRequest); //sts = MFX_ERR_NONE
                    if (sts == MFX_ERR_NONE) {
                        sts = m_renderer.allocSurfaces(mfxAllocator.pthis, &m_mfxRequest, &mfxResponse);
                        if (sts == MFX_ERR_NONE) {
                            m_pmfxSurfaces = new mfxFrameSurface1 *[m_mfxRequest.NumFrameSuggested];
                            for (int i = 0; i < m_mfxRequest.NumFrameSuggested; i++) {
                                m_pmfxSurfaces[i] = new mfxFrameSurface1;
                                memset(m_pmfxSurfaces[i], 0, sizeof(mfxFrameSurface1));
                                memcpy(&(m_pmfxSurfaces[i]->Info), &(mfxVideoParams.mfx.FrameInfo), sizeof(mfxFrameInfo));
                                // MID (memory id) represents one video NV12 surface
                                m_pmfxSurfaces[i]->Data.MemId = mfxResponse.mids[i];
                            };
                            sts = m_mfxVideoDecode.Init(&mfxVideoParams); //sts = MFX_ERR_MEMORY_ALLOC
                        }
                    }
                }
            }
        }
    }

    return sts;
}

因此,您可以看到MFXVideoDECODE::Init(mfxVideoParam*)(内部称为MFXVideoDECODE_Init)返回MFX_ERR_MEMORY_ALLOC,而奇怪的是在this document中,它表示此函数没有此返回值。

这是有关mfxVideoParams的一些调试信息:



这是在这里使用的 header 中的一些成员数据定义:
MFXVideoSession m_mfxSession;
MFXVideoDECODE m_mfxVideoDecode;
mfxFrameAllocRequest m_mfxRequest;
mfxFrameSurface1** m_pmfxSurfaces;

这是关于我当前工作设备的一些信息,可能与此问题有关:
  • 操作系统:Windows 8.1
  • 处理器:Intel(R)Core(TM)i5-3470 CPU @ 3.20GHZ
  • 系统类型:64位操作系统,基于x64的处理器
  • 安装的内存(RAM):8.00 GB

  • 最后,为了重现同样的情况,我从this site下载了名为big_buck_bunny_1080p_h264.mov的视频,然后用ffmpeg将其提取到h264,并在我的程序中使用了它。

    最佳答案

    您需要使用适当的函数初始化mfxFrameAlocator回调函数(Alloc,Free,GetHDL等)。
    例如 :

    //static member
    mfxStatus decoder::gethdl(mfxHDL pthis, mfxMemId mid, mfxHDL* handle)
    {
        pthis; // To avoid warning for this unused parameter
    
        if (handle == 0) return MFX_ERR_INVALID_HANDLE;
    
        *handle = mid;
        return MFX_ERR_NONE;
    }
    
    
    
    mfxStatus decoder::initDecoder(HWND window, mfxBitstream *Header) {
    
        //blah blah
        mfxAllocator.pthis = m_mfxSession;
        mfxAllocator.GetHDL = gethdl;
        //define for these too
        //mfxAllocator.Alloc = alloc;
        //mfxAllocator.Free = free;
        //mfxAllocator.Lock = lock;
        //mfxAllocator.Unlock = unlock;
    
        //rest of your code
    }
    

    关于c++ - MFXVideoDECODE_Init失败,出现MFX_ERR_MEMORY_ALLOC,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46948537/

    10-11 15:38