解决了输出JM编码AC系数和解码系数不一致的情况

来源:互联网 发布:主要的网络侦查技术 编辑:程序博客网 时间:2024/05/16 05:28

cbp一共6bit,高2bit表示cbpc(2:cb、cr中至少一个4x4块的AC系数不全为0;1:cb、cr中至少一个2x2的DC系数不全为0;0:所有色度系数全0)

低4bit分别表示4个8x8亮度块,其中从最低一位开始的4位分别对应00,10,01,11位置的8*8亮度块。如果某位为1,表示该对应8*8块的4个4*4块中至少有一个的系数不全为0。

ICBPTAB[0] = 0 (00 0000)表示既没有亮度系数,也没有色差系数

ICBPTAB[1] = 16 (01 0000)表示没有亮度系数,有色差直流系数(没有交流系数)

ICBPTAB[2] = 32 (10 0000)表示没有亮度系数,有色差交流系数(可能含有直流系数)

ICBPTAB[3] = 15 (00 1111)表示有亮度系数,没有色差系数

ICBPTAB[4] = 31 (01 1111)表示有亮度系数,有色差直流系数(没有交流系数)

ICBPTAB[5] = 47 (10 1111)表示有亮度系数,有色差交流系数(可能含有直流系数)

 

 

例如cbp=7  (00 0111) ,代表色度系数全0,四个8x8亮度块中,(1,1)位置的全为0

 

JM lencod 中

int writeCBPandLumaCoeff ()

 

 

 

上述代码中, if(cbp&(1<<i)) 的含义就是看第 i 个位置的8x8亮度块是否全是零,是的话就不用写编码了。

也就是有些宏块编码的子宏块数不一定都是16,可能是12个(少一个8x8),或者8个等等。所以enc_trace文件才会出现不是16个子宏块的情况。

 

今天终于解决一个大问题,多亏师兄的帮助!特此记录一下,等下整理一下代码上传,做备份,呵呵