Эффект AV_CODEC_FLAG2_FAST в декодировании H.264

Кто-нибудь знает, каков эффект AV_CODEC_FLAG2_FAST флаг в библиотеке libavcodec (ffmpeg 4.0.2), когда он включен AVCodecContext?

AVCodecContext* avCodecContext;
AVCodec* avCodec;

...
avCodec = ...;
avCodecContext = avcodec_alloc_context3(avCodec);
avCodecContext->flags2 |= AV_CODEC_FLAG2_FAST;
...
// start receiving stream and parsing and decoding frames
...

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

Любая идея, любая информация приветствуется.

1 ответ

Решение

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

При установленном флаге деблокирование больше не откладывается. Компромисс состоит в том, что деблокирование не пересекает границы среза, поэтому могут быть разрывы / артефакты на краях среза.

Я предполагаю, что любое относительное ускорение будет заметным, когда декодирование использует много потоков.

Если disable_deblocking_filter_idc = 2 (т. Е. Снятие блочности через границы слайсов отключено, и, следовательно, каждый слайс полностью самодостаточен) во входном потоке, то флаг AV_CODEC_FLAG2_FAST не действует.

В противном случае могут наблюдаться ухудшения зрения (из-за дрейфа между процессами кодирования и декодирования), особенно если количество слайсов на pframe велико и / или интервал между последовательными кадрами IDR большой (из-за временного распространения).

Обратите внимание, что кадры IDR не устраняют дрейф, они просто уменьшают его.

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