转载地址: http://blog.sina.com.cn/s/blog_9f945ced0102w0ub.html
前面讲过了,YUV图像类的中的成员,我们清楚的知道了YUV的图像的组织结构和访问每个像素的机制。这里我们看一下HTM中的输入输出类,TVideoIOYuv,如下:
下面看看,这两个类是如何组织原始帧的列表、重建帧列表等。
首先,有一个编码工程类TAppEncTop如下:
可以看到了编码工程类关联了两个输入输出类TVideoIOYuv的数组。可以通过这两个成员进行原始数据的输入和重建帧的输出。而最后一个变量则是YUV图像类的二维数组(用于记录每个layer中的重建帧的列表)。现在主要的任务就是如何将这个三个变量,关联到参数文件指定的输入输出文件中。同时编码工程类TAppEncTop是编码参数类的一个继承类。(因为编码工程类就是对编码参数类,进行操作)。
其中编码参数类里有几个参数如下:
搞清楚了相互关联的这个关系,现在从Main 函数开始理顺这个先后的关联,主要找到关联的函数,这样可以通过修改参数文件,就可以实现我们额外要输出的文件。首先main函数先建立了一个编码工程类的对象。当然包含其基类的如上参数。
在Main 函数的另一条语句,TAppEncCfg::parseCfg( Int argc, Char* argv[] ),该函数为编码参数,而语句 const list& argv_unhandled = po::scanArgv(opts, argc, (const Char**) argv); // 实现了编码基类的编码参数类中的原始帧的列表和重建帧的列表进行赋值。
接下来的main函数里,调用了一个encode()函数。该函数的中的首先是要准备一些编码过程用到的变量的内存的开辟和赋值。有函数:
xInitLibCfg(); // 为6个编码层开辟了内存空间,编码工程类中的两个成员已经开辟了内存但是并未正确赋值
此外,在encode的函数中有个语句
TComPicYuv* pcPicYuvOrg = new TComPicYuv;
之后通过YUV图像类的creat函数对YUV图像类的成员进行赋值。pcPicYuvOrg->create( m_iSourceWidth, m_iSourceHeight, m_uiMaxCUWidth, m_uiMaxCUHeight, m_uiMaxCUDepth );
接下来的m_acTVideoIOYuvInputFileLi st[layer]->read ( pcPicYuvOrg, m_aiPad ); 是读取一帧的数据存储在YUV图像类的m_piPicOrgY成员中。
而对于重建的图像的list,函数Void TAppEncTop::xGetBuffer( TComPicYuv*& rpcPicYuvRec, UInt layer)里有如下代码
以上是为每个编码层(纹理图像和深度图像),创建重建的YUV的重建帧。
最终看encode函数中的一句代码
这个函数就是编码一帧,其中其参数pcPicYuvOrg:为encode的函数中创建的YUV的图像类,该变量已经读写了编码工程类中的输入输出m_handle中的原始帧数据,而m_handle已经和编码参数类的输入输出的文件名相关联。
而*m_picYuvRec[layer]是编码图像的重建参考帧,YUV图像类的一个list。
对于最终的输出的重建帧,
在encode函数之后, xWriteOutput(bitstreamFile, iNumEncoded, outputAccessUnits, layer);
m_acTVideoIOYuvReconFileLi st[layerId]->write( pcPicYuvRecTop, pcPicYuvRecBottom, m_confLeft, m_confRight, m_confTop, m_confBottom, m_isTopFieldFirst ); 将重建帧写入到输出文件中。