概述
此部分内容对应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字段值。
最后
以上就是高挑小松鼠为你收集整理的bs_t结构及其相关函数的全部内容,希望文章能够帮你解决bs_t结构及其相关函数所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复