X264中CAVLC码字的快速读取
理解X264中解码码表生成的规律,需要研究bs_read_vlc函数
相关结构体:
typedef struct
{
int i_value; //码字
int i_size; //码长
} vlc_lookup_t;
struct x264_vlc_table_t
{
int i_lookup_bits; //
int i_lookup; //
vlc_lookup_t *lookup; //码表
};
结合上面的代码和vlc_table_t的类型定义,给出vlc_table_t结构各字段的含义:
i_lookup_bits:当需要从码流中读取一个CAVLC码字时,首先应该读取的比特数,程序利
用该值可以找到查找表中的相应位置,从而决定是否已经读完一个完整码字,如果不是则
利用查找表项的信息继续查找
i_lookup:查找表lookup的长度
lookup:查找表表项集合
其中每个查找表表项都是一个vlc_lookup_t的结构,该结构的各字段含义如下:
int i_size; 该值大于0表示码字已经完全读入,其数值表示在整个码字读取过程中最后一
次读入的比特数;该值等于0为无效表项;该值小于0表示码字还不完整,其绝对值表示为
了使码字完整,还需读入的比特数;
int i_value:当i_size大于0,该值表示读入的码字对应的解码值,也就是程序实际需要
的值;当i_size等于0,该值无效;当i_size小于0,表示码字还不完整,下次读入-i_siz
e个比特后,应该在查找表i_value表示的偏移处开始读取查找表。
举例如下:
查找表h->x264_coeff_token_lookup[0]的各字段值为:
i_lookup_bits=4
i_loopup=100
现在需要读入一个完整的CAVLC码字,过程如下:
首先依据i_lookup_bits需要读入4个比特,假设读入的值为0,则读取表项lookup[0],其
值为i_value=16, i_size=-4;
故需要再读入4比特,假设读入2,则应该读取表项lookup[16+2],其值为i_value=92, i_
size=-1;
故需要再读入1比特,假设读入0,则应该读取表项lookup[92+0],其值为i_value=31, i_
size=1;
因为i_size已经大于0,故码字已经完整读入,即0000 0010 0,对应H.264标准Table 9-5
,可以查得:TotalCoeff=7, TrailingOnes=3
理解X264中解码码表生成的规律,需要研究bs_read_vlc函数
相关结构体:
typedef struct
{
int i_value; //码字
int i_size; //码长
} vlc_lookup_t;
struct x264_vlc_table_t
{
int i_lookup_bits; //
int i_lookup; //
vlc_lookup_t *lookup; //码表
};
结合上面的代码和vlc_table_t的类型定义,给出vlc_table_t结构各字段的含义:
i_lookup_bits:当需要从码流中读取一个CAVLC码字时,首先应该读取的比特数,程序利
用该值可以找到查找表中的相应位置,从而决定是否已经读完一个完整码字,如果不是则
利用查找表项的信息继续查找
i_lookup:查找表lookup的长度
lookup:查找表表项集合
其中每个查找表表项都是一个vlc_lookup_t的结构,该结构的各字段含义如下:
int i_size; 该值大于0表示码字已经完全读入,其数值表示在整个码字读取过程中最后一
次读入的比特数;该值等于0为无效表项;该值小于0表示码字还不完整,其绝对值表示为
了使码字完整,还需读入的比特数;
int i_value:当i_size大于0,该值表示读入的码字对应的解码值,也就是程序实际需要
的值;当i_size等于0,该值无效;当i_size小于0,表示码字还不完整,下次读入-i_siz
e个比特后,应该在查找表i_value表示的偏移处开始读取查找表。
举例如下:
查找表h->x264_coeff_token_lookup[0]的各字段值为:
i_lookup_bits=4
i_loopup=100
现在需要读入一个完整的CAVLC码字,过程如下:
首先依据i_lookup_bits需要读入4个比特,假设读入的值为0,则读取表项lookup[0],其
值为i_value=16, i_size=-4;
故需要再读入4比特,假设读入2,则应该读取表项lookup[16+2],其值为i_value=92, i_
size=-1;
故需要再读入1比特,假设读入0,则应该读取表项lookup[92+0],其值为i_value=31, i_
size=1;
因为i_size已经大于0,故码字已经完整读入,即0000 0010 0,对应H.264标准Table 9-5
,可以查得:TotalCoeff=7, TrailingOnes=3