Exp-Golomb指数哥伦布码
指数哥伦布码(Exponential-Golomb)属于熵编码,属于无损编码 H.264中使用的是0阶指数哥伦布编码,编码方式如下:
以待编码码号code_num = 3为例: 第一步:将code_num +1, 即3+1 = 4 第二步:将4写为二进制的形式:100 第三步:计算100的比特个数为3,在100前面写(3-1)个0,得到编码码字:00100 0阶指数哥伦布码如下所示:
1 => 10 => 010
2 => 11 => 011
3 => 100 => 00100
4 => 101 => 00101
5 => 110 => 00110
6 => 111 => 00111
7 => 1000 => 0001000
8 => 1001 => 0001001
NALU、RBSP、EBSP、SODB
H264裸流中,可以提取到一个个的NALU,并且解析出NALU Header,NALU Header是占一个字节。下面我们就从NALU Header的下一个字节开始,分析NALUE Placeholder部分。
NALU的Placeholder涉及到三个重要的名词,分别为EBSP、RBSP和SODB。 SODB 数据比特串-->最原始的编码数据 RBSP 原始字节序列载荷-->在SODB的后面填加了结尾比特(RBSP trailing bits 一个bit“1”)若干比特“0”,以便字节对齐。 EBSP 扩展字节序列载荷-- >在RBSP基础上填加了仿校验字节(0X03)它的原因是:NALU的起始码为0x000001或0x00000001,同时H264规定,当检测到0x000000时,也可以表示当前NALU的结束。 那这样就会产生一个问题,就是如果在NALU的内部,出现了0x000001或0x000000时,就需要使用“防止竞争”这样一种机制,当编码器编码完一个NAL时,应该检测NALU内部,是否出现0x000000、0x000001、0x000002、0x000003。 当检测到它们存在时,编码器就在最后一个字节前,插入一个新的字节:0x03。比如:0x00000300、0x00000301、0x00000302、0x00000303。 这样一来,当我们拿到EBSP时,就需要检测EBSP内是否有序列:0x000003,如果有,则去掉其中的0x03。这样一来,我们就能得到原始字节序列载荷:RBSP。
公式可以这样看: NALU = NALU Header(1 bytes) + EBSP
RBSP = SODB + RBSP trailing bits
RBSP = EBSP - 0x03
其中RBSP trailing bits用于对齐字节数,因为SODB是最原始的编码数据,所以需要使用trailing bits来对齐字节数。
SPS/PPSNAL uint_type=7 包括了一个图像序列的所有信息(包含的是针对一连续编码视频序列的参数,如标识符seq_parameter_set_id、帧数及POC的约束、参考帧数目、解码图像尺寸和帧场编码模式选择标识等)
PPS:Picture Parameter Set,图像参数集 NAL uint_type=8 包括了一个图像所有片的信息(对应的是一个序列中某一副图像或者某几幅图像,参数如标识符pic_parameter_set_id、可选的seq_parameter_set_id、熵编码模式选择标识、片组数目、初始量化参数和去方块滤波系数调整标识等) 视频冗余前面说到一些名词之后初步认识了H264大概的结构,现在我们这边探讨的是,对于各种冗余的剔除。 帧内压缩帧内预测
人眼对图象都有一个识别度,人的眼睛对图像的低频特性比如物体的总体亮度之类的信息很敏感,而对图像中的高频细节信息不敏感。所以基于一些研究,可以将一幅图像中人眼不敏感的数据去除掉。这样就提出了帧内预测技术。
帧内压缩类似于图片压缩,跟这一帧的前面(或后面)一帧(或几帧)无关,由当前帧中,已编码的部分来推测当前待编码的这一部分数据是什么。
|