一种CABAC编/解码方法
技术领域
本发明涉及编解码领域,特别涉及一种CABAC编/解码方法。
技术背景
CABAC(Context-based Adaptive Binary Arithmetic Coding,基于上下文的自适应算术编码)是SVAC(Surveillance video and audio coding,安全防范监控数字视音频编解码)标准中所采用的两套熵编码方案之一。和另外一套熵编码方案CAVLC相比,CABAC有更好的压缩效率,但是也具有更高的实现复杂度。熵编码器的功能是依照宏块扫描顺序将每个宏块中所有的语法元素的值按固定次序依次编码到码流中。
CABAC编码过程包括三个主要部分:二值化,context概率模型的选择和更新以及二值算术编码。
二值化是对每个语法元素的值根据一定的规则映射成为一串01二值字符串,其映射规则因语法元素的不同而不同,在SVAC标准文档中有详细规定。
Context概率模型给二值算数编码器提供待编码bin(CABAC编解码基本的bit位)的概率估计值PMPS。在编码每一个bin之前,都要估计其为0和为1的概率。如果为0的概率大,则MPS(大概率符号标志)=0,LPS(小概率符号标志)=1;否则MPS=1,LPS=0。PMPS就是bin的值为MPS的概率估计值。CABAC中为每个bin都设置了相对应的context概率模型。每个context概率模型包括一个MPS、一个cycno和一个lgPMPS(指示PMPS)。计算编码当前宏块的bin所需要的context概率模型,需要用到相邻左宏块和上宏块的信息,其计算规则在SVAC标准文档中有详细的规定。
该现有方案中,对于上面一行宏块和左边相邻宏块,每个宏块都需要存储如表1所示的相邻信息。具体来说,每个宏块存储的用于下边宏块参考的相邻信息为17bit,用于右边宏块参考的相邻信息为217bit。此时,如果待编码图像的分辨率为1080P,行宏块数目为120个,则需要存储17×120+217=2257bit=283byte。
表1已有方案CABAC context概率模型每个宏块需要存储的相邻信息
备注1:表1中以4:2:0的图像格式为例;如果图像格式为4:0:0,则coded_block_pattern为4bit;如果图像格式为4:2:2,则coded_block_pattern为4bit,另外还需编码语法元素coded_block_pattern_422,其也是4bit。
备注2:以4:2:0格式为例,一个宏块可以分为4子块如图3所示,每个子块有2个mv_diff_x(分别表示第一个参考图像和第二个参考图像的mv_diff_x),因此需要8“个mv_diffx”。“8个mv_diff_y”与“8个mv_diff_x”同理。
备注3:mb_qp_delta编码参考的是前一个宏块的mb_qp_delta,所以不需要存储一行的相邻信息,只需要存储上一个宏块的mb_qp_delta。上述计算中把这部分计入其用于右宏块参考的相邻信息内。
从上面的分析可以看出,已有CABAC编/解码器确定context概率模型时用到的相邻信息占用存储空间较大,编/解码速度慢,无法满足实时应用场合的需要,也无法集成于芯片中。
发明内容
有鉴于此,本发明实施例提供一种新的CABAC编/解码方法,以减少相邻信息占用存储空间。
为了达到上述目的,本发明实施例提供的一种CABAC编/解码方法,包括:
获取当前块的语法元素的值;
根据获取的语法元素值,判断当前块用于右边块编/解码的相邻信息和/或用于下边块编/解码的相邻信息中变量的值;
将所述变量的值存储在当前块信息中,该变量用于根据语法元素的ctxIdxInc确定步骤计算出ctxIdxInc。
本发明提出一种CABAC编/解码方法,对确定context概率模型需要的相邻宏块信息进行优化:只存储其相邻宏块CABAC编/解码时用到的相邻子块的信息以及其相邻宏块CABAC编/解码时需要用到的参数。相比于现有技术存储整个宏块信息以及整个语法元素值,优化后的方案与已有方案相比,可以节省约54%的存储空间。
附图说明
图1是本发明实施例中一种CABAC编/解码方法的流程示意图。
图2是本发明实施例中当前块E与其相邻块A和B的空间位置关系。
图3是本发明实施例中图像格式为4:2:0的格式宏块划分示意图。
具体实施方式
为使本发明的目的、技术方案和优点更加清楚,下面结合附图对本发明作进一步的详细描述。
本发明提出的编/解码器针对确定context概率模型需要的相邻宏块信息进行优化。
在每一个宏块信息中,只需要存储如表2所示的相邻信息。
表2本发明提出的CABAC context概率模型需要的相邻信息
备注1:表2中以4:2:0的图像格式为例;如果图像格式为4:0:0,则coded_block_pattern为4bit,其相邻信息只需要a和b;如果图像格式为4:2:2,则coded_block_pattern为4bit,其相邻信息为a和b,另外还需编码语法元素coded_block_pattern_422,为4bit,其相邻信息也是该语法元素对应的a和b。
图2所示为本发明实施例中当前块E与其相邻块A和B的空间位置关系。下面将基于该图来阐述如何获得本发明表2所示的“存储的用于右边块编/解码的相邻信息”以及“存储的用于下边块编/解码的相邻信息”。
当前块用于其下边块或右边块编/解码时,最终需要获得每个语法原始的概率模型,由于ctxIdx=起始索引号+ctxIdxInc,其中,语法元素的起始索引号是一个固定的数值,因此,为了求得ctxIdx,需要已知ctxIdxInc。对于每一个语法元素来说,SVAC标准中已经明确规定了ctxIdxInc的计算方式。基于此条件,本发明实施例提供的一种CABAC编/解码方法,如图1所示,该方法包括:
步骤101:获取当前块的语法元素的值;
步骤102:根据获取的语法元素值,判断当前块用于右边块编/解码的相邻信息和/或用于下边块编/解码的相邻信息中变量的值;
步骤103:将所述变量的值存储在当前块信息中。
后续在进行右边块和/或下边块编/解码时,可以直接提取该变量的值,并基于SVAC标准中的计算公式,计算出该语法元素的ctxIdxInc,并进一步计算ctxIdx。
下面以每一个具体的语法元素为例进行说明。
语法元素mb_type
SVAC标准文档相关引文
确定mb_type的ctxIdxInc的步骤如下:
1)如果当前为I条带或P条带,则:
ctxIdxInc=Min(binIdx,4)
2)否则,如果当前为B条带,并且binIdx等于0,则:
ctxIdxInc=5+a+b
3)否则,如果当前为B条带,并且binIdx小于或等于7,则:
ctxIdxInc=7+binIdx
4)否则,如果当前为B条带,并且binIdx大于7,则:
ctxIdxInc=14
SVAC标准文档又提及:
如果当前块E的左边块A(或上边块B)可用,并且块A(或块B)的宏块类型(mb_type)不等于0,则a(或b)的值为1;否则a(或b)的值为0。
具体来说,
首先获取a’和b’的值,计算如下:
其中,skip模式是跳过模式,如果为skip模式,当前宏块不编码mb_type,此时a’和b’都应该为0。
为此,根据本发明实施例的方法,首先获取mb_type的值;根据mb_type,以及是否skip模式,即可判断是a’和/或b’的值是1还是0;将a’和/或b’的值存放在块信息中;待后续给右边块和/或下边块编/解码时,根据它们之间的可用性,得到a和/或b(如果左边块可用,则a=a’,否则a=0,如果上边块可用,则b=b’否则b=0),然后根据mb_type的ctxIdxInc确定步骤计算出ctxIdxInc,进而获得ctxIdx。
由此可见,当前块用于右边块编/解码的相邻信息和/或用于下边块编/解码的相邻信息中变量为a’和b’。本发明存储a’或b’,与现有技术存储5bit的mb_type相比,节约了4bit。
语法元素intra_chroma_pred_mode
SVAC标准文档相关引文
确定intra_chroma_pred_mode的ctxIdxInc的步骤如下:
1)如果binIdx等于0,则:
ctxIdxInc=a+b
2)否则:
ctxIdxInc=3
如果当前块E的左边块A(或上边块B)可用,并且块A(或块B)的预测模式(intra_chroma_pred_mode)不等于0,则a(或b)的值为1;否则a(或b)的值为0。如果块A(或块B)所在宏块的svc_mode_flag等于1,则a(或b)的值为0。
本发明的实施方法首先获取intra_chroma_pred_mode和svc_mode_flag的值;根据intra_chroma_pred_mode和svc_mode_flag以及是否帧内编码模式,获取a’和/或b’,并将其值存放在块信息中;待后续给右边块和/或下边块编/解码时,根据它们之间的可用性,得到a和/或b(如果左边块可用,则a=a’,否则a=0;如果上边块可用,则b=b’,否则b=0);然后根据intra_chroma_pred_mode的ctxIdxInc确定步骤计算出ctxIdxInc,进而获得ctxIdx。具体来说,获取a’和b’的计算如下:
由此可见,当前块用于右边块编/解码的相邻信息和/或用于下边块编/解码的相邻信息中变量为a’和b’。
本发明存储a’或b’,相比于现有技术存储2bit的intra_chroma_pred_mode,节约了1bit。
语法元素coded_block_pattern
SVAC标准文档相关引文
确定code_block_pattern,code_block_pattern_422及code_block_pattern_4×4的ctxIdxInc的步骤如下:
1)如果binIdx的值小于或等于3,则:
ctxIdxInc=a+2×b
2)否则,如果binIdx的值等于4,则:
if(chroma_format_idc==1)
ctxIdxInc=4+c+2×d
else
ctxIdxInc=4
3)否则,如果binIdx的值等于5,则:
ctxIdxInc=4+e+2×f
4)否则:
ctxIdxInc=8+e+2×f
如果当前块E的左边块A(或上边块B)可用,并且块A(或块B)中不包含非零系数,则a(或b)的值为1;否则a(或b)的值为0。
对code_block_pattern,如果当前宏块E的左边宏块A(或上边宏块B)可用,并且宏块A(或宏块B)中顺序号等于4或5的块包含非零系数,则c(或d)的值为1;否则c(或d)的值为0。
对code_block_pattern,如果当前宏块E的左边宏块A(或上边宏块B)可用,并且宏块A(或宏块B)中顺序号等于5的块包含非零系数,则e(或f)的值为1;否则e(或f)的值为0。
在本发明中,coded_block_pattern表示宏块中8×8亮度块和8×8色度块是否包含非零系数。一旦8×8亮度块或8×8色度块包含非零系统,再进一步判断其4×4子亮度块是否包含非零系数。
如果图像格式为4:2:0,则coded_block_pattern为一个6位无符号整数,指示宏块中的4个8×8亮度块和2个8×8色度块是否包含非零残差数据;
如果图像格式为4:0:0或4:2:2,chroma_format_idc等于0或2,coded_block_pattern为一个4位无符号整数,指示宏块中的4个8×8亮度块是否包含非零残差数据。
按照SVAC标准的如上规则,根据其左边块A的coded_block_pattern来确定a、c、e,根据其上边块B的coded_block_pattern来确定b、d、f。再由左边块A的a、c、e和上边块B的b、d、f就可以得到ctxIdxInc的值。
本发明的实施方法首先获取coded_block_pattern的值;根据coded_block_pattern,获取a’、b’、c’、e’、b’、d’、f’,并将其值存放在块信息中;待后续给右边块和/或下边块编/解码时,根据它们之间的可用性,得到a、b、c、d、e、f(如果左边块可用,则当前块block0的a=左边块A block1的a’,当前块block2的a=左边块A block3的a’,当前块block4的c=左边块A block4的c’,当前块block5的e’=左边块A block5的e’,否则当前块a、c、e都为0;如果上边块可用,当前块的block0的b=上边块B block2的b’,block1的b=上边块B block3的b’,当前块block4的d’=上边块B block4的d’,当前块block5的f’=上边块B block5的f’,否则当前块b、d、f都为0);然后根据coded_block_pattern的ctxIdxInc确定步骤计算出ctxIdxInc。
具体来说,以4:2:0为例,如图3所示为图像格式为4:2:0的格式宏块示意图。在亮度宏块中,与右边宏块相邻的是block1和block3,与下边宏块相邻的是block2和block3,则a’、b’、c’、e’、b’、d’、f’的值计算如下:
block1的a’=~((coded_block_pattern>>1)&1);
block3的a’=~((coded_block_pattern>>3)&1);
block2的b’=~((coded_block_pattern>>2)&1);
block3的b’=~((coded_block_pattern>>3)&1);
block4的c’=block4的d’=((coded_block_pattern>>4)&1);
block5的e’=block5的f’=((coded_block_pattern>>5)&1);
由此可见,当前块用于右边块编/解码的相邻信息和/或用于下边块编/解码的相邻信息中变量为a’、b’、c’、e’、b’、d’、f’。
本发明存储4bit的a’(block1和block3)、c’(block4)、e’(blcok5)或b’(block2和block3)、d’(block4)、f’(block5),与现有技术存储6bit的coded_block_pattern相比,节约了2bit。
语法元素mb_reference_index
SVAC标准文档相关引文
确定mb_reference_index的ctxIdxInc的步骤如下:
1)如果binIdx等于0,则:
ctxIdxInc=a+2×b
2)否则,如果binIdx等于1,则:
ctxIdxInc=4
3)否则:
ctxIdxInc=5
如果当前块E的左边块A(或上边块B)可用,并且块A(或块B)的参考索引值大于0,则a(或b)值为1;否则a(或b)的值为0。
在本发明中,首先获取mb_referenc_index的值,根据mb_reference_index以及编码模式来确定a’和/或b’的值是1还是0,将a’和/或b’的值存放在块信息中;待后续给右边块和/或下边块编/解码时,根据它们之间的可用性,得到a和b(如果左边块可用,则a=a’,否则a=0;如果上边块可用,则b=b’,否则b=0),然后按照mb_referenc_index的ctxIndxInc的确定步骤就可以得到ctxIdxInc的值。依然以4:2:0为例,与右边宏块相邻的是block1和block3,与下边宏块相邻的是block2和block3,则a、b的值计算如下:
本发明存储2bit的a’(block1的a’和block3的a’)或2bit的b’(block2的b’和block3的b’),与现有技术存储4bit相比,节约了2bit。
语法元素mv_diff_x/y
SVAC标准文档相关引文
确定mv_diff_x、mv_diff_y的ctxIdxInc的步骤如下:
1)如果binIdx等于0,则:
if(mvda<2)
ctxIdxInc=0
else if(mvda<16)
ctxIdxInc=1
else
ctxIdxInc=2
2)否则,如果binIdx等于1,则:
ctxIdxInc=3
3)否则,如果binIdx等于2,并且binIdx为1的二进制位为‘0’,则:
ctxIdxInc=4
4)否则,如果binIdx为1的二进制位为‘0’,则:
ctxIdxInc=5
如果当前块E的左边块A可用,并且块A的mv_diff_x或mv_diff_y在比特流存在,则mvda的值为块A的mv_diff_x或mv_diff_y的值;否则mvda的值为0。
在本发明中,P帧有多个参考帧的时候,其mv_diffx/y在相邻宏块参考时,不按mb_reference_index区分,都可以互相参考。
B帧的前后mv_diff_x/y之间不能互相参考,具体规则是,前向mv_diff_x/y可以参考对称模式或者前向运动矢量的mv_diff_x/y;后向mv_diff_x/y可以参考对称模式或者后向运动矢量的mv_diff_x/y;对称模式的mv_diff_x/y可以参考对称模式或者前向运动矢量的mv_diff_x/y。
据此,如果当前块是P帧宏块或者是B帧的对称模式宏块(设该参数为mvref_ava),则可以被相邻宏块参考;如果是B帧的其它模式,则还需要比较当前块的前后向信息(mvref_fwbw)和相邻块的前后向信息,才能确定是否可以参考。
依然以4:2:0为例,与右边宏块相邻的是block1和block3,用于右边宏块编码需要存储的信息为:
如果mv_diffx/y在码流中存在,则有如下公式,否则这些参数都等于0。
block1的mvrefa_ava0=block1为((P slice)||(B slice对称模式));
block3的mvrefa_ava1=plock3为((P slice)||(B slice对称模式));
block1的mvrefa_fwbw0=block1为(B slice前向预测模式);
block3的mvrefa_fwbw1=block3为(B slice前向预测模式);
block1的mvrefa_mv_diff_x0=block1的mv_diff_x
block3的mvrefa_mv_diff_x1=block3的mv_diff_x
block1的mvrefa_mv_diff_y0=block1的mv_diff_y
block3的mvrefa_mv_diff_y1=block3的mv_diff_y
由于B帧不需要存储mb_reference_index,所以mvrefa_fwbw可以和P帧mb_reference_index合并,为0表示前向,为1表示后向。因此本发明需要存储的信息为2个1bit的mvrefa_ava,2个mvrefa_mv_diff_x和2个mvrefa_mv_diff_y。
以当前块E的block1为例,当条件(当前块E的左边块A可用,并且左边块A的mvref_ava0==1||当前块的前后向预测模式==左边块A的mvref_fwbw0)满足时,mvda=左边块A的mvref_mv_diff_x0;否则mvda=0。
语法元素mb_qp_delta
SVAC标准文档相关引文
确定mb_qp_delta的ctxIdxInc的步骤如下:
1)如果binIdx等于0,则:
if(PreviousDeltaQP!=0)
ctxIdxInc=1
else
ctxIdxInc=0
2)否则,如果binIdx等于1,则:
ctxIdxInc=2
3)否则:
ctxIdxInc=3
从上面的公式可以看出,根据其上一个宏块的mb_qp_delta(PreviousDeltaQP)确定ctxIdxInc。本发明不存储mb_type,而是存储PreviousDeltaQP的判断条件0或1,这样仅存储1bit数值即可。
相比于现有技术存储6bit的mb_qp_delta,本发明节省了5bit。
利用本发明实施例提供的方法,每个宏块存储的用于下边宏块参考的相邻信息为8bit,用于右边宏块参考的相邻信息为59bit。此时,如果待编码图像的分辨率为1080P,行宏块数目为120个,则需要存储8×120+59=1019bit=138byte。与已有方案相比,本发明方法节约了54%左右的存储空间。
以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内,所作的任何修改、等同替换等,均应包含在本发明的保护范围之内。