14.2.1 MPEG-4编/解码设计与剖析(11)
3)销毁解码器实例
对应创建编码器工作,释放申请的所有内存,删除解码器句柄。
int decoder_destroy(DECODER * dec) { xvid_free(dec->last_mbs); //释放宏块结构体 xvid_free(dec->mbs); //释放宏块结构体 image_destroy(&dec->refn[0], dec->edged_width, dec->edged_height); //释放参考帧0的空间 image_destroy(&dec->refn[1], dec->edged_width, dec->edged_height); //释放参考帧1的空间 image_destroy(&dec->tmp, dec->edged_width, dec->edged_height); //释放临时帧的空间 image_destroy(&dec->cur, dec->edged_width, dec->edged_height); //释放当前帧的空间 xvid_free(dec); //释放、删除解码器 return 0; } |
XviD的MPEG-4视频编/解码算法结构清晰、定点算法,非常适合硬件平台来实现。可以说XviD是目前MPEG-4算法开源代码中最优秀的工程实现。一方面XviD已经针对主流的CPU做了汇编优化,另一方面为其他平台移植提供了技术方向。如表14-1所示是XviD MPEG-4视频编/解码算法的底层模块。
表14-1 XviD MPEG-4视频CODEC底层模块
|
核心模块< xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /> |
编码 |
解码 |
功能描述 |
|
transfer_8to16copy |
× |
|
图像精度扩展,8~16位 |
|
transfer_16to8copy |
× |
× |
图像像素嵌位8位(0~255) |
|
transfer_8to16sub |
× |
|
图像块相减,并扩展精度 |
|
transfer_16to8add |
× |
× |
差值加到图像,并嵌位到8位 |
|
transfer8x8_copy |
× |
|
块复制 |
|
quant_h263_intra |
× |
|
Intra块的h263方式量化 |
|
quant_h263_inter |
× |
|
Intrer块的h263方式量化 |
|
dequant_h263_intra |
× |
× |
Intra块的h263方式反量化 |
|
dequant_h263_inter |
× |
× |
Intrer块的h263方式反量化 |
|
Fdct |
× |
|
前向DCT |
|
Idct |
× |
× |
反向DCT |
|
interpolate8x8_halfpel_h |
× |
× |
水平1/2像素差值 |
|
interpolate8x8_halfpel_v |
× |
× |
垂直1/2像素差值 |
|
interpolate8x8_halfpel_hv |
× |
× |
斜角1/2像素差值 |
|
sad16 |
× |
|
计算图像宏块的SAD |
|
sad8 |
× |
|
计算图像块的SAD |
|
dev16 |
× |
|
计算图像宏块的平均值的偏差 |
|
calc_cbp |
× |
|
计算6个块的CBP |
从表14-1分析可以清晰地看出,编码器的工作包含了解码器的任务。为提高CODEC的执行效率,这些底层模块必须进行汇编优化,下面就介绍底层模块的优化方法。
【责任编辑:
云霞 TEL:(010)68476606】