VTM数据结构2

VTM数据结构2


文章目录

  • VTM数据结构2
  • 前言
    • 学习CompArea,UnitArea前参考VTM数据结构1 [VTM数据结构1](https://blog.csdn.net/cx52039/article/details/124108443?spm=1001.2014.3001.5501) VTM数据结构:CompArea,UnitArea 这两种自定义的数据类型继承于Area
  • 一、CompArea
  • 二、UnitArea
    • 1.static_vector的封装
  • 总结


前言

学习CompArea,UnitArea前参考VTM数据结构1
VTM数据结构1
VTM数据结构:CompArea,UnitArea
这两种自定义的数据类型继承于Area

提示:以下是本篇文章正文内容,下面案例可供参考
这两种自定义数据类型在CommonLib/Unit.h中定义

一、CompArea

简介:CopArea继承自Area,用来表示特定分量的二维信息
注意:CompArea作为子类,添加了ChromaFormat型的成员,以及ComponentID型的成员,这两种都是美剧类型的变量。


ChromaFormat和ComponentID枚举类型的定义

enum ChromaFormat
{CHROMA_400        = 0,CHROMA_420        = 1,CHROMA_422        = 2,CHROMA_444        = 3,NUM_CHROMA_FORMAT = 4
};enum ComponentID
{COMPONENT_Y         = 0,COMPONENT_Cb        = 1,COMPONENT_Cr        = 2,MAX_NUM_COMPONENT   = 3,MAX_NUM_TBLOCKS     = MAX_NUM_COMPONENT
};

VTM对CompArea的定义:

struct CompArea : public Area
{CompArea() : Area(), chromaFormat(NUM_CHROMA_FORMAT), compID(MAX_NUM_TBLOCKS)                                                                                                                                 { }  //参数初始化列表//以给出了CompArea(const ComponentID _compID, const ChromaFormat _cf, const Area &_area, const bool isLuma = false)                                          : Area(_area),          chromaFormat(_cf), compID(_compID) { if (isLuma) xRecalcLumaToChroma(); }CompArea(const ComponentID _compID, const ChromaFormat _cf, const Position& _pos, const Size& _size, const bool isLuma = false)                    : Area(_pos, _size),    chromaFormat(_cf), compID(_compID) { if (isLuma) xRecalcLumaToChroma(); }CompArea(const ComponentID _compID, const ChromaFormat _cf, const uint32_t _x, const uint32_t _y, const uint32_t _w, const uint32_t _h, const bool isLuma = false) : Area(_x, _y, _w, _h), chromaFormat(_cf), compID(_compID) { if (isLuma) xRecalcLumaToChroma(); }ChromaFormat chromaFormat;   //新增的成员变量ComponentID compID;     //新增的成员变量Position chromaPos() const;Position lumaPos()   const;Size     chromaSize() const;Size     lumaSize()   const;Position compPos( const ComponentID compID ) const;Position chanPos( const ChannelType chType ) const;Position topLeftComp    (const ComponentID _compID) const { return recalcPosition(chromaFormat, compID, _compID, *this);                                                     }Position topRightComp   (const ComponentID _compID) const { return recalcPosition(chromaFormat, compID, _compID, { (PosType) (x + width - 1), y                          }); }Position bottomLeftComp (const ComponentID _compID) const { return recalcPosition(chromaFormat, compID, _compID, { x                        , (PosType) (y + height - 1 )}); }Position bottomRightComp(const ComponentID _compID) const { return recalcPosition(chromaFormat, compID, _compID, { (PosType) (x + width - 1), (PosType) (y + height - 1 )}); }bool valid() const { return chromaFormat < NUM_CHROMA_FORMAT && compID < MAX_NUM_TBLOCKS && width != 0 && height != 0; }   //校验数据有效const bool operator==(const CompArea &other) const   //重载==,{if (chromaFormat != other.chromaFormat) return false;if (compID       != other.compID)       return false;return Position::operator==(other) && Size::operator==(other);    //利用父类的重载,}const bool operator!=(const CompArea &other) const { return !(operator==(other)); }    //重载!=#if REUSE_CU_RESULTS_WITH_MULTIPLE_TUSvoid     resizeTo          (const Size& newSize)          { Size::resizeTo(newSize); }
#endifvoid     repositionTo      (const Position& newPos)       { Position::repositionTo(newPos); }void     positionRelativeTo(const CompArea& origCompArea) { Position::relativeTo(origCompArea); }private:void xRecalcLumaToChroma();
};

二、UnitArea

简介:UnitArea中存放了ChromaFormat型以及CompArea型的数据

1.static_vector的封装

类模板static_vector

template<typename T, size_t N>
class static_vector
{T _arr[ N ];size_t _size;public:typedef T         value_type;typedef size_t    size_type;typedef ptrdiff_t difference_type;typedef T&        reference;typedef T const&  const_reference;typedef T*        pointer;typedef T const*  const_pointer;typedef T*        iterator;typedef T const*  const_iterator;static const size_type max_num_elements = N;static_vector() : _size( 0 )                                 { }static_vector( size_t N_ ) : _size( N_ )                     { }static_vector( size_t N_, const T& _val ) : _size( 0 )       { resize( N_, _val ); }template<typename It>static_vector( It _it1, It _it2 ) : _size( 0 )               { while( _it1 < _it2 ) _arr[ _size++ ] = *_it1++; }static_vector( std::initializer_list<T> _il ) : _size( 0 ){typename std::initializer_list<T>::iterator _src1 = _il.begin();typename std::initializer_list<T>::iterator _src2 = _il.end();while( _src1 < _src2 ) _arr[ _size++ ] = *_src1++;CHECKD( _size > N, "capacity exceeded" );}static_vector& operator=( std::initializer_list<T> _il ){_size = 0;typename std::initializer_list<T>::iterator _src1 = _il.begin();typename std::initializer_list<T>::iterator _src2 = _il.end();while( _src1 < _src2 ) _arr[ _size++ ] = *_src1++;CHECKD( _size > N, "capacity exceeded" );}void resize( size_t N_ )                      { CHECKD( N_ > N, "capacity exceeded" ); while(_size < N_) _arr[ _size++ ] = T() ; _size = N_; }void resize( size_t N_, const T& _val )       { CHECKD( N_ > N, "capacity exceeded" ); while(_size < N_) _arr[ _size++ ] = _val; _size = N_; }void reserve( size_t N_ )                     { CHECKD( N_ > N, "capacity exceeded" ); }void push_back( const T& _val )               { CHECKD( _size >= N, "capacity exceeded" ); _arr[ _size++ ] = _val; }void push_back( T&& val )                     { CHECKD( _size >= N, "capacity exceeded" ); _arr[ _size++ ] = std::forward<T>( val ); }void pop_back()                               { CHECKD( _size == 0, "calling pop_back on an empty vector" ); _size--; }void pop_front()                              { CHECKD( _size == 0, "calling pop_front on an empty vector" ); _size--; for( int i = 0; i < _size; i++ ) _arr[i] = _arr[i + 1]; }void clear()                                  { _size = 0; }reference       at( size_t _i )               { CHECKD( _i >= _size, "Trying to access an out-of-bound-element" ); return _arr[ _i ]; }const_reference at( size_t _i ) const         { CHECKD( _i >= _size, "Trying to access an out-of-bound-element" ); return _arr[ _i ]; }reference       operator[]( size_t _i )       { CHECKD( _i >= _size, "Trying to access an out-of-bound-element" ); return _arr[ _i ]; }const_reference operator[]( size_t _i ) const { CHECKD( _i >= _size, "Trying to access an out-of-bound-element" ); return _arr[ _i ]; }reference       front()                       { CHECKD( _size == 0, "Trying to access the first element of an empty vector" ); return _arr[ 0 ]; }const_reference front() const                 { CHECKD( _size == 0, "Trying to access the first element of an empty vector" ); return _arr[ 0 ]; }reference       back()                        { CHECKD( _size == 0, "Trying to access the last element of an empty vector" );  return _arr[ _size - 1 ]; }const_reference back() const                  { CHECKD( _size == 0, "Trying to access the last element of an empty vector" );  return _arr[ _size - 1 ]; }pointer         data()                        { return _arr; }const_pointer   data() const                  { return _arr; }iterator        begin()                       { return _arr; }const_iterator  begin() const                 { return _arr; }const_iterator  cbegin() const                { return _arr; }iterator        end()                         { return _arr + _size; }const_iterator  end() const                   { return _arr + _size; };const_iterator  cend() const                  { return _arr + _size; };size_type       size() const                  { return _size; };size_type       byte_size() const             { return _size * sizeof( T ); }bool            empty() const                 { return _size == 0; }size_type       capacity() const              { return N; }size_type       max_size() const              { return N; }size_type       byte_capacity() const         { return sizeof(_arr); }iterator        insert( const_iterator _pos, const T& _val ){ CHECKD( _size >= N, "capacity exceeded" );for( difference_type i = _size - 1; i >= _pos - _arr; i-- ) _arr[i + 1] = _arr[i];*const_cast<iterator>( _pos ) = _val;_size++;return const_cast<iterator>( _pos ); }iterator        insert( const_iterator _pos, T&& _val ){ CHECKD( _size >= N, "capacity exceeded" );for( difference_type i = _size - 1; i >= _pos - _arr; i-- ) _arr[i + 1] = _arr[i];*const_cast<iterator>( _pos ) = std::forward<T>( _val );_size++; return const_cast<iterator>( _pos ); }template<class InputIt>iterator        insert( const_iterator _pos, InputIt first, InputIt last ){ const difference_type numEl = last - first;CHECKD( _size + numEl >= N, "capacity exceeded" );for( difference_type i = _size - 1; i >= _pos - _arr; i-- ) _arr[i + numEl] = _arr[i];iterator it = const_cast<iterator>( _pos ); _size += numEl;while( first != last ) *it++ = *first++;return const_cast<iterator>( _pos ); }
};

UnitArea定义:

typedef static_vector<CompArea, MAX_NUM_TBLOCKS> UnitBlocksType;struct UnitArea
{ChromaFormat chromaFormat;UnitBlocksType blocks;UnitArea() : chromaFormat(NUM_CHROMA_FORMAT) { }UnitArea(const ChromaFormat _chromaFormat);UnitArea(const ChromaFormat _chromaFormat, const Area &area);UnitArea(const ChromaFormat _chromaFormat, const CompArea  &blkY);UnitArea(const ChromaFormat _chromaFormat,       CompArea &&blkY);UnitArea(const ChromaFormat _chromaFormat, const CompArea  &blkY, const CompArea  &blkCb, const CompArea  &blkCr);UnitArea(const ChromaFormat _chromaFormat,       CompArea &&blkY,       CompArea &&blkCb,       CompArea &&blkCr);//在static_vector中重载了[],实际上就是返回对应CompArea& Y()                                  { return blocks[COMPONENT_Y];  }//这里重载了[],返回的时_arr数组中对应的分量const CompArea& Y()                            const { return blocks[COMPONENT_Y];  }CompArea& Cb()                                 { return blocks[COMPONENT_Cb]; }const CompArea& Cb()                           const { return blocks[COMPONENT_Cb]; }CompArea& Cr()                                 { return blocks[COMPONENT_Cr]; }const CompArea& Cr()                           const { return blocks[COMPONENT_Cr]; }CompArea& block(const ComponentID comp)       { return blocks[comp]; }const CompArea& block(const ComponentID comp) const { return blocks[comp]; }bool contains(const UnitArea& other) const;bool contains(const UnitArea& other, const ChannelType chType) const;CompArea& operator[]( const int n )       { return blocks[n]; }const CompArea& operator[]( const int n ) const { return blocks[n]; }const bool operator==(const UnitArea &other) const{if (chromaFormat != other.chromaFormat)   return false;if (blocks.size() != other.blocks.size()) return false;for (uint32_t i = 0; i < blocks.size(); i++){if (blocks[i] != other.blocks[i]) return false;}return true;}#if REUSE_CU_RESULTS_WITH_MULTIPLE_TUSvoid resizeTo    (const UnitArea& unit);
#endifvoid repositionTo(const UnitArea& unit);const bool operator!=(const UnitArea &other) const { return !(*this == other); }const Position& lumaPos () const { return Y(); }const Size&     lumaSize() const { return Y(); }const Position& chromaPos () const { return Cb(); }const Size&     chromaSize() const { return Cb(); }const UnitArea  singleComp(const ComponentID compID) const;const UnitArea  singleChan(const ChannelType chType) const;const SizeType  lwidth()  const { return Y().width; }  /*! luma width  */const SizeType  lheight() const { return Y().height; } /*! luma height */const PosType   lx() const { return Y().x; }           /*! luma x-pos */const PosType   ly() const { return Y().y; }           /*! luma y-pos */bool valid() const { return chromaFormat != NUM_CHROMA_FORMAT && blocks.size() > 0; }
};

总结


CompArea提供了单个分量的信息,UnitArea相当于是CompArea类型的数组,存储多个分量的信号。

static_vector这个类模板的设计很巧妙,相当于设计了一个类似vector容器的结构,相比于vector容器有了长度的限定。


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部