1 /* The copyright in this software is being made available under the BSD 2 * License, included below. This software may be subject to other third party 3 * and contributor rights, including patent rights, and no such rights are 4 * granted under this license. 5 * 6 * Copyright (c) 2010-2014, ITU/ISO/IEC 7 * All rights reserved. 8 * 9 * Redistribution and use in source and binary forms, with or without 10 * modification, are permitted provided that the following conditions are met: 11 * 12 * * Redistributions of source code must retain the above copyright notice, 13 * this list of conditions and the following disclaimer. 14 * * Redistributions in binary form must reproduce the above copyright notice, 15 * this list of conditions and the following disclaimer in the documentation 16 * and/or other materials provided with the distribution. 17 * * Neither the name of the ITU/ISO/IEC nor the names of its contributors may 18 * be used to endorse or promote products derived from this software without 19 * specific prior written permission. 20 * 21 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 22 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 24 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS 25 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 26 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 27 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 28 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 29 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 30 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 31 * THE POSSIBILITY OF SUCH DAMAGE. 32 */ 33 34 /** 35 \file TEncSampleAdaptiveOffset.h 36 \brief estimation part of sample adaptive offset class (header) 37 */ 38 39 #ifndef __TENCSAMPLEADAPTIVEOFFSET__ 40 #define __TENCSAMPLEADAPTIVEOFFSET__ 41 42 #include "TLibCommon/TComSampleAdaptiveOffset.h" 43 #include "TLibCommon/TComPic.h" 44 45 #include "TEncEntropy.h" 46 #include "TEncSbac.h" 47 #include "TLibCommon/TComBitCounter.h" 48 49 //! \ingroup TLibEncoder 50 //! \{ 51 52 // ==================================================================================================================== 53 // Class definition 54 // ==================================================================================================================== 55 56 enum SAOCabacStateLablesRDO //CABAC state labels 57 { 58 SAO_CABACSTATE_PIC_INIT =0, 59 SAO_CABACSTATE_BLK_CUR, 60 SAO_CABACSTATE_BLK_NEXT, 61 SAO_CABACSTATE_BLK_MID, 62 SAO_CABACSTATE_BLK_TEMP, 63 NUM_SAO_CABACSTATE_LABELS 64 }; 65 66 struct SAOStatData //data structure for SAO statistics 67 { 68 Int64 diff[MAX_NUM_SAO_CLASSES]; 69 Int64 count[MAX_NUM_SAO_CLASSES]; 70 SAOStatDataSAOStatData71 SAOStatData(){} ~SAOStatDataSAOStatData72 ~SAOStatData(){} resetSAOStatData73 Void reset() 74 { 75 ::memset(diff, 0, sizeof(Int64)*MAX_NUM_SAO_CLASSES); 76 ::memset(count, 0, sizeof(Int64)*MAX_NUM_SAO_CLASSES); 77 } 78 const SAOStatData& operator=(const SAOStatData& src) 79 { 80 ::memcpy(diff, src.diff, sizeof(Int64)*MAX_NUM_SAO_CLASSES); 81 ::memcpy(count, src.count, sizeof(Int64)*MAX_NUM_SAO_CLASSES); 82 return *this; 83 } 84 #if SAO_ENCODE_ALLOW_USE_PREDEBLOCK 85 const SAOStatData& operator+= (const SAOStatData& src) 86 { 87 for(Int i=0; i< MAX_NUM_SAO_CLASSES; i++) 88 { 89 diff[i] += src.diff[i]; 90 count[i] += src.count[i]; 91 } 92 return *this; 93 } 94 #endif 95 }; 96 97 class TEncSampleAdaptiveOffset : public TComSampleAdaptiveOffset 98 { 99 public: 100 TEncSampleAdaptiveOffset(); 101 virtual ~TEncSampleAdaptiveOffset(); 102 103 //interface 104 #if SAO_ENCODE_ALLOW_USE_PREDEBLOCK 105 Void createEncData(Bool isPreDBFSamplesUsed); 106 #else 107 Void createEncData(); 108 #endif 109 Void destroyEncData(); 110 Void initRDOCabacCoder(TEncSbac* pcRDGoOnSbacCoder, TComSlice* pcSlice) ; 111 Void SAOProcess(TComPic* pPic, Bool* sliceEnabled, const Double *lambdas 112 #if SAO_ENCODE_ALLOW_USE_PREDEBLOCK 113 , Bool isPreDBFSamplesUsed 114 #endif 115 ); 116 public: //methods 117 #if SAO_ENCODE_ALLOW_USE_PREDEBLOCK 118 Void getPreDBFStatistics(TComPic* pPic); 119 #endif 120 private: //methods 121 Void getStatistics(SAOStatData*** blkStats, TComPicYuv* orgYuv, TComPicYuv* srcYuv,TComPic* pPic 122 #if SAO_ENCODE_ALLOW_USE_PREDEBLOCK 123 , Bool isCalculatePreDeblockSamples = false 124 #endif 125 ); 126 Void decidePicParams(Bool* sliceEnabled, Int picTempLayer); 127 Void decideBlkParams(TComPic* pic, Bool* sliceEnabled, SAOStatData*** blkStats, TComPicYuv* srcYuv, TComPicYuv* resYuv, SAOBlkParam* reconParams, SAOBlkParam* codedParams); 128 Void getBlkStats(ComponentID compIdx, SAOStatData* statsDataTypes, Pel* srcBlk, Pel* orgBlk, Int srcStride, Int orgStride, Int width, Int height, Bool isLeftAvail, Bool isRightAvail, Bool isAboveAvail, Bool isBelowAvail, Bool isAboveLeftAvail, Bool isAboveRightAvail, Bool isBelowLeftAvail, Bool isBelowRightAvail 129 #if SAO_ENCODE_ALLOW_USE_PREDEBLOCK 130 , Bool isCalculatePreDeblockSamples 131 #endif 132 ); 133 Void deriveModeNewRDO(Int ctuRsAddr, SAOBlkParam* mergeList[NUM_SAO_MERGE_TYPES], Bool* sliceEnabled, SAOStatData*** blkStats, SAOBlkParam& modeParam, Double& modeNormCost, TEncSbac** cabacCoderRDO, Int inCabacLabel); 134 Void deriveModeMergeRDO(Int ctuRsAddr, SAOBlkParam* mergeList[NUM_SAO_MERGE_TYPES], Bool* sliceEnabled, SAOStatData*** blkStats, SAOBlkParam& modeParam, Double& modeNormCost, TEncSbac** cabacCoderRDO, Int inCabacLabel); 135 Int64 getDistortion(ComponentID compIdx, Int typeIdc, Int typeAuxInfo, Int* offsetVal, SAOStatData& statData); 136 Void deriveOffsets(ComponentID compIdx, Int typeIdc, SAOStatData& statData, Int* quantOffsets, Int& typeAuxInfo); 137 inline Int64 estSaoDist(Int64 count, Int64 offset, Int64 diffSum, Int shift); 138 inline Int estIterOffset(Int typeIdx, Int classIdx, Double lambda, Int offsetInput, Int64 count, Int64 diffSum, Int shift, Int bitIncrease, Int64& bestDist, Double& bestCost, Int offsetTh ); 139 #if SAO_ENCODE_ALLOW_USE_PREDEBLOCK 140 Void addPreDBFStatistics(SAOStatData*** blkStats); 141 #endif 142 private: //members 143 //for RDO 144 TEncSbac** m_pppcRDSbacCoder; 145 TEncSbac* m_pcRDGoOnSbacCoder; 146 #if FAST_BIT_EST 147 TEncBinCABACCounter** m_pppcBinCoderCABAC; 148 #else 149 TEncBinCABAC** m_pppcBinCoderCABAC; 150 #endif 151 Double m_lambda[MAX_NUM_COMPONENT]; 152 153 //statistics 154 SAOStatData*** m_statData; //[ctu][comp][classes] 155 #if SAO_ENCODE_ALLOW_USE_PREDEBLOCK 156 SAOStatData*** m_preDBFstatData; 157 #endif 158 #if SAO_ENCODING_CHOICE 159 Double m_saoDisabledRate[MAX_NUM_COMPONENT][MAX_TLAYER]; 160 #endif 161 Int m_skipLinesR[MAX_NUM_COMPONENT][NUM_SAO_NEW_TYPES]; 162 Int m_skipLinesB[MAX_NUM_COMPONENT][NUM_SAO_NEW_TYPES]; 163 }; 164 165 166 //! \} 167 168 #endif 169