Проблемы с 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-битной схеме. Что кажется очень странным. Использование этого значения не меняет результаты, которые я получаю.

0 ответов

Другие вопросы по тегам