一种快速防止出现伪起始码的方法及装置的制作方法

文档序号:7859175阅读:175来源:国知局
专利名称:一种快速防止出现伪起始码的方法及装置的制作方法
技术领域
本发明涉及ー种防止出现伪起始码的方法及装置,特别是涉及ー种将音视频编码数据组织成可随机访问数据流时的快速防止出现伪起始码的方法。
背景技术
传统的视频编码标准如ITU(International Telecommunication Union,国际电信联盟)制定的 H. 261, H. 263, H. 263+, H. 264 标准以及 ISO (International Organizationfor Standardization,国际标准化组织)的 MPEG(Moving Pictures Experts Group,动态图像专家组)组织制定的MPEG-I,MPEG-2,MPEG-4等都需把音视频编码数据组织成可随机访问数据流,以便解码器可以从设置的随机访问点处开始解码。在以上标准中都是通过 起始码来实现编码数据的随机访问的,例如视频序列起始码、图像组起始码、图像起始码等等。这些起始码都是由起始码前缀和起始码值两部分組成。起始码前缀是ー个固定的ニ进制位串,标志ー个起始码的存在;起始码值是ー个数值,指出起始码的含义。如果在其他编码数据中出现了与起始码前缀ー样的ニ进制位串,则解码器就有可能把该位串错误地当成起始码前缀,从而引起解码错误。这样的ニ进制位串与紧随其后的若干ニ进制位构成了伪起始码。为了保证音视频码流的正确解码,必须防止在码流中出现伪起始码。防止出现伪起始码的通常方法是在设计码流的语法结构时设置ー些禁止值和掩码位。所谓禁止值是指禁止语法元素取某些值,因为如果该语法元素取了那些值,就有可能出现伪起始码。所谓掩码位,是指在可能出现伪起始码的语法元素之间插入ー个固定的ニ进制位。上述的设置禁止值和掩码位的方法有以下缺点a.増加了语法设计的复杂性。设计语法结构吋,要时时刻刻考虑到是否会出现伪起始码,是否需要禁止一些值,是否需要插入掩码位。b.降低了语法结构的易读性。这些与压缩编码无关的语法元素混在语法结构中,使人不容易抓住要点。c.效率不高。在有可能产生伪起始码的地方都必须采取措施,而不论语法元素的具体取值是否会真的产生伪起始码。自从H. 264采用了算木编码,上述的方法就不再具有可行性。专利号为US7839895的美国专利提出了一种能够适应算术编码的防伪起始码方法。该方法对两个起始码之间的数据块进行检查,如果在某个字节对齐位置出现了连续的22个0,则在第22个0之后插入如下的8个比特11000000,从而避免了伪起始码的出现。在解码时进行相反的操作,检查两个起始码之间的数据块中是否出现了 0x000003,如果出现了,则删除0x03.该方法在字节层面操作,实现起来比较方便。申请号为200310107985. X的中国专利申请提出了一种防伪起始码方案。与美国专利US7839895的区别是该专利申请是在位层面进行操作,当在某个字节对齐位置出现了连续的22个0时,在第22个0之后插入I个或2个位来防止伪起始码出现。美国专利US7839895和中国专利200310107985. X发明的两类方法各有所长,但是它们有ー个共同的缺点,就是在解码端,不论有没有出现伪起始码,都要首先逐个字节检查是否存在插入的位,如果存在,则删除这些插入的位。这ー过程需要一定的计算量,对于计算能力有限的解码器来讲,将是ー种负担。

发明内容
为克服 上述现有技术存在的不足,本发明之目的在于提供ー种快速防止伪起始码的方法及系统,其可以使解码端在进行解码时以极小的计算量完成防伪起始码的操作。为达上述及其它目的,本发明提供ー种快速防止伪起始码的方法,包括编码端处理方法及解码端处理方法,其中,该编码端处理方法包括如下步骤步骤一,在数据块中的字节对齐位置寻找伪起始码前綴,并记录伪起始码前缀出现的次数和位置;步骤ニ,判断伪起始码前缀出现的次数;步骤三,若该伪起始码前缀出现的次数为0,则于该数据块的第一个字节前插入ー最高位为I且包含该数据块长度信息的字节;若该伪起始码前缀出现的次数大于0,则于该数据块的第一个字节前插入1-4个非0字节,且该1-4个非0字节记录第一个伪起始码前缀的位置信息;以及步骤四,根据ー预定的修改规则修改每个伪起始码前缀所包含的三个字节的值,将它们修改为包含下ー个伪起始码前缀或真起始码前缀位置信息的值,且修改后的三个字节不会与前面或后面的字节构成新的伪起始码前缀;该解码端处理方法包括如下步骤步骤五,在接收到的数据流中寻找起始码前缀,起始码前缀后面的ー个字节为起始码值;步骤六,解析紧跟在起始码值之后的字节以判断该数据块中是否出现了伪起始码如缀;步骤七,若该数据块中没有出现伪起始码前缀,则根据该紧跟在起始码值之后的字节的除最高位以外的7位获得数据块长度信息,也就是下ー个起始码的位置信息,然后删除该紧跟在起始码值之后的字节,转到步骤十;若该数据块中出现了伪起始码前缀,则根据该紧跟在起始码值之后的字节获得插入的字节数,井根据插入的字节获得第一个伪起始码前缀的位置信息,然后删除插入的字节;以及步骤八,根据获得的第一个伪起始码前缀的位置信息获得第一个伪起始码前缀所包含的三个字节,根据第一个伪起始码前缀所包含的三个字节获得下ー个伪起始码前缀或者下ー个真起始码前缀的位置信息,并恢复第一个伪起始码前缀所包含的三个字节的值;步骤九,根据下ー个伪起始码前缀或真起始码前缀的位置信息获得下ー个伪起始码前缀或真起始码前缀所包含的三个字节,如果该三个字节是真起始码前綴,则该三个字节之前的数据就是所需数据块,处理过程结束;如果该三个字节不是真起始码前綴,则根据该三个字节的值获取下一个伪起始码前缀或真起始码前缀的位置信息,并将该三个字节的值恢复为起始码前缀的值,重复本步骤直到出现下ー个真起始码前缀,获得最終的数据块;步骤十,根据获得的下一个起始码前缀的位置信息寻找下一个起始码前缀,从该紧跟在起始码值之后的字节的下一个字节到下一个起始码前缀之间的所有字节为所需的数据块。进ー步地,所述数据块是指从当前起始码(包括起始码前缀和起始码值)的下一个字节开始,到下ー个起始码的第一个字节之前(不包括下ー个起始码的第一个字节)的所有数据。数据块中出现的与起始码前缀相同的若干连续字节被称为‘伪起始码前綴’,伪起始码前缀与紧跟其后的一个字节形成的若干连续字节被称为‘伪起始码’。进ー步地,于步骤三中,若该伪起始码前缀出现的次数为0,则于该数据块的第一个字节前插入ー最高位为I且包含该数据块长度信息的字节,其值为(N% 128)+128,其中N是数据块中包含的总字节数(不包含插入的字节),N% 128表示N除以128所得的余数。进ー步地,于步骤三中,若该伪起始码前缀出现的次数大于0,于该数据块的第一个字节前插入1-4个非0字节的步骤还包括如下步骤
将第一个伪起始码前缀的位置信息表示成用1-4个字节表示的形式;根据第一个伪起始码前缀的位置信息确定所需的插入字节数以及每个插入字节的值。进ー步地,将第一个伪起始码前缀的位置信息表示成((v3*255+v2)*255+vl)*31+v0 的形式;若v3 > 0,则u为3 ;否则,如果v2 > 0,则u = 2 ;否则,如果vl > 0,则u = I ;否则,u = 0 ;在该数据块的第一个字节前插入u+1个字节,按从前到后的顺序记为I
,I [I],I [2],I [3],其中 I
= (11<<5)+¥0+1,如果11>0,则1[1] = vl+1 ;如果 u > 1,则 1[2]=v2+l ;如果 u > 2,则 I [3] = v3+l。进ー步地,步骤四中的修改规则为对于最后ー个伪起始码前缀,将其所包含的三个字节的值修改为包含下一个真起始码前缀位置信息的值;对于非最后ー个伪起始码前缀,将其所包含的三个字节的值修改为包含下ー个伪起始码前缀位置信息的值。进ー步地,该修改规则为对于最后一个伪起始码如缀B[p[i]] = N% 254+2 ;B[p[i]+1] = (N/254) % 255+1 ;B[p[i]+2] = (N/254/255) % 255+1 ;对于非最后一个伪起始码如缀B [p [i] ] = p [i+1] % 254+2 ;B[p[i]+1] = (p[i+1]/254) % 255+1 ;B[p[i]+2] = (p [i+1]/254/255) % 255+1 ;其中,B[p[i]]、B[p[i]+l]、B[p[i]+2]为当前伪起始码前缀对应的三个字节,P [i+1]为下ー个伪起始码前缀的位置,N为该数据块长度(字节数),在数值上等于下ー个真起始码前缀的位置。进ー步地,于步骤六中,若该紧跟在起始码值之后的字节的最高位为1,则表示该数据块中没有出现伪起始码;若该紧跟在起始码值之后的字节的最高位为O,表示该数据块中出现了伪起始码。进ー步地,于步骤七中,若该数据块中没有出现伪起始码,则根据如下方法获得数据块长度信息,也就是下ー个起始码的位置信息N = (I
-128)+128 Xk其中1
是紧跟在起始码值之后的字节,N是数据块的长度,k是ー个未知的非负整数。进ー步地,若该数据块中出现了伪起始码,于步骤七中,根据如下方法获得该第一个伪起始码前缀的位置信息U = 1
>> 5,·如果U = O,则 p
= (I
&0xlf)-l ;如果u = l,则 p
= (I
&0xlf)_l+(I [1]_1)*31 ;如果u = 2,则 p
= (I
&0xlf)-1+(I[1]-1+(I[2]_1)*255)*31 ;如果u = 3,则 p
= (I
&0xlf)-1+(1 [I]-1+(1 [2]-1+(1 [3]-I)*255)*255)*3I ;其中p
为该第一个伪起始码前缀的位置。进ー步地,若该数据块中出现了伪起始码,于步骤八和步骤九中,根据如下方法获得下一个伪起始码前缀或真起始码前缀的位置信息p [i+1] = B [p [i] ] -2+255* (B [p [i] +1] -1+255* (B [p [i] +2]-I))为达到上述及其他目的,本发明还提供一种自动快速防止伪起始码的装置,包括编码装置与解码装置,其中该编码装置至少包括记录模组,用于在数据块中的字节对齐位置寻找伪起始码前缀,并记录伪起始码前缀出现的次数和位置;判断模组,判断记录的伪起始码前缀出现的次数;插入字节处理模组,根据判断结果进行如下处理若伪起始码前缀出现的次数为0,则在该数据块的第一个字节前面插入ー最高位为I且包含该数据块的长度信息的字节;若伪起始码前缀出现的次数大于0,则于该数据块的第一个字节前插入1-4个非0字节,该1-4个非0字节记录第一个伪起始码的位置信息;以及伪起始码前缀修改模组,根据预定的修改规则修改每个伪起始码前缀所包含的三个字节的值,将当前伪起始码前缀所包含的三个字节的值修改为包含下ー个伪起始码前缀或真起始码前缀位置信息的值,且修改后的三个字节不会与前面或后面的字节构成新的伪起始码前缀;解码装置至少包括查找模组,于接收到的数据流中寻找起始码前缀;解析模组,解析紧跟在起始码值之后的字节;位置获取模组,以于解析模组的解析结果为码流中出现了伪起始码时,根据紧跟在起始码值之后的字节获得插入的字节数,井根据插入的字节获得第一个伪起始码前缀的位置信息;以及数据块恢复模组,删除紧跟在起始码值之后的插入的1-4个字节,根据获得的第ー个伪起始码前缀的位置信息获得该第一个伪起始码前缀所包含的三个字节,井根据预定的修改规则恢复第一个伪起始码前缀所包含的三个字节的值,同时获得下一个伪起始码前缀或真起始码前缀的位置信息,依次类推直到出现真起始码前缀,获得最終的数据块,同吋,该数据块恢复模组于解析模组的解析结果为码流中没有出现伪起始码前缀时,根据紧跟在起始码值之后的字节中包含的数据块长度信息获得下ー个起始码,去掉紧跟在起始码值之后的字节,获取其下一个字节到下一个起始码之间的所有字节为最终所需数据块。进ー步地,该插入字节处理模组于该伪起始码前缀出现的次数大于0时,将该第ー个伪起始码前缀的位置信息表示成((v3*255+v2)*255+vl)*31+v0的形式,并根据v3、v2、vl及vO的数值情况确定所需插入的字节数,再根据所需插入的字节数在该数据块的第 ー个字节前插入相应字节数的记录第一个伪起始码的位置信息的非0字节。进ー步地,该修改规则为对于最后ー个伪起始码前缀,将其修改为包含下ー个真起始码前缀位置信息的值,且其第一个字节修改为大于等于2的值,第二字节和第三字节修改为非0 ;对于非最后ー个伪起始码前缀,将其修改为包含下ー个伪起始码前缀位置信息的值,且其第一个字节为大于等于2的值,第二字节和第三字节为非0值。与现有技术相比,本发明ー种自动快速防止伪起始码的方法及系统,通过于编码端记录伪起始码前缀出现的次数和位置,井根据相应规则于数据块第I个字节前插入1-4个非0字节形成新的数据块,使所形成的新的数据块中不会存在伪起始码前綴,于解码端通过相应的规则恢复所需数据块,使得解码端处理过程中,不需要在每个字节对齐位置判断是否出现了插入的数据或起始码,极大地降低了解码端处理过程的计算量。


图I为本发明ー种快速防止伪起始码的方法之编码端的处理方法的步骤流程图;图2为本发明ー种快速防止伪起始码的方法之解码端的处理方法的步骤流程图;图3为本发明较佳实施例中在数据块B之前插入的I 4个字节的结构示意图;图4为本发明较佳实施例中在数据块B内部出现伪起始码前缀的位置给三个字节重新赋值的示意图;图5为本发明较佳实施例中没有出现伪起始码前缀时的解码端处理过程示意图;图6为本发明较佳实施例中出现伪起始码前缀时的解码端处理过程示意图;图7为本发明ー种快速防止伪起始码的系统的系统架构图。
具体实施例方式以下通过特定的具体实例并结合

本发明的实施方式,本领域技术人员可由本说明书所掲示的内容轻易地了解本发明的其它优点与功效。本发明亦可通过其它不同的具体实例加以施行或应用,本说明书中的各项细节亦可基于不同观点与应用,在不背离本发明的精神下进行各种修饰与变更。假设两个起始码之间的数据块B共包含N个字节,可以表示成B= {B
,B[1],B[2],...,B[N_1]}起始码前缀为0x000001,即23个‘0’加I个‘ I’,而且总是出现在字节对齐位置。
本发明之快速防止伪起始码的方法,包括编码端的处理方法与解码端的处理方法,图I为本发明ー种快速防止伪起始码的方法之编码端的处理方法的步骤流程图,如图I所示,编码端的处理方法,包括步骤101,在数据块B中的字节对齐位置寻找伪起始码前缀0x000001,并记录伪起始码前缀出现的次数和位置,形式为{p
,p[l],...,P[M-1]},其中M>=0,是伪起始码前缀出现的次数,P [i]为第i次出现的伪起始码前缀的第一个字节的位置,也即在数据块B中的序号,P [i]的取值范围是0. .N-3 ;步骤102,判断伪起始码前缀出现的次数M ;步骤103,若M = 0,即数据块B中没有出现伪起始码前綴,则在数据块B的第I个字节,即B
,前面插入ー个字节记为1
,1
最高位应为1,且至少包含数据块B的长度イ目息;步骤104,若M > 0,则于数据块B的第I个字节前插入1_4个非0字节,这1_4个非0字节记录第一个伪起始码的位置信息P
;具体来说,首先将p
表示成((v3*255+v2)*255+vl)*31+v0的形式;然后根据v3, v2, vl, vO确定所需插入的字节数及姆个插入字节的值,如若v3 > 0,则u = 3 ;否则,如果v2 > 0,则u = 2 ;否则,如果vl > 0,则u = I ;否则,u = 0 ;在B
前插入 u+1 个字节,记为 1
,1[1],1[2],1[3]。其中 I
= (uくく 5)+v0+l。如果 u > 0,贝丨J I [I] = vl+1。如果 u > 1,贝丨J I [2] = v2+l。如果 u > 2,贝丨JI [3] = v3+l。步骤105,根据预定的修改规则修改每个伪起始码前缀所包含的三个字节的值,该修改规则为对于最后ー个伪起始码前缀所包含的三个字节,将其修改为包含下ー个真起始码前缀位置信息的值B[p[i]] = N% 254+2 ;B[p[i]+1] = (N/254) % 255+1 ;B[p[i]+2] = (N/254/255) % 255+1 ;其中i = M-l.对于非最后ー个伪起始码前缀所包含的三个字节B [p [i] ] = p [i+1] % 254+2 ;B[p[i]+1] = (p[i+1]/254) % 255+1 ;B[p[i]+2] = (p [i+1]/254/255) % 255+1 ;其中0彡i彡M-2。按照上述规则修改后,每个伪起始码前缀所包含的第一个字节为大于等于2的值,第二字节和第三字节为非0值,这样可以保证不会与它们前面或后面的任何字节构成新的伪起始码前缀。以上为本发明之编码端的处理方法。图2为本发明ー种快速防止伪起始码的方法之解码端的处理方法的步骤流程图,相应的,解码端的处理方法包括如下步骤步骤201,在接收到的数据流中寻找起始码前缀0x000001。起始码前缀后面的ー个字节是起始码值,从起始码值后面的一个字节开始是数据块Be = {1
,...,B
,B[l],…}。此时Be的长度未知;步骤202,解析紧跟在起始码值之后的字节,即I [O]。如果1
>= 128,表示码流中没有出现伪起始码前缀,则转步骤203 ;如果1
< 128,表示码流中出现了伪起始码,转步骤204。步骤203,根据紧跟在起始码值后的字节中包含的数据块长度信息获得数据块长度信息,也就是下ー个起始码前缀的位置信息,根据获得的下一个起始码前缀的位置信息寻找下一个起始码前缀,从该紧跟在起始码值之后的字节的下一个字节到下ー个起始码前缀之间的所有字节为所需的数据块B,解码端处理过程结束;在此再说明一下,这里所说的数据块是指从当前起始码(包括起始码前缀和起始码值)的下ー个字节开始,到下ー个起始码的第一个字节之前(不包括下一 个起始码的第一个字节)的所有数据。数据块中出现的与起始码前缀相同的若干连续字节被称为‘伪起始码前綴’,伪起始码前缀与紧跟其后的一个字节形成的若干连续字节被称为‘伪起始码’。步骤204,根据紧跟在起始码值之后的字节获得插入的字节数,井根据插入的字节获得第一个伪起始码前缀的位置信息,然后删除插入的字节;具体来说,u= I
> > 5,如果u = 0,则 p
= (I
&0xlf)-l ;如果u = l,则 p
= (I
&0xlf)-l+(I [1]-1)*31 ;如果u = 2,则 p
= (I
&0xlf)-l+(I[l]-l+(I[2]-l)*255)*31 ;如果u = 3,则 p
= (I
&0xlf)-1+(1 [I]-1+(1 [2]-1+(1 [3]-I)*255)*255)*3
Io步骤205,根据获得的第一个伪起始码前缀的位置信息获得第一个伪起始码前缀所包含的三个字节,根据第一个伪起始码前缀所包含的三个字节获得下ー个伪起始码前缀或者下ー个真起始码前缀的位置信息,并恢复第一个伪起始码前缀所包含的三个字节的值;步骤206,根据下ー个伪起始码前缀或真起始码前缀的位置信息获得下一个伪起始码前缀或真起始码前缀所包含的三个字节,并进行相应处理。如果该三个字节是真起始码前綴,则该三个字节之前的数据就是所需数据块,处理过程结束;如果该三个字节不是真起始码前缀,则根据该三个字节的值获取下一个伪起始码前缀或真起始码前缀的位置信息,并将该三个字节的值恢复为起始码前缀的值,重复本步骤直到出现下ー个真起始码前缀,获得最終的数据块。以下将配合一具体实施例来进ー步说明本发明ー种快速防止伪起始码的方法编码端与解码端的处理过程。图3为本发明较佳实施例中在数据块B之前插入的I 4个字节的结构示意图,图4为本发明较佳实施例中在数据块B内部出现伪起始码前缀的位置给三个字节重新赋值的示意图。配合图3及图4,首先编码端的处理过程如下(I)在数据块B中的字节对齐位置寻找伪起始码前缀0x000001,记录伪起始码前缀出现的次数和位置,形式为{p
,p[l],...,p[M-l]},其中M> = 0,是伪起始码前缀出现的次数,p[i]为第i次出现的伪起始码前缀的第一个字节的位置,也即在数据块B中的序号,P[i]的取值范围是0..N-3。
(2)若M = 0,即数据块B中没有出现伪起始码前缀,则在数据块B的第I个字节,即B
,前面插入ー个字节,该记为I
,该字节最高位应为I,且至少包含数据块B的长度信息,即1
= 128+(N% 128),编码端的处理过程结束。(3) M > 0,则执行以下步骤步骤3. 1,把 p
表示成((v3*255+v2)*255+vl)*31+v0 的形式,其中vO = p
% 31 ;vl = (p
/31) % 255 ;v2 = (p
/31/255) % 255 ;v3 = (p
/31/255/255) % 255 ; 步骤3. 2,根据v3, v2, vl, vO的数值情况计算p
所需的插入字节数u。如果v3> 0,则u = 3 ;否则,如果v2 > 0,则u = 2 ;否则,如果vl > 0,则u = I ;否则,u = 0 ;步骤3. 3,在 B
前插入 u+1 个字节,记为 1
,1[1],1[2],1[3]。其中 1
=(u << 5) +vO+lo 如果 u > 0,贝丨J I [I] = vl+1。如果 u > I,则 I [2] = v2+l0 如果 u > 2,则I [3] = v3+l,如图3所示;步骤3.4,令i = 0;步骤3. 5,如果i = M-I,则转到步骤3. 7 ;步骤3. 6,令B[p[i]] = p[i+l] % 254+2 ;B[p[i]+1] = (p[i+1]/254) % 255+1 ;B[p[i]+2] = (p [i+1]/254/255) % 255+1 ;i = i+1 ;转步骤3. 5;步骤3. 7,令B[p[i]] = N% 254+2 ;B[p[i]+1] = (N/254) % 255+1 ;B[p[i]+2] = (N/254/255) % 255+1 ;编码端处理过程结束。上述的编码端处理过程,对被处理的数据块B的字节数是有限制的,即N应小于255*255*254 = 16516350。这个数对于绝大多数音视频编码数据块是够用的。高清视频节目一帧的数据量在压缩前只有3M字节,即使对于8k*4k的超高清节目,每帧的数据量在压缩前也只有48M字节,压缩比只要达到三比一,就不会超出上述的限制。上述的编码端处理过程,可以保证在处理过程结束以后,所形成的新的数据块Be={1
, ,B
,B[l],…,B[N-1]}中不会存在伪起始码前缀,也就不会存在伪起始码。在数据块Be的开头,插入的字节都是非0的,不会与B
,B[l]构成新的伪起始码前綴。另外,数据块Be前面是起始码,即OxOOOOOlxx,即使xx = 00,也不会形成新的伪起始码。在数据块Be的中间,出现伪起始码前缀的位置上,三个字节的值都被修改为非0的值,不会和其后的字节组合成新的伪起始码前綴。特别是第一个字节被修改为大于等于2的值。即使其前面出现若干个连续的值为0的字节,也不会形成新的伪起始码前綴。图5为本发明较佳实施例中没有出现伪起始码时的解码端处理过程示意图;图6为本发明较佳实施例中出现伪起始码时的解码端处理过程示意图。配合图5及图6,解码端的处理过程包括以下步骤(I)在数 据流中寻找起始码前缀0x000001。起始码前缀后面的ー个字节是起始码值,从起始码值后面的一个字节开始是数据块Be = {I
,...,B
,B[1],...}。此时Be的长度未知。(2)解析I
,即紧跟在起始码值后面的字节。如果1
>= 128,表示码流中没有出现伪起始码,转步骤(3);如果1
< 128,表示码流中出现了伪起始码,转步骤(6)。(3)令offset = I
-128,则下ー个起始码出现在B
,即I
的下一个字节,之后第offset+k*128的位置,其中k = 0,1,2, (4)在B
之后offset+k*128的位置(k = 0,1,2,…)搜索起始码,直到遇到下ー个起始码。(5)去掉1
,从1
的下一个字节到下一个起始码之前的所有字节就是B。解码端处理过程结束。(6)令 u = I
> > 5,如果 u = 0,贝丨J p
= (I
&0xlf)-l ;如果 u = I,贝丨Jp
= (I
&0xlf)-l+(I[l]-l)*31 ;如果 u = 2,则 p
= (I
&0xlf)-1+(I[1]-1+(I-I) *255) *31 ;如果 u = 3,则 p
= (I
&0xlf)-1+(1 [I]-1+(1 [2]-1+(1 [3]-I) *255)*255)*31(7) i = I ;(8)p[i] = B[p[i-l]]-2+(B[p[i-l]+l]-l+(B[p[i-l]+2]_l)*255)*254(9)令 B[p[i-1]] = 0, B[p[i-1]+1] = 0, B[p[i_l]+2] = I(10)如果 B[p[i]] =0 且 B[p[i]+1] =0 且 B[p[i]+2] = I,则解码端处理过程结束。数据块B= {B
,B[l],...,B[p[i]-l]}是恢复的数据块。否则令i = i+l,转到步骤(8)由上述的解码端处理过程可知,在解码端处理过程中,不需要在每个字节对齐位置判断是否出现了插入的数据或起始码,只需要根据在开始位置解析得到的P
,就可以直接找到伪起始码出现的位置,将其恢复,并同时得到下一个伪起始码的位置,依次类推直到出现下ー个真正的起始码,解码端处理过程结束。与美国专利US7839895和中国专利申请200310107985. X的方案相比,极大地降低了解码端处理过程的计算量。如果码流中没有出现伪起始码,在解码端处理过程中,不需要在每个字节对齐位置判断是否遇到下ー个起始码。解码端可以根据I(O)获得ー个偏移值offset,然后在B
之后offset+k*128的位置(k = 0,1,2, ...)搜索起始码,直到遇到下ー个起始码。比起在每个字节对齐位置判断是否遇到起始码的方法,本发明所需的判断次数下降为原来的1/128。图7为本发明ー种快速防止伪起始码的系统的系统架构图。如图7所示,本发明ー种防止伪起始码的系统,包括编码装置70及解码装置71。其中编码装置70包括记录模组701、判断模组702、插入字节处理模组703以及伪起始码前缀修改模组704。记录模组701用于在数据块B中的字节对齐位置寻找伪起始码前缀0x000001,并记录伪起始码前缀出现的次数和位置,形式为{p
, p[l],,P [M-l]},其中M > = 0,是伪起始码前缀出现的次数,p [i]为第i次出现的伪起始码前缀的第一个字节的位置,也即在数据块B中的序号,p[i]的取值范围是0.. N-3;判断模组702,判断记录的伪起始码前缀出现的次数;插入字节处理模组703,根据判断结果进行如下处理若M = 0,即数据块B中没有出现伪起始码前綴,则在数据块B的第I个字节,即B
,前面插入ー个字节记为1
,1
最高位应为I,且至少包含数据块B的长度信息;若M > 0,则于数据块B的第I个字节前插入1-4个非0字节,这1-4个非0字节记录第一个伪起始码的位置信息p
;具体来说,首先将p
表示成((v3*255+v2)*255+vl)*31+v0的形式;然后根据v3,v2,vl,v0的数值情况确定所需的插入字节数,如若v3 > 0,则u = 3 ;否则,如果v2 > 0,则u = 2 ;否则,如果vl > 0,则u = I ;否则,u = 0 ;
在B
前插入 u+1 个字节,记为 1
,1[1],1[2],1[3]。其中 I
= (uくく 5)+v0+l。如果 u > 0,贝丨J I [I] = vl+1。如果 u > 1,贝丨J I [2] = v2+l。如果 u > 2,贝丨JI [3] = v3+l。伪起始码前缀修改模组704,根据预定的修改规则修改每个伪起始码前缀所包含的三个字节的值,获得新的数据块Be。将每个伪起始码前缀所包含的第一个字节修改为大于等于2的值,第二字节和第三字节修改为非0值,该修改规则为对于最后一个伪起始码如缀B[p[i]] = N% 254+2 ;B[p[i]+1] = (N/254) % 255+1 ;B[p[i]+2] = (N/254/255) % 255+1 ;其中i =M-L对于非最后一个伪起始码如缀B [p [i] ] = p [i+1] % 254+2 ;B[p[i]+1] = (p[i+1]/254) % 255+1 ;B[p[i]+2] = (p [i+1]/254/255) % 255+1 ;其中0彡i彡M-2。按照上述规则修改后,每个伪起始码前缀所包含的第一个字节为大于等于2的值,第二字节和第三字节为非0值,这样可以保证不会与它们前面或后面的任何字节构成新的伪起始码前缀。解码装置71包括查找模组710、解析模组720、位置获取模组730以及数据块恢复模组740。查找模组710,于接收到的数据流中寻找起始码前缀0x000001。起始码前缀后面的ー个字节是起始码值,从起始码值后面的一个字节开始是数据块Be = {I
,...,B
,B [I],. . . }。此时Be的长度未知;解析模组720,解析紧跟在起始码值后的字节,即I
,如果1
>= 128,表示码流中没有出现伪起始码前缀,如果I
< 128,表示码流中出现了伪起始码前缀;位置获取模组730,以于解析模组的解析结果为码流中出现了伪起始码前缀时,根据紧跟在起始码值后的字节获得插入的字节数,井根据插入的字节获得第一个伪起始码前缀的位置信息,具体来说,U= 1
>>5,
如果u = 0,则 p
= (I
&0xlf)-l ;如果u = l,则 p
= (I
&0xlf)-l+(I [1]-1)*31 ;如果u = 2,则 p
= (I
&0xlf)-1+(I[1]-1+(I[2]_1)*255)*31 ;如果u = 3,则 p
= (I
&0xlf)-1+(1 [I]-1+(1 [2]-1+(1 [3]-I)*255)*255)*3
Io数据块恢复模组740,删除紧跟在起始码值后的插入的1-4个字节,根据获得的第ー个伪起始码前缀的位置信息获得第一个伪起始码前缀所包含的三个字节,井根据预定的修改规则恢复第一个伪起始码前缀所包含的三个字节的值,同时获得下ー个伪起始码前缀或真起始码前缀的位置信息,依次类推直到出现真起始码前缀,获得最終的数据块,同吋,于解析模组的解析结果为数据块中没有出现伪起始码前缀时,根据紧跟在起始码值后的字 节中包含的数据块长度信息获得下ー个起始码,去掉紧跟在起始码值后的字节,其下ー个字节到下一个起始码之间的所有字节就是所需的数据块。可见,本发明ー种自动快速防止伪起始码的方法及系统,通过于编码端记录伪起始码前缀出现的次数和位置,井根据相应规则于数据块第I个字节前插入1-4个非0字节形成新的数据块,使所形成的新的数据块中不会存在伪起始码前綴,于解码端通过相应的规则恢复所需数据块,使得解码端处理过程中,不需要在每个字节对齐位置判断是否出现了插入的数据或起始码,极大地降低了解码端处理过程的计算量。上述实施例仅例示性说明本发明的原理及其功效,而非用于限制本发明。任何本领域技术人员均可在不违背本发明的精神及范畴下,对上述实施例进行修饰与改变。因此,本发明的权利保护范围,应如权利要求书所列。
权利要求
1.一种快速防止伪起始码的方法,包括编码端处理方法及解码端处理方法,其特征在于,该编码端处理方法包括如下步骤 步骤一,在数据块中的字节对齐位置寻找伪起始码前缀,并记录伪起始码前缀出现的次数和位置; 步骤二,判断伪起始码前缀出现的次数; 步骤三,若该伪起始码前缀出现的次数为O,则于该数据块的第一个字节前插入一最高位为I且包含该数据块长度信息的字节;若该伪起始码前缀出现的次数大于O,则于该数据块的第一个字节前插入1-4个非O字节,且该1-4个非O字节记录第一个伪起始码的位置"[目息;以及 步骤四,根据一预定的修改规则修改每个伪起始码前缀所包含的三个字节的值,将当前伪起始码前缀所包含的三个字节的值修改为包含下一个伪起始码前缀或真起始码前缀位置信息的值,且修改后的该当前伪起始码前缀所包含的三个字节不会和前面或后面的任何字节构成新的伪起始码前缀; 该解码端处理方法包括如下步骤 步骤五,在接收到的数据流中寻找起始码前缀,起始码前缀后面的一个字节为起始码值; 步骤六,解析紧跟在起始码值之后的字节以判断数据块中是否出现了伪起始码; 步骤七,若数据块中没有出现伪起始码,则根据该紧跟在起始码值之后的字节获得下一个起始码前缀的位置信息,去掉该紧跟在起始码值之后的字节,转到步骤十;若数据块中出现了伪起始码前缀,则根据该紧跟在起始码值之后的字节获得插入的字节数,并根据插入的字节获得第一个伪起始码前缀的位置信息,然后删除插入的字节;以及 步骤八,根据获得的第一个伪起始码前缀的位置信息获得第一个伪起始码前缀所包含的三个字节,根据第一个伪起始码前缀所包含的三个字节获得下一个伪起始码前缀或者下一个真起始码前缀的位置信息,并恢复第一个伪起始码前缀所包含的三个字节的值; 步骤九,根据下一个伪起始码前缀或真起始码前缀的位置信息获得所包含的三个字节,如果该三个字节是真起始码前缀,则该三个字节之前的数据就是所需数据块,处理过程结束;如果该三个字节不是真起始码前缀,则根据该三个字节的值获取下一个伪起始码前缀或真起始码前缀的位置信息,并将该三个字节的值恢复为起始码前缀的值,重复本步骤直到出现下一个真起始码前缀,获得最终的数据块; 步骤十,根据获得的下一个起始码前缀的位置信息寻找下一个起始码前缀,从该紧跟在起始码值之后的字节的下一个字节到下一个起始码前缀之间的所有字节为所需的数据块。
2.如权利要求I所述的一种自动快速防止伪起始码的方法,其特征在于所述数据块是指从包括起始码前缀和起始码值的当前起始码的下一个字节开始,到下一个起始码的第一个字节之前的所有数据。
3.如权利要求2所述的一种自动快速防止伪起始码的方法,其特征在于, 于步骤三中,若该伪起始码前缀出现的次数为O,则于该数据块的第一个字节前插入一最高位为I且包含该数据块长度信息的字节,其值为(N%128)+128,其中N是数据块中包含的总字节数,N%128表示N除以128所得的余数。
4.如权利要求3所述的一种自动快速防止伪起始码的方法,其特征在于, 于步骤三中,若该伪起始码前缀出现的次数大于O,于该数据块的第一个字节前插入1-4个非O字节的步骤还包括如下步骤 将第一个伪起始码前缀的位置信息表示成用1-4个字节表示的形式,根据第一个伪起始码前缀的位置信息确定所需的字节数以及每个字节的值。
5.如权利要求4所述的一种自动快速防止伪起始码的方法,其特征在于 将第一个伪起始码前缀的位置信息表示成((v3*255+v2)*255+vl)*31+v0的形式; 若v3>0,则u为3 ;否则,如果v2>0,则u=2 ;否则,如果vl>0,则u=l ;否则,U=O ; 在该数据块的第一个字节前插入u+1个字节,记为I
,I[1],I[2],I[3],其中I
= (u 5)+v0+l,如果 u>0,则 I[l]=vl+1 ;如果 u>l,则 I[2]=v2+1 ;如果 u>2,则I[3]=v3+l。
6.如权利要求I所述的一种自动快速防止伪起始码的方法,其特征在于,步骤四所述的修改规则为 对于最后一个伪起始码前缀,将其修改为包含下一个真起始码前缀位置信息的值; 对于非最后一个伪起始码前缀,将其修改为包含下一个伪起始码前缀位置信息的值。
7.如权利要求6所述的一种自动快速防止伪起始码的方法,其特征在于,该修改规则为 对于最后一个伪起始码前缀所包含的三个字节,B[p[i]]=N%254+2;B[p[i]+l] = (N/254)%255+l;B[p[i]+2]=(N/254/255)%255+l; 其中P[i]为最后一个伪起始码前缀的位置,N为该数据块的长度; 对于非最后一个伪起始码前缀B[p[i]]=p[i+l]%254+2;B[p[i]+1]=(p[i+1]/254)%255+1;B[p[i]+2]=(p[i+1]/254/255)%255+l; 其中,B[p[i]]、B[p[i]+l]、B[p[i]+2]为当前伪起始码前缀所包含的三个字节,p[i+l]为下一个伪起始码前缀的位置。
8.如权利要求I所述的一种自动快速防止伪起始码的方法,其特征在于于步骤六中,若该紧跟在起始码值之后的字节大于等于128,则表示该数据块中没有出现伪起始码前缀;若该紧跟在起始码值之后的字节小于128,则表示该数据块中出现了伪起始码前缀。
9.如权利要求8所述的一种自动快速防止伪起始码的方法,其特征在于,于步骤七中,若该数据块中没有出现伪起始码,则根据如下方法获得数据块长度信息,也就是下一个起始码的位置信息N= (I
-128)+128 Xk 其中1
是紧跟在起始码值之后的字节,N是数据块的长度,k是一个未知的非负整数。
10.如权利要求8所述的一种自动快速防止伪起始码的方法,其特征在于,于步骤七中,若该数据块中出现了伪起始码,根据如下方法获得该第一个伪起始码前缀的位置信息u=I
5,如果 u=0,则 p
= (I
&0xlf)-l ;如果 U=I,则 p
= (I
&0xlf)-l+(I[l]-l)*31 ;如果 11=2,则 p
= (I
&0xlf)-l+(I[l]-l+(I[2]-l)*255)*31 ;如果 u=3,则 p
= (I
&0xlf)-l+(I[l]-l+(I[2]-l+(I[3]-l)*255)*255)*31 ; 其中P
为该第一个伪起始码前缀的位置。
11.一种自动快速防止伪起始码的系统,包括编码装置与解码装置,其特征在于,该编码装置至少包括 记录模组,用于在数据块中的字节对齐位置寻找伪起始码前缀,并记录伪起始码前缀出现的次数和位置; 判断模组,判断记录的伪起始码前缀出现的次数; 插入字节处理模组,根据判断结果进行如下处理若伪起始码前缀出现的次数为0,则在该数据块的第一个字节前面插入一最高位为I且包含该数据块的长度信息的字节;若伪起始码前缀出现的次数大于0,则于该数据块的第一个字节前插入1-4个非0字节,该1-4个非0字节记录第一个伪起始码的位置信息;以及 伪起始码前缀修改模组,根据预定的修改规则修改每个伪起始码前缀所包含的三个字节的值,将当前伪起始码前缀所包含的三个字节的值修改为包含下一个伪起始码前缀或真起始码前缀位置信息的值,且修改后的该当前伪起始码前缀所包含的三个字节不会和前面或后面的任何字节构成新的伪起始码前缀; 解码装置至少包括 查找模组,于接收到的数据流中寻找起始码前缀; 解析模组,解析紧跟在起始码值之后的字节; 位置获取模组,以于解析模组的解析结果为数据块中出现了伪起始码时,根据紧跟在起始码值后的字节获得插入的字节数,并根据插入的字节获得第一个伪起始码前缀的位置"[目息;以及 数据块恢复模组,删除紧跟在起始码值后的插入的1-4个字节,根据获得的第一个伪起始码前缀的位置信息获得该第一个伪起始码前缀所包含的三个字节,并根据预定的修改规则恢复第一个伪起始码前缀所包含的三个字节的值,同时获得下一个伪起始码前缀或真起始码前缀的位置信息,依次类推直到出现真起始码前缀,获得最终的数据块,同时,该数据块恢复模组于解析模组的解析结果为数据块中没有出现伪起始码时,根据紧跟在起始码值之后的字节中包含的数据块长度信息获得下一个起始码,去掉紧跟在起始码值之后的字节,获取其下一个字节到下一个起始码之间的所有字节为最终所需数据块。
12.如权利要求11所述的一种自动快速防止伪起始码的系统,其特征在于 该插入字节处理模组于该伪起始码前缀出现的次数大于0时,将该第一个伪起始码前缀的位置信息表示成((v3*255+v2) *255+vl) *31+v0的形式,并根据v3、v2、vl及vO的数值情况确定所需插入的字节数,再根据确定的所需插入的字节数在该数据块的第一个字节前插入相应字节数的记录第一个伪起始码的位置信息的非0字节。
13.如权利要求11所述的一种自动快速防止伪起始码的系统,其特征在于,该修改规则为 对于最后一个伪起始码前缀,将其所包含的三个字节的值修改为包含下一个真起始码前缀位置信息的值,且修改后的该当前伪起始码前缀所包含的三个字节不会和前面或后面的任何字节构成新的伪起始码前缀; 对于非最后一个伪起始码前缀,将其所包含的三个字节的值修改为包含下一个伪起始码前缀位置信息的值,且修改后的该当前伪起始码前缀所包含的三个字节不会和前面或后面的任何字节构成新的伪起始码前缀。
全文摘要
本发明公开一种自动快速防止伪起始码的方法及系统,该系统包括编码端与解码端,其中编码端包括记录模组、判断模组、插入字节处理模组以及伪起始码前缀修改模组;解码端包括查找模组、解析模组、位置获取模组以及数据块恢复模组,编码端通过记录伪起始码前缀出现的次数和位置,并根据相应规则于数据块第1个字节前插入1-4个非0字节形成新的数据块,使所形成的新的数据块中不会存在伪起始码前缀,解码端再通过相应的规则恢复所需数据块,本发明使得解码端处理过程中,不需要在每个字节对齐位置判断是否出现了插入的数据或起始码,极大地降低了解码端处理过程的计算量。
文档编号H04N21/845GK102802023SQ20121031258
公开日2012年11月28日 申请日期2012年8月29日 优先权日2012年8月29日
发明者赵海武 申请人:上海国茂数字技术有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1