Фильтр аппаратного масштабирования DirectX D3D11

Вопрос или проблема

Я пытаюсь реализовать фильтр аппаратного масштабирования (vf_scale_d3d11) с использованием VideoProcessBlt D3D11 DDI, а также добавить поддержку PIX_FMT_D3D11 для кодировщика MediaFoundation (mfenc).

Изначально было много ошибок “Превышен размер пула статических поверхностей”.

decode_receive_frame_internal failed = Invalid data found when processing input
Static surface pool size exceeded
get_buffer() failed
thread_get_buffer() failed
decode_slice_headec error
no frame!

Эта проблема была решена увеличением initial_pool_size на 3. Теперь следующие два потока работают как ожидается:

  1. ./ffmpeg.exe -hwaccel d3d11va -hwaccel_output_format d3d11 -hide_banner -i bbb_sunflower_2160p_30fps_normal.mp4 -hw_encoding 1 -c:v h264_mf -vframes 100 -loglevel verbose sample.mp4 -y
  2. ./ffmpeg.exe -hwaccel d3d11va -hwaccel_output_format d3d11 -hide_banner -i bbb_sunflower_2160p_30fps_normal.mp4 -hw_encoding 1 -c:v h264_mf -vf "scale_d3d11=width=1920:height=1080" -vframes 100 -loglevel verbose sample.mp4 -y

Когда я пытаюсь вызвать av_hwframe_transfer_data() внутри блока if(encoder_requires_software_frame) для следующего потока, снова возникает ошибка “Превышен размер пула статических поверхностей”.

  1. ./ffmpeg.exe -hwaccel d3d11va -hwaccel_output_format d3d11 -hide_banner -i bbb_sunflower_2160p_30fps_normal.mp4 -c:v rawvideo -vframes 10 -loglevel verbose sample.yuv -y

Увеличение initial_pool_size до любого более высокого значения, кажется, не решает эту проблему. Та же ошибка наблюдается, когда изменения интегрированы в приложение HandBrake, даже для случаев использования (1) и (2). Любая информация о том, почему это происходит и как это исправить, будет ценна. Ссылка на патч: https://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20241230/ce28c8db/attachment.obj

Ответ или решение

Вопрос: Реализация аппаратного фильтра масштабирования DirectX D3D11

Вы сталкиваетесь с задачей реализации аппаратного фильтра масштабирования (vf_scale_d3d11) с помощью VideoProcessBlt D3D11 DDI, а также добавления поддержки формата PIX_FMT_D3D11 для кодировщика MediaFoundation (mfenc). В процессе выполнения у вас возникали ошибки, связанные с превышением "Static surface pool size". Например, ошибки в коде:

decode_receive_frame_internal failed = Invalid data found when processing input
Static surface pool size exceeded
get_buffer() failed
thread_get_buffer() failed
decode_slice_header error
no frame!

Эти проблемы были частично решены увеличением значения initial_pool_size на 3. Это позволило успешно выполнять два сценария:

  1. ffmpeg.exe -hwaccel d3d11va -hwaccel_output_format d3d11 -hide_banner -i bbb_sunflower_2160p_30fps_normal.mp4 -hw_encoding 1 -c:v h264_mf -vframes 100 -loglevel verbose sample.mp4 -y
  2. ffmpeg.exe -hwaccel d3d11va -hwaccel_output_format d3d11 -hide_banner -i bbb_sunflower_2160p_30fps_normal.mp4 -hw_encoding 1 -c:v h264_mf -vf "scale_d3d11=width=1920:height=1080" -vframes 100 -loglevel verbose sample.mp4 -y

Однако, проблемы остаются в третьем сценарии, где вы используете av_hwframe_transfer_data() в блоке if(encoder_requires_software_frame):

  1. ffmpeg.exe -hwaccel d3d11va -hwaccel_output_format d3d11 -hide_banner -i bbb_sunflower_2160p_30fps_normal.mp4 -c:v rawvideo -vframes 10 -loglevel verbose sample.yuv -y

Увеличение initial_pool_size не решает этих проблем. Ошибки проявляются и при интеграции изменений в приложение HandBrake. Вам необходимо понимание причин возникновения проблемы и способы её устранения.

Варианты решения проблемы

  1. Анализ использования памяти: Проверьте использование и распределение памяти во время выполнения программы. Возможно, статический пул переполняется из-за некорректного управления выделением и освобождением памяти, особенно заметное при работе с большим количеством видеокадров.

  2. Динамическое управление размерами пула: Попробуйте внедрить динамическое управление размерами пула, чтобы корретировать его размер в зависимости от нагрузки или улучшить дозагрузку, например, через буферизацию.

  3. Проверка обратной совместимости: Убедитесь, что используемые вами версии библиотек и API совместимы с d3d11 и MediaFoundation. Использование устаревших или несовместимых версий может вызывать неожиданные ошибки.

  4. Логгирование и отладка: Добавьте более подробное логирование в критические участки кода, чтобы выявить места, где пул может переполняться, и понять внутреннюю логику работы праймериз.

Оптимизация кода:

Поскольку ваш вопрос может заинтересовать специалистов по графике и видеокодированию, стоит делать акцент на использование и оптимизацию новых технологий DirectX и MediaFoundation. Это привлечет внимание разработчиков, использующих современное программное обеспечение для обработки видео.

Если ваши проблемы все еще остаются нерешенными, рекомендуется детальный аудит и тестирование с использованием других наборов данных, а также возможно привлечение сообщества разработчиков через специализированные форумы и ресурсы, чтобы совместно найти решение.

Надеюсь, эта информация будет полезна в разрешении вашей проблемы.

Оцените материал
Добавить комментарий

Капча загружается...