Ogg格式码流的数据处理方法

文档序号:7513737阅读:202来源:国知局
专利名称:Ogg格式码流的数据处理方法
技术领域
本发明涉及数据处理领域,特别涉及一种适用于0gg格式码流的数据处理方法。
背景技术
0gg Vorbis是一种新的音频压缩格式。音频数据经Vobis编码算法转换成 Vorbis流, 一般采用0gg流容器来装载Vorbis原始流。0gg Vorbis码流的基 本单位是页(page),各页顺序4并4妄构成一个码流。页由页头(page header) 和页实体(page body)构成。页头中包含页序号、同步字、段数、段值表等信 息,页实体用来装载Vorbis原始流。Vorbis原始流的基本单位为数据包 (packet ), 一个it悟包^"应一帧Vorbis ;马流或用来^刀始4b Ogg Vorbis解石马器 的一个Vorbis头凄t据。
其中,第一个页实体中只装载身份头数据包(IdentificationHeader packet ),其余页实体中装载数量不固定的数据包。 一个数据包不一定完整地放 置于一个页实体中,可以放置于相邻的多个页实体中。
Ogg Vorbis数据包被分解成长度为255字节的若干段和最后一个长度小于 255字节的段。在段值表中记录了各段的长度,以字节为单位,取值范围为 0-255。这些段可以分别放置于多个页中,因此段长值小于255即表示该数据段 是一个数据包的最后 一个数据段。
图1是Ogg Vorbis码流的结构示意图。图中共显示了 n~n+3号4个完整 0gg页。第n页的页实体包含数据包m和数据包m+l这两个完整的数据包,以 及数据包m+2的前半部分。第n+l页的页实体中含有凝:据包m+2的后半部分和 数据包m+3的第一部分。第n+2页的页实体中含有数据包m+3的第二部分。第n+3页的页实体中含有数据包m+3的第三部分和完整的数据包m+4。
Vorbis解码器核心实现代码一般以通用解码库的形式发布,用户通过集成 API实现0gg Vorbis码流的解码。Vorbis解码器首先解析0gg Vorbis码流的 页头,获得当前页的基本信息。在确定数据的正确性后,从页实体中提取出 Vorbis原始流,并对其进行解码。 一般的,需要在解码器中开辟两个数据緩冲 区, 一个是存储来自外部的0gg Vorbis码流的0gg Vorbis码流緩冲区,另一 个是存储待解码Vorbis原始流的待解码緩冲区。在进行Vorbis解码前,将0gg Vorbis码流的页实体部分,即Vorbis原始流,/人Ogg Vorbis码流緩冲区中复 制到待解码緩沖区中,直到将待解码緩冲区充满。Vorbis解码器正常工作的前 提是待解码緩沖区中至少存储了一个连续、完整的数据包。由于一个完整的数 据包有可能放置于Ogg Vorbis码流的多个页实体中,因此,需要一种机制确保 待解码緩冲区中装载有至少一个完整的数据包。
为了确保待解码緩冲区中装载有至少一个完整的数据包,常用的方法是将 待解码緩沖区的尺寸设置得比较大,比如6144Bytes。图2是常用的一种0gg Vorbis码流数据拼接的方法流程图。首先判断输入待解码緩沖区中的Vorbis 原始流是否足够多,通常要求能够装满整个緩沖区。如果未能装满,则继续解 析Ogg Vorbis码流H冲区中的页头,从Ogg Vorbis码流緩冲区中读耳又新的 Vorbis原始流置入待解码緩冲区,直至装满整个待解码緩沖区;如果待解码緩 冲区已装满,则开始对Vorbis原始流进行解码。这时的解码li冲区中的Vorbis 原始流数据包个数会出现两种情况, 一种情况是不含有完整的数据包,此时解 码器将无法正常工作;另一种情况是待解码緩冲区中装载有至少一个完整的数 据包,解码器可以正常解码第一个数据包,而后由于无法准确判定待解码緩冲 区中的剩余码流是否含有完整的数据包,便认为当前待解码緩冲区中的Vorbis 原始流不够多,需要将剩余的Vorbis原始流搬移到待解码緩冲区最前端,并从 Ogg Vorbis码流緩沖区中读耳又Vorbis原始流与剩余的Ogg Vorbis原始流拼接, 以填充待解码緩沖区中的剩余空间。由于数据包的尺寸可大可小。当数据包尺寸很大时,待解码緩冲区处于填满状态时仍可能不含有完整数据包,此时对待
解码緩冲区中的Voribs原始流进行解码,解码器无法正常工作,甚至会崩溃; 当数据包尺寸较小时,待解码緩冲区中可能含有多个完整Vorbis数据包,仅对 一个数据包进行解码后就进行数据搬移和读取会导致频繁的且不必要的数据访 问和复制,降低了解码器的工作效率,增加了系统的功耗。
另外,此方法需要在解码器中开辟两个缓冲区,分别用于存储0gg Vorbis 码流和存储待解码的Vorbis原始流,对系统内存的需求大,实现成本高。

发明内容
有鉴于此,本发明的目的在于提供一种用于0gg Vorbis码流解码的数据拼 接方法,通过解析0gg页头,获取0gg页实体中装载的完整数据包的个数,以 实现对不完整数据包的拼接。
为达到上述目的,本发明提供一种Ogg格式码流的数据处理方法,包括以 下步骤
1) 将待解码0gg码流数据放入待解码緩沖区直至装满;
2) 搜索解码緩冲区中是否存在页头,如果是,转入步骤3),否则,转入 步骤4 );
3 )将搜索到的页头删除,并将该页头前后的属于同 一数据包的数据进行拼 接,再将该页头对应的完整数据包进行解码,随后返回步骤2);
4)将解码緩沖区中的未解码数据搬移至解码緩冲区最前端,并返回步骤1)。
在步骤3)之前,还包括解析待解码緩冲区中的第一个0gg页头,并统 计该页头所对应的页实体中所包含的完整数据包的个lt,当统计结果为大于等 于1时,则执行步骤3 );否则,删除待解码緩冲区中的该页头,返回步骤2 )。
所述0gg码流数据为0gg Vorbis码流数据。
所述将该页头前后的属于同一数据包的数据进行拼接,为判断该页头是
否处于待解码緩冲区的最前端,如果是,则不进行拼接;否则,将该页头后的 待解码数据与该页头前的数据进行拼接。
在步骤2)之前,还包括,判断待解码緩冲区中是否包含完整的0gg页, 具体为
A) 判断待解码緩冲区中的0gg Vorbis码流字节数是否小于0gg页的最小 长度;如果小于,则判定待解码緩冲区中不包含完整的0gg页,否则,将执行 步骤B);
B) 判断待解码缓冲区中的Ogg Vorbis码流字节数是否大于页头长度,如 果大于,执行步骤C),否则,则判定待解码緩沖区中不包含完整的Ogg页;
C) 判断待解码緩冲区中的Ogg Vorbis码流字节数是否小于页长值,如果小 于,则判定待解码緩冲区中不包含完整的Ogg页;否则,判定待解码緩冲区中 包含完整的Ogg页。
所述页头长度的获得,具体为解析待解码緩冲区中的第一个页头,获取 这个页的段数值,其页头长度为Ogg页最小长度值与段数值之和,
所述页长值为页实体长度与页头长度之和,页实体长度为段值表中各段段 值之和。
所述将解码緩冲区中的未解码数据搬移至解码緩冲区最前端,为如果待 解码缓沖区中的第 一个0gg页头位于待解码緩冲区的最前端,则删除待解码緩沖 区中的0gg码流数据;否则,删除解码緩冲区中的第一个页头之前的所有数据, 将该页头及其之后的码流数据搬移至待解码緩冲区的最前端。
在步骤l)之前还包括判断外部是否存在待解码Ogg码流数据,为如 果存在,则返回所述步骤l),否则结束对Ogg码流数据的处理。
由以上的技术方案可见,本发明提供的Ogg码流数据处理方法,通过解析 0gg页头,统计页实体中装载的完整数据包的个数,如果统计结果大于等于l, 则对所有完整的数据包进行解码,否则对Ogg码流数据进行处理。避免了不必
要的码流读取和搬移操作,保证了解码过程的连续性,提高了解码器的效率, 降低了系统的功耗。
另外,本发明提供的数据拼接的方法只使用了一个緩冲区,该緩冲区用来 完成对0gg页头的解析和对0gg码流凄t据的处理,减少了对系统内存的需求, 降低了实现的成本。


图l是0gg Vorbis码流的结构示意图2是现有技术中0gg Vorbis码流的数据对并接方法;
图3是本发明提供的数据拼接方法流程示意图。
图4是本发明提供的数据拼接方法的一种实施例示意图。
具体实施例方式
为使本发明的目的、技术方案及优点更加清楚明白,以下参照附图并举实
施例,对本发明进一步详细说明。
图3是本发明提供的数据拼接方法流程示意图。该方法包括
步骤301,将待解码的0gg码流数据放入待解码緩冲区中,直至装满整个
待解码缓冲区。
其中待解码数据是符合Ogg封装格式的码流数据,通常情况下,音频数据 为0gg Vorbis石马流, 一见频l丈l居为0gg Theora石马;危。
步骤302,搜索解码緩冲区中是否存在页头,如果是,转入步骤303,否则, 转入步骤304;
步骤303,将4叟索到的第一个0gg页头删除,并将该页头前后的属于同一 数据包的数据进行拼接,再将该页头对应的完整数据包进行解码,随后返回步 骤302;
步骤304,将解码緩冲区中的未解码数据搬移至解码緩冲区最前端,并返回步骤301。
图4是本发明提供的数据拼接方法的一种实施例示意图。其中,待解码数
据以Ogg Vorbis码流为例,该方法包括以下步-骤
步骤401,获取Ogg Vorbis码流,并将Ogg Vorbis码流复制到待解码緩 冲区中,直至装满整个待解码緩冲区,执行步骤402。
步骤402,统计待解码緩沖区中第一个Ogg页头(简称第一个页头)所 对应的页长值,判断待解码緩冲区是否包含完整的0gg页(简称页)。如果包 含,则执行步骤403,否则,执行步骤404。在本实施例中,统计待解码緩冲区 中的第一个页头所对应的页长值,具体为
解析第一个0gg页的页头,获取该页的段值表和段数值。段数值与ogg页 的最小长度之和为该页的页头长度,段值表中各段长度值之和为该页的页实体 长度,该页的页头长度与页实体长度之和为该页的页长。
其中Ogg页的最小长度通常为27个字节。
在本实施例中,判断待解码緩冲区中是否包含完整的Ogg页,包括以下步

A) 判断待解码緩冲区中的Ogg Vorbis码流字节数是否小于Ogg页的最小 长度。如果小于,则判定待解码緩沖区中不包含完整的Ogg页,否则,将执行 步骤B);
通常,Ogg页的最小长度为27个字节。
B) 解析待解码緩冲区中的第一个页头,获^^这个页的段数值,其页头长 度为Ogg页最小长度值与段数值之和,判断待解码緩冲区中的Ogg Vorbis码流 字节数是否大于页头长度,如果大于,执行步骤C),否则,则判定待解码緩冲 区中不包含完整的Ogg页;
C) 经解析,获取第一个页头的段值表,页实体长度为段值表中各段段值 之和,页长值为页实体长度与页头长度之和,判断待解码緩冲区中的Ogg Vorbi s 码流字节数是否小于页长值,如果小于,则判定待解码緩冲区中不包含完整的0gg页;否则,判定待解码緩冲区中包含完整的0gg页。
步骤403,判断待解码緩沖区中第一个页头所对应的页中是否包含完整的 数据包;如果是,则执行步骤405,否则执行步骤407。 这个步骤具体为
a )利用页头中的段值表数据统计得出第 一个页头所对应的页中完整数据包 的个数。由于, 一个完整的数据包通常被分解成长度为255的若干段和最后一 个长度小于255的段,在段值表中段的长度值在0-255范围内。这些段可以分 别放置于多个页中,因此段长值小于255即表示该段是一个数据包的最后一段。
所以,第一个页头的段值表中段的长度值小于255的段数便为第一个页头 所对应的页中完整凄t据包的个数。这里分两种情况,将第一个页头所对应的页 作为当前页, 一种情况是一个数据包的码流数据部分在当前页中,部分在前一 页中,如图1中的数据包m+2存在于n和n+l两个页中。此时,该数据包装载 于前一页中的码流数据已保留在待解码緩冲区中。另 一种情况是当前页的第一 个数据包中的数据完全存在于当前页中,当然当前页也可能与相临的下一页共 有数据包,如图1中的第n页。每个数据包有且仅有一个长度小于255字节的 段,长度小于255字节的段即为一个数据包的最后一段,因此统计Ogg页段值 表中段长值小于255的个数,就可以得到在获取当前页页实体中的Vobis原始 流后,可以得到的完整数据包个数,即使第一个数据包的部分数据段可能存在 于前一页中。
b)判断第一个页头所对应的页中完整数据包的个数是否大于等于1;如 果是,则判定待解码緩冲区中含有完整的数据包;否则,判定该页中不包含完 整的数据包。
步骤404,判断待解码緩冲区中的第一个页头是否处于待解码緩沖区的最 前端;如果是,则删除待解码緩冲区中的Ogg Vorbis码流,执行步骤408;否 则,删除解码緩冲区中的第一个页头之前的所有数据,将该页头及其之后的码
流数据搬移至待解码緩冲区的最前端,随后执行步骤4 08 。
在本步骤中,如果判定待解码緩冲区中的第一个页头不在待解码緩冲区的 最前端,这意味着待解码緩沖区的最前端还存在一部分数据,该数据与第一个 页头所对应的页实体中的第一段组成一个完整的数据包,而且该数据还是上一 页的一部分,为了保证页的完整性,需将这部分数据删除,那么本步骤处理后, 第一个页头所对应的页实体中的第一段是个不完整的数据包,因此,在后续解 码过程中,将不会这一段数据进行解码而从其后的数据包开始解码。
步骤405,删除待解码緩冲区中的第一个页头,并对第一个页头对应的页 所包含的完整数据包进行解码,执行步骤406。
在这个步骤中,如果第一个页头位于待解码緩冲区的最前端,则在删除第 一个页头之后,直接对完整的数据包进行解码;否则,在删除第一个页头之后, 需将该页头两端的Vorbis原始流进行拼接,再对完整的数据包进行解码。
步骤406,判断待解码緩沖区中是否还存在Ogg页头;如果存在,则返回 步骤402;否则,抽j亍步骤408。
由于每个Ogg页头中都含有同步字信息,当查找到待解码緩冲区中含存在 同步字信息,便可判定待解码緩冲区中还存在Ogg页头。
步骤407,删除待解码緩冲区中的第一个页头,并判断待解码緩沖区中是 否还存在Ogg页头;如果存在,则执行步骤403;否则,将待解码緩冲区中的 Vorbis原始流搬移至待解码緩冲区的最前端,执行步骤408。
步骤408,判断外部是否还有待解码的Ogg Vorbis码流文件;如果有,则 返回步骤401;否则,结束数据处理。
由上述的实施例可见,本发明提供的数据拼接方法,通过解析0gg页头, 统计页实体中装载的完整数据包的个数,如果统计结果大于等于1,则对完整 的数据包进行解码,否则对0gg码流数据进行搬移和/或拼接处理。避免了不必 要的码流读取和搬移操作,保证了解码过程的连续性,提高了解码器的效率,
降低了系统的功耗。另夕卜,本发明提供的数据拼接的方法只使用了一个緩冲区, 该緩沖区完成对0gg页头的解析,对数据包的提取,拼接,减少了对系统内存 的需求,降4氐了实现的成本。
综上所述,以上仅为本发明的较佳实施例而已,并非用于限定本发明的保 护范围。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等, 均应包含在本发明的保护范围之内。
权利要求
1、一种0gg格式码流的数据处理方法,其特征在于,包括以下步骤1)将待解码0gg码流数据放入待解码缓冲区直至装满;2)搜索解码缓冲区中是否存在页头,如果是,转入步骤3),否则,转入步骤4);3)将搜索到的页头删除,并将该页头前后的属于同一数据包的数据进行拼接,再将该页头对应的完整数据包进行解码,随后返回步骤2);4)将解码缓冲区中的未解码数据搬移至解码缓冲区最前端,并返回步骤1)。
2、 如权利要求l所述的方法,其特征在于,在步骤3)之前,还包括解 析待解码緩冲区中的第一个Ogg页头,并统计该页头所对应的页实体中所包含 的完整数据包的个数,当统计结果为大于等于1时,则执行步骤3);否则,删 除待解码緩沖区中的该页头,返回步骤2)。
3、 如权利要求2所述的方法,其特征在于所述0gg码流数据为0gg Vorbis 码流数据。
4、 如权利要求3所述的方法,其特征在于,所述将该页头前后的属于同一 数据包的数据进行拼接,为判断该页头是否处于待解码緩冲区的最前端,如 果是,则不进行拼接;否则,将该页头后的待解码数据与该页头前的数据进行 拼接。
5、 如权利要求3所述的方法,其特征在于,在步骤2)之前,还包括,判 断待解码緩冲区中是否包含完整的0gg页,具体为A) 判断待解码緩冲区中的0gg Vorbis码流字节数是否小于0gg页的最 小长度;如果小于,则判定待解码緩冲区中不包含完整的0gg页,否则,将执 行步骤B);B) 判断待解码緩冲区中的0gg Vorbis码流字节数是否大于页头长度, 如果大于,执行步骤C),否则,则判定待解码緩冲区中不包含完整的0gg页; C) 判断待解码緩冲区中的0gg Vorbis码流字节lt是否小于页长值,如 果小于,则判定待解码緩冲区中不包含完整的0gg页;否则,判定待解码緩冲 区中包含完整的0gg页。
6、 如权利要求5所述的方法,其特征在于,所述页头长度的获得,具体为 解析待解码緩冲区中的第一个页头,获取这个页的段数值,其页头长度为0gg 页最小长度值与段数值之和,
7、 如权利要求5所述的方法,其特征在于,所述页长值为页实体长度与页 头长度之和,页实体长度为段值表中各段段值之和。
8、 如权利要求3所述的方法,其特征在于,所述将解码緩冲区中的未解码 数据搬移至解码緩冲区最前端,为如果待解码緩冲区中的第一个Ogg页头位于 待解码緩冲区的最前端,则删除待解码緩冲区中的Ogg码流数据;否则,删除解 码緩冲区中的第一个页头之前的所有数据,将该页头及其之后的码流数据搬移 至待解码緩沖区的最前端。
9、 如权利要求l所述的方法,其特征在于,在步骤l)之前还包括判断 外部是否存在待解码Ogg码流数据,为如果存在,则返回所述步骤l),否则 结束对0gg码流lt据的处理。
全文摘要
本发明提供的Ogg格式码流的数据处理方法,通过解析Ogg页头,统计页实体中装载的完整数据包的个数,如果统计结果大于等于1,则对完整的数据包进行解码,否则对Ogg码流数据进行搬移和/或拼接处理。避免了不必要的码流读取和搬移操作,保证了解码过程的连续性,提高了解码器的效率,降低了系统的功耗。
文档编号H03M7/30GK101345531SQ20081011856
公开日2009年1月14日 申请日期2008年8月19日 优先权日2008年8月19日
发明者昊 邓 申请人:北京中星微电子有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1