h264编码概述八(哥伦布编码ue(v))

一、概述

熵编码是无损编码的一种方法。该编码方法的宗旨是找到一种编码,使得码字的平均码长达到熵极限。具体实施是,对出现概率较大的符号,取较短的码长,对出现概率较小的符号取较大的码长。

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位长度:

标题无符号指数哥伦布编码:ue(v)编码方法

计算公式:(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编码-哥伦布解析SPS信息 - 简书

h264编码分析-哥伦布编码_h264 哥伦布编码_fantasy_arch的博客-CSDN博客

H.264(三)熵编码和指数哥伦布编码_13257193的技术博客_51CTO博客

H.264(四)指数哥伦布编码(实现编码)_13257193的技术博客_51CTO博客

猜你喜欢

转载自blog.csdn.net/CrystalShaw/article/details/129388266