在HTM中如何获取不同视点的彩色或深度图像(Layer)的模式信息

对于单通道视频而言,在HM中获取相邻PU的模式信息,这个已经可以很方便的获得,详见http://blog.csdn.net/yangxiao_xiang/article/details/8478283。但是对于多视点平台而言,有时候需要获得当前视点对应深度图像的某个PU的模式信息,或者是当前POC的某个视点的PU的模式信息,为了解决这个问题,在HTM中专门提供了一个选择不同图像的接口。下面以HTM 8.0为例,简单地介绍其功能。

在HTM中如何获取不同视点的彩色或深度图像(Layer)的模式信息_第1张图片

在接口定义在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等指针。

 

你可能感兴趣的:(3D,htm,HEVC)