反二进制化
CAbAC定义了四种二进制化方法:一元码(Unary)、截断一元码(Truncated Unary)、K阶指数哥伦布码(kth order Exp-Golomb)和定长码(Fixed-Length)。一个句法元素可以对应一种或两种上述二进制化方法,但特殊的是,句法元素mb_type和sub_mb_type的反二进制化独立于上述四种方法,它们通过查表来实现。
规则解码的二进制算术解码和归一化过程主要包括比较、减法、查表、移位操作。在H.264中,为了减少计算的复杂度,CAbAC首先建立一个64×4的二维表格rangeTabLPS[64][4],存放预先计算好的乘法结果。表格的入口参数是pStateIdx和qCodIRangeIdx,其中qCodIRangeIdx由变量codIRange量化而来,量化方法是(codIRange>>6)&3。其Verilog HDL实现如下:
assign qCodIRangeIdx= (codIRange>>6)&2'b11;
always@(pStateIdx or qCodIRangeIdx)
begin
case{pStateIdx, qCodIRangeIdx}
0: codIRangeLPS=0;
… …
255:codIRangeLPS=63;
endcase
end
建立了概率模型和乘法模型后,在递进计算过程中CAbAC必须保存一下变量:当前区间的下限codIOffset、当前区间的大小codIRange、当前MPS(大概率符号)字符valMPS、LPS(小概率符号)的概率编号pStateIdx。transIdxLPS[pStateIdx]和transIdxMPS[pStateIdx]是两个深度为64项的表格,其中pStateIdx的取值为0"63。接下来是归一化判断,当codIRange小于0x0100时,需进行归一化。这样就能在1个时钟周期内完成二进制化和归一化两个步骤,其Verilog HDL实现如下:
always@(posedge clk or negedge rst)
if( !rst)
... ...
else
begin
if(codIOffset>= codIRange-codIRangeLPS)
begin
binVal<="valMPS;
codIOffset<=codIOffset-(codIRange-codIRangeLPS);
codIRange<=codIRangeLPS;
if(pStateIdx==0)
valMPS<=1-valMPS; pStateIdx<=transIdxLPS[pStateIdx];
end
else
begin
binVal<=valMPS;
pStateIdx<=transIdxMPS[pStateIdx];
end
while(codIRange<0x100) //注:此语句不可综合
begin
codIRange<= (codIRange-codIRangeLPS)<<1;
codIOffset<=(codIOffset<<1) |read_bits(1);
end
end
结语
由于采用了一系列的优化方案,同时,在设计时考虑了解码速度及解码系统中各个模块之间的协调,本文实现了熵解码CAbAC的快速解码,能完成高清码流的实时解码任务,在视频解码芯片中有很好的应用价值。
参考文献
1 Detlev Marpe,Heiko Schwarz,Thomas Wiegand. Context-based Adaptive binary Arithmetic Coding in the H.264/AVC Video Compression Standard[J]. IEEE Transactions on Circuit and Systems for Video Technology,2003,13(7):620-636
2 毕厚杰. 新一代视频压缩编码标准-H.264/AVC[M]. 北京:人民邮电出版社,2005
3 JVT-G050, Draft ITU-T Recommendation H.264 and Draft ISO/IEC 14496-10 AVC,2005[S]