我是靠谱客的博主 高挑小松鼠,最近开发中收集的这篇文章主要介绍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字段值。

 


 

最后

以上就是高挑小松鼠为你收集整理的bs_t结构及其相关函数的全部内容,希望文章能够帮你解决bs_t结构及其相关函数所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(37)

评论列表共有 0 条评论

立即
投稿
返回
顶部