/* 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-2012, 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 TEncSlice.h \brief slice encoder class (header) */ #ifndef __TENCSLICE__ #define __TENCSLICE__ // Include files #include "TLibCommon/CommonDef.h" #include "TLibCommon/TComList.h" #include "TLibCommon/TComPic.h" #include "TLibCommon/TComPicYuv.h" #include "TEncCu.h" #include "WeightPredAnalysis.h" //! \ingroup TLibEncoder //! \{ class TEncTop; class TEncGOP; // ==================================================================================================================== // Class definition // ==================================================================================================================== /// slice encoder class class TEncSlice : public WeightPredAnalysis { private: // encoder configuration TEncCfg* m_pcCfg; ///< encoder configuration class // pictures TComList* m_pcListPic; ///< list of pictures TComPicYuv* m_apcPicYuvPred; ///< prediction picture buffer TComPicYuv* m_apcPicYuvResi; ///< residual picture buffer // processing units TEncGOP* m_pcGOPEncoder; ///< GOP encoder TEncCu* m_pcCuEncoder; ///< CU encoder // encoder search TEncSearch* m_pcPredSearch; ///< encoder search class // coding tools TEncEntropy* m_pcEntropyCoder; ///< entropy encoder TEncCavlc* m_pcCavlcCoder; ///< CAVLC encoder TEncSbac* m_pcSbacCoder; ///< SBAC encoder TEncBinCABAC* m_pcBinCABAC; ///< Bin encoder CABAC TComTrQuant* m_pcTrQuant; ///< transform & quantization // RD optimization TComBitCounter* m_pcBitCounter; ///< bit counter TComRdCost* m_pcRdCost; ///< RD cost computation TEncSbac*** m_pppcRDSbacCoder; ///< storage for SBAC-based RD optimization TEncSbac* m_pcRDGoOnSbacCoder; ///< go-on SBAC encoder UInt64 m_uiPicTotalBits; ///< total bits for the picture UInt64 m_uiPicDist; ///< total distortion for the picture Double m_dPicRdCost; ///< picture-level RD cost Double* m_pdRdPicLambda; ///< array of lambda candidates Double* m_pdRdPicQp; ///< array of picture QP candidates (double-type for lambda) Int* m_piRdPicQp; ///< array of picture QP candidates (int-type) TEncBinCABAC* m_pcBufferBinCoderCABACs; ///< line of bin coder CABAC TEncSbac* m_pcBufferSbacCoders; ///< line to store temporary contexts TEncBinCABAC* m_pcBufferLowLatBinCoderCABACs; ///< dependent tiles: line of bin coder CABAC TEncSbac* m_pcBufferLowLatSbacCoders; ///< dependent tiles: line to store temporary contexts UInt m_uiSliceIdx; #if MERL_VSP_C0152 // Data temporarily stored, will be sent to TComSlice level where the data will be actually used TComPic* m_pPicBaseTxt; TComPic* m_pPicBaseDepth; Int* m_aiShiftLUT; Int m_iShiftPrec; #endif public: TEncSlice(); virtual ~TEncSlice(); Void create ( Int iWidth, Int iHeight, UInt iMaxCUWidth, UInt iMaxCUHeight, UChar uhTotalDepth ); Void destroy (); Void init ( TEncTop* pcEncTop ); /// preparation of slice encoding (reference marking, QP and lambda) #if VIDYO_VPS_INTEGRATION|QC_MVHEVC_B0046 #if MTK_DEPTH_MERGE_TEXTURE_CANDIDATE_C0137 Void initEncSlice ( TComPic* pcPic, Int iPOCLast, UInt uiPOCCurr, Int iNumPicRcvd, Int iGOPid, TComSlice*& rpcSlice, TComVPS* pVPS, TComSPS* pSPS, TComPPS *pPPS, bool isDepth ); #else Void initEncSlice ( TComPic* pcPic, Int iPOCLast, UInt uiPOCCurr, Int iNumPicRcvd, Int iGOPid, TComSlice*& rpcSlice, TComVPS* pVPS, TComSPS* pSPS, TComPPS *pPPS ); #endif #else Void initEncSlice ( TComPic* pcPic, Int iPOCLast, UInt uiPOCCurr, Int iNumPicRcvd, Int iGOPid, TComSlice*& rpcSlice, TComSPS* pSPS, TComPPS *pPPS ); #endif // compress and encode slice Void precompressSlice ( TComPic*& rpcPic ); ///< precompress slice for multi-loop opt. Void compressSlice ( TComPic*& rpcPic ); ///< analysis stage of slice Void encodeSlice ( TComPic*& rpcPic, TComOutputBitstream* rpcBitstream, TComOutputBitstream* pcSubstreams ); // misc. functions Void setSearchRange ( TComSlice* pcSlice ); ///< set ME range adaptively UInt64 getTotalBits () { return m_uiPicTotalBits; } TEncCu* getCUEncoder() { return m_pcCuEncoder; } ///< CU encoder Void xDetermineStartAndBoundingCUAddr ( UInt& uiStartCUAddr, UInt& uiBoundingCUAddr, TComPic*& rpcPic, Bool bEncodeSlice ); UInt getSliceIdx() { return m_uiSliceIdx; } Void setSliceIdx(UInt i) { m_uiSliceIdx = i; } #if MERL_VSP_C0152 Void setBWVSPLUTParam ( Int *pShiftLUT, Int iLoG2LUTPrec ) { m_aiShiftLUT = pShiftLUT; m_iShiftPrec = 2-iLoG2LUTPrec; } Void setRefPicBaseTxt ( TComPic*pPicTxt ) { m_pPicBaseTxt = pPicTxt; } Void setRefPicBaseDepth ( TComPic*pPicDepth ) { m_pPicBaseDepth = pPicDepth;} Void getBWVSPLUTParam ( Int*& pShiftLUT, Int& iShiftPrec ) { pShiftLUT = m_aiShiftLUT; iShiftPrec = m_iShiftPrec; } TComPic* getRefPicBaseTxt () { return m_pPicBaseTxt; } TComPic* getRefPicBaseDepth () { return m_pPicBaseDepth; } #endif }; //! \} #endif // __TENCSLICE__