1.编译调试Xvidcore
从Xvid官方网站下载xvidcore_1.3.3.orig.tar.gz。
解压。
按照~/doc中的INSTALL进行安装。
完成安装后,利用eclipse luna进行调试,出现问题:
新建工程,将~/xvidcore_1.3.3整个文件夹内的文件加载。
debug其中的xvid_decraw,发现单步调试时无法进入函数xvid_decore()。
幸得大神相助,发现是/build在make的时候需要加-g,使得调试过程中能够进入xvid_decore。
具体的是,在/build/generic/文件夹中的Makefile中加入-g:
@$(CC) -c $(ARCHITECTURE) $(BUS) $(ENDIANNESS) $(FEATURES) $(SPECIFIC_CFLAGS) $(CFLAGS) $< -o $(BUILD_DIR)/$@
改为:
@$(CC) -g3 -c $(ARCHITECTURE) $(BUS) $(ENDIANNESS) $(FEATURES) $(SPECIFIC_CFLAGS) $(CFLAGS) $< -o $(BUILD_DIR)/$@
修改之后重新编译即可进入函数xvid_decore()。
2.标志位:cbp(coded_block_pattern)
cbp即coded_block_pattern,其定义在MPEG-4 part2 中有写明。
在解码过程中,cbp标志位说明了每个block是否进行编码。
例如,在解码P-VOP时,如果编码块为Skipped MB(即mb->mode == MODE_NOT_CODED),则该宏块的cbp设置为0.
decoder.c
{
...
mb->mode = MODE_NOT_CODED
mb->quant = quant;
...
decoder_mbinter(dec,mb,x,y,0,bs,rounding,0,0);//其中,第五个参数即为cbp的值,可以看到,当宏块为S-MB时,cbp值设置为0
...
}
在xvid的源代码中,decoder.c文件包含了解码器的主要函数,cbp的数据类型为uint23_t,长度为四个字节。
在MPEG-4 part2 标准中,Table B.82定义了cbp变长编码的对应表。
INTER模式的帧间预测宏块(pMB)由四个block组成,这四个block在motion compensation 时共用一个MV。
然而其四个预测残差块是不相同的,如果预测残差块系数全为0,则这一块对应的cbp设置为0.