源码分析系列(二)x264_cavlc_dataflow

http://www.cnblogs.com/xkfz007/articles/2616156.html

 

CAVLC编码部分的关键函数

2.1 x264_macroblock_write_cavlc(x264_t *h, bs_t *s)

功能

判断宏块类型,对宏块进行CAVLC编码。

输入项目

x264_t *h:指向x264_t类型的结构体的指针变量。

输出项目

bs_t *s: 指向bs_s类型结构体的指针变量。

流程图

    如附图6所示:

附图6: x264_macroblock_write_cavlc流程图

2.2 block_residual_write_cavlc(x264_t *h,bs_t *s,int i_idx,int *l, int i_count)

功能

对得到的残差数据进行cavlc编码

输入项目

x264_t *h: 指向x264_t类型的结构体变量的指针变量

int i_idx:索引

int *l: l为指针变量,它指向长度为4x4的数组的首地址

int i_count:编码后的码流长度

输出项目

Bs_t *s: 指向bs_s类型的结构体变量的指针变量

流程图

    如附图7所示:

附图7: block_residual_write_cavlc流程图

2.3 bs_write( bs_t *s, int i_count, uint32_t i_bits )

功能

将i_bits逐位写入码流,码流长度为i_count。

输入项目

int i_count:编码后的码流长度;

uint32_t i_bits:待编码的数。

输出项目

bs_t *s:bs_s类型的结构体变量;

bs_t *s : bs_s类型的结构体变量;

typedef struct bs_s

{

uint8_t *p_start;

uint8_t *p;

uint8_t *p_end;

int i_left;

} bs_t;

p_start:码流的开始地址;

p:当前码流的地址;

p_end:码流的结束地址;

i_left:存储单元中空闲的比特数。

流程图

如附图8所示:

附图8: bs_write流程图

2.4 bs_write_vlc( bs_t *s, vlc_t v )

功能

将i_bits逐位写入码流,该码流长度为I_size。

输入项目

vlc_t v : vlc_t类型的结构体变量。

typedef struct

{

int i_bits;

int i_size;

} vlc_t;

I_bits:待编码的数;

I_size:编码后的长度。            

输出项目

bs_t *s : bs_s类型的结构体变量

2.5 bs_write_ue( bs_t *s, unsigned int val )

功能

进行无符号指数哥伦布编码。

输入项目

val:待编码的无符号数。

输出项目

bs_t *s:bs_s类型的结构体变量。

流程图

    如附图9所示:

附图9: bs_write_ue流程图

2.6 bs_write_se( bs_t *s, int val )

功能

进行有符号指数哥伦布编码。

输入项目

val:待编码的有符号数。

输出项目

bs_t *s:bs_s类型的结构体变量。

 

 
分类: X264
posted @ 2017-07-18 10:45  STN_LCD  阅读(359)  评论(0编辑  收藏  举报