CN109743581B - 编码端处理方法、解码端处理方法及防止伪起始码的方法 - Google Patents
编码端处理方法、解码端处理方法及防止伪起始码的方法 Download PDFInfo
- Publication number
- CN109743581B CN109743581B CN201910069112.5A CN201910069112A CN109743581B CN 109743581 B CN109743581 B CN 109743581B CN 201910069112 A CN201910069112 A CN 201910069112A CN 109743581 B CN109743581 B CN 109743581B
- Authority
- CN
- China
- Prior art keywords
- length information
- start code
- data block
- byte
- value
- 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
- 238000003672 processing method Methods 0.000 title claims abstract description 33
- 238000000034 method Methods 0.000 title claims abstract description 21
- 238000012545 processing Methods 0.000 claims description 16
- 238000004458 analytical method Methods 0.000 claims description 4
- 238000011084 recovery Methods 0.000 claims description 4
- 238000004364 calculation method Methods 0.000 abstract description 4
- 238000012217 deletion Methods 0.000 description 2
- 230000037430 deletion Effects 0.000 description 2
- 230000008520 organization Effects 0.000 description 2
- 230000004075 alteration Effects 0.000 description 1
- 230000006835 compression Effects 0.000 description 1
- 238000007906 compression Methods 0.000 description 1
- 230000007547 defect Effects 0.000 description 1
- 238000013461 design Methods 0.000 description 1
- 238000010586 diagram Methods 0.000 description 1
- 238000005516 engineering process Methods 0.000 description 1
- 238000003780 insertion Methods 0.000 description 1
- 230000037431 insertion Effects 0.000 description 1
- 238000006467 substitution reaction Methods 0.000 description 1
Images
Abstract
本发明提供了一种编码端处理方法、解码端处理方法及防止伪起始码的方法,通过在编码时插入临时长度信息并记录起始码前缀的位置信息,然后删除起始码前缀使形成的新的数据块中不会存在伪起始码前缀,在解码时通过长度信息恢复所需的数据块,既能快速防止伪起始码又能获取当前数据块的长度,且在进行解码时以极小的计算量完成防伪起始码的操作,而且在一个数据块到齐时可以及时开始解码,不需要等待下一个起始码。
Description
技术领域
本发明涉及视频数据流的编解码技术领域,尤其涉及一种编码端处理方法、解码端处理方法及防止伪起始码的方法。
背景技术
传统的视频编码标准如ITU(International Telecommunication Union,国际电信联盟)制定的H.261,H.263,H.263+,H.264标准以及ISO(International Organizationfor Standardization,国际标准化组织)的MPEG(Moving Pictures Experts Group,动态图像专家组)组织制定的MPEG-1,MPEG-2,MPEG-4等都需编码器把音视频编码数据块组织成可随机访问数据流,以便解码器可以从设置的随机访问点处开始解码。在以上标准中都是通过起始码来实现编码数据的随机访问的,例如视频序列起始码、图像组起始码、图像起始码等等。这些起始码都是由起始码前缀和起始码值两部分组成。起始码前缀是一个固定的二进制位串,标志一个起始码的存在;起始码值是一个数值,指出起始码的含义。
如果在数据块中出现了与起始码前缀一样的二进制位串,则解码器就有可能把该位串错误地当成起始码前缀,从而引起解码错误。这样的二进制位串与紧随其后的若干二进制位构成了伪起始码。为了保证音视频码流的正确解码,必须防止在码流中出现伪起始码。
防止出现伪起始码的通常方法是在设计码流的语法结构时设置一些禁止值和掩码位。所谓禁止值是指禁止语法元素取某些值,因为如果该语法元素取了那些值,就有可能出现伪起始码。所谓掩码位,是指在可能出现伪起始码的语法元素之间插入一个固定的二进制位。上述的设置禁止值和掩码位的方法有以下缺点:a.增加了语法设计的复杂性。设计语法结构时,要时时刻刻考虑到是否会出现伪起始码,是否需要禁止一些值,是否需要插入掩码位;b.降低了语法结构的易读性,这些与压缩编码无关的语法元素混在语法结构中,使人不容易抓住要点;c.效率不高,在有可能产生伪起始码的地方都必须采取措施,而不论语法元素的具体取值是否会真的产生伪起始码。
上述的防伪起始码方法有如下问题:(1)解码时必须在接收到的码流中不断搜索起始码,计算量较大;(2)必须接收到下一个起始码才能判断出一个数据块的结束。
为了克服上述缺陷,本发明提供一种快速防伪起始码方法,在防伪起始码的同时插入数据块长度信息,使解码模块不再依赖下一个起始码就能够判断数据块中的数据是否已到齐。
发明内容
本发明的目的在于提供一种编码端处理方法、解码端处理方法及防止伪起始码的方法,其可以使解码端在进行解码时以极小的计算量完成防伪起始码的操作。
为了达到上述目的,本发明提供了一种编码端处理方法,包括:
S11:获取数据块并在所述数据块的前端插入M个字节的临时长度信息,在所述数据块的末尾插入一起始码前缀,其中M为大于0的整数,执行步骤S12;
S12:在所述数据块中插入临时长度信息之后的字节对齐位置寻找起始码前缀,并记录出现第一个起始码前缀的位置信息N,执行步骤S13;
S13:根据找到的起始码前缀的位置信息N得到长度信息,并将插入的临时长度信息替换为所述长度信息,执行步骤S14;
S14:若找到的起始码前缀不是在所述数据块末尾插入的起始码前缀,令长度信息的最高位的值为0,删除找到的起始码前缀并在删除的位置处重新插入M个字节的临时长度信息,并执行步骤S12,若找到的起始码前缀是在所述数据块末尾插入的起始码前缀,令长度信息的最高位的值为1,并删除所述数据块末尾插入的起始码前缀,处理过程结束。
可选的,起始码前缀的位置信息N为插入的临时长度信息之后,找到的起始码前缀之前的字节数。
可选的,所述长度信息具有M个字节,且根据找到的起始码前缀的位置信息N得到长度信息,并将插入的临时长度信息替换为所述长度信息的步骤包括:
根据找到的起始码前缀的位置信息N得到所述长度信息中每个字节的值;
将所述长度信息中每个字节的值赋予插入的临时长度信息的对应字节。
可选的,令所述长度信息的每个字节的值为B[i],并利用如下公式得到所述长度信息中每个字节的值:
当M=1时:
B[0]=N%255+2;
当M>1时:
B[i]=(N/255i)%255+1,i=0~M-2;
B[i]=(N/255i)%255+2,i=M-1;
其中,i为所述长度信息的字节对应的序号,i从左到右的取值为M-1~0,“%”表示取余除法,“/”表示取整除法。
可选的,所述数据块的长度小于等于G值,其中:
当M=1时,A[0]=125,当M>=2且i=0~M-2时,A[i]=254;当M>=2且i=M-1时A[i]=125。
可选的,将每个处理好的数据块前段插入起始码并拼接在一起以形成数据流,所述数据流中的每个所述数据块中的长度信息的字节数M相等,且根据所述数据流中数据块的长度的最大值确定所述长度信息的字节数M。
本发明还提供了一种解码端处理方法,包括:
S21:在接收到的数据流中寻找起始码,执行步骤S22;
S22:解析出所述数据块出现的下一个长度信息,并根据所述长度信息得到起始码前缀的位置信息N,执行步骤S23;
S23:若所述长度信息的最高位的值为0,删除所述长度信息并在删除位置的N个字节后插入起始码前缀,并执行步骤S22,若所述长度信息的最高位的值为1,删除所述长度信息,并执行步骤S21。
可选的,步骤S22中所述的下一个长度信息是指起始码之后的M个字节或者步骤S23中插入的起始码前缀后的M个字节。
可选的,令所述长度信息的每个字节的值为B[i],利用如下公式得到起始码前缀的位置信息N:
其中,当M=1时,C[0]=(B[0]&0x7f)-2;当M>=2且i=0~M-2时,C[i]=B[i]-1;当M>=2且i=M-1时C[i]=(B[i]&0x7f)-2;i为所述长度信息的字节对应的序号,“*”为相乘,“&”为与运算。
可选的,所述数据流包括若干数据块,所述起始码位于两个数据块之间,且每个所述起始码均包括起始码前缀及起始码值。
可选的,将数据块的长度L初始化为0,得到起始码前缀的位置信息N后,当所述长度信息的最高位的值为0时,令数据块的长度L=L+N+3,当所述长度信息的最高位的值为1时,令数据块的长度L=L+N。
本发明还提供了一种防止伪起始码的方法,包括:
利用所述的编码端处理方法对数据块进行编码并形成数据流;
利用所述的解码端处理方法对所述数据流进行解码。
本发明还提供了一种编码装置,包括:
插入字节模组,用于在数据块的前端插入M个字节的临时长度信息,在数据块的末尾插入一起始码前缀,其中M为大于0的整数;
记录及修改字节模组,用于寻找并记录出现第一个起始码前缀的位置信息N以得到长度信息,并将插入的临时长度信息替换为所述长度信息;
第一判断模组,用于判断找到的起始码前缀是否为在所述数据块末尾插入的起始码前缀;
插入字节处理模组,根据判断结果进行如下处理:若找到的起始码前缀不是在所述数据块末尾插入的起始码前缀,令长度信息的最高位的值为0,删除找到的起始码前缀并在删除的位置处重新插入M个字节的临时长度信息,若找到的起始码前缀是在所述数据块末尾插入的起始码前缀,令长度信息的最高位的值为1,并删除所述数据块末尾插入的起始码前缀。
本发明还提供了一种解码装置,包括:
查找模组,用于在接收到的数据流中寻找起始码;
解析模组,解析出所述数据块出现的下一个长度信息,并根据所述长度信息得到起始码前缀的位置信息N;
第二判断模组,用于判断所述长度信息的最高位的值是否为0;
数据块恢复模组,根据判断结果进行如下处理:若所述长度信息的最高位的值为0,删除所述长度信息并在删除位置的N个字节后插入起始码前缀,若所述长度信息的最高位的值为1,删除所述长度信息。
本发明还提供了一种防止伪起始码的系统,包括所述编码装置及所述解码装置,所述编码装置对数据块进行编码并形成数据流,所述解码装置对所述数据流进行解码。
本发明提供了一种编码端处理方法、解码端处理方法及防止伪起始码的方法,通过在编码时插入临时长度信息并记录起始码前缀的位置信息,然后删除起始码前缀使形成的新的数据块中不会存在伪起始码前缀,在解码时通过长度信息恢复所需的数据块,既能快速防止伪起始码又能获取当前数据块的长度,且在进行解码时以极小的计算量完成防伪起始码的操作,并且由于在编码时在数据块中插入了长度信息,在解码时,一个数据块到齐时可以及时开始解码,不需要等待下一个起始码。
附图说明
图1为本发明实施例提供的编码端处理方法的流程图;
图2为本发明实施例提供的解码端处理方法的流程图;
图3为本发明实施例提供的防止伪起始码的系统的结构框图;
其中,1-编码装置;11-插入字节模组;12-记录及修改字节模组;13-第一判断模组;14-插入字节处理模组;2-解码装置;21-查找模组;22-解析模组;23-第二判断模组;24-数据块恢复模组。
具体实施方式
下面将结合示意图对本发明的具体实施方式进行更详细的描述。根据下列描述和权利要求书,本发明的优点和特征将更清楚。需说明的是,附图均采用非常简化的形式且均使用非精准的比例,仅用以方便、明晰地辅助说明本发明实施例的目的。
假设两个起始码之间的数据块K[j]共包含j个字节,可以表示成:
K={K[j-1],K[j-2],...,K[1],K[0]};
起始码前缀由24个比特构成,取固定的值0x000001,即23个‘0’加1个‘1’,而且总是出现在字节对齐位置(起始码前缀的第一个比特的序号能被8整除),起始码由起始码前缀和起始码值构成,起始码值包含8个比特,例如0x00000153、0x000001b4。
如图1所示,本实施例提供了一种编码端处理方法,包括:
S11:提供数据块K[j]并在所述数据块K[j]的前端插入M(M为大于0的整数)个字节的临时长度信息P[i],其中P[i]可以表示成P={P[M-1],P[M-2],...,P[1],P[0]},其中,i为临时长度信息的字节对应的序号,且临时长度信息从左到右i的取值为M-1~0,然后在所述数据块K[j]的末尾插入一起始码前缀0x000001,执行步骤S12;
S12:在所述数据块K[j]中最新插入的临时长度信息P[i]之后的字节对齐位置寻找起始码前缀,并记录出现第一个起始码前缀的位置信息,可以理解的是,起始码前缀的位置信息为插入的临时长度信息P[i]之后,找到的起始码前缀之前的字节数,记为N,执行步骤S13;
S13:根据找到的起始码前缀的位置信息N利用如下公式得到长度信息,所述长度信息与所述临时长度信息的字节数相等,均为M,令所述长度信息为B[i],其中,B[i]可以表示为B={B[M-1],B[M-2],...,B[1],B[0]},其中,i为长度信息的字节数,且长度信息从左到右i的取值为M-1~0,长度信息中每个字节的值为:
当M=1时:
B[0]=N%255+2;
当M>1时:
B[i]=(N/255i)%255+1,i=0~M-2;
B[i]=(N/255i)%255+2,i=M-1;
其中,可以理解的是,M具体有几个字节就可以计算出几个字节的具体值,如若M=1,则只需要计算B[0]即可。“%”表示相除后取余数,“/”表示相除后取整数,例如7%4=3,7/4=1。
将插入的临时长度信息P[i]中每个字节的值替换为所述长度信息B[i]中对应字节的值,以使所述临时长度信息替换为所述长度信息,或者也可以这么理解,由于在此步骤之前,插入的临时长度信息P[i]中每个字节的值是未知的,所以需要通过此步骤将插入的临时长度信息P[i]中每个字节的值求出,执行步骤S14;
S14:若找到的起始码前缀不是在所述数据块末尾插入的起始码前缀,则说明找到的起始码前缀是伪起始码前缀,令长度信息的最高位(最高比特位)的值为0,即令B[M-1]=B[M-1]&0x7f(‘&’表示‘与’运算),删除找到的起始码前缀并在刚刚删除的位置处重新插入M个字节的临时长度信息(这个临时长度信息与步骤S11中插入的临时长度信息的字节数相同,每个字节的值可能相同,也可能不同),这样一来就将伪起始码前缀删除了,并重新执行步骤S12,寻找刚刚插入的临时长度信息之后的起始码前缀,直至找完所有的伪起始码前缀。最后,若找到的起始码前缀是在所述数据块末尾插入的起始码前缀,则表明伪起始码前缀已经找完或者表明数据块中已经不存在伪起始码前缀了,则令长度信息的最高位的值为1,即B[M-1]=B[M-1]|0x80(‘|’表示‘或’运算),并删除所述数据块末尾插入的起始码前缀,这个数据块即处理完成,可以重新执行步骤S11以处理下一个数据块。
在处理完若干个数据块之后,可以在每个所述数据块之前插入起始码,起始码包括起始码前缀(0x000001)和起始码值(1个字节),起始码值表示数据块中数据的类型,由外部定义。把已处理的数据块连接起来,形成数据流发送出去,由于在编码时已经将伪起始码前缀全部删除,此时数据流中的起始码前缀均为起始码中的起始码前缀,也就是说,并不存在伪起始码。
可以理解的是,临时长度信息的字节数M和所述数据块的长度(包含的字节数)有关,当M=1时,数据块的长度不能超过125;当M=2时,数据块的长度不能超过125*255+254;当M=3时,数据块的长度不能超过125*2552+254*255+254;当M=4时,数据块的长度不能超过125*2553+254*2552+254*255+254;即所述数据块的长度小于等于G值,其中:
当M=1时,A[0]=125,当M>=2且i=0~M-2时,A[i]=254;当M>=2且i=M-1时A[i]=125。
在同一个数据流里,长度信息的字节数M是固定不变的,因此要根据数据流里数据块的长度的最大值确定所述长度信息的字节数M。
接下来,如图2所示,本实施例还提供了一种解码端处理方法,包括:
S21:在接收到的数据流中寻找起始码,对找到的起始码之后的字节开始进行解码,所述起始码中前三个字节为起始码前缀0x000001,后一个字节为起始码值,将数据块的长度L初始化为0,执行步骤S22;
S22:解析出所述数据块的下一个长度信息B[i],并根据所述长度信息B[i]得到起始码前缀的位置信息N,具体的,根据所述长度信息中每个字节的值B[i]利用如下公式得到起始码前缀的位置信息N:
其中,其中,当M=1时,C[0]=(B[0]&0x7f)-2;当M>=2且i=0~M-2时,C[i]=B[i]-1;当M>=2且i=M-1时C[i]=(B[i]&0x7f)-2;i为所述长度信息的字节对应的序号,“*”为相乘。
可以理解的是,在进行第一次解析时,下一个长度信息B[i]即为起始码值之后的M个字节或者步骤S23中插入的起始码前缀后的M个字节,若数据块中的长度信息为多个时,所述长度信息会在其他位置。执行步骤S23;
S23:若所述长度信息的最高位的值为0,即可以判定在编码时删除过一个伪起始码前缀,此时需要将伪起始码前缀恢复出来,具体的,将所述长度信息删除并在删除位置的N个字节之后,第N+1个字节之前(编码时删除的起始码前缀的位置)插入起始码前缀,此时就将这个长度信息对应的起始码前缀恢复了,令L=L+N并重新执行步骤S22以找到数据块的下一个长度信息。若所述长度信息的最高位的值为1,即可以判定编码时并未出现伪起始码前缀或者编码时出现了伪起始码前缀但已经将伪起始码前缀恢复完全了,然后删除所述长度信息,则这一个数据块解码完成,这个数据块之后又是一个起始码,所以可以重新执行步骤S21恢复出下一个起始码之后的数据块,这样在解码时只需要寻找出数据流中的任意一个起始码就可开始解码,而不需要等待下一个起始码到来。
可以理解的是,在不断的循环步骤S22和S23后,将数据块中的每个长度信息均解析完,可以将在编码时删除的伪起始码前缀全部恢复,并且,每计算出一个起始码前缀的位置信息N后,若所述长度信息的最高位的值为0时,令数据块的长度L=L+N+3(仅在计算数据块的长度的时候自增3个字节),当所述长度信息的最高位的值为1时,令数据块的长度L=L+N,最终计算出的数据块的长度L等于当所述长度信息的最高位的值为0时所有自增后的N与当所述长度信息的最高位的值为1时的N的总和(当所述长度信息的最高位的值为1时,N不需要自增)。
基于此,本实施还提供了一种防止伪起始码的方法,首先利用所述的编码端处理方法对数据块进行编码,将已经编码好的每个数据块前端加上插入起始码并将数据块连接起来形成数据流,接着利用所述解码端处理方法对所述数据流中的每个数据块进行解码,由于在编码时删除了伪起始码前缀,可以避免在解码过程中出现解码错误的问题。
为了更好的阐述所述防止伪起始码的方法,本实施例将结合以下案例进一步说明所述防止伪起始码的方法。
首先,设定M=4,即假设临时长度信息、长度信息均包括4个字节(具有32位),需要编码处理的数据块如下位串所示(这里为了便于观看,以下位串为16进制数字):
20 38 00 00 01 d9 00 00 01 a8 (1)
接下来,执行编码端处理方法:
在数据块的前端和后端分别插入临时长度信息和起始码前缀,此时临时长度信息的值未知,表示为x,得到新的数据块如下位串:
xx xx xx xx 20 38 00 00 01 d9 00 00 01 a8 00 00 01 (2)
在数据块中插入的临时长度信息xx xx xx xx之后的字节对齐位置寻找起始码前缀,如上所示,可见,所述临时长度信息之后的字节具有三个起始码前缀(下划线处),其中,前两个起始码前缀即为伪起始码前缀,而第三个起始码前缀是在插入所述临时长度信息时插入的起始码前缀(即是真实的起始码前缀)。为了便于描述,将该数据块中的三个起始码前缀编号,从左到右分别为起始码前缀①、起始码前缀②和起始码前缀③。
接下来,将出现的第一个起始码前缀(即起始码前缀①)的位置信息N记录下来,根据位串(2)可见,起始码前缀①的位置信息N=2。接着需要根据找到的起始码前缀的位置信息N得到长度信息,设所述长度信息的4个字节(从左到右排序)的值分别为B[3]、B[2]、B[1]、B[0],则通过以下公式计算出B[3]、B[2]、B[1]、B[0]为:
B[3]=(2/2553)%255+2=2;
B[2]=(2/2552)%255+1=1;
B[1]=(2/255)%255+1=1;
B[0]=2%255+2=3;
由于起始码前缀①为伪起始码前缀,所以将长度信息的最高位设置为0,则所述长度信息的值为02 01 01 03,将插入的临时长度信息xx xx xx xx替换为所述长度信息0201 01 03,得到如下的位串:
02 01 01 03 20 38 00 00 01 d9 00 00 01 a8 00 00 01 (3)
接着删除起始码前缀①,并在删除的位置处重新插入一个临时长度信息,此时重新插入的临时长度信息的值也是不确定的,仍然采用x替待,得到如下位串:
02 01 01 03 20 38 xx xx xx xx d9 00 00 01 a8 00 00 01 (4)
接下来,在N=1个字节处找到起始码前缀②,接着需要根据找到的起始码前缀的位置信息N得到长度信息,设所述长度信息的4个字节(从左到右排序)的值分别为B[3]’、B[2]’、B[1]’、B[0]’,则通过以下公式计算出B[3]’、B[2]’、B[1]’、B[0]’为:
B[3]’=(1/2553)%255+2=2;
B[2]’=(1/2552)%255+1=1;
B[1]’=(1/255)%255+1=1;
B[0]’=1%255+2=2;
由于起始码前缀②也为伪起始码前缀,所以将长度信息的最高位设置为0,则所述长度信息的值为02 01 01 02,将插入的临时长度信息xx xx xx xx替换为所述长度信息0201 01 02,得到如下的位串:
02 01 01 03 20 38 02 01 01 02 d9 00 00 01 a8 00 00 01 (5)
接着删除起始码前缀②,并在删除的位置处重新插入一个临时长度信息,此时重新插入的临时长度信息的值也是不确定的,仍然采用x替待,得到如下位串:
02 01 01 03 20 38 02 01 01 02 d9 xx xx xx xx a8 00 00 01 (6)
接下来,在N=1个字节处找到起始码前缀③,接着需要根据找到的起始码前缀的位置信息N得到长度信息,设所述长度信息的4个字节(从左到右排序)的值分别为B[3]”、B[2]”、B[1]”、B[0]”,则通过以下公式计算出B[3]”、B[2]”、B[1]”、B[0]”为:
B[3]”=(1/2553)%255+2=2;
B[2]”=(1/2552)%255+1=1;
B[1]”=(1/255)%255+1=1;
B[0]”=1%255+2=2;
由于起始码前缀③不是伪起始码前缀,而是数据块末尾插入的起始码前缀,所以将长度信息的最高位设置为1,则所述长度信息的值为82 01 01 02,将插入的临时长度信息xx xx xx xx替换为所述长度信息82 01 01 02,得到如下的位串:
02 01 01 03 20 38 02 01 01 02 d9 82 01 01 02 a8 (7)
位串(7)即为已处理的数据块,在每个已处理的数据块前端插入起始码000001xx,其中,00 00 01为起始码前缀,xx是起始码值,把已处理的数据块连接起来,形成数据流。以下是数据流中一个数据块加上起始码后的位串:
00 00 01 53 02 01 01 03 20 38 02 01 01 02 d9 82 01 01 02 a8 00 00 0154 (8)
接下来,执行解码端处理方法:
在接收到的数据流中寻找起始码,例如在位串(8)中找到00 00 01 53后对起始码之后字节开始进行解码:
02 01 01 03 20 38 02 01 01 02 d9 82 01 01 02 a8 (9)
如位串(9)所示,待处理的数据块中具有3个长度信息,为了便于描述,将该数据块中的三个长度信息编号,从左到右分别为长度信息①、长度信息②和长度信息③。令数据块的长度L初始化为0,首先解析紧跟在起始码之后的4个字节(即长度信息①),根据如下公式得到起始码前缀的位置信息N:
其中,C[3]=(B[3]&0x7f)-2,C[2]=B[2]-1,C[1]=B[1]-1,C[0]=B[0]-1,由于所述长度信息①的最高位为0,删除所述长度信息①,并在删除位置的第2个字节之后、第3个字节之前插入起始码前缀00 00 01,得到如下位串:
20 38 00 00 01 02 01 01 02 d9 82 01 01 02 a8 (10)
然后,令N=N+3=5,所述长度信息①的最高位为0,则L=L+N+3=5。
接着重新获取数据块中出现的下一个长度信息,或者也可以直接处理最新插入的起始码前缀之后的4个字节,即长度信息②,根据如下公式得到起始码前缀的位置信息N:
其中,C[3]’=(B[3]’&0x7f)-2,C[2]’=B[2]’-1,C[1]’=B[1]’-1,C[0]’=B[0]’-1,由于所述长度信息②的最高位为0,删除所述长度信息②,并在删除位置的第1个字节之后、第2个字节之前插入起始码前缀00 00 01,得到如下位串:
20 38 00 00 01 d9 00 00 01 82 01 01 02 a8 (11)
然后,令N=N+3=4,所述长度信息①的最高位为0,则L=L+N+3=9。
接着重新获取数据块中出现的下一个长度信息,或者也可以直接处理最新插入的起始码前缀之后的4个字节,即长度信息③,根据如下公式得到起始码前缀的位置信息N:
其中,C[3]”=(B[3]”&0x7f)-2,C[2]”=B[2]”-1,C[1]”=B[1]”-1,C[0]”=B[0]”-1,由于所述长度信息③的最高位为0,直接删除所述长度信息③即可,得到如下位串:
20 38 00 00 01 d9 00 00 01 a8 (12)
然后,所述长度信息①的最高位为1,N不需要自增,则L=L+N+3=10。
可见,解码得到的位串(12)与原始的数据块位串(1)是一致的,说明采用本实施例能够正确的快速防止伪起始码又能获取当前数据块的长度L,并且计算量也比较小。
可以理解的是,位串(12)后又是一个起始码00 00 01 54,重复以上解码步骤以对下一个起始码之后的数据块进行解码。
基于此,如图3所示,本实施例还提供了一种编码装置1,包括:
插入字节模组11,用于在数据块的前端和末尾分别插入M个字节的临时长度信息和一起始码前缀;
记录及修改字节模组12,用于在数据块的前端插入M个字节的临时长度信息,在数据块的末尾插入一起始码前缀,其中M为大于0的整数;
第一判断模组13,用于判断找到的起始码前缀是否为在所述数据块末尾插入的起始码前缀;
插入字节处理模组14,根据判断结果进行如下处理:若找到的起始码前缀不是在所述数据块末尾插入的起始码前缀,令长度信息的最高位的值为0,删除找到的起始码前缀并在删除的位置处重新插入M个字节的临时长度信息,若找到的起始码前缀是在所述数据块末尾插入的起始码前缀,令长度信息的最高位的值为1,并删除所述数据块末尾插入的起始码前缀。
请继续参阅图3,本实施例还提供了一种解码装置2,包括:
查找模组21,在接收到的数据流中寻找起始码;
解析模组22,解析出所述数据块出现的下一个长度信息,并根据所述长度信息得到起始码前缀的位置信息N;
第二判断模组23,用于判断所述长度信息的最高位的值是否为0;
数据块恢复模组24,根据判断结果进行如下处理:若所述长度信息的最高位的值为0,删除所述长度信息并在删除位置的N个字节后插入起始码前缀,若所述长度信息的最高位的值为1,删除所述长度信息。
本实施例还提供了一种防止伪起始码的系统,包括所述编码装置及所述解码装置,所述编码装置对数据块进行编码并形成数据流,所述解码装置对所述数据流进行解码。
综上,在本发明实施例提供的编码端处理方法、解码端处理方法及防止伪起始码的方法,通过在编码时插入临时长度信息并记录起始码前缀的位置信息,然后删除起始码前缀使形成的新的数据块中不会存在伪起始码前缀,在解码时通过长度信息恢复所需的数据块,既能快速防止伪起始码又能获取当前数据块的长度,且在进行解码时以极小的计算量完成防伪起始码的操作,而且在一个数据块到齐时可以及时开始解码,不需要等待下一个起始码。
上述仅为本发明的优选实施例而已,并不对本发明起到任何限制作用。任何所属技术领域的技术人员,在不脱离本发明的技术方案的范围内,对本发明揭露的技术方案和技术内容做任何形式的等同替换或修改等变动,均属未脱离本发明的技术方案的内容,仍属于本发明的保护范围之内。
Claims (11)
1.一种编码端处理方法,其特征在于,包括:
S11:获取数据块并在所述数据块的前端插入M个字节的临时长度信息,在所述数据块的末尾插入一起始码前缀,其中M为大于0的整数,执行步骤S12;
S12:在所述数据块中插入的临时长度信息之后的字节对齐位置寻找起始码前缀,并记录出现第一个起始码前缀的位置信息N,执行步骤S13;
S13:根据找到的起始码前缀的位置信息N得到长度信息,并将插入的临时长度信息替换为所述长度信息,执行步骤S14;
S14:若找到的起始码前缀不是在所述数据块末尾插入的起始码前缀,令长度信息的最高位的值为0,删除找到的起始码前缀并在删除的位置处重新插入替换前的M个字节的临时长度信息,并执行步骤S12,若找到的起始码前缀是在所述数据块末尾插入的起始码前缀,令长度信息的最高位的值为1,并删除所述数据块末尾插入的起始码前缀,处理过程结束;
将每个处理好的数据块前段插入起始码并拼接在一起以形成数据流,所述数据流中的每个所述数据块中的长度信息的字节数M相等,且根据所述数据流中数据块的长度的最大值确定所述长度信息的字节数M,起始码前缀的位置信息N为插入的临时长度信息之后,找到的起始码前缀之前的字节数;
令所述长度信息的每个字节的值为B[i],并利用如下公式得到所述长度信息中每个字节的值:
当M=1时:
B[0]=N%255+2;
当M>1时:
B[i]=(N/255i)%255+1,i=0~M-2;
B[i]=(N/255i)%255+2,i=M-1;
其中,i为所述长度信息的字节对应的序号,i从左到右的取值为M-1~0,“%”表示取余除法,“/”表示取整除法。
2.如权利要求1所述的编码端处理方法,其特征在于,所述长度信息具有M个字节,且根据找到的起始码前缀的位置信息N得到长度信息,并将插入的临时长度信息替换为所述长度信息的步骤包括:
根据找到的起始码前缀的位置信息N得到所述长度信息中每个字节的值;
将所述长度信息中每个字节的值赋予插入的临时长度信息的对应字节。
4.一种解码端处理方法,用于解码如权利要求1-3中任一项所述的编码端处理方法处理的数据块,其特征在于,包括:
S21:在接收到的数据流中寻找起始码,执行步骤S22;
S22:解析出所述起始码之后出现的下一个长度信息,并根据所述长度信息得到起始码前缀的位置信息N,执行步骤S23;
S23:若所述长度信息的最高位的值为0,删除所述长度信息并在删除位置的N个字节后插入起始码前缀,并执行步骤S22,若所述长度信息的最高位的值为1,删除所述长度信息,并执行步骤S21;
令所述长度信息的每个字节的值为B[i],利用如下公式得到起始码前缀的位置信息N:
其中,当M=1时,C[0]=(B[0]&0x7f)-2;当M>=2且i=0~M-2时,C[i]=B[i]-1;当M>=2且i=M-1时C[i]=(B[i]&0x7f)-2;i为所述长度信息的字节对应的序号,“*”为相乘,“&”为与运算。
5.如权利要求4所述的解码端处理方法,其特征在于,步骤S22中的所述下一个长度信息是指起始码之后的M个字节或者步骤S23中插入的起始码前缀后的M个字节。
6.如权利要求4所述的解码端处理方法,其特征在于,所述数据流包括若干数据块,所述起始码位于两个数据块之间,且每个所述起始码均包括起始码前缀及起始码值。
7.如权利要求6所述的解码端处理方法,其特征在于,将数据块的长度L初始化为0,得到起始码前缀的位置信息N后,当所述长度信息的最高位的值为0时,令数据块的长度L=L+N+3,当所述长度信息的最高位的值为1时,令数据块的长度L=L+N。
8.一种防止伪起始码的方法,其特征在于,包括:
利用如权利要求1-3中任一项所述的编码端处理方法对数据块进行编码并形成数据流;
利用如权利要求4-7中任一项所述的解码端处理方法对所述数据流进行解码。
9.一种编码装置,其特征在于,包括:
插入字节模组,用于在数据块的前端插入M个字节的临时长度信息,在数据块的末尾插入一起始码前缀,其中M为大于0的整数;
记录及修改字节模组,用于寻找并记录出现第一个起始码前缀的位置信息N以得到长度信息,并将插入的临时长度信息替换为所述长度信息;
第一判断模组,用于判断找到的起始码前缀是否为在所述数据块末尾插入的起始码前缀;
插入字节处理模组,根据判断结果进行如下处理:若找到的起始码前缀不是在所述数据块末尾插入的起始码前缀,令长度信息的最高位的值为0,删除找到的起始码前缀并在删除的位置处重新插入替换前的M个字节的临时长度信息,若找到的起始码前缀是在所述数据块末尾插入的起始码前缀,令长度信息的最高位的值为1,并删除所述数据块末尾插入的起始码前缀;
将每个处理好的数据块前段插入起始码并拼接在一起以形成数据流,所述数据流中的每个所述数据块中的长度信息的字节数M相等,且根据所述数据流中数据块的长度的最大值确定所述长度信息的字节数M,起始码前缀的位置信息N为插入的临时长度信息之后,找到的起始码前缀之前的字节数;
令所述长度信息的每个字节的值为B[i],并利用如下公式得到所述长度信息中每个字节的值:
当M=1时:
B[0]=N%255+2;
当M>1时:
B[i]=(N/255i)%255+1,i=0~M-2;
B[i]=(N/255i)%255+2,i=M-1;
其中,i为所述长度信息的字节对应的序号,i从左到右的取值为M-1~0,“%”表示取余除法,“/”表示取整除法。
10.一种解码装置,其特征在于,包括:
查找模组,用于在接收到的数据流中寻找起始码;
解析模组,解析出所述数据块出现的下一个长度信息,并根据所述长度信息得到起始码前缀的位置信息N;
第二判断模组,用于判断所述长度信息的最高位的值是否为0;
数据块恢复模组,根据判断结果进行如下处理:若所述长度信息的最高位的值为0,删除所述长度信息并在删除位置的N个字节后插入起始码前缀,若所述长度信息的最高位的值为1,删除所述长度信息;
其中,令所述长度信息的每个字节的值为B[i],利用如下公式得到起始码前缀的位置信息N:
其中,当M=1时,C[0]=(B[0]&0x7f)-2;当M>=2且i=0~M-2时,C[i]=B[i]-1;当M>=2且i=M-1时C[i]=(B[i]&0x7f)-2;i为所述长度信息的字节对应的序号,“*”为相乘,“&”为与运算。
11.一种防止伪起始码的系统,其特征在于,包括如权利要求9所述的编码装置及如权利要求10所述的解码装置,所述编码装置对数据块进行编码并形成数据流,所述解码装置对所述数据流进行解码。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910069112.5A CN109743581B (zh) | 2019-01-24 | 2019-01-24 | 编码端处理方法、解码端处理方法及防止伪起始码的方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910069112.5A CN109743581B (zh) | 2019-01-24 | 2019-01-24 | 编码端处理方法、解码端处理方法及防止伪起始码的方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN109743581A CN109743581A (zh) | 2019-05-10 |
CN109743581B true CN109743581B (zh) | 2021-08-27 |
Family
ID=66366028
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201910069112.5A Active CN109743581B (zh) | 2019-01-24 | 2019-01-24 | 编码端处理方法、解码端处理方法及防止伪起始码的方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN109743581B (zh) |
Families Citing this family (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112839232B (zh) * | 2019-11-22 | 2023-01-17 | 合肥杰发科技有限公司 | 数据流起始码搜索方法、装置及计算机存储介质 |
CN113678460B (zh) * | 2019-11-29 | 2023-07-25 | 深圳市大疆创新科技有限公司 | 一种数据编码、数据解码方法、设备及存储介质 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
EP0651584A2 (en) * | 1993-10-29 | 1995-05-03 | Mitsubishi Denki Kabushiki Kaisha | Data receiving apparatus and method |
CN101217660A (zh) * | 2007-12-27 | 2008-07-09 | 海信集团有限公司 | 一种音视频解码方法 |
CN101800892A (zh) * | 2010-03-04 | 2010-08-11 | 青岛海信信芯科技有限公司 | 多媒体码流识别的方法和装置 |
CN102802023A (zh) * | 2012-08-29 | 2012-11-28 | 上海国茂数字技术有限公司 | 一种快速防止出现伪起始码的方法及装置 |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US7436328B2 (en) * | 2003-07-09 | 2008-10-14 | Texas Instruments Incorporated | Video coding with start code emulation prevention |
-
2019
- 2019-01-24 CN CN201910069112.5A patent/CN109743581B/zh active Active
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
EP0651584A2 (en) * | 1993-10-29 | 1995-05-03 | Mitsubishi Denki Kabushiki Kaisha | Data receiving apparatus and method |
CN101217660A (zh) * | 2007-12-27 | 2008-07-09 | 海信集团有限公司 | 一种音视频解码方法 |
CN101800892A (zh) * | 2010-03-04 | 2010-08-11 | 青岛海信信芯科技有限公司 | 多媒体码流识别的方法和装置 |
CN102802023A (zh) * | 2012-08-29 | 2012-11-28 | 上海国茂数字技术有限公司 | 一种快速防止出现伪起始码的方法及装置 |
Non-Patent Citations (1)
Title |
---|
H.264标准中的分层技术;查日勇;《有线电视技术》;20141010;全文 * |
Also Published As
Publication number | Publication date |
---|---|
CN109743581A (zh) | 2019-05-10 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
TWI310137B (en) | Methods and systems for preventing start code emulation at locations that include non-byte aligned and/or bit-shifted positions | |
EP2123053B1 (en) | Generating a data stream and identifying positions within a data stream | |
US7487423B2 (en) | Decoding method, medium, and apparatus | |
CN109743581B (zh) | 编码端处理方法、解码端处理方法及防止伪起始码的方法 | |
US20080130735A1 (en) | Methods and Apparatus for Data Decoding/Encoding and for Searching For/Inserting Stuffing Bytes | |
KR960028573A (ko) | 패킷화된 데이터스트림의 동기화 및 에러검출 | |
CN101675473B (zh) | 用于处理编码的音频数据的方法和装置 | |
US20060133507A1 (en) | Picture information decoding method and picture information encoding method | |
JP2012034398A (ja) | ビデオを復号する再同期方法 | |
CN101800892B (zh) | 多媒体码流识别的方法和装置 | |
JP2013051707A (ja) | データストリームにおけるビデオデータ及び関連するメタデータを送信する方法 | |
KR20050074812A (ko) | 전송 에러가 발생한 지점을 탐지하여 바르게 디코딩된데이터를 복원하는 디코딩 방법 및 그 디코딩 장치 | |
US7940807B2 (en) | Methods, decoder circuits and computer program products for processing MPEG audio frames | |
CN103988438A (zh) | 用于确定在编码的比特流中的可修改元素的方法和相关联的装置 | |
JP3080149B2 (ja) | パタン符号化方法及び復号化方法とこの方法を用いた符号化装置及び復号化装置 | |
US20140119445A1 (en) | Method of concealing picture header errors in digital video decoding | |
CN102802023B (zh) | 一种快速防止出现伪起始码的方法及装置 | |
EP3443674B1 (en) | Compressing indices in a video stream | |
US8009067B2 (en) | Method and apparatus for coding and decoding using bit-precision | |
CN112449201B (zh) | 解码方法、编码方法、相应的装置、电子设备及存储介质 | |
KR20030016859A (ko) | 허프만 부호의 복호화 방법 | |
WO2005038643A1 (fr) | Procede de formation d'un flux de donnees qui peut etre accede de maniere aleatoire et procede de decodage correspondant | |
US8462855B2 (en) | Method and apparatus for stream parsing and picture location | |
JP3693636B2 (ja) | 映像符号化装置及び映像復号化装置 | |
JP2005130352A (ja) | 復号化装置 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant | ||
TR01 | Transfer of patent right |
Effective date of registration: 20240426 Address after: Building 16, 3rd Floor, Huatai Center, No. 355 Jinyun Road, Jiading District, Shanghai, March 2018 Patentee after: Shanghai Bicheng Information Technology Co.,Ltd. Country or region after: China Address before: Room 403, block a, 563 Songtao Road, Zhangjiang High Tech Park, Pudong New Area, Shanghai 201203 Patentee before: SHANGHAI GMT DIGITAL TECHNOLOGY Co.,Ltd. Country or region before: China |