Xvid源代码学习

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.

你可能感兴趣的:(Xvid源代码学习)