发明内容
有鉴于现有技术对H.264Main Profile和High Profile不很完善,本发明主要针对H.264解码过程中错误检测、恢复和隐藏进行改善,一方面保证解码器本身顺利进行解码,而不至于使用了错误的信息导致解码器不正常工作(crash),另一方面保证解码的结果可以给用户看到较好的效果。
为达上述目的,本发明提供一种影像解码器的码流错误侦测方法,其特征在于,步骤包括首先接收一码流并将该码流解码。接着检查该码流中序列参数设定值SPS指定的图像大小是否超出当前码流等级参数(leve1)规定的最大值,若为超过,则认为当前的序列参数设定值SPS有错。然后检查该码流中图像参数设定值PPS所指定当前使用的序列参数设定值SPS的索引值,若当前指定的序列参数设定值SPS不存在,则认为当前图像参数设定值PPS有错。检查该码流中片段档头(Slice header)所指定当前使用的图像参数设定值PPS的索引值,如果当前指定的图像参数设定值PPS不存在,则认为当前的片段档头有错。以及检查该码流中当前的宏块数,若当前的宏块数大于图像中的总宏块数,则认为当前宏块解码有错。
为达上述目的,本发明再提供一种参考图像列表的错误侦测及恢复方法,其特征在于,步骤包括先将当前的参考图像列表备份,再接收一组重新排序图像序号,然后开始处理重新排序参考图像列表。若重新排序图像序号大于一设定值,则恢复备份的参考图像列表。最后若重新排序后的参考图像列表中,其有效参考图的个数小于应有的参考图的个数,则恢复备份的参考图像列表。
为达上述目的,本发明还提供一种对未解码宏块的错误恢复的参考图选择方法,其特征在于,步骤包括:接收一影像码流;根据该影像码流判断当前图是否为解码的第一幅图,若是,则使用当前图进行帧内预测,而若不是,则于当前图像队列中寻找图像显示顺序值POC刚刚大于当前图像的图像显示顺序值POC的图1像;若当前图为场景切换点且该图1像为有效,则以图1像进行帧间预测,若当前图为场景切换点而图1像为无效,则使用当前图进行帧内预测;若当前图不为场景切换点,则从当前图像队列中寻找图像显示顺序值POC刚刚小于当前图像的图像显示顺序值POC的图2像;若图1像为场景切换点且图2像为有效,则以图2像进行帧间预测,若图1像为场景切换点而图2像为无效,则使用当前图进行帧内预测;若图1像不为场景切换点,则判断图1像及图2像是否皆为有效,若皆为有效则选择两者间正确解码宏块较多的图像执行帧间预测;若图1像不为场景切换点,图1像及图2像不皆为有效,则选择有效的图1像或图2像执行帧间预测;及若图1像不为场景切换点,图1像及图2像皆为无效,则使用当前图进行帧内预测。
为了能更进一步了解本发明为达成预定目的所采取的技术、手段及功效,请参阅以下有关本发明的详细说明与附图,相信本发明的目的、特征与特点,当可由此得一深入且具体的了解,然而所附图式仅提供参考与说明用,并非用来对本发明加以限制。
具体实施方式
首先针对H.264码流格式(bitstream format)做相关的说明。H.264码流由不同类型的网络提取层的封包单元(network abstraction layerunits,NAL units)组成。NAL unit包含了nal_ref_idc、nal_unit类型以及RBSP(raw byte sequence payload)。如果nal_ref_idc不等于0,表示当前NAL unit是SPS、PPS或可被参考的片段。NAL units类型包括SPS、PPS、图像片断码(coded slices of pictures)以及补充增加信息SEI(Supplemental Enhancement Information)等其它类型。每一码流皆包括一或多个SPS及一或多个PPS。SPS中包含了profile,leve1,序列参数设定值索引(seq_parameter_set_id)、图像大小、num_ref_frames等参数信息。其中seq_parameter_set_id表示当前SPS的索引值(Index);num_ref_frame表示可被参考的图的最大个数。PPS中包含了图像参数设定索引(pic_parameter_set_id)、序列参数设定值索引(seq_parameter_set_id)、num_ref_idx_lx_active_minus1等参数信息。其中pic_parameter_set_id表示当前PPS的Index值;seq_parameter_set_id表示当前PPS使用的SPS的Index值;num_ref_idx_lx_active_minus1(x=0 or 1)表示两个参考图像列表(list)中参考图像的个数。图像片断码(coded slices of pictures)包含了档头片断(Slice header)、数据片断(Slice data)等信息。档头片断(Sliceheader)中包含了当前片段中第一个MB的位置(first_mb_in_slice)、图像参数设定值索引(pic_parameter_st_id)、框架参数值(frame_num)、图像的显示顺序POC(pic_order_cnt)以及Decoded Picture Buffer(DPB)管理等信息;更详细的说,first_mb_in_slice表示当前片段(slice)中第一个MB(macroblock)的位置;pic_parameter_st_id表示当前片段使用的PPS的索引值;frame_num表示当前片段所在的图像(picture)的框架参数值;pic_order_cnt(POC)表示当前片段所在的图像的显示顺序。Slice data中包含了组成该片段的宏块信息。按照H.264协议Annex B规定,NAL unit以三个字节的起始码(start code)0x000001开始,以下一个NAL unit的起始码或以位0x000000结束。
接着针对介绍H.264解码器架构(decoder architecture)。请参阅图1,为本发明影像解码器的架构图。其中熵解码模块11(Entropydecoding module)可以是CAVLC(context-based adaptive variable lengthcoding)或CABAC(context-based adaptive binary arithmetic coding),用来解码各种各样的参数和数据。如果当前宏块(macroblock,MB)是帧内宏块(intra MB),帧内预测模式选择模块13(decide intra predictionmode)将根据解码出来的信息以及相邻MBs的信息决定当前MB的帧内预测模式(intra prediction mode),进而于帧内预测模块15(intraprediction module)来运算。如果当前MB是帧间宏块(inter MB),帧间预测模式选择模块12(decide inter prediction mode)将根据解码出来的信息以及相邻MBs的信息决定当前MB的参考图的索引值(ref_pic_idx)以及运动向量(motion vector,MV),进而于运动补偿模块14(motion compensation module)执行运动补偿。内部预测及运动补偿后的结果由预测模式选择模块16(prediction mode selector)输出,并与反向运算模块17输出的当前码流反向量化及反向变换(Inversequantization&inverse transform)后的残余系数相加,而相加的结果经过除区块滤波器18(deblocking filter)输出就是最终解码出来的结果。如果当前图是一个可被参考图,同时当前图需要存入解码图像缓存器19(Decoded Picture Buffer,DPB),用作未来解码使用的参考图。而解码图像缓存器19的最大值是由当前码流中SPS的Leve1参数值决定。
请参阅图2,为本发明解码器对片段的解码流程图。首先对片段(slice)的档头进行解码,以取得first_mb_in_slice、pic_parameter_st_id、frame_num、POC以及DPB管理等信息(如图2步骤S201)。接着根据first_mb_in_slice参数值的信息,可判断当前的片段是否已是新(另一)图像的片段(如图2步骤S203)。若为是,则将该新的图像初始化(如图2步骤S205)。若为否,或步骤S205后,开始初始化参考图像列表(reference picture list),以执行一建表的动作(如图2步骤S207)。接着将参考图像列表重新排序(reorder reference list)(如图2步骤S209)。然后便开始对片段中的宏块进行解码(如图2步骤S211)。在宏块解码结束后便检查是否已完成整个片段的解码(如图2步骤S213)。若尚未解完,则返回步骤S211继续解未解完的宏块。若已解完,则检查是否已完成一张图像的解码(如图2步骤S215)。若已完成整张图像的解码,接着则可进行解码图像缓存器对解完的图像的管理(如图2步骤S217)。若尚未完成整张图像的解码,则继续执行未完成的图像的解码(如图2步骤S219)。
接下来介绍本发明对于错误侦测(Error detection)的一些手段。一般错误侦测的方法有三种,第一种是解码器遇到了码表中不存在的码字,即判断有错误发生。第二种是根据语法(syntax)规定的参数(parameter)的取值范围来决定解码出来的值是否合理。第三种是虽然解码出来的值合理,但是若从上下文来看不合理,即判断有错误发生。第一种方法是显而易见的,而在美国公开号US20060013318一案中已经对第二种方法作了大量介绍,本发明主要着重在第三种方法。
解码过程中对于SPS及PPS的侦错判断为,如果当前SPS指定的图像大小(picture size)超出当前码流等级(bitstream Leve1)规定的最大值,则认为当前的SPS有错。而PPS会指定当前使用的SPS的索引值。如果当前指定的SPS不存在,则认为当前的PPS有错。
而在片段的档头解码(Slice header decoding)时,Slice header会指定当前使用的PPS的索引值。如果当前指定的PPS不存在,则认为当前的Slice header有错。
在对重新排序图像序号(reordering_of_pic_nums_idc)进行解码时,如果连续解码出来有效的重新排序图像序号(reordering_of_pic_nums_idc)的个数超过应有的参考图的个数(hum_ref_idx_lx_active),则认为重新排序参考图像列表(reorder refpicture list)的解码有错。
针对重新排序参考图像列表(reorder_ref_pic_list)后的结果,如果有效的参考图像列表(ref_pic_list)中的参考图的个数小于应有的参考图的个数(num_ref_idx_lx_active),表示有参考图重复相同序号,则认为重新排序参考图像列表有错。
而在宏块解码方面,如果当前的宏块数大于整张图像中的宏块数(current_mb_nr>PicSizeInMbs-1),则认为当前宏块解码有错。
根据H.264subclause 8.4.1计算和推导当前区块或宏块的参考索引(block or MB’s reference index)时,如果计算出来的参考索引值超出了当前的参考图像列表(reference picture list),或者在当前referencepicture list中找不到合适的参考图(reference picture),则认为当前宏块解码有错。
在对区块残余系数进行解码时,如果解码出来的非零系数个数(totalcoeff)与零系数个数(total_zeros)的和大于当前区块应有的最大系数个数,则认为当前宏块解码有错。
在对当前区块根据H.264subclause 8.3进行帧内预测(Intraprediciton)时,尽管选择的帧内预测模式(Intra prediction mode)没有超出语法范围,但是用到的相邻区块不存在或不合理,则认为当前宏块解码有错。
接着介绍本发明对于错误发生时的恢复及隐藏手段(Errorrecovery and concealment)。首先针对参考图像列表作说明,请参阅图3,本发明参考图像列表错误侦测及恢复流程图。先判断是否有重新排序(reodering)的命令要处理,如果ref_pic_list_reordering_flag_lx!=0,表示有重新排序的命令要处理(如图3步骤S301)。若没有则跳出,无须执行错误的侦测及恢复。若有,在处理重新排序命令的前,首先将当前的参考图像列表(reference picture list)备份(如图3步骤S303)。然后再处理一组重新排序图像序号并重新排序reorder reference list(如图3步骤S305)。重新排序时判断是否有错误的重新排序命令,重新排序图像序号是否大于3,Reodering_of_pic_nums_idc>3(如图3步骤S307)。若大于3,则表示当前的重新排序命令不可信,因此恢复备份的参考图像列表(如图3步骤S309),处理结束。若重新排序图像序号没有大于3,则进一步检查重新排序的后的参考图像列表,参考图像列表中有效参考图的个数是否小于应有的参考图的个数num_ref_idx_lx_active(如图3步骤S311)。若是小于,同样表示重新排序命令不可信,因此恢复备份的参考图像列表(如图3步骤S313)。若没有小于,则表示重新排序命令是可信的,毋须恢复备份的参考图像列表。
对于参考索引(reference index)侦测及恢复手段方面,本发明对于计算出来的参考索引超出当前的参考图像列表,或者在当前参考图像列表中找不到合适的参考图时,则强制当前区块的参考索引为当前参考图像列表中的第一个参考图。
然而解码器如果在宏块(MB)解码过程中检测到错误则放弃当前片段(slice)的解码。由于H.264可使用最多16个参考图,因此当前帧缓存器(frame buffer)里残留的资料可能与当前图像差别很大,为了使用户看到好的效果,必须对没有解码的MBs进行错误恢复。错误恢复可以利用当前图像中已解码的MBs进行帧内预测(Intra prediction)(copy or interpolation),也可以利用已解码的其它图像进行帧间预测(Inter prediction)(direct copy or derivated MVs prediction)。
请参阅图4,为本发明对没有解码的宏块进行错误恢复的参考图的选择流程图。在选择参考图的过程中要考虑场景切换(scene change)的问题。在本发明中采用统计帧内宏块(Intra MBs)的个数的方法。当一幅图中的帧内宏块的个数超过一默认值(threshold)时,这幅图很可能是场景切换点(scene change point)。
如图4所示,首先判断当前图是否为解码的第一幅图(如图4步骤S401)。如果当前图是解码的第一幅图,则使用当前图进行帧内预测(Intra prediction)(如图4步骤S403)。否则从当前图像队列中寻找POC值刚刚大于当前图的POC的图1像(pic_H)(如图4步骤S405)。当前图像队列可以是DPB中的参考图,还可以包括不在DPB中但仍未显示的其它图像。接着判断当前图是否为场景切换点(possible scenechange point)(如图4步骤S407)。若当前图是场景切换点,接着判断图1像(pic_H)是否为有效(valid)(如图4步骤S409)。如果当前图是场景切换点而且图1像(pic_H)有效,则选择图1像(pic_H)进行帧间预测(Inter prediction)错误恢复(如图4步骤S411)。如果当前图是场景切换点但图1像(pic_H)无效,则使用当前图进行帧内预测(如图4步骤S413)。如果当前图不是场景切换点,则从当前图像队列中寻找POC值刚刚小于当前图的POC的Pic_L(如图4步骤S415)。然后再判断图1像(pic_H)是否为场景切换点(如图4步骤S417)。若图1像(pic_H)是场景切换点,便再判断Pic_L有效是否有效(如图4步骤S419)。如果图1像(pic_H)是场景切换点并且Pic_L有效,则选择Pic_L进行帧间预测错误恢复(如图4步骤S421)。如果图1像(pic_H)是场景切换点且Pic_L无效,则使用当前图进行帧内预测(如图4步骤S423)。如果图1像(pic_H)不是场景切换点,则需判断是否图1像(pic_H)和Pic_L都有效(如图4步骤S425)。若图1像(pic_H)不是场景切换点并且图1像(pic_H)和Pic_L都有效,选择图1像(pic_H)及Pic_L两者间正确解码宏块数多的图像来执行帧间预测错误恢复,如果正确解码宏块数相同则选择Pic_L(如图4步骤S427)。如果图1像(pic_H)不是场景切换点并且图1像(pic_H)和Pic_L只用一个有效,则选择有效的图像(图1像(pic_H)或Pic_L)来执行帧间预测错误恢复(如图4步骤S429、S431、S433及S435)。如果图1像(pic_H)不是场景转换点并且图1像(pic_H)和Pic_L都无效,则使用当前图进行帧内预测(如图4步骤S437)。
以上所述,仅为本发明较佳的具体实施例的详细说明与附图,惟本发明的特征并不局限于此,并非用以限制本发明,本发明的所有范围应以下述的申请专利范围为准,凡合于本发明申请专利范围的精神与其类似变化的实施例,皆应包含于本发明的范畴中,任何熟悉该项技艺者在本发明的领域内,可轻易思及的变化或修饰皆可涵盖在所述的专利范围内。