h264 u(v) декодирование frame_num, pic_order_cnt_lsb и slice_group_change_cycle

Согласно "Синтаксису заголовка слайса" (описанному в Рекомендации МСЭ-Т h264), frame_num, pic_order_cnt_lsb а также slice_group_change_cycle иметь u(v) дескриптор, который является целым числом без знака, использующим переменное число битов.

Док утверждает, что

"количество битов варьируется в зависимости от значения других элементов синтаксиса".

Знаете ли вы, как вычислить количество бит, используемых для хранения frame_num, pic_order_cnt_lsb а также slice_group_change_cycle?

[Цитируемая документация указывает на read_bits(n) функции, к сожалению, я не могу понять это самостоятельно. Вы можете помочь?]

1 ответ

Решение

Другие значения битового потока определяют количество бит для чтения.

frame_num

используется в качестве идентификатора для изображений и должен быть представлен log2_max_frame_num_minus4 + 4 бита в битовом потоке.

Вот что делает FFmpeg, например:

log2_max_frame_num_minus4 = get_ue_golomb(&h->gb);
// ...
sps->log2_max_frame_num = log2_max_frame_num_minus4 + 4;
// ...
h->frame_num = get_bits(&h->gb, h->sps.log2_max_frame_num);

pic_order_cnt_lsb

задает счетчик порядка изображений по модулю MaxPicOrderCntLsb для верхнего поля кодированного кадра или для кодированного поля. Размер синтаксического элемента pic_order_cnt_lsb составляет log2_max_pic_order_cnt_lsb_minus4 + 4 бита.

Значение pic_order_cnt_lsb должно быть в диапазоне от 0 до MaxPicOrderCntLsb - 1 включительно.

slice_group_change_cycle

Значение slice_group_change_cycle представлено в битовом потоке следующим количеством бит Ceil( Log2( PicSizeInMapUnits ÷ SliceGroupChangeRate + 1))

Пример чтения битов: SliceHeader.cpp, строка 170

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