AreaBuf,UnitBuf 封装了二维视频信号的一维存储下的内存管理方法,提供了简单内存操作接口。
AreaBuf
是一个类模板,AreaBuf
采用了通用数据类型成员,VTM中以AreaBuf
为模板实例化6个模板类,分别管理像素、变换系数和运动信息的存储和访问,如下:
typedef AreaBuf< Pel> PelBuf
;typedef AreaBuf CPelBuf
;typedef AreaBuf< TCoeff> CoeffBuf
;typedef AreaBuf CCoeffBuf
;typedef AreaBuf< MotionInfo> MotionBuf
;typedef AreaBuf CMotionBuf
;template<typename T>
struct AreaBuf : public Size
{
T* buf; // area的存储buff
int stride; // area的stride
// the proper type causes awful lot of errors
//ptrdiff_t stride;
AreaBuf() : Size(), buf( NULL ), stride( 0 ) { }
AreaBuf( T *_buf, const Size &size ) : Size( size ), buf( _buf ), stride( size.width ) { }
AreaBuf( T *_buf, const int &_stride, const Size &size ) : Size( size ), buf( _buf ), stride( _stride ) { }
AreaBuf( T *_buf, const SizeType &_width, const SizeType &_height ) : Size( _width, _height ), buf( _buf ), stride( _width ) { }
AreaBuf( T *_buf, const int &_stride, const SizeType &_width, const SizeType &_height ) : Size( _width, _height ), buf( _buf ), stride( _stride ) { }
operator AreaBuf<const T>() const { return AreaBuf<const T>( buf, stride, width, height ); }
void fill ( const T &val ); // 以特定值val填充area
void memset ( const int val ); // 同fill
void copyFrom ( const AreaBuf<const T> &other ); // 复制other area的内容到当前area
void reconstruct ( const AreaBuf<const T> &pred, const AreaBuf<const T> &resi, const ClpRng& clpRng);
void copyClip ( const AreaBuf<const T> &src, const ClpRng& clpRng);
void subtract ( const AreaBuf<const T> &other );
void extendSingleBorderPel();
void extendBorderPel ( unsigned margin );
void addWeightedAvg ( const AreaBuf<const T> &other1, const AreaBuf<const T> &other2, const ClpRng& clpRng, const int8_t gbiIdx);
void removeWeightHighFreq ( const AreaBuf<T>& other, const bool bClip, const ClpRng& clpRng, const int8_t iGbiWeight);
void addAvg ( const AreaBuf<const T> &other1, const AreaBuf<const T> &other2, const ClpRng& clpRng );
void removeHighFreq ( const AreaBuf<T>& other, const bool bClip, const ClpRng& clpRng);
void updateHistogram ( std::vector<int32_t>& hist ) const;
T meanDiff ( const AreaBuf<const T> &other ) const;
void subtract ( const T val );
void linearTransform ( const int scale, const int shift, const int offset, bool bClip, const ClpRng& clpRng );
void transposedFrom ( const AreaBuf<const T> &other );
void toLast ( const ClpRng& clpRng );
// 返回特定位置(x,y)的值
T& at( const int &x, const int &y ) { return buf[y * stride + x]; }
const T& at( const int &x, const int &y ) const { return buf[y * stride + x]; }
T& at( const Position &pos ) { return buf[pos.y * stride + pos.x]; }
const T& at( const Position &pos ) const { return buf[pos.y * stride + pos.x]; }
// 返回指向位置(x,y)的指针
T* bufAt( const int &x, const int &y ) { return &at( x, y ); }
const T* bufAt( const int &x, const int &y ) const { return &at( x, y ); }
T* bufAt( const Position& pos ) { return &at( pos ); }
const T* bufAt( const Position& pos ) const { return &at( pos ); }
// 返回AreaBuf,其区域area相对于当前area偏移(x,y)或pos,尺寸为size或(w,h)。
AreaBuf< T> subBuf( const Position &pos, const Size &size ) { return AreaBuf< T>( bufAt( pos ), stride, size ); }
AreaBuf<const T> subBuf( const Position &pos, const Size &size ) const { return AreaBuf<const T>( bufAt( pos ), stride, size ); }
AreaBuf< T> subBuf( const int &x, const int &y, const unsigned &_w, const unsigned &_h ) { return AreaBuf< T>( bufAt( x, y ), stride, _w, _h ); }
AreaBuf<const T> subBuf( const int &x, const int &y, const unsigned &_w, const unsigned &_h ) const { return AreaBuf<const T>( bufAt( x, y ), stride, _w, _h ); }
};
也是一个类模板,包含三个颜色通道的AreaBuf,实例化4个模板类
typedef UnitBuf< Pel> PelUnitBuf;
typedef UnitBuf CPelUnitBuf;
typedef UnitBuf< TCoeff> CoeffUnitBuf;
typedef UnitBuf CCoeffUnitBuf;
template<typename T>
struct UnitBuf
{
typedef static_vector<AreaBuf<T>, MAX_NUM_COMPONENT> UnitBufBuffers;
typedef static_vector<AreaBuf<const T>, MAX_NUM_COMPONENT> ConstUnitBufBuffers;
ChromaFormat chromaFormat;
UnitBufBuffers bufs;
UnitBuf() : chromaFormat( NUM_CHROMA_FORMAT ) { }
UnitBuf( const ChromaFormat &_chromaFormat, const UnitBufBuffers& _bufs ) : chromaFormat( _chromaFormat ), bufs( _bufs ) { }
UnitBuf( const ChromaFormat &_chromaFormat, UnitBufBuffers&& _bufs ) : chromaFormat( _chromaFormat ), bufs( std::forward<UnitBufBuffers>( _bufs ) ) { }
UnitBuf( const ChromaFormat &_chromaFormat, const AreaBuf<T> &blkY ) : chromaFormat( _chromaFormat ), bufs{ blkY } { }
UnitBuf( const ChromaFormat &_chromaFormat, AreaBuf<T> &&blkY ) : chromaFormat( _chromaFormat ), bufs{ std::forward<AreaBuf<T> >(blkY) } { }
UnitBuf( const ChromaFormat &_chromaFormat, const AreaBuf<T> &blkY, const AreaBuf<T> &blkCb, const AreaBuf<T> &blkCr ) : chromaFormat( _chromaFormat ), bufs{ blkY, blkCb, blkCr } { }
UnitBuf( const ChromaFormat &_chromaFormat, AreaBuf<T> &&blkY, AreaBuf<T> &&blkCb, AreaBuf<T> &&blkCr ) : chromaFormat( _chromaFormat ), bufs{ std::forward<AreaBuf<T> >(blkY), std::forward<AreaBuf<T> >(blkCb), std::forward<AreaBuf<T> >(blkCr) } { }
operator UnitBuf<const T>() const
{
return UnitBuf<const T>( chromaFormat, ConstUnitBufBuffers( bufs.begin(), bufs.end() ) );
}
AreaBuf<T>& get( const ComponentID comp ) { return bufs[comp]; }
const AreaBuf<T>& get( const ComponentID comp ) const { return bufs[comp]; }
AreaBuf<T>& Y() { return bufs[0]; }
const AreaBuf<T>& Y() const { return bufs[0]; }
AreaBuf<T>& Cb() { return bufs[1]; }
const AreaBuf<T>& Cb() const { return bufs[1]; }
AreaBuf<T>& Cr() { return bufs[2]; }
const AreaBuf<T>& Cr() const { return bufs[2]; }
void fill ( const T &val );
void copyFrom ( const UnitBuf<const T> &other );
void reconstruct ( const UnitBuf<const T> &pred, const UnitBuf<const T> &resi, const ClpRngs& clpRngs );
void copyClip ( const UnitBuf<const T> &src, const ClpRngs& clpRngs );
void subtract ( const UnitBuf<const T> &other );
void addWeightedAvg ( const UnitBuf<const T> &other1, const UnitBuf<const T> &other2, const ClpRngs& clpRngs, const uint8_t gbiIdx = GBI_DEFAULT, const bool chromaOnly = false, const bool lumaOnly = false);
void addAvg ( const UnitBuf<const T> &other1, const UnitBuf<const T> &other2, const ClpRngs& clpRngs, const bool chromaOnly = false, const bool lumaOnly = false);
void extendSingleBorderPel();
void extendBorderPel ( unsigned margin );
void removeHighFreq ( const UnitBuf<T>& other, const bool bClip, const ClpRngs& clpRngs
, const int8_t gbiWeight = g_GbiWeights[GBI_DEFAULT]
);
UnitBuf< T> subBuf (const UnitArea& subArea);
const UnitBuf<const T> subBuf (const UnitArea& subArea) const;
};