一、概述
熵编码是无损编码的一种方法。该编码方法的宗旨是找到一种编码,使得码字的平均码长达到熵极限。具体实施是,对出现概率较大的符号,取较短的码长,对出现概率较小的符号取较大的码长。
H.264中使用的熵编码有:指数哥伦布编码、CAVLC、CABAC。
本次仅分析指数哥伦布编码方法。H.264中定义的指数哥伦布编码共四类:
类型 | 说明 |
ue(v) | 无符号指数哥伦布编码 |
se(v) | 有符号指数哥伦布编码 |
te(v) | 截断指数哥伦布编码 |
me(v) | 映射指数哥伦布编码 |
其中ue(v)是其他变型算法的基础,其他算法的结果由ue(v)的结果进一步处理得到。
ue(v)的码字分为三个部分:[prefix] + 1+ [surfix]
[prefix]为连续n个0。
[surfix]为表示实际数值的信息位,其长度与[prefix]一样。
[prefix] 和 [surfix]由码元取值确定。
下图是哥伦布编码不同值,编码后占用的bit位长度:

计算公式:(LeadingZeroBits:前面有多少个零)
二、实现
1、由此总结结,无符号指数哥伦布编码的实现,可以分为以下四步
2、举例说明
code_num | tmp1: code_num + 1 | tmp2:转换二进制记录比特个数:M | tmp3:[prefix]需插入0个数(M-1) | 码字 |
0 | 1 | 1 | 0 | 1 |
1 | 2 | 10 | 1 | 010 |
2 | 3 | 11 | 1 | 011 |
3 | 4 | 100 | 2 | 00100 |
4 | 5 | 101 | 2 | 00101 |
5 | 6 | 110 | 2 | 00110 |
6 | 7 | 111 | 2 | 00111 |
7 | 8 | 1000 | 3 | 0001000 |
8 | 9 | 1001 | 3 | 0001001 |
X264编码实现流程整理:
三、示例
以上面一段SPS的码流为例:
00 00 00 01 67 4D 00 29
start code nalutype=7 sps profileidc=0x4D=77=main profile level idc=0x29=41=4.1
8D 8D 40 3C
seq_parameter_set_id:ue(v) (解析8D为10001101)首个1bit是seq_parameter_set_id,根据上面的二.2表格,可知seq_parameter_set_id为0。
log2_max_frame_num_minus4:ue(v) (解析8D为0001101)如下显示,log2_max_frame_num_minus4应该是12
code_num | tmp1: code_num + 1 | tmp2:转换二进制记录比特个数:M | tmp3:[prefix]需插入0个数(M-1) | 码字 |
12 | 13 | 1101 | 3 | 0001101 |
pic_order_cnt_type:ue(v) (解析8D为10001101)首个1bit是pic_order_cnt_type=0
log2_max_pic_order_cnt_lsb_minus4:ue(v)解析8D为0001101)为12
num_ref_frames:ue(v)(解析40为01000000):为1
gaps_in_frame_num_value_allowed_flag:u(1):为0
pic_width_in_mbs_minus1:ue(v)(解析0x03C01:0000 0011 1100 0000 0001)
code_num | tmp1: code_num + 1 | tmp2:转换二进制记录比特个数:M | tmp3:[prefix]需插入0个数(M-1) | 码字 |
119 | 120 | 111 1000 | 6 | 0000 0011 1100 0 |
01 13
pic_height_in_map_units_minus1:ue(v) (解析0x0113: 000 0001 0001 0011 )为67
code_num | tmp1: code_num + 1 | tmp2:转换二进制记录比特个数:M | tmp3:[prefix]需插入0个数(M-1) | 码字 |
67 | 68 | 100 0100 | 6 | 0000 0001 0001 00 |
frame_mbs_only_flag:u(1) bit1为1
direct_8x8_inference_flag:u(1) bit1为1
F2C
frame_cropping_flag:u(1)(解析0xF2:1111 0010) bit1为1
frame_crop_left_offset:ue(v) (解析0xF2:1111 0010) bit1为0
frame_crop_right_offset:ue(v) (解析0xF2:1111 0010) bit1为0
frame_crop_top_offset:ue(v) (解析0xF2:1111 0010) bit1为0
frame_crop_bottom_offset:ue(v) (解析0x2C: 0010 1100)为4
vui_parameters_present_flag:u(1)(解析0x2C:0010 1100)为TRUE
下面需要解VUI信息
aspect_ratio_info_present_flag:u(1) (解析0x2C:0010 1100)为false
overscan_info_present_flag:u(1)(解析0x2C:0010 1100)为false
D C0 40 40 5
video_signal_type_present_flag:u(1)(解析0XDC:1101 1100)为true。
video_format:u(3) (解析0xdc:1101 1100)为5
video_full_range_flag:u(1) (解析0xdc 1101 1100)为true
colour_description_present_flag:u(1) (解析0xdc 1101 1100)为true
colour_primaries:u(8) (解析0xc040: 1100 0000 0100 0000)为1
transfer_characteristics:u(8) (解析:0x4040:0100 0000 0100 0000)为1
matrix_coefficients:u(8) (解析0x4050:0100 0000 0101 0000)为1
chroma_loc_info_present_flag:u(1) (解析0x4050:0100 0000 0101 0000)为0
timing_info_present_flag:u(1)(解析0x4050:0100 0000 0101 0000)为true
0000 0BB8 0001 5F90 0400 0000 0
num_units_in_tick:u(32) 0x0000 0BB8
time_scale:u(32) 0x0001 5F90
fixed_frame_rate_flag:u(1):(解析0x0400:0000 0100 0000 0000 )为false。
nal_hrd_parameters_present_flag:u(1) (解析0x0400:0000 0100 0000 0000 )为false。
vcl_hrd_parameters_present_flag:u(1) (解析0x0400:0000 0100 0000 0000 )为false。
pic_struct_present_flag:u(1) (解析0x0400:0000 0100 0000 0000 )为false。
bitstream_restriction_flag:u(1)(解析0x0400:0000 0100 0000 0000 )为false。
后面是trailing_bits()
rbsp_stop_one_bit:f(1)(解析0x0400:0000 0100 0000 0000 )为true。
后面是为了字节对齐补充的pad位。
四、参考
h264编码分析-哥伦布编码_h264 哥伦布编码_fantasy_arch的博客-CSDN博客