/* The copyright in this software is being made available under the BSD * License, included below. This software may be subject to other third party * and contributor rights, including patent rights, and no such rights are * granted under this license. * * Copyright (c) 2010-2015, ITU/ISO/IEC * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * * Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of the ITU/ISO/IEC nor the names of its contributors may * be used to endorse or promote products derived from this software without * specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF * THE POSSIBILITY OF SUCH DAMAGE. */ /** \file TComYuv.h \brief general YUV buffer class (header) \todo this should be merged with TComPicYuv \n check usage of removeHighFreq function */ #ifndef __TCOMYUV__ #define __TCOMYUV__ #include "CommonDef.h" #include "TComPicYuv.h" #include "TComRectangle.h" //! \ingroup TLibCommon //! \{ // ==================================================================================================================== // Class definition // ==================================================================================================================== /// general YUV buffer class class TComYuv { private: // ------------------------------------------------------------------------------------------------------------------ // YUV buffer // ------------------------------------------------------------------------------------------------------------------ Pel* m_apiBuf[MAX_NUM_COMPONENT]; // ------------------------------------------------------------------------------------------------------------------ // Parameter for general YUV buffer usage // ------------------------------------------------------------------------------------------------------------------ UInt m_iWidth; UInt m_iHeight; ChromaFormat m_chromaFormatIDC; ////< Chroma Format // dims 16x16 // blkSize=4x4 // these functions assume a square CU, of size width*width, split into square TUs each of size blkSize*blkSize. // iTransUnitIdx is the raster-scanned index of the sub-block (TU) in question. // eg for a 16x16 CU, with 4x4 TUs: // 0 1 2 3 // 4 5 6 7 // 8 9 10 11 // 12 13 14 15 // So, for iTransUnitIdx=14, 14*4 & 15 =8=X offset. // 14*4 / 16 =3=Y block offset // 3*4*16 = Y offset within buffer public: TComYuv (); virtual ~TComYuv (); // ------------------------------------------------------------------------------------------------------------------ // Memory management // ------------------------------------------------------------------------------------------------------------------ Void create ( const UInt iWidth, const UInt iHeight, const ChromaFormat chromaFormatIDC ); ///< Create YUV buffer Void destroy (); ///< Destroy YUV buffer Void clear (); ///< clear YUV buffer // ------------------------------------------------------------------------------------------------------------------ // Copy, load, store YUV buffer // ------------------------------------------------------------------------------------------------------------------ // Copy YUV buffer to picture buffer Void copyToPicYuv ( TComPicYuv* pcPicYuvDst, const UInt ctuRsAddr, const UInt uiAbsZorderIdx, const UInt uiPartDepth = 0, const UInt uiPartIdx = 0 ) const ; Void copyToPicComponent ( const ComponentID id, TComPicYuv* pcPicYuvDst, const UInt iCtuRsAddr, const UInt uiAbsZorderIdx, const UInt uiPartDepth = 0, const UInt uiPartIdx = 0 ) const ; // Copy YUV buffer from picture buffer Void copyFromPicYuv ( const TComPicYuv* pcPicYuvSrc, const UInt ctuRsAddr, const UInt uiAbsZorderIdx ); Void copyFromPicComponent ( const ComponentID id, const TComPicYuv* pcPicYuvSrc, const UInt iCtuRsAddr, const UInt uiAbsZorderIdx ); // Copy Small YUV buffer to the part of other Big YUV buffer Void copyToPartYuv ( TComYuv* pcYuvDst, const UInt uiDstPartIdx ) const ; Void copyToPartComponent ( const ComponentID id, TComYuv* pcYuvDst, const UInt uiDstPartIdx ) const ; // Copy the part of Big YUV buffer to other Small YUV buffer Void copyPartToYuv ( TComYuv* pcYuvDst, const UInt uiSrcPartIdx ) const; Void copyPartToComponent ( const ComponentID id, TComYuv* pcYuvDst, const UInt uiSrcPartIdx ) const; // Copy YUV partition buffer to other YUV partition buffer Void copyPartToPartYuv ( TComYuv* pcYuvDst, const UInt uiPartIdx, const UInt uiWidth, const UInt uiHeight ) const; Void copyPartToPartComponent ( const ComponentID id, TComYuv* pcYuvDst, const UInt uiPartIdx, const UInt uiWidthComponent, const UInt uiHeightComponent ) const; // Copy YUV partition buffer to other YUV partition buffer for non-square blocks Void copyPartToPartComponentMxN ( const ComponentID id, TComYuv* pcYuvDst, const TComRectangle &rect ) const; // ------------------------------------------------------------------------------------------------------------------ // Algebraic operation for YUV buffer // ------------------------------------------------------------------------------------------------------------------ // Clip(pcYuvSrc0 + pcYuvSrc1) -> m_apiBuf Void addClip ( const TComYuv* pcYuvSrc0, const TComYuv* pcYuvSrc1, const UInt uiTrUnitIdx, const UInt uiPartSize, const BitDepths &clipBitDepths ); // pcYuvSrc0 - pcYuvSrc1 -> m_apiBuf Void subtract ( const TComYuv* pcYuvSrc0, const TComYuv* pcYuvSrc1, const UInt uiTrUnitIdx, const UInt uiPartSize ); // (pcYuvSrc0 + pcYuvSrc1)/2 for YUV partition Void addAvg ( const TComYuv* pcYuvSrc0, const TComYuv* pcYuvSrc1, const UInt iPartUnitIdx, const UInt iWidth, const UInt iHeight, const BitDepths &clipBitDepths ); Void removeHighFreq ( const TComYuv* pcYuvSrc, const UInt uiPartIdx, const UInt uiWidth, const UInt uiHeight , const Int bitDepths[MAX_NUM_CHANNEL_TYPE], const Bool bClipToBitDepths ); // ------------------------------------------------------------------------------------------------------------------ // Access function for YUV buffer // ------------------------------------------------------------------------------------------------------------------ // Access starting position of YUV buffer Pel* getAddr (const ComponentID id) { return m_apiBuf[id]; } const Pel* getAddr (const ComponentID id) const { return m_apiBuf[id]; } // Access starting position of YUV partition unit buffer Pel* getAddr (const ComponentID id, const UInt uiPartUnitIdx) { Int blkX = g_auiRasterToPelX[ g_auiZscanToRaster[ uiPartUnitIdx ] ] >> getComponentScaleX(id); Int blkY = g_auiRasterToPelY[ g_auiZscanToRaster[ uiPartUnitIdx ] ] >> getComponentScaleY(id); assert((blkX> getComponentScaleX(id); Int blkY = g_auiRasterToPelY[ g_auiZscanToRaster[ uiPartUnitIdx ] ] >> getComponentScaleY(id); assert((blkX> getComponentScaleX(id); } UInt getHeight (const ComponentID id) const { return m_iHeight >> getComponentScaleY(id); } UInt getWidth (const ComponentID id) const { return m_iWidth >> getComponentScaleX(id); } ChromaFormat getChromaFormat () const { return m_chromaFormatIDC; } UInt getNumberValidComponents () const { return ::getNumberValidComponents(m_chromaFormatIDC); } UInt getComponentScaleX (const ComponentID id) const { return ::getComponentScaleX(id, m_chromaFormatIDC); } UInt getComponentScaleY (const ComponentID id) const { return ::getComponentScaleY(id, m_chromaFormatIDC); } #if NH_3D Void addClipPartLuma( Int bitDepth, TComYuv* pcYuvSrc0, TComYuv* pcYuvSrc1, UInt uiTrUnitIdx, UInt uiPartSize ); #if H_3D_ARP Void addARP ( TComYuv* pcYuvSrc0, TComYuv* pcYuvSrc1, UInt uiAbsPartIdx, UInt uiWidth , UInt uiHeight , Bool bClip ); Void addARPLuma ( TComYuv* pcYuvSrc0, TComYuv* pcYuvSrc1, UInt uiAbsPartIdx, UInt uiWidth , UInt uiHeight , Bool bClip ); Void addARPChroma ( TComYuv* pcYuvSrc0, TComYuv* pcYuvSrc1, UInt uiAbsPartIdx, UInt uiWidth , UInt uiHeight , Bool bClip ); Void subtractARP ( TComYuv* pcYuvSrc0, TComYuv* pcYuvSrc1, UInt uiAbsPartIdx, UInt uiWidth , UInt uiHeight ); Void subtractARPLuma ( TComYuv* pcYuvSrc0, TComYuv* pcYuvSrc1, UInt uiAbsPartIdx, UInt uiWidth , UInt uiHeight ); Void subtractARPChroma ( TComYuv* pcYuvSrc0, TComYuv* pcYuvSrc1, UInt uiAbsPartIdx, UInt uiWidth , UInt uiHeight ); Void multiplyARP ( UInt uiAbsPartIdx , UInt uiWidth , UInt uiHeight , UChar dW ); Void multiplyARPLuma ( UInt uiAbsPartIdx , UInt uiWidth , UInt uiHeight , UChar dW ); Void multiplyARPChroma ( UInt uiAbsPartIdx , UInt uiWidth , UInt uiHeight , UChar dW ); private: Void xxMultiplyLine ( Pel * pSrcDst , UInt uiWidth , UChar dW ); #endif #endif };// END CLASS DEFINITION TComYuv //! \} #endif // __TCOMYUV__