对于单通道视频而言,在HM中获取相邻PU的模式信息,这个已经可以很方便的获得,详见http://blog.csdn.net/yangxiao_xiang/article/details/8478283。但是对于多视点平台而言,有时候需要获得当前视点对应深度图像的某个PU的模式信息,或者是当前POC的某个视点的PU的模式信息,为了解决这个问题,在HTM中专门提供了一个选择不同图像的接口。下面以HTM 8.0为例,简单地介绍其功能。
在接口定义在TEncTop层,该层是顶层编码层,因此在该层可以利用该接口完成不同layer之间的接入。
class TEncTop : public TEncCfg
{
TComPicLists* m_ivPicLists; ///< access to picture lists of otherlayers
TComPicLists* getIvPicLists() {return m_ivPicLists; }
}
接下来,认识TComPicLists这个类。
class TComPicLists
{
private:
TComList<TComList<TComPic*>*> m_lists;
#if H_3D
TComVPS* m_vps;
#endif
public:
Void push_back(TComList<TComPic*>* list ) { m_lists.push_back( list ); }
Int size () { return (Int)m_lists.size(); }
TComPic* getPic ( Int layerIdInNuh, Int poc );
TComPicYuv* getPicYuv( Int layerIdInNuh, Int poc, Bool recon );
#if H_3D
Void setVPS ( TComVPS* vps ) { m_vps = vps; };
TComPic* getPic ( Int viewIndex, Bool depthFlag, Int poc );
TComPicYuv* getPicYuv( Int viewIndex, Bool depthFlag, Int poc, Boolrecon );
#endif
Void print( );
}; // END CLASS DEFINITION TComPicLists
然后就可以发现里面定义很多可以使用的接口,
TComPic* getPic ( Int layerIdInNuh, Int poc ); 这个是图像返回指针,也就是我们需要的。
因此,我们可以采用以下方式获取某个layer的图像接口。以下是我获取当前视点深度图像的方法:
if(m_pcEncTop->getIsDepth())
{
TComPicLists*ivPicLists = m_pcEncTop->getIvPicLists();
TComPic*pcTextPic = ivPicLists->getPic(getLayerId()-1,pcPic->getPOC());
}
为了得到PU的模式信息,还需要再TComDataCU::initCU函数中进行修改。
if( m_uiCUAddr / uiWidthInCU )
{
m_pcCUAbove = pcPic->getCU( m_uiCUAddr - uiWidthInCU );
}
if( m_pcCULeft && m_pcCUAbove )
{
m_pcCUAboveLeft = pcPic->getCU( m_uiCUAddr - uiWidthInCU - 1 );
}
if( m_pcCUAbove && ( (m_uiCUAddr%uiWidthInCU) < (uiWidthInCU-1) ) )
{
m_pcCUAboveRight = pcPic->getCU( m_uiCUAddr - uiWidthInCU + 1 );
}
if( getSlice()->getNumRefIdx( REF_PIC_LIST_0 ) > 0 )
{
m_apcCUColocated[0] = getSlice()->getRefPic( REF_PIC_LIST_0,0)->getCU( m_uiCUAddr );
}
if( getSlice()->getNumRefIdx( REF_PIC_LIST_1 ) > 0 )
{
m_apcCUColocated[1] = getSlice()->getRefPic( REF_PIC_LIST_1,0)->getCU( m_uiCUAddr );
}
if(m_pcPic->getIsDepth())
{
m_pcCUColorPic =m_pcPic->getTextPic()->getCU( m_uiCUAddr );
}
注意:关于m_pcCUColorPic 创建、释放,以及指针的获取,可以参考m_pcCULeft、m_pcCUAbove等指针。