背景技术
基于H.264视频编解码标准的算术编码为一种基于上下文的自适应二进制算术编码,其编码对象是视频信号中的语法元素(SE),分为残差SE和非残差SE。
其中,残差SE包括:表示当前块是否有非零系数的CBF、表示当前位置上的非0系数的绝对值减1的CALM、表示当前位置上的系数是否为0的SCF、表示当前位置上的系数是否为最后一个非0系数的LSCF等类别的数据,通常表示为4×4的亮度DC系数、亮度/色度AC系数、色度DC系数矩阵等,每种残差SE又分为5个子类别(Cat);非残差SE包括:表示前后向预测的参考图像索引的refIdx、表示运动向量和其前后向预测值之差的MVD、表示当前亮度和色度块的直流和交流分量的非零情况的CBP、表示当前帧中的宏块是否是skip模式的mb_skip_flag等类别的数据,通常仅表示为一个数值。
上述算术编码首先需要对SE进行二进制化处理,得到该SE所属SE类别对应的概率模型的序号。其中,一个概率模型对应一个序号;对于残差SE来说,SE类别是指某一类别下的一个子类别。然后调用并调整得到的序号对应的概率模型。
概率模型为7比特的数值,每个概率模型的初始值存储于存储单元中。在调用概率模型时,需要根据预设的不同概率模型与存储位置的映射关系,从相应的存储位置读取对应的概率模型,并将更新后的该概率模型再存储到对应的存储位置。
其中,存储位置是指:如RAM、E2PROM等存储器的存储地址,和/或寄存器等具有存储功能的物理实体。
在H.264视频编解码标准中,共有399种与不同SE类别对应的概率模型。不同概率模型的序号及其对应的SE类别如表1所示。
表1
表1中,“(Frame)”表示帧模式,“(Field)”表示场模式。
现有技术中,所有概率模型是无序地存储在一个或多个存储单元中,即不同的概率模型与存储位置的映射关系是随意设定的。然而,在算术编码过程中,通常需要连续读取多个概率模型,这样,每次调用概率模型均需要在存储单元中查找,使得算术编码过程中访问存储单元的次数较多。
例如,由于残差SE通常表示为4×4的各种系数矩阵,因此对于残差SE的算术编码过程,一般需要针对矩阵中每个系数的CBF、CALM、SCF和LSCF对应的概率模型连续多次访问并查找存储单元。以算术编码采用帧模式、存储单元为一个RAM、Cat=0为例,需要连续访问44次RAM,并根据不同序号的概率模型与RAM存储地址的映射关系,获取CBF对应的序号为85~88的4个概率模型、CALM对应的序号为227~236的10个概率模型、SCF(Frame)对应的序号为105~119的15个概率模型、LSCF(Frame)对应的序号为166~180的15个概率模型。
而且,随意为不同概率模型分配存储位置,造成了存储单元的资源利用混乱和资源浪费。
可见,现有技术中没有依据算术编码的过程有序地存储概率模型,从而使得算术编码的效率不高,且造成了存储资源的浪费。
发明内容
有鉴于此,本发明的一个主要目的在于,提供一种算术编码中的概率模型存储方法,能够提高算术编码的效率。
根据上述的一个主要目的,本发明提供了一种算术编码中的概率模型存储方法,包括:
根据概率模型所对应的语法元素SE类别,设置所有概率模型与存储位置的映射关系,以使得算术编码过程中连续读取的概率模型集中存储;
根据所述设置的映射关系,将相同SE类别对应的所有概率模型分别集中存储到对应的存储位置,以使得同一SE类别对应的概率模型尽可能存储在同一行、和/或每一行尽可能多的存储概率模型。
所述存储位置包括:随机存储器RAM的行地址。
所述RAM为一个或多个。
所述RAM的存储空间大小为56×56。
所述同一SE类别对应的概率模型尽可能存储在同一行包括:
表示当前块是否有非零系数的CBF对应的每个子类别Cat的概率模型集中存储在一行内;
表示当前位置上的非0系数的绝对值减1的CALM对应的每个Cat的概率模型集中存储在两行内;
场模式下的表示当前位置上的系数是否为0的SCF与表示当前位置上的系数是否为最后一个非0系数的LSCF对应的每个Cat的概率模型集中存储在两行内;
帧模式下的SCF与LSCF对应的每个Cat的概率模型集中存储在两行内。
所述同一SE类别对应的概率模型尽可能存储在同一行包括:
表示当前P帧中的宏块是否是skip模式的mb_skip_flag_P对应的所有概率模型集中存储于一行内;
表示当前I帧中的宏块类型的mb_type_I对应的所有概率模型集中存储于两行内。
所述每一行尽可能多的存储概率模型包括:
mb_skip_flag_P、表示当前P帧中的宏块类型的mb_type_P、表示当前P帧中的子宏块类型的sub_mb_type_P、表示当前B帧中的宏块是否是skip模式的mb_skip_flag_B、表示当前B帧中的宏块类型的sub_mb_type_B、用于更新片的量化参数mb_qb_delta、表示当前宏块的预测方式的prev_intra4x4_mode、表示当前宏块的左方宏块和上方宏块的预测方式的rem_intra4x4_mode、表示当前宏块是帧还是场模式的mb_field_decoding_flag、表示亮度为Intra4x4预测时色度块的预测方式的intra_chroma_pred_mode中的一个或多个SE类别对应的概率模型,与其他SE类别对应的概率模型集中存储。
所述存储位置进一步包括:寄存器。
该方法进一步包括:将片结束标识End_of_slice_flag对应的概率模型存储在寄存器中。
由上述技术方案可见,本发明依据概率模型所对应的SE类别,设置不同概率模型与存储位置的映射关系,并根据设置的映射关系,将算术编码过程中连续读取的概率模型集中存储到对应的存储位置,使得算术编码过程中能够以行为单位同时读取多个所需的概率模型,从而减少了访问存储单元的次数,提高了算术编码的效率。而且,每一行尽可能多的存储概率模型,提高了存储资源的利用率,减少了资源浪费。
具体实施方式
为使本发明的目的、技术方案及优点更加清楚明白,以下参照附图并举实施例,对本发明进一步详细说明。
图1为本发明中的概率模型存储方法的示例性流程图。如图1所示,本实施例中的概率模型存储方法包括以下步骤:
步骤101,依据概率模型所对应的SE类别,设置不同概率模型与存储位置的映射关系,使得算术编码过程中连续读取的概率模型集中存储;
步骤102,根据设置的映射关系,将所有概率模型分别存储到对应的存储位置。
这样,即可降低算术编码过程中对存储单元的访问次数。
具体来说,本实施例中的集中存储至少满足以下两个条件或其中任意一个:
a、同一SE类别对应的概率模型尽可能存储在同一行,即同一SE类别对应的概率模型对应同一个行地址,这样,算术编码过程中即可以行为单位,一次读取同一SE类别对应的所有概率模型;
b、每一行尽可能多的存储概率模型,即多个SE类别对应的所有概率模型对应同一个行地址,这样,算术编码过程中即可以行为单位,一次读取一个或多个SE类别对应的所有概率模型,同时还提高了存储单元的资源利用率。
下面,以存储单元包括一个56×56的RAM和一个专用寄存器为例,对本实施例中的概率模型存储方法进行详细说明。
由于通常的算术编码过程中,对End_of_slice_flag对应的序号为276的概率模型访问较频繁,因此,将该SE类别对应的概率模型存储于专用寄存器中。其余的概率模型则存储于56×56的RAM中。
本实施例中不同概率模型与存储地址的映射关系可以如表2所示。
SE类别--序号 | 存储地址 |
mb_type_I--0~2 | RAM第1行 |
mb_type_I--3~10 | RAM第2行 |
mb_skip_flag_P--11~13 | RAM第3行 |
mb_type_P--14~20 | RAM第4行 |
sub_mb_type_P--21~23 | RAM第5行 |
mb_skip_flag_B--24~26 | RAM第3行 |
mb_type_B--27~34 | RAM第6行 |
mb_type_B--35 | RAM第5行 |
sub_mb_type_B--36~39 | RAM第5行 |
MVDX--40~46 | RAM第7行 |
MVDY--47~53 | RAM第8行 |
ref_idx--54~59 | RAM第9行 |
mb_qb_delta--60~63 | RAM第1行 |
intra_chroma_pred_mode--64~67 | RAM第10行 |
prev_intra4x4_mode--68 | RAM第9行 |
rem_intra4x4_mode--69 | RAM第9行 |
mb_field_decoding_flag--70~72 | RAM第10行 |
CBP--73~76 | RAM第11行 |
CBP--77~84 | RAM第12行 |
CBF/Cat=0--85~88 | RAM第13行 |
CBF/Cat=1--89~92 | RAM第14行 |
CBF/Cat=2--93~96 | RAM第15行 |
CBF/Cat=3--97~100 | RAM第16行 |
CBF/Cat=4--101~104 | RAM第17行 |
SCF(Frame)/Cat=0--105~112 | RAM第23行 |
SCF(Frame)/Cat=0--113~119 | RAM第24行 |
SCF(Frame)/Cat=1--120~127 | RAM第25行 |
SCF(Frame)/Cat=1--128~133 | RAM第26行 |
SCF(Frame)/Cat=2--134~141 | RAM第27行 |
SCF(Frame)/Cat=2--142~148 | RAM第28行 |
SCF(Frame)/Cat=3--149~151 | RAM第29行 |
SCF(Frame)/Cat=4--152~159 | RAM第30行 |
SCF(Frame)/Cat=4--160~165 | RAM第31行 |
LSCF(Frame)/Cat=0--166~173 | RAM第32行 |
LSCF(Frame)/Cat=0--174~180 | RAM第33行 |
LSCF(Frame)/Cat=1--181~188 | RAM第34行 |
LSCF(Frame)/Cat=1--189~194 | RAM第35行 |
LSCF(Frame)/Cat=2--195~202 | RAM第36行 |
LSCF(Frame)/Cat=2--203~209 | RAM第37行 |
LSCF(Frame)/Cat=3--210~212 | RAM第29行 |
LSCF(Frame)/Cat=4--213~220 | RAM第38行 |
LSCF(Frame)/Cat=4--221~226 | RAM第39行 |
CALM/Cat=0--227~230 | RAM第13行 |
CALM/Cat=0--231~236 | RAM第18行 |
CALM/Cat=1--237~240 | RAM第14行 |
CALM/Cat=1--241~246 | RAM第19行 |
CALM/Cat=2--247~250 | RAM第15行 |
CALM/Cat=2--251~256 | RAM第20行 |
CALM/Cat=3--257~260 | RAM第16行 |
CALM/Cat=3--261~265 | RAM第21行 |
CALM/Cat=4--266~269 | RAM第17行 |
CALM/Cat=4--270~275 | RAM第22行 |
End_of_slice_flag--276 | 专用寄存器 |
SCF(Field)/Cat=0--277~284 | RAM第40行 |
SCF(Field)/Cat=0--285~291 | RAM第41行 |
SCF(Field)/Cat=1--292~299 | RAM第42行 |
SCF(Field)/Cat=1--300~305 | RAM第43行 |
SCF(Field)/Cat=2--306~313 | RAM第44行 |
SCF(Field)/Cat=2--314~320 | RAM第45行 |
SCF(Field)/Cat=3--321~323 | RAM第46行 |
SCF(Field)/Cat=4--324~331 | RAM第47行 |
SCF(Field)/Cat=4--332~337 | RAM第48行 |
LSCF(Field)/Cat=0--338~345 | RAM第49行 |
LSCF(Field)/Cat=0--346~352 | RAM第50行 |
LSCF(Field)/Cat=1--353~360 | RAM第51行 |
LSCF(Field)/Cat=1--361~366 | RAM第52行 |
LSCF(Field)/Cat=2--367~374 | RAM第53行 |
LSCF(Field)/Cat=2--375~381 | RAM第54行 |
LSCF(Field)/Cat=3--382~384 | RAM第46行 |
LSCF(Field)/Cat=4--385~392 | RAM第55行 |
LSCF(Field)/Cat=4--393~398 | RAM第56行 |
表2
图2为本发明实施例中的概率模型存储示意图。如图2所示,设置如表2所示的不同概率模型与存储地址的映射关系,根据该映射关系将所有概率模型分别存储到对应的存储地址中,使得除序号为276的概率模型之外的其余概率模型,按照同一SE类别对应的概率模型尽可能存储在同一行和每一行尽可能多的方式存储于56×56的RAM中。
这样,对于除非残差SE的算术编码过程,mb_type_I、mb_type_B或CBP对应的所有概率模型,需要访问两次RAM才能够全部获取,而其他的每个SE类别对应的所有概率模型均只需通过一次访问RAM的一行而获得。
例如,对于mb_skip_flag_P对应的所有概率模型均存储于RAM的第3行,因此,只需读取RAM的第3行的所有数据即可获得mb_skip_flag_P对应的所有概率模型,同时,还获得了mb_skip_flag_B对应的所有概率模型;而对于mb_type_I对应的所有概率模型,也只需对RAM的第1行和第2行各读取一次即可获得。
如果RAM为38×84的RAM,即每行能够存储12个概率模型,则对于所有非残差SE来说,每个SE类别对应的所有概率模型均可通过一次访问RAM的一行而获得。
而且,如表1所示,mb_skip_flag_P、mb_skip_flag_B、sub_mb_type_P、等SE类别对应的概率模型数量较少,因而可以将所有这些SE类别或其中的一部分SE类别对应的概率模型存储于RAM中的任何位置,分别与其他SE类别对应的概率模型共处一行,节省了RAM的资源。
对于残差SE的算术编码过程,以算术编码在采用帧模式、Cat=0或1为例,只需要连续访问6次RAM:
第1次,读取4个CBF对应的概率模型和4个CALM对应的概率模型,例如读取RAM的第13行或第14行;
第2次,读取8个SCF(Frame)对应的概率模型,即读取RAM的第23行或第25行;
第3次,读取8个LSCF(Frame)对应的概率模型,即读取RAM的第32行或第34行;
第4次,读取剩余的相同Cat的SCF(Frame)对应的概率模型,即读取RAM的第24行或第26行;
第5次,读取剩余的相同Cat的LSCF(Frame)对应的概率模型,即读取RAM的第33行或第35行;
第6次,读取剩余的相同Cat的CALM对应的概率模型,即读取RAM的第18行或第19行。
而对于Cat=3的残差SE来说,只需要连续访问3次RAM:
第1次,读取4个CBF对应的概率模型和4个CALM对应的概率模型,即读取RAM的第16行;
第2次,读取所有4个SCF和4个LSCF对应的概率模型,即读取RAM的第29行;
第3次,读取剩余的CALM对应的概率模型,即读取RAM的第21行。
这样,将相同SE类别的概率模型集中存储,即可使得上述两个访问过程中的访问次数分别限制为6次和3次,提高了算术编码的效率。
而且,由于算术编码在采用帧模式和场模式的情况下,分别对应SCF(frame)和LSCF(frame)、SCF(field)和LSCF(field),因此,依据不同的Cat,将SCF(frame)与LSCF(frame)对应的概率模型集中存储、将SCF(field)与LSCF(field)对应的概率模型集中存储,可进一步提高算术编码的效率。
如果算术编码只采用帧模式或场模式中的一种,则不需要SCF(field)和LSCF(field)对应的概率模型、或者不需要SCF(frame)和LSCF(frame)对应的概率模型。此时,仅需要39×56的RAM即可。
实际应用中,也可以将所有概率模型分别存储于两个RAM中。例如,将算术编码过程中读写次数多的概率模型存储在一个RAM中,将读写次数相对较少的其他概率模型存储于另一个RAM中。这样,两个RAM的行地址数都较少,集中对一个RAM的访问就进一步提高了算术编码的效率。
由于对RAM同时读和写的情况较少,因此考虑到节省硬件资源,本实施例的RAM较佳地采用单端口RAM(single-port RAM,SRAM),相对于双端口RAM来说,在读写速度相同的情况下节省了一半的硬件资源。
以上所述仅为本发明的较佳实施例而已,并非用于限定本发明的保护范围。凡在本发明的精神和原则之内,所作的任何修改、等同替换以及改进等,均应包含在本发明的保护范围之内。