X264中CAVLC码字的快速读取

来源:互联网 发布:dyndns.org是什么域名 编辑:程序博客网 时间:2024/06/09 17:18
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
 
 
原创粉丝点击