Error al ejecutar: 0x80070057, al decodificar video a través de ffmpeg con dxva2

He implementado con éxito un reproductor de video usando ffmpeg. Ahora estoy tratando de usar la decodificación de hardware, pero me enfrento a un par de problemas. Encontré una publicación que seguí como punto de partida aquí:http://comments.gmane.org/gmane.comp.video.ffmpeg.libav.user/13523

He actualizado el código que configura las cosas necesarias para el decodificador. El código actualizado está disponible aquí:https://drive.google.com/file/d/0B5ufHdoDzA4ieVk5UVpxcDNzRHc/view?usp=sharing

Y así es como lo estoy usando para inicializar el decodificador:

// Prepare the decoding context
AVCodec *codec = nullptr;
_codecContext = _avFormatContext->streams[_streamIndex]->codec;
if ((codec = avcodec_find_decoder(_codecContext->codec_id)) == 0)
{
    std::cout << "Unsupported video codec!" << std::endl;
    return false;
}

_codecContext->thread_count = 1;  // Multithreading is apparently not compatible with hardware decoding
InputStream *ist = new InputStream();
ist->hwaccel_id = HWACCEL_AUTO;
ist->hwaccel_device = "dxva2";
ist->dec = codec;
ist->dec_ctx = _codecContext;
_codecContext->coded_width = _width;
_codecContext->coded_height = _height;

_codecContext->opaque = ist;
dxva2_init(_codecContext);

_codecContext->get_buffer2 = ist->hwaccel_get_buffer;
_codecContext->get_format = GetHwFormat;
_codecContext->thread_safe_callbacks = 1;

if (avcodec_open2(_codecContext, codec, nullptr) < 0)
{
    std::cout << "Video codec open error" << std::endl;
    return false;
}

Y aquí está la definición de GetHwFormat mencionada anteriormente:

AVPixelFormat GetHwFormat(AVCodecContext *s, const AVPixelFormat *pix_fmts)
{
    InputStream* ist = (InputStream*)s->opaque;
    ist->active_hwaccel_id = HWACCEL_DXVA2;
    ist->hwaccel_pix_fmt = AV_PIX_FMT_DXVA2_VLD;
    return ist->hwaccel_pix_fmt;
}

Cuando abro un video mp4 (codificado en h264) con resolución HD o menos, todo parece estar funcionando bien. Sin embargo, tan pronto como pruebo videos de mayor resolución como 3840x2160, recibo los siguientes errores repetidamente:

Failed to execute: 0x80070057
Hardware accelerator failed to decode picture

También empiezo a recibir los siguientes errores después de unos segundos:

co located POCs unavailable

Y el video no se muestra correctamente: obtengo muchos artefactos en todo el video y está retrasado. Verifiqué el primer error en el código fuente de ffmpeg. Parece que IDirectXVideoDecoder_Execute falla debido a un parámetro no válido. Como esto está sucediendo dentro de ffmpeg, debe haber algo que me falta pero no puedo entender qué. La única publicación relevante que encontré con este error fue debido al subproceso múltiple, pero configuré el thread_count a 1 antes de abrir el códec.

Este problema está ocurriendo en mi computadora principal que tiene las siguientes especificaciones:

CPU i7-4790 @ 3.6GHzRAM 16 GBIntel HD Graphics 4600Windows 8.1

El mismo problema no ocurre en mi segunda computadora que tiene las siguientes especificaciones:

i7 4510U @ 2GHzRAM 8 GBNVIDIA GeForce GTX 750TiWindows 10

Si uso DXVAChecker en mi equipo principal, que dice que mi tarjeta gráfica es compatible con DXVA2 para H264_VLD_ *, y puedo ver que se están haciendo las llamadas a la API de Microsoft (DXVA2_DecodeDeviceCreated, DXVA2_DecodeDeviceBeginFrame, DXVA2_DecodeDeviceGetBuffer, DXVA2_DecodeDeviceExecute, DXVA2_DecodeDeviceEndFrame) mientras mi vídeo es jugando.

Tampoco veo ningún aumento en el uso de GPU (en cualquier computadora) entre la versión con decodificación de hardware y la versión sin; Sin embargo, veo una disminución en el uso de la CPU (aunque no tanto como esperaba). Esto también es muy extraño.

Tenga en cuenta que probé tanto la versión de Windows disponible en el sitio web de FFmpeg como una versión que compilé con --enable-dxva2. Ya he buscado mucho pero no pude encontrar lo que estoy haciendo mal.

Con suerte, ¿alguien puede ayudarme o tal vez señalarme un mejor ejemplo?

Respuestas a la pregunta(1)

Su respuesta a la pregunta