bs_t结构及其相关函数的定义

此部分内容对应H.264标准9.1节及[2]中6.4.13小节

bs_t结构描述了比特流的概念 , 从比特流中进行顺序读写操作(相似于前向迭代器)

typedef struct bs_s

{

uint8_t *p_start; // 缓冲区首地址

uint8_t *p; // 缓冲区当前的读写指针

uint8_t *p_end; // 缓冲区尾地址

int i_left; // p所指字节当前还有多少比特可读写

int i_bits_encoded;

} bs_t;

void bs_init( bs_t *s void *p_data int i_data )

使用p_data指向的i_data个字节作为缓冲区初始化比特流s

 

int bs_pos( bs_t *s )

返回比特流s当前读写的位置(以比特为单位) , 相似于ftell的功能,

int bs_eof( bs_t *s )

当前是否已经位于比特流s的尾部 , 假如是 , 返回1;否则返回0

static uint32_t bs_read( bs_t *s int i_count )

从比特流s中读出i_count个比特的值并返回

static uint32_t bs_read1( bs_t *s )

从比特流s中读出1个比特并返回之

static uint32_t bs_show( bs_t *s int i_count )

从比特流中读出i_count个比特的值并返回 , 但是不移动读写指针

此处实现好像存在潜在的错误 , 即假如p1时 , 按照ue映射方式写入;其他情况下不执行任何操作 。

 

static void bs_rbsp_trailing( bs_t *s )

无论比特流当前位置是否字节对齐 , 都向其中写入一个比特1及若干个(0~7个)比特0 , 使其字节对齐

static int bs_size_ue( unsigned int val )

返回以ue方式对val进行Exp-goloma编码所需要的比特数 。

static int bs_size_se( int val )

返回以se方式对val进行Exp-goloma编码所需要的比特数 。

static int bs_size_te( int x int val )

返回以te方式对val进行Exp-goloma编码所需要的比特数 。 当x=1时 ,返回1;当x>1时 , 按照ue映射方式计算并返回;其他情况下返回0 。

 

#define bs_write(s,n,v)    ((s)->i_bits_encoded += (n))

void x264_sps_write( bs_t *s, x264_sps_t *sps )
{
   bs_write( s, 8, sps->i_profile_idc );


}

s是个bs_t指针,bs_write( s, 8, sps->i_profile_idc )只是更新了一下bs_t结构体的i_bits_encoded字段值。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值