登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

面包会有的

... ...

 
 
 

日志

 
 

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

2011-10-25 16:10:31|  分类: H264 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |


参考bs.h


此部分内容对应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;   /* RD only */

} 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个比特的值并返回,但是不移动读写指针

此处实现似乎存在潜在的错误,即如果p<p_end但是p向后移动i_count个比特后越过了p_end,程序依然能够返回,不报错!!

static void bs_skip( bs_t *s, int i_count )

将比特读写位置向后移动i_count个比特

static int bs_read_ue( bs_t *s )

static int bs_read_se( bs_t *s )

static int bs_read_te( bs_t *s, int x )

static void bs_write( bs_t *s, int i_count, uint32_t i_bits )

向指定比特流s写入i_count个比特的值i_bits;如果当前位置距离比特流尾部相差少于四个字节??,则不做任何工作,直接返回;如果要写入的值所需比特数大于i_count,则截掉高位后写入。

static void bs_write1( bs_t *s, uint32_t i_bit )

向指定比特流s写入一个比特值i_bit;如果当前已处于比特流尾部,则不做任何工作,直接返回。

static void bs_align_0( bs_t *s )

向后调整比特流的读写位置,使其处于字节对齐位置;中间这些跳过的比特位全部置0

static void bs_align_1( bs_t *s )

向后调整比特流的读写位置,使其处于字节对齐位置;中间这些跳过的比特位全部置1

static void bs_align( bs_t *s )

与bs_align_0函数完全相同

void bs_write_ue( bs_t *s, unsigned int val )

以ue映射方式向比特流中写入无符号值,具体过程为:

(1)    首先向比特流中写入连续M个比特的0,其中M=floor(log2(val+1));

(2)    向比特流中写入1个比特的1

(3)    向比特流中写入M个比特,这M个比特的值应等于val+1-2M

static void bs_write_se( bs_t *s, int val )

以H.264标准Table 9.3的映射方式向比特流中写入。具体为:

当val<=0时,则以ue方式向比特流中写入-2*val

当val>0时,则以ue方式向比特流中写入2*val-1

static void bs_write_te( bs_t *s, int x, int val )

当x=1时,向比特流中写入val的最低比特的反码;当x>1时,按照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。




  评论这张
 
阅读(1578)| 评论(0)

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018