Проблемы с get_buffer2 при использовании ffmpeg / dxva2
Я пытаюсь использовать аппаратное ускорение для декодирования h264 с использованием ffmpeg и dxva2. Я использую DX9. Я подтвердил, что моя сборка ffmpeg поддерживает dxva, хотя я сам ее не собирал.
Моя проблема связана с этим постом:
FFMPEG: При декодировании видео можно генерировать результат в предоставленный пользователем буфер?
Я подозреваю, что проблема в моем методе get_buffer2. После этого звонка я получаю эти ошибки / сообщения от ffmpeg:
Increasing reorder buffer to 1
Discarding mismatching reference
Discarding mismatching reference
Missing reference picture, default is 0
decode_slice_header error
hardware accelerator failed to decode picture
Failed to send packet: Operation not permitted
Основываясь на выводе "Отбрасывание несоответствующей ссылки", я считаю, что проблема заключается в несоответствии между высотой AVFrame и высотой в AVCodecContext.
AVFrame, входящий в myGetBuffer, имеет размер 1920x1088, но AVCodecContext имеет разрешение 1920x1080 (фактическое разрешение потока). Я понимаю, что буферы должны быть выровнены по 32 битам, и я получаю этот вывод из ffmpeg до вызова myGetBuffer:
Reinit context to 1920x1088, pix_fmt: yuv420p
myGetBuffer заполняет данные фрейма, размер строки и буфер с использованием поверхностей dx9 и av_buffer_create, почти так же, как и в связанном вопросе выше. Насколько я понимаю, buf[0] для Y, buf[1] для U, и buf[2] для V, и кадр будет декодирован в эти буферы.
Я считаю, что мой hwaccel настроен правильно. Все эти звонки успешны:
hr = DXVA2CreateDirect3DDeviceManager9
hr = pD3DManager->ResetDevice
hr = pD3DManager->OpenDeviceHandle
hr = DXVA2CreateVideoService
hr = pDecoderService->GetDecoderRenderTargets
hr = pDecoderService->GetDecoderDeviceGuids
hr = pDecoderService->GetDecoderConfigurations
hr = pDecoderService->CreateSurface
hr = pDecoderService->CreateVideoDecoder
Я использую "более новую" парадигму avcodec_send_packet и avcodec_receive_frame, а не устаревшую avcodec_decode_video2. Все отлично работает с программным декодированием.
Источник - h264 в разрешении 1920x1080 с живой камеры.
Это проблема с байтовым выравниванием? Если так, как я могу получить AvCodecContext в myGetBuffer равным 1088?
Я много гуглил по этому поводу и не нашел хороших образцов. Любые предложения о том, что я пропустил, с благодарностью!
ПРИМЕЧАНИЕ. - Когда я вызываю avcodec_align_dimensions2, он хочет установить высоту равной 1090, которая не выровнена по 32-битной схеме. Что кажется очень странным. Использование этого значения не меняет результаты, которые я получаю.