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 ()
<textarea cols="50" rows="15" name="code" class="cpp:collapse"> if (!IS_NEWINTRA (currMB))//((MB)->mb_type==I16MB) { //===== L U M I N A N C E ===== //-------------------------------- for (i=0; i<4; i++) if (cbp & (1<<i)) { rate += writeLumaCoeff8x8 (i, (currMB->b8mode[i]==IBLOCK)); } }</textarea>
上述代码中, if(cbp&(1<<i)) 的含义就是看第 i 个位置的8x8亮度块是否全是零,是的话就不用写编码了。
也就是有些宏块编码的子宏块数不一定都是16,可能是12个(少一个8x8),或者8个等等。所以enc_trace文件才会出现不是16个子宏块的情况。
今天终于解决一个大问题,多亏师兄的帮助!特此记录一下,等下整理一下代码上传,做备份,呵呵