第一章 前言
第三章 有关 SPS 和 PPS 的一切
第四章 有关 Slice 的一切
第七章 帧间编码
第八章 残差的熵编码: CAVLC 和 CABAC
现在,我们可以重写 NaluSPS 的 Parse 函数了。我们先在 Parse 函数里构建一个 BitStream 对象,把 EBSP 传给这个 BitStream 对象,这样,我们就能利用 BitStream 来进行指数哥伦布的解码了。
RBSP 的第一个字节,其实就是 Nalu Header,我们之前已经解析过,所以我们直接跳过第一个字节。在构建 BitStream 的时候,我们向后位移一个字节。
int NaluSPS::Parse()
{
uint8_t * buf = rbsp.buf;
int bufLen = rbsp.len;
BitStream bitStream(buf + 1, bufLen - 1);
return 0;
}
我们翻开文档,先看前面的一部分。
seq_parameter_set_data() | C | Descriptor |
---|---|---|
profile_idc | 0 | u(8) |
constraint_set0_flag | 0 | u(1) |
constraint_set1_flag | 0 | u(1) |
constraint_set2_flag | 0 | u(1) |
constraint_set3_flag | 0 | u(1) |
constraint_set4_flag | 0 | u(1) |
constraint_set5_flag | 0 | u(1) |
reserved_zero_2bits | 0 | u(2) |
level_idc | 0 | u(8) |
seq_parameter_set_id | 0 | ue(8) |
第一个就是一个叫做 profile_idc 的属性,根据 Descriptor 我们知道,他占用了 8 bit 的大小,那么我们只需要读取 8bit 的数据出来就可以了。
profile_idc = bitStream.ReadU(8);
TODO
profile_idc 表示的是当前这路码流的编码档次,我们有时候会说一路码流是 Baseline,Main 等等,就是这个属性所决定的。具体的映射表如下:
可以看到,这里有非常多的档次,但是其实很多我们平时都接触不上,我们这里介绍几个常见的。一些不常见的,大家可以自行翻阅。