欢迎来到天天文库
浏览记录
ID:10975880
大小:219.00 KB
页数:19页
时间:2018-07-09
《h264错误隐藏分析》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、JM86之误码掩盖参考代码完全剖析 说明:红色表示函数 绿色表示函数中的参数 褐色表示函数内部的代码正文 本文主要讲述了一些H.264中后处理错误隐藏的知识,而且也集中在解码端实现,根据空域和时域不同的掩盖方法,文章分为两大部分,第一部分主要讲帧内掩盖,相对应的c文件是erc_do_i.c;第二部分主要讲帧间掩盖,相对应的c文件是erc_do_p.c,这一部分相对于帧内掩盖要复杂得多,也是本文的重点。下面,我们就从简到难,细细讲述其中的原理。 第一部分:帧内误码掩盖
2、(erc_do_i.c) 大家先对整个帧内误码掩盖有个大体的框架,请看下图,其中ercConcealIntraFrame()是帧内的入口函数。帧内的掩盖方式为像素平均权值,方法相对来说比较简单。下面,我们通过一个一个函数分析来了解帧内掩盖算法。intercConcealIntraFrame(frame*recfr,int32picSizeX,int32picSizeY,ercVariables_t*errorVar) 函数功能简述:这是帧内掩盖的入口函数,被image.c中的exit_pi
3、cture()函数所调用。这里,没有太多的代码,只是做了坐标级之间的转换,并调用了concealBlocks()。函数参数解释:frame*recfr表示当前帧指针结构体,这个结构体包含了指向当前帧Y,U和V块的指针。 int32picSizeX表示一帧的宽度,当QCIF图像时,该值为176,当CIF图像时,该值为352。 int32picSizeY表示一帧的高度,当QCIF图像时,该值为144,当CIF图像
4、时,该值为288。 ercVariables_t*errorVar表示包含了一些掩盖状态和信息的结构体。注意点:1.ercVariables_t结构体中变量的含义(详看我的erc_api.c初探)。2.不同基本单位之间的转换,我的意思是指以宏块为单位的横纵坐标转换成以8x8块为单位的坐标之类的问题。函数详述: 函数内部的动作比较简单,但是照顾到刚刚接触误码掩盖的朋友,在介绍第一个函数的时候,我更多的会讲一些变量的含义以及代码的操作习惯。这边我主
5、要现讲两方面,一个就是errorVar->yCondition、errorVar->uCondition和errorVar->vCondition指的是什么?另外一个就是不同基本单位之间的转换。 在接收端,有一个宏块状态图的概念,它的作用就是记录一帧图像所有宏块的接收状态。如下图: 标记为ERC_BLOCK_OK的宏块表示正确接收,标记为ERC_BLOCK_CONCEALED的宏块表示错误的块但是已经被掩盖过,标记为ERC_BLOCK_CORRUPTED或ERC_BLOCK_EMPTY就表
6、示错误接收或已经丢失的块。这样,我们在程序中就可以通过这张表来知道哪些块是需要进行误码掩盖的,而errorVar->yCondition、errorVar->uCondition和errorVar->vCondition这三个数组就是分别存放了YUV块的这种状态标志,但是这边需要注意的是,在程序中存放的时候,并不是以宏块为单位的,而是进一步将一个宏块分割成4个8x8的子块,存放的是这些子块的状态信息。当然,对于UV来说,不用分割,基本单位已经是8x8了。由此我们知道,接下去误码掩盖处理的过程中,并不
7、是以整像素单位进行的,而是以8x8块为单位的。 进一步,我们现在应该明白为什么程序一开始对于YUV的lastRow和lastColumn所作的赋值。 //Y lastRow=(int)(picSizeY>>3);lastColumn=(int)(picSizeX>>3); //UV lastRow=(int)(picSizeY>>4); lastColumn=(int)(picSizeX>>4);假设对于一个DCIF图像来说,picSizeX=176pic
8、SizeY=144,作了处理后,对于Y块就被分割成22x18个8x8块,而对于UV块就被分割成11x9个8x8块。其实这个就是我所说的不同基本单位之间的转换。 明白了上面这两点,这个函数就理解了,下面就是调用了concealBlocks()。staticvoidconcealBlocks(intlastColumn,intlastRow,intcomp,frame*recfr,int32picSizeX,int*condition) 函数功能简述:函数根据亮
此文档下载收益归作者所有