CN102802023B - 一种快速防止出现伪起始码的方法及装置 - Google Patents
一种快速防止出现伪起始码的方法及装置 Download PDFInfo
- Publication number
- CN102802023B CN102802023B CN201210312587.0A CN201210312587A CN102802023B CN 102802023 B CN102802023 B CN 102802023B CN 201210312587 A CN201210312587 A CN 201210312587A CN 102802023 B CN102802023 B CN 102802023B
- Authority
- CN
- China
- Prior art keywords
- pseudo
- start code
- byte
- code prefix
- prefix
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Landscapes
- Compression, Expansion, Code Conversion, And Decoders (AREA)
Abstract
本发明公开一种自动快速防止伪起始码的方法及***,该***包括编码端与解码端,其中编码端包括记录模组、判断模组、***字节处理模组以及伪起始码前缀修改模组;解码端包括查找模组、解析模组、位置获取模组以及数据块恢复模组,编码端通过记录伪起始码前缀出现的次数和位置,并根据相应规则于数据块第1个字节前***1-4个非0字节形成新的数据块,使所形成的新的数据块中不会存在伪起始码前缀,解码端再通过相应的规则恢复所需数据块,本发明使得解码端处理过程中,不需要在每个字节对齐位置判断是否出现了***的数据或起始码,极大地降低了解码端处理过程的计算量。
Description
技术领域
本发明涉及一种防止出现伪起始码的方法及装置,特别是涉及一种将音视频编码数据组织成可随机访问数据流时的快速防止出现伪起始码的方法。
背景技术
传统的视频编码标准如ITU(International Telecommunication Union,国际电信联盟)制定的H.261,H.263,H.263+,H.264标准以及ISO(InternationalOrganization for Standardization,国际标准化组织)的MPEG(Moving PicturesExperts Group,动态图像专家组)组织制定的MPEG-1,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之后***1个或2个位来防止伪起始码出现。
美国专利US7839895和中国专利200310107985.X发明的两类方法各有所长,但是它们有一个共同的缺点,就是在解码端,不论有没有出现伪起始码,都要首先逐个字节检查是否存在***的位,如果存在,则删除这些***的位。这一过程需要一定的计算量,对于计算能力有限的解码器来讲,将是一种负担。
发明内容
为克服上述现有技术存在的不足,本发明之目的在于提供一种快速防止伪起始码的方法及***,其可以使解码端在进行解码时以极小的计算量完成防伪起始码的操作。
为达上述及其它目的,本发明提供一种快速防止伪起始码的方法,包括编码端处理方法及解码端处理方法,其中,该编码端处理方法包括如下步骤:
步骤一,在数据块中的字节对齐位置寻找伪起始码前缀,并记录伪起始码前缀出现的次数和位置;
步骤二,判断伪起始码前缀出现的次数;
步骤三,若该伪起始码前缀出现的次数为0,则于该数据块的第一个字节前***一最高位为1且包含该数据块长度信息的字节;若该伪起始码前缀出现的次数大于0,则于该数据块的第一个字节前***1-4个非0字节,且该1-4个非0字节记录第一个伪起始码前缀的位置信息;以及
步骤四,根据一预定的修改规则修改每个伪起始码前缀所包含的三个字节的值,将它们修改为包含下一个伪起始码前缀或真起始码前缀位置信息的值,且修改后的三个字节不会与前面或后面的字节构成新的伪起始码前缀;
该解码端处理方法包括如下步骤:
步骤五,在接收到的数据流中寻找起始码前缀,起始码前缀后面的一个字节为起始码值;
步骤六,解析紧跟在起始码值之后的字节以判断该数据块中是否出现了伪起始码前缀;
步骤七,若该数据块中没有出现伪起始码前缀,则根据该紧跟在起始码值之后的字节的除最高位以外的7位获得数据块长度信息,也就是下一个起始码的位置信息,然后删除该紧跟在起始码值之后的字节,转到步骤十;若该数据块中出现了伪起始码前缀,则根据该紧跟在起始码值之后的字节获得***的字节数,并根据***的字节获得第一个伪起始码前缀的位置信息,然后删除***的字节;以及
步骤八,根据获得的第一个伪起始码前缀的位置信息获得第一个伪起始码前缀所包含的三个字节,根据第一个伪起始码前缀所包含的三个字节获得下一个伪起始码前缀或者下一个真起始码前缀的位置信息,并恢复第一个伪起始码前缀所包含的三个字节的值;
步骤九,根据下一个伪起始码前缀或真起始码前缀的位置信息获得下一个伪起始码前缀或真起始码前缀所包含的三个字节,如果该三个字节是真起始码前缀,则该三个字节之前的数据就是所需数据块,处理过程结束;如果该三个字节不是真起始码前缀,则根据该三个字节的值获取下一个伪起始码前缀或真起始码前缀的位置信息,并将该三个字节的值恢复为起始码前缀的值,重复本步骤直到出现下一个真起始码前缀,获得最终的数据块;
步骤十,根据获得的下一个起始码前缀的位置信息寻找下一个起始码前缀,从该紧跟在起始码值之后的字节的下一个字节到下一个起始码前缀之间的所有字节为所需的数据块。
进一步地,所述数据块是指从当前起始码(包括起始码前缀和起始码值)的下一个字节开始,到下一个起始码的第一个字节之前(不包括下一个起始码的第一个字节)的所有数据。数据块中出现的与起始码前缀相同的若干连续字节被称为‘伪起始码前缀’,伪起始码前缀与紧跟其后的一个字节形成的若干连续字节被称为‘伪起始码’。
进一步地,于步骤三中,若该伪起始码前缀出现的次数为0,则于该数据块的第一个字节前***一最高位为1且包含该数据块长度信息的字节,其值为(N%128)+128,其中N是数据块中包含的总字节数(不包含***的字节),N%128表示N除以128所得的余数。
进一步地,于步骤三中,若该伪起始码前缀出现的次数大于0,于该数据块的第一个字节前***1-4个非0字节的步骤还包括如下步骤:
将第一个伪起始码前缀的位置信息表示成用1-4个字节表示的形式;
根据第一个伪起始码前缀的位置信息确定所需的***字节数以及每个***字节的值。
进一步地,将第一个伪起始码前缀的位置信息表示成((v3*255+v2)*255+v1)*31+v0的形式;
若v3>0,则u为3;否则,如果v2>0,则u=2;否则,如果v1>0,则u=1;否则,u=0;
在该数据块的第一个字节前***u+1个字节,按从前到后的顺序记为I[0],I[1],I[2],I[3],其中I[0]=(u<<5)+v0+1,如果u>0,则I[1]=v1+1;如果u>1,则I[2]=v2+1;如果u>2,则I[3]=v3+1。
进一步地,步骤四中的修改规则为:
对于最后一个伪起始码前缀,将其所包含的三个字节的值修改为包含下一个真起始码前缀位置信息的值;
对于非最后一个伪起始码前缀,将其所包含的三个字节的值修改为包含下一个伪起始码前缀位置信息的值。
进一步地,该修改规则为:
对于最后一个伪起始码前缀
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]+1]、B[p[i]+2]为当前伪起始码前缀对应的三个字节,p[i+1]为下一个伪起始码前缀的位置,N为该数据块长度(字节数),在数值上等于下一个真起始码前缀的位置。
进一步地,于步骤六中,若该紧跟在起始码值之后的字节的最高位为1,则表示该数据块中没有出现伪起始码;若该紧跟在起始码值之后的字节的最高位为0,表示该数据块中出现了伪起始码。
进一步地,于步骤七中,若该数据块中没有出现伪起始码,则根据如下方法获得数据块长度信息,也就是下一个起始码的位置信息:
N=(I[0]-128)+128×k
其中I[0]是紧跟在起始码值之后的字节,N是数据块的长度,k是一个未知的非负整数。
进一步地,若该数据块中出现了伪起始码,于步骤七中,根据如下方法获得该第一个伪起始码前缀的位置信息:
u=I[0]>>5,
如果u=0,则p[0]=(I[0]&0x1f)-1;
如果u=1,则p[0]=(I[0]&0x1f)-1+(I[1]-1)*31;
如果u=2,则p[0]=(I[0]&0x1f)-1+(I[1]-1+(I[2]-1)*255)*31;
如果u=3,则p[0]=(I[0]&0x1f)-1+(I[1]-1+(I[2]-1+(I[3]-1)*255)*255)*31;
其中p[0]为该第一个伪起始码前缀的位置。
进一步地,若该数据块中出现了伪起始码,于步骤八和步骤九中,根据如下方法获得下一个伪起始码前缀或真起始码前缀的位置信息:
p[i+1]=B[p[i]]-2+255*(B[p[i]+1]-1+255*(B[p[i]+2]-1))
为达到上述及其他目的,本发明还提供一种自动快速防止伪起始码的装置,包括编码装置与解码装置,其中该编码装置至少包括:
记录模组,用于在数据块中的字节对齐位置寻找伪起始码前缀,并记录伪起始码前缀出现的次数和位置;
判断模组,判断记录的伪起始码前缀出现的次数;
***字节处理模组,根据判断结果进行如下处理:若伪起始码前缀出现的次数为0,则在该数据块的第一个字节前面***一最高位为1且包含该数据块的长度信息的字节;若伪起始码前缀出现的次数大于0,则于该数据块的第一个字节前***1-4个非0字节,该1-4个非0字节记录第一个伪起始码的位置信息;以及
伪起始码前缀修改模组,根据预定的修改规则修改每个伪起始码前缀所包含的三个字节的值,将当前伪起始码前缀所包含的三个字节的值修改为包含下一个伪起始码前缀或真起始码前缀位置信息的值,且修改后的三个字节不会与前面或后面的字节构成新的伪起始码前缀;
解码装置至少包括:
查找模组,于接收到的数据流中寻找起始码前缀;
解析模组,解析紧跟在起始码值之后的字节;
位置获取模组,以于解析模组的解析结果为码流中出现了伪起始码时,根据紧跟在起始码值之后的字节获得***的字节数,并根据***的字节获得第一个伪起始码前缀的位置信息;以及
数据块恢复模组,删除紧跟在起始码值之后的***的1-4个字节,根据获得的第一个伪起始码前缀的位置信息获得该第一个伪起始码前缀所包含的三个字节,并根据预定的修改规则恢复第一个伪起始码前缀所包含的三个字节的值,同时获得下一个伪起始码前缀或真起始码前缀的位置信息,依次类推直到出现真起始码前缀,获得最终的数据块,同时,该数据块恢复模组于解析模组的解析结果为码流中没有出现伪起始码前缀时,根据紧跟在起始码值之后的字节中包含的数据块长度信息获得下一个起始码,去掉紧跟在起始码值之后的字节,获取其下一个字节到下一个起始码之间的所有字节为最终所需数据块。
进一步地,该***字节处理模组于该伪起始码前缀出现的次数大于0时,将该第一个伪起始码前缀的位置信息表示成((v3*255+v2)*255+v1)*31+v0的形式,并根据v3、v2、v1及v0的数值情况确定所需***的字节数,再根据所需***的字节数在该数据块的第一个字节前***相应字节数的记录第一个伪起始码的位置信息的非0字节。
进一步地,该修改规则为:
对于最后一个伪起始码前缀,将其修改为包含下一个真起始码前缀位置信息的值,且其第一个字节修改为大于等于2的值,第二字节和第三字节修改为非0;
对于非最后一个伪起始码前缀,将其修改为包含下一个伪起始码前缀位置信息的值,且其第一个字节为大于等于2的值,第二字节和第三字节为非0值。
与现有技术相比,本发明一种自动快速防止伪起始码的方法及***,通过于编码端记录伪起始码前缀出现的次数和位置,并根据相应规则于数据块第1个字节前***1-4个非0字节形成新的数据块,使所形成的新的数据块中不会存在伪起始码前缀,于解码端通过相应的规则恢复所需数据块,使得解码端处理过程中,不需要在每个字节对齐位置判断是否出现了***的数据或起始码,极大地降低了解码端处理过程的计算量。
附图说明
图1为本发明一种快速防止伪起始码的方法之编码端的处理方法的步骤流程图;
图2为本发明一种快速防止伪起始码的方法之解码端的处理方法的步骤流程图;
图3为本发明较佳实施例中在数据块B之前***的1~4个字节的结构示意图;
图4为本发明较佳实施例中在数据块B内部出现伪起始码前缀的位置给三个字节重新赋值的示意图;
图5为本发明较佳实施例中没有出现伪起始码前缀时的解码端处理过程示意图;
图6为本发明较佳实施例中出现伪起始码前缀时的解码端处理过程示意图;
图7为本发明一种快速防止伪起始码的***的***架构图。
具体实施方式
以下通过特定的具体实例并结合附图说明本发明的实施方式,本领域技术人员可由本说明书所揭示的内容轻易地了解本发明的其它优点与功效。本发明亦可通过其它不同的具体实例加以施行或应用,本说明书中的各项细节亦可基于不同观点与应用,在不背离本发明的精神下进行各种修饰与变更。
假设两个起始码之间的数据块B共包含N个字节,可以表示成:
B={B[0],B[1],B[2],...,B[N-1]}
起始码前缀为0x000001,即23个‘0’加1个‘1’,而且总是出现在字节对齐位置。
本发明之快速防止伪起始码的方法,包括编码端的处理方法与解码端的处理方法,图1为本发明一种快速防止伪起始码的方法之编码端的处理方法的步骤流程图,如图1所示,编码端的处理方法,包括:
步骤101,在数据块B中的字节对齐位置寻找伪起始码前缀0x000001,并记录伪起始码前缀出现的次数和位置,形式为{p[0],p[1],...,p[M-1]},其中M>=0,是伪起始码前缀出现的次数,p[i]为第i次出现的伪起始码前缀的第一个字节的位置,也即在数据块B中的序号,p[i]的取值范围是0..N-3;
步骤102,判断伪起始码前缀出现的次数M;
步骤103,若M=0,即数据块B中没有出现伪起始码前缀,则在数据块B的第1个字节,即B[0],前面***一个字节记为I[0],I[0]最高位应为1,且至少包含数据块B的长度信息;
步骤104,若M>0,则于数据块B的第1个字节前***1-4个非0字节,这1-4个非0字节记录第一个伪起始码的位置信息p[0];
具体来说,首先将p[0]表示成((v3*255+v2)*255+v1)*31+v0的形式;然后根据v3,v2,v1,v0确定所需***的字节数及每个***字节的值,如:
若v3>0,则u=3;否则,如果v2>0,则u=2;否则,如果v1>0,则u=1;否则,u=0;
在B[0]前***u+1个字节,记为I[0],I[1],I[2],I[3]。其中I[0]=(u<<5)+v0+1。如果u>0,则I[1]=v1+1。如果u>1,则I[2]=v2+1。如果u>2,则I[3]=v3+1。
步骤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-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;
其中0≤i≤M-2。
按照上述规则修改后,每个伪起始码前缀所包含的第一个字节为大于等于2的值,第二字节和第三字节为非0值,这样可以保证不会与它们前面或后面的任何字节构成新的伪起始码前缀。
以上为本发明之编码端的处理方法。图2为本发明一种快速防止伪起始码的方法之解码端的处理方法的步骤流程图,相应的,解码端的处理方法包括如下步骤:
步骤201,在接收到的数据流中寻找起始码前缀0x000001。起始码前缀后面的一个字节是起始码值,从起始码值后面的一个字节开始是数据块Be={I[0],...,B[0],B[1],...}。此时Be的长度未知;
步骤202,解析紧跟在起始码值之后的字节,即I[0]。如果I[0]>=128,表示码流中没有出现伪起始码前缀,则转步骤203;如果I[0]<128,表示码流中出现了伪起始码,转步骤204。
步骤203,根据紧跟在起始码值后的字节中包含的数据块长度信息获得数据块长度信息,也就是下一个起始码前缀的位置信息,根据获得的下一个起始码前缀的位置信息寻找下一个起始码前缀,从该紧跟在起始码值之后的字节的下一个字节到下一个起始码前缀之间的所有字节为所需的数据块B,解码端处理过程结束;
在此再说明一下,这里所说的数据块是指从当前起始码(包括起始码前缀和起始码值)的下一个字节开始,到下一个起始码的第一个字节之前(不包括下一个起始码的第一个字节)的所有数据。数据块中出现的与起始码前缀相同的若干连续字节被称为‘伪起始码前缀’,伪起始码前缀与紧跟其后的一个字节形成的若干连续字节被称为‘伪起始码’。
步骤204,根据紧跟在起始码值之后的字节获得***的字节数,并根据***的字节获得第一个伪起始码前缀的位置信息,然后删除***的字节;
具体来说,u=I[0]>>5,
如果u=0,则p[0]=(I[0]&0x1f)-1;
如果u=1,则p[0]=(I[0]&0x1f)-1+(I[1]-1)*31;
如果u=2,则p[0]=(I[0]&0x1f)-1+(I[1]-1+(I[2]-1)*255)*31;
如果u=3,则p[0]=(I[0]&0x1f)-1+(I[1]-1+(I[2]-1+(I[3]-1)*255)*255)*31。
步骤205,根据获得的第一个伪起始码前缀的位置信息获得第一个伪起始码前缀所包含的三个字节,根据第一个伪起始码前缀所包含的三个字节获得下一个伪起始码前缀或者下一个真起始码前缀的位置信息,并恢复第一个伪起始码前缀所包含的三个字节的值;
步骤206,根据下一个伪起始码前缀或真起始码前缀的位置信息获得下一个伪起始码前缀或真起始码前缀所包含的三个字节,并进行相应处理。如果该三个字节是真起始码前缀,则该三个字节之前的数据就是所需数据块,处理过程结束;如果该三个字节不是真起始码前缀,则根据该三个字节的值获取下一个伪起始码前缀或真起始码前缀的位置信息,并将该三个字节的值恢复为起始码前缀的值,重复本步骤直到出现下一个真起始码前缀,获得最终的数据块。
以下将配合一具体实施例来进一步说明本发明一种快速防止伪起始码的方法编码端与解码端的处理过程。图3为本发明较佳实施例中在数据块B之前***的1~4个字节的结构示意图,图4为本发明较佳实施例中在数据块B内部出现伪起始码前缀的位置给三个字节重新赋值的示意图。配合图3及图4,首先编码端的处理过程如下:
(1)在数据块B中的字节对齐位置寻找伪起始码前缀0x000001,记录伪起始码前缀出现的次数和位置,形式为{p[0],p[1],...,p[M-1]},其中M>=0,是伪起始码前缀出现的次数,p[i]为第i次出现的伪起始码前缀的第一个字节的位置,也即在数据块B中的序号,p[i]的取值范围是0..N-3。
(2)若M=0,即数据块B中没有出现伪起始码前缀,则在数据块B的第1个字节,即B[0],前面***一个字节,该记为I[0],该字节最高位应为1,且至少包含数据块B的长度信息,即:I[0]=128+(N%128),编码端的处理过程结束。
(3)M>0,则执行以下步骤:
步骤3.1,把p[0]表示成((v3*255+v2)*255+v1)*31+v0的形式,其中:
v0=p[0]%31;
v1=(p[0]/31)%255;
v2=(p[0]/31/255)%255;
v3=(p[0]/31/255/255)%255;
步骤3.2,根据v3,v2,v1,v0的数值情况计算p[0]所需的***字节数u。如果v3>0,则u=3;否则,如果v2>0,则u=2;否则,如果v1>0,则u=1;否则,u=0;
步骤3.3,在B[0]前***u+1个字节,记为I[0],I[1],I[2],I[3]。其中I[0]=(u<<5)+v0+1。如果u>0,则I[1]=v1+1。如果u>1,则I[2]=v2+1。如果u>2,则I[3]=v3+1,如图3所示;
步骤3.4,令i=0;
步骤3.5,如果i=M-1,则转到步骤3.7;
步骤3.6,令
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;
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={I[0],...,B[0],B[1],...,B[N-1]}中不会存在伪起始码前缀,也就不会存在伪起始码。在数据块Be的开头,***的字节都是非0的,不会与B[0],B[1]构成新的伪起始码前缀。另外,数据块Be前面是起始码,即0x000001xx,即使xx=00,也不会形成新的伪起始码。在数据块Be的中间,出现伪起始码前缀的位置上,三个字节的值都被修改为非0的值,不会和其后的字节组合成新的伪起始码前缀。特别是第一个字节被修改为大于等于2的值。即使其前面出现若干个连续的值为0的字节,也不会形成新的伪起始码前缀。
图5为本发明较佳实施例中没有出现伪起始码时的解码端处理过程示意图;图6为本发明较佳实施例中出现伪起始码时的解码端处理过程示意图。配合图5及图6,解码端的处理过程包括以下步骤:
(1)在数据流中寻找起始码前缀0x000001。起始码前缀后面的一个字节是起始码值,从起始码值后面的一个字节开始是数据块Be={I[0],...,B[0],B[1],...}。此时Be的长度未知。
(2)解析I[0],即紧跟在起始码值后面的字节。如果I[0]>=128,表示码流中没有出现伪起始码,转步骤(3);如果I[0]<128,表示码流中出现了伪起始码,转步骤(6)。
(3)令offset=I[0]-128,则下一个起始码出现在B[0],即I[0]的下一个字节,之后第offset+k*128的位置,其中k=0,1,2,...
(4)在B[0]之后offset+k*128的位置(k=0,1,2,...)搜索起始码,直到遇到下一个起始码。
(5)去掉I[0],从I[0]的下一个字节到下一个起始码之前的所有字节就是B。解码端处理过程结束。
(6)令u=I[0]>>5,如果u=0,则p[0]=(I[0]&0x1f)-1;如果u=1,则p[0]=(I[0]&0x1f)-1+(I[1]-1)*31;如果u=2,则p[0]=(I[0]&0x1f)-1+(I[1]-1+(I[2]-1)*255)*31;如果u=3,则p[0]=(I[0]&0x1f)-1+(I[1]-1+(I[2]-1+(I[3]-1)*255)*255)*31
(7)i=1;
(8)p[i]=B[p[i-1]]-2+(B[p[i-1]+1]-1+(B[p[i-1]+2]-1)*255)*254
(9)令B[p[i-1]]=0,B[p[i-1]+1]=0,B[p[i-1]+2]=1
(10)如果B[p[i]]=0且B[p[i]+1]=0且B[p[i]+2]=1,则解码端处理过程结束。数据块B={B[0],B[1],...,B[p[i]-1]}是恢复的数据块。否则令i=i+1,转到步骤(8)
由上述的解码端处理过程可知,在解码端处理过程中,不需要在每个字节对齐位置判断是否出现了***的数据或起始码,只需要根据在开始位置解析得到的p[0],就可以直接找到伪起始码出现的位置,将其恢复,并同时得到下一个伪起始码的位置,依次类推直到出现下一个真正的起始码,解码端处理过程结束。与美国专利US7839895和中国专利申请200310107985.X的方案相比,极大地降低了解码端处理过程的计算量。
如果码流中没有出现伪起始码,在解码端处理过程中,不需要在每个字节对齐位置判断是否遇到下一个起始码。解码端可以根据I(0)获得一个偏移值offset,然后在B[0]之后offset+k*128的位置(k=0,1,2,...)搜索起始码,直到遇到下一个起始码。比起在每个字节对齐位置判断是否遇到起始码的方法,本发明所需的判断次数下降为原来的1/128。
图7为本发明一种快速防止伪起始码的***的***架构图。如图7所示,本发明一种防止伪起始码的***,包括:编码装置70及解码装置71。
其中编码装置70包括:记录模组701、判断模组702、***字节处理模组703以及伪起始码前缀修改模组704。记录模组701用于在数据块B中的字节对齐位置寻找伪起始码前缀0x000001,并记录伪起始码前缀出现的次数和位置,形式为{p[0],p[1],...,p[M-1]},其中M>=0,是伪起始码前缀出现的次数,p[i]为第i次出现的伪起始码前缀的第一个字节的位置,也即在数据块B中的序号,p[i]的取值范围是0..N-3;判断模组702,判断记录的伪起始码前缀出现的次数;***字节处理模组703,根据判断结果进行如下处理:
若M=0,即数据块B中没有出现伪起始码前缀,则在数据块B的第1个字节,即B[0],前面***一个字节记为I[0],I[0]最高位应为1,且至少包含数据块B的长度信息;
若M>0,则于数据块B的第1个字节前***1-4个非0字节,这1-4个非0字节记录第一个伪起始码的位置信息p[0];具体来说,首先将p[0]表示成((v3*255+v2)*255+v1)*31+v0的形式;然后根据v3,v2,v1,v0的数值情况确定所需的***字节数,如:
若v3>0,则u=3;否则,如果v2>0,则u=2;否则,如果v1>0,则u=1;否则,u=0;
在B[0]前***u+1个字节,记为I[0],I[1],I[2],I[3]。其中I[0]=(u<<5)+v0+1。如果u>0,则I[1]=v1+1。如果u>1,则I[2]=v2+1。如果u>2,则I[3]=v3+1。
伪起始码前缀修改模组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-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;
其中0≤i≤M-2。
按照上述规则修改后,每个伪起始码前缀所包含的第一个字节为大于等于2的值,第二字节和第三字节为非0值,这样可以保证不会与它们前面或后面的任何字节构成新的伪起始码前缀。
解码装置71包括查找模组710、解析模组720、位置获取模组730以及数据块恢复模组740。
查找模组710,于接收到的数据流中寻找起始码前缀0x000001。起始码前缀后面的一个字节是起始码值,从起始码值后面的一个字节开始是数据块Be={I[0],...,B[0],B[1],...}。此时Be的长度未知;解析模组720,解析紧跟在起始码值后的字节,即I[0],如果I[0]>=128,表示码流中没有出现伪起始码前缀,如果I[0]<128,表示码流中出现了伪起始码前缀;位置获取模组730,以于解析模组的解析结果为码流中出现了伪起始码前缀时,根据紧跟在起始码值后的字节获得***的字节数,并根据***的字节获得第一个伪起始码前缀的位置信息,具体来说,u=I[0]>>5,
如果u=0,则p[0]=(I[0]&0x1f)-1;
如果u=1,则p[0]=(I[0]&0x1f)-1+(I[1]-1)*31;
如果u=2,则p[0]=(I[0]&0x1f)-1+(I[1]-1+(I[2]-1)*255)*31;
如果u=3,则p[0]=(I[0]&0x1f)-1+(I[1]-1+(I[2]-1+(I[3]-1)*255)*255)*31。
数据块恢复模组740,删除紧跟在起始码值后的***的1-4个字节,根据获得的第一个伪起始码前缀的位置信息获得第一个伪起始码前缀所包含的三个字节,并根据预定的修改规则恢复第一个伪起始码前缀所包含的三个字节的值,同时获得下一个伪起始码前缀或真起始码前缀的位置信息,依次类推直到出现真起始码前缀,获得最终的数据块,同时,于解析模组的解析结果为数据块中没有出现伪起始码前缀时,根据紧跟在起始码值后的字节中包含的数据块长度信息获得下一个起始码,去掉紧跟在起始码值后的字节,其下一个字节到下一个起始码之间的所有字节就是所需的数据块。
可见,本发明一种自动快速防止伪起始码的方法及***,通过于编码端记录伪起始码前缀出现的次数和位置,并根据相应规则于数据块第1个字节前***1-4个非0字节形成新的数据块,使所形成的新的数据块中不会存在伪起始码前缀,于解码端通过相应的规则恢复所需数据块,使得解码端处理过程中,不需要在每个字节对齐位置判断是否出现了***的数据或起始码,极大地降低了解码端处理过程的计算量。
上述实施例仅例示性说明本发明的原理及其功效,而非用于限制本发明。任何本领域技术人员均可在不违背本发明的精神及范畴下,对上述实施例进行修饰与改变。因此,本发明的权利保护范围,应如权利要求书所列。
Claims (13)
1.一种快速防止伪起始码的方法,包括编码端处理方法及解码端处理方法,其特征在于,该编码端处理方法包括如下步骤:
步骤一,在数据块中的字节对齐位置寻找伪起始码前缀,并记录伪起始码前缀出现的次数和位置;
步骤二,判断伪起始码前缀出现的次数;
步骤三,若该伪起始码前缀出现的次数为0,则于该数据块的第一个字节前***一最高位为1且包含该数据块长度信息的字节;若该伪起始码前缀出现的次数大于0,则于该数据块的第一个字节前***1-4个非0字节,且该1-4个非0字节记录第一个伪起始码的位置信息;以及
步骤四,根据一预定的修改规则修改每个伪起始码前缀所包含的三个字节的值,将当前伪起始码前缀所包含的三个字节的值修改为包含下一个伪起始码前缀或真起始码前缀位置信息的值,且修改后的该当前伪起始码前缀所包含的三个字节不会和前面或后面的任何字节构成新的伪起始码前缀;
该解码端处理方法包括如下步骤:
步骤五,在接收到的数据流中寻找起始码前缀,起始码前缀后面的一个字节为起始码值;
步骤六,解析紧跟在起始码值之后的字节以判断数据块中是否出现了伪起始码;
步骤七,若数据块中没有出现伪起始码,则根据该紧跟在起始码值之后的字节获得下一个起始码前缀的位置信息,去掉该紧跟在起始码值之后的字节,转到步骤十;若数据块中出现了伪起始码前缀,则根据该紧跟在起始码值之后的字节获得***的字节数,并根据***的字节获得第一个伪起始码前缀的位置信息,然后删除***的字节;以及
步骤八,根据获得的第一个伪起始码前缀的位置信息获得第一个伪起始码前缀所包含的三个字节,根据第一个伪起始码前缀所包含的三个字节获得下一个伪起始码前缀或者下一个真起始码前缀的位置信息,并恢复第一个伪起始码前缀所包含的三个字节的值;
步骤九,根据下一个伪起始码前缀或真起始码前缀的位置信息获得所包含的三个字节,如果该三个字节是真起始码前缀,则该三个字节之前的数据就是所需数据块,处理过程结束;如果该三个字节不是真起始码前缀,则根据该三个字节的值获取下一个伪起始码前缀或真起始码前缀的位置信息,并将该三个字节的值恢复为起始码前缀的值,重复本步骤直到出现下一个真起始码前缀,获得最终的数据块;
步骤十,根据获得的下一个起始码前缀的位置信息寻找下一个起始码前缀,从该紧跟在起始码值之后的字节的下一个字节到下一个起始码前缀之间的所有字节为所需的数据块。
2.如权利要求1所述的一种快速防止伪起始码的方法,其特征在于:所述数据块是指从包括起始码前缀和起始码值的当前起始码的下一个字节开始,到下一个起始码的第一个字节之前的所有数据。
3.如权利要求2所述的一种快速防止伪起始码的方法,其特征在于,
于步骤三中,若该伪起始码前缀出现的次数为0,则于该数据块的第一个字节前***一最高位为1且包含该数据块长度信息的字节,其值为(N%128)+128,其中N是数据块中包含的总字节数,N%128表示N除以128所得的余数。
4.如权利要求3所述的一种快速防止伪起始码的方法,其特征在于,
于步骤三中,若该伪起始码前缀出现的次数大于0,于该数据块的第一个字节前***1-4个非0字节的步骤还包括如下步骤:
将第一个伪起始码前缀的位置信息表示成用1-4个字节表示的形式,根据第一个伪起始码前缀的位置信息确定所需的字节数以及每个字节的值。
5.如权利要求4所述的一种快速防止伪起始码的方法,其特征在于:
将第一个伪起始码前缀的位置信息表示成((v3*255+v2)*255+v1)*31+v0的形式,其中,v0,v1,v2,v3是整数,“*”表示相乘;
若v3>0,则u为3;否则,如果v2>0,则u=2;否则,如果v1>0,则u=1;否则,u=0;
在该数据块的第一个字节前***u+1个字节,记为I[0],I[1],I[2],I[3],其中I[0]=(u<<5)+v0+1,如果u>0,则I[1]=v1+1;如果u>1,则I[2]=v2+1;如果u>2,则I[3]=v3+1。
6.如权利要求1所述的一种快速防止伪起始码的方法,其特征在于,步骤四所述的修改规则为:
对于最后一个伪起始码前缀,将其修改为包含下一个真起始码前缀位置信息的值;
对于非最后一个伪起始码前缀,将其修改为包含下一个伪起始码前缀位置信息的值。
7.如权利要求6所述的一种快速防止伪起始码的方法,其特征在于,该修改规则为:
对于最后一个伪起始码前缀所包含的三个字节,
B[p[i]]=N%254+2;
B[p[i]+1]=(N/254)%255+1;
B[p[i]+2]=(N/254/255)%255+1;
其中p[i]为最后一个伪起始码前缀的位置,N为该数据块的长度;
对于非最后一个伪起始码前缀:
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]+1]、B[p[i]+2]为当前伪起始码前缀所包含的三个字节,p[i+1]为下一个伪起始码前缀的位置,“%”表示取余数,“/”表示相除。
8.如权利要求1所述的一种快速防止伪起始码的方法,其特征在于:于步骤六中,若该紧跟在起始码值之后的字节大于等于128,则表示该数据块中没有出现伪起始码前缀;若该紧跟在起始码值之后的字节小于128,则表示该数据块中出现了伪起始码前缀。
9.如权利要求8所述的一种快速防止伪起始码的方法,其特征在于,于步骤七中,若该数据块中没有出现伪起始码,则根据如下方法获得数据块长度信息,也就是下一个起始码的位置信息:
N=(I[0]-128)+128×k
其中I[0]是紧跟在起始码值之后的字节,N是数据块的长度,k是一个未知的非负整数。
10.如权利要求8所述的一种快速防止伪起始码的方法,其特征在于,于步骤七中,若该数据块中出现了伪起始码,根据如下方法获得该第一个伪起始码前缀的位置信息:
u=I[0]>>5,其中,I[0]是紧跟在起始码值之后的字节;
如果u=0,则p[0]=(I[0]&0x1f)-1;
如果u=1,则p[0]=(I[0]&0x1f)-1+(I[1]-1)*31;
如果u=2,则p[0]=(I[0]&0x1f)-1+(I[1]-1+(I[2]-1)*255)*31;
如果u=3,则p[0]=(I[0]&0x1f)-1+(I[1]-1+(I[2]-1+(I[3]-1)*255)*255)*31;
其中p[0]为该第一个伪起始码前缀的位置。
11.一种自动快速防止伪起始码的***,包括编码装置与解码装置,其特征在于,该编码装置至少包括:
记录模组,用于在数据块中的字节对齐位置寻找伪起始码前缀,并记录伪起始码前缀出现的次数和位置;
判断模组,判断记录的伪起始码前缀出现的次数;
***字节处理模组,根据判断结果进行如下处理:若伪起始码前缀出现的次数为0,则在该数据块的第一个字节前面***一最高位为1且包含该数据块的长度信息的字节;若伪起始码前缀出现的次数大于0,则于该数据块的第一个字节前***1-4个非0字节,该1-4个非0字节记录第一个伪起始码的位置信息;以及
伪起始码前缀修改模组,根据预定的修改规则修改每个伪起始码前缀所包含的三个字节的值,将当前伪起始码前缀所包含的三个字节的值修改为包含下一个伪起始码前缀或真起始码前缀位置信息的值,且修改后的该当前伪起始码前缀所包含的三个字节不会和前面或后面的任何字节构成新的伪起始码前缀;
解码装置至少包括:
查找模组,于接收到的数据流中寻找起始码前缀;
解析模组,解析紧跟在起始码值之后的字节;
位置获取模组,以于解析模组的解析结果为数据块中出现了伪起始码时,根据紧跟在起始码值后的字节获得***的字节数,并根据***的字节获得第一个伪起始码前缀的位置信息;以及
数据块恢复模组,删除紧跟在起始码值后的***的1-4个字节,根据获得的第一个伪起始码前缀的位置信息获得该第一个伪起始码前缀所包含的三个字节,并根据预定的修改规则恢复第一个伪起始码前缀所包含的三个字节的值,同时获得下一个伪起始码前缀或真起始码前缀的位置信息,依次类推直到出现真起始码前缀,获得最终的数据块,同时,该数据块恢复模组于解析模组的解析结果为数据块中没有出现伪起始码时,根据紧跟在起始码值之后的字节中包含的数据块长度信息获得下一个起始码,去掉紧跟在起始码值之后的字节,获取其下一个字节到下一个起始码之间的所有字节为最终所需数据块。
12.如权利要求11所述的一种快速防止伪起始码的***,其特征在于:
该***字节处理模组于该伪起始码前缀出现的次数大于0时,将该第一个伪起始码前缀的位置信息表示成((v3*255+v2)*255+v1)*31+v0的形式,并根据v3、v2、v1及v0的数值情况确定所需***的字节数,再根据确定的所需***的字节数在该数据块的第一个字节前***相应字节数的记录第一个伪起始码的位置信息的非0字节。
13.如权利要求11所述的一种快速防止伪起始码的***,其特征在于,
该修改规则为:
对于最后一个伪起始码前缀,将其所包含的三个字节的值修改为包含下一个真起始码前缀位置信息的值,且修改后的该当前伪起始码前缀所包含的三个字节不会和前面或后面的任何字节构成新的伪起始码前缀;
对于非最后一个伪起始码前缀,将其所包含的三个字节的值修改为包含下一个伪起始码前缀位置信息的值,且修改后的该当前伪起始码前缀所包含的三个字节不会和前面或后面的任何字节构成新的伪起始码前缀。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201210312587.0A CN102802023B (zh) | 2012-08-29 | 2012-08-29 | 一种快速防止出现伪起始码的方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201210312587.0A CN102802023B (zh) | 2012-08-29 | 2012-08-29 | 一种快速防止出现伪起始码的方法及装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN102802023A CN102802023A (zh) | 2012-11-28 |
CN102802023B true CN102802023B (zh) | 2014-08-27 |
Family
ID=47200975
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201210312587.0A Active CN102802023B (zh) | 2012-08-29 | 2012-08-29 | 一种快速防止出现伪起始码的方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN102802023B (zh) |
Families Citing this family (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN109743581B (zh) * | 2019-01-24 | 2021-08-27 | 上海国茂数字技术有限公司 | 编码端处理方法、解码端处理方法及防止伪起始码的方法 |
CN111684804B (zh) * | 2019-04-30 | 2022-05-13 | 深圳市大疆创新科技有限公司 | 一种数据编码、数据解码方法、设备及存储介质 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
EP1753244A1 (en) * | 2002-01-22 | 2007-02-14 | Microsoft Corporation | Methods and systems for start code emulation prevention and data stuffing |
CN101640805A (zh) * | 2008-07-28 | 2010-02-03 | 青岛海信信芯科技有限公司 | 一种视频解码方法及视频解码器 |
CN101646073A (zh) * | 2008-08-08 | 2010-02-10 | 青岛海信信芯科技有限公司 | 一种视频解码方法及应用该方法的电视机 |
CN101800892A (zh) * | 2010-03-04 | 2010-08-11 | 青岛海信信芯科技有限公司 | 多媒体码流识别的方法和装置 |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
TWI310137B (en) * | 2002-04-19 | 2009-05-21 | Microsoft Corp | Methods and systems for preventing start code emulation at locations that include non-byte aligned and/or bit-shifted positions |
-
2012
- 2012-08-29 CN CN201210312587.0A patent/CN102802023B/zh active Active
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
EP1753244A1 (en) * | 2002-01-22 | 2007-02-14 | Microsoft Corporation | Methods and systems for start code emulation prevention and data stuffing |
CN101640805A (zh) * | 2008-07-28 | 2010-02-03 | 青岛海信信芯科技有限公司 | 一种视频解码方法及视频解码器 |
CN101646073A (zh) * | 2008-08-08 | 2010-02-10 | 青岛海信信芯科技有限公司 | 一种视频解码方法及应用该方法的电视机 |
CN101800892A (zh) * | 2010-03-04 | 2010-08-11 | 青岛海信信芯科技有限公司 | 多媒体码流识别的方法和装置 |
Also Published As
Publication number | Publication date |
---|---|
CN102802023A (zh) | 2012-11-28 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US8594366B2 (en) | Context-based adaptive binary arithmetic coding (CABAC) video stream compliance | |
EP2123053B1 (en) | Generating a data stream and identifying positions within a data stream | |
CN101321279B (zh) | 处理数据的方法和*** | |
CN101197578B (zh) | 游程编码方法、游程编码解码***以及颜色数据存储方法 | |
KR102122628B1 (ko) | 컨테이너 포맷으로 된 미디어 파일의 구문 인식 조작 | |
CN101017574A (zh) | 一种适于jpeg码流的哈夫曼解码方法 | |
CN103475935A (zh) | 一种视频片段的检索方法及装置 | |
JP2012034398A (ja) | ビデオを復号する再同期方法 | |
US8565299B2 (en) | Method and apparatus for processing audio/video bit-stream | |
CN104350751A (zh) | 扩展数据处理 | |
US7436328B2 (en) | Video coding with start code emulation prevention | |
EP2908518A1 (en) | Encoding/decoding method, video sequence stream encoding/decoding method, and device corresponding thereto | |
KR100963211B1 (ko) | 버전이 다른 avs1-p2 비트스트림을 시그널링하고디코딩하기 위한 방법 및 장치 | |
CN106576152A (zh) | 改进的屏幕内容编码方法 | |
CN102802023B (zh) | 一种快速防止出现伪起始码的方法及装置 | |
CN109743581B (zh) | 编码端处理方法、解码端处理方法及防止伪起始码的方法 | |
US20100246983A1 (en) | Data compression method | |
CN1684522B (zh) | 处理音频帧的方法和解码器电路 | |
CN109600616B (zh) | 一种基于h.264视频压缩标准的码流封装方法 | |
EP1130926A2 (en) | Variable length decoding system and method | |
KR100296684B1 (ko) | 오디오/비디오 압축 코드 데이타를 디코딩하기 위한 디코딩 방법 및 디코더 | |
CN105208462B (zh) | 视频数字水印处理方法及执行该方法的视频数字水印*** | |
WO2003061137A2 (en) | Robust signal coding | |
WO2020220249A1 (zh) | 一种数据编码、数据解码方法、设备及存储介质 | |
RU2331914C2 (ru) | Способ формирования потока данных с возможностью произвольного доступа и соответствующий способ его декодирования |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant |