Вопрос или проблема
Я пытаюсь реализовать фильтр аппаратного масштабирования (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. Теперь следующие два потока работают как ожидается:
./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
./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)
для следующего потока, снова возникает ошибка “Превышен размер пула статических поверхностей”.
./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. Это позволило успешно выполнять два сценария:
- 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
- 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):
- 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. Вам необходимо понимание причин возникновения проблемы и способы её устранения.
Варианты решения проблемы
-
Анализ использования памяти: Проверьте использование и распределение памяти во время выполнения программы. Возможно, статический пул переполняется из-за некорректного управления выделением и освобождением памяти, особенно заметное при работе с большим количеством видеокадров.
-
Динамическое управление размерами пула: Попробуйте внедрить динамическое управление размерами пула, чтобы корретировать его размер в зависимости от нагрузки или улучшить дозагрузку, например, через буферизацию.
-
Проверка обратной совместимости: Убедитесь, что используемые вами версии библиотек и API совместимы с d3d11 и MediaFoundation. Использование устаревших или несовместимых версий может вызывать неожиданные ошибки.
-
Логгирование и отладка: Добавьте более подробное логирование в критические участки кода, чтобы выявить места, где пул может переполняться, и понять внутреннюю логику работы праймериз.
Оптимизация кода:
Поскольку ваш вопрос может заинтересовать специалистов по графике и видеокодированию, стоит делать акцент на использование и оптимизацию новых технологий DirectX и MediaFoundation. Это привлечет внимание разработчиков, использующих современное программное обеспечение для обработки видео.
Если ваши проблемы все еще остаются нерешенными, рекомендуется детальный аудит и тестирование с использованием других наборов данных, а также возможно привлечение сообщества разработчиков через специализированные форумы и ресурсы, чтобы совместно найти решение.
Надеюсь, эта информация будет полезна в разрешении вашей проблемы.