MFXVideoDECODE_Init завершается ошибкой с MFX_ERR_MEMORY_ALLOC

Я пытаюсь использовать Intel-Media-SDK декодер для видео h.264. Вот мой код для инициализации декодера:

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 и странная вещь здесь в этот документ он говорит, что эта функция не имеет этого возвращаемого значения.

Вот некоторая отладочная информация о mfxVideoParams :

AllocId = 0, AsyncDepth = 0, IOPattern = 16, mfx.CodecId = 541283905,
mfx.CodecProfile = 77, mfx.CodecLevel = 30, vpp.In.FourCC = 842094158,
vpp.In.Width = 864, vpp.In.Height = 480, vpp.In.CropW = 854,
vpp.In.CropH = 480, vpp.In.BufferSize = 31458144, vpp.In.AspectRatioW
= 1, vpp.In.AspectRatioH = 1, vpp.In.PicStruct = 1, vpp.In.ChromaFormat = 1

Вот некоторые данные определения члена в заголовке, которые используются здесь:

MFXVideoSession m_mfxSession;
MFXVideoDECODE m_mfxVideoDecode;
mfxFrameAllocRequest m_mfxRequest;
mfxFrameSurface1** m_pmfxSurfaces;

А вот некоторая информация о моем текущем работающем устройстве, которая может быть связана с этой проблемой:

  • Операционная система: Windows 8.1
  • Процессор: Intel (R) Core (TM) i5-3470 CPU @ 3,20 ГГц
  • Тип системы: 64-разрядная операционная система, 64-разрядный процессор
  • Установленная память (RAM): 8,00 ГБ

И наконец, чтобы воспроизвести точно такую ​​же ситуацию, я скачал видео под названием big_buck_bunny_1080p_h264.mov от этот сайт а затем извлек его с помощью ffmpeg в h264 и использовал его в моей программе.

2

Решение

Вам нужно инициализировать функции обратного вызова 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
}
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]