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