source: SHVCSoftware/branches/SHM-dev/source/Lib/TLibCommon/TComTrQuant.h @ 1165

Last change on this file since 1165 was 1029, checked in by seregin, 10 years ago

merge with SHM-upgrade branch

  • Property svn:eol-style set to native
File size: 15.8 KB
Line 
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/** \file     TComTrQuant.h
35    \brief    transform and quantization class (header)
36*/
37
38#ifndef __TCOMTRQUANT__
39#define __TCOMTRQUANT__
40
41#include "CommonDef.h"
42#include "TComYuv.h"
43#include "TComDataCU.h"
44#include "TComChromaFormat.h"
45#include "ContextTables.h"
46
47//! \ingroup TLibCommon
48//! \{
49
50// ====================================================================================================================
51// Constants
52// ====================================================================================================================
53
54#define QP_BITS                 15
55
56// ====================================================================================================================
57// Type definition
58// ====================================================================================================================
59
60typedef struct
61{
62  Int significantCoeffGroupBits[NUM_SIG_CG_FLAG_CTX][2 /*Flag = [0|1]*/];
63  Int significantBits[NUM_SIG_FLAG_CTX][2 /*Flag = [0|1]*/];
64  Int lastXBits[MAX_NUM_CHANNEL_TYPE][LAST_SIGNIFICANT_GROUPS];
65  Int lastYBits[MAX_NUM_CHANNEL_TYPE][LAST_SIGNIFICANT_GROUPS];
66  Int m_greaterOneBits[NUM_ONE_FLAG_CTX][2 /*Flag = [0|1]*/];
67  Int m_levelAbsBits[NUM_ABS_FLAG_CTX][2 /*Flag = [0|1]*/];
68
69  Int blockCbpBits[NUM_QT_CBF_CTX_SETS * NUM_QT_CBF_CTX_PER_SET][2 /*Flag = [0|1]*/];
70  Int blockRootCbpBits[4][2 /*Flag = [0|1]*/];
71
72  Int golombRiceAdaptationStatistics[RExt__GOLOMB_RICE_ADAPTATION_STATISTICS_SETS];
73} estBitsSbacStruct;
74
75// ====================================================================================================================
76// Class definition
77// ====================================================================================================================
78
79/// QP struct
80struct QpParam
81{
82  Int Qp;
83  Int per;
84  Int rem;
85
86  QpParam(const Int           qpy,
87          const ChannelType   chType,
88          const Int           qpBdOffset,
89          const Int           chromaQPOffset,
90          const ChromaFormat  chFmt );
91
92  QpParam(const TComDataCU   &cu, const ComponentID compID);
93
94}; // END STRUCT DEFINITION QpParam
95
96
97/// transform and quantization class
98class TComTrQuant
99{
100public:
101  TComTrQuant();
102  ~TComTrQuant();
103
104  // initialize class
105  Void init                 ( UInt  uiMaxTrSize,
106                              Bool useRDOQ                = false,
107                              Bool useRDOQTS              = false,
108                              Bool bEnc                   = false,
109                              Bool useTransformSkipFast   = false
110#if ADAPTIVE_QP_SELECTION
111                            , Bool bUseAdaptQpSelect      = false
112#endif
113                              );
114
115  // transform & inverse transform functions
116  Void transformNxN(       TComTU         & rTu,
117                     const ComponentID      compID,
118                           Pel           *  pcResidual,
119                     const UInt             uiStride,
120                           TCoeff        *  rpcCoeff,
121#if ADAPTIVE_QP_SELECTION
122                           TCoeff        * rpcArlCoeff,
123#endif
124                           TCoeff         & uiAbsSum,
125                     const QpParam        & cQP
126                    );
127
128
129  Void invTransformNxN(      TComTU       & rTu,
130                       const ComponentID    compID,
131                             Pel         *pcResidual,
132                       const UInt           uiStride,
133                             TCoeff      *  pcCoeff,
134                       const QpParam      & cQP
135                             DEBUG_STRING_FN_DECLAREP(psDebug));
136
137  Void invRecurTransformNxN ( const ComponentID compID, TComYuv *pResidual, TComTU &rTu );
138
139  Void rdpcmNxN   ( TComTU& rTu, const ComponentID compID, Pel* pcResidual, const UInt uiStride, const QpParam& cQP, TCoeff* pcCoeff, TCoeff &uiAbsSum, RDPCMMode& rdpcmMode );
140  Void invRdpcmNxN( TComTU& rTu, const ComponentID compID, Pel* pcResidual, const UInt uiStride );
141
142  Void applyForwardRDPCM( TComTU& rTu, const ComponentID compID, Pel* pcResidual, const UInt uiStride, const QpParam& cQP, TCoeff* pcCoeff, TCoeff &uiAbsSum, const RDPCMMode mode );
143
144  // Misc functions
145
146#if RDOQ_CHROMA_LAMBDA
147  Void setLambdas(const Double lambdas[MAX_NUM_COMPONENT]) { for (UInt component = 0; component < MAX_NUM_COMPONENT; component++) m_lambdas[component] = lambdas[component]; }
148  Void selectLambda(const ComponentID compIdx) { m_dLambda = m_lambdas[compIdx]; }
149#else
150  Void setLambda(Double dLambda) { m_dLambda = dLambda;}
151#endif
152  Void setRDOQOffset( UInt uiRDOQOffset ) { m_uiRDOQOffset = uiRDOQOffset; }
153
154  estBitsSbacStruct* m_pcEstBitsSbac;
155
156  static Int      calcPatternSigCtx( const UInt* sigCoeffGroupFlag, UInt uiCGPosX, UInt uiCGPosY, UInt widthInGroups, UInt heightInGroups );
157
158  static Int      getSigCtxInc     ( Int                              patternSigCtx,
159                                     const TUEntropyCodingParameters &codingParameters,
160                                     const Int                        scanPosition,
161                                     const Int                        log2BlockWidth,
162                                     const Int                        log2BlockHeight,
163                                     const ChannelType                chanType
164                                    );
165
166  static UInt getSigCoeffGroupCtxInc  (const UInt*  uiSigCoeffGroupFlag,
167                                       const UInt   uiCGPosX,
168                                       const UInt   uiCGPosY,
169                                       const UInt   widthInGroups,
170                                       const UInt   heightInGroups);
171
172  Void initScalingList                      ();
173  Void destroyScalingList                   ();
174  Void setErrScaleCoeff    ( UInt list, UInt size, Int qp );
175  Double* getErrScaleCoeff              ( UInt list, UInt size, Int qp ) { return m_errScale             [size][list][qp]; };  //!< get Error Scale Coefficent
176  Double& getErrScaleCoeffNoScalingList ( UInt list, UInt size, Int qp ) { return m_errScaleNoScalingList[size][list][qp]; };  //!< get Error Scale Coefficent
177  Int* getQuantCoeff                    ( UInt list, Int qp, UInt size ) { return m_quantCoef            [size][list][qp]; };  //!< get Quant Coefficent
178  Int* getDequantCoeff                  ( UInt list, Int qp, UInt size ) { return m_dequantCoef          [size][list][qp]; };  //!< get DeQuant Coefficent
179  Void setUseScalingList   ( Bool bUseScalingList){ m_scalingListEnabledFlag = bUseScalingList; };
180  Bool getUseScalingList   (const UInt width, const UInt height, const Bool isTransformSkip){ return m_scalingListEnabledFlag && (!isTransformSkip || ((width == 4) && (height == 4))); };
181  Void setFlatScalingList  (const ChromaFormat format);
182  Void xsetFlatScalingList ( UInt list, UInt size, Int qp, const ChromaFormat format);
183  Void xSetScalingListEnc  ( TComScalingList *scalingList, UInt list, UInt size, Int qp, const ChromaFormat format);
184  Void xSetScalingListDec  ( TComScalingList *scalingList, UInt list, UInt size, Int qp, const ChromaFormat format);
185  Void setScalingList      ( TComScalingList *scalingList, const ChromaFormat format);
186  Void setScalingListDec   ( TComScalingList *scalingList, const ChromaFormat format);
187  Void processScalingListEnc( Int *coeff, Int *quantcoeff, Int quantScales, UInt height, UInt width, UInt ratio, Int sizuNum, UInt dc);
188  Void processScalingListDec( Int *coeff, Int *dequantcoeff, Int invQuantScales, UInt height, UInt width, UInt ratio, Int sizuNum, UInt dc);
189#if ADAPTIVE_QP_SELECTION
190  Void    initSliceQpDelta() ;
191  Void    storeSliceQpNext(TComSlice* pcSlice);
192  Void    clearSliceARLCnt();
193  Int     getQpDelta(Int qp) { return m_qpDelta[qp]; }
194  Int*    getSliceNSamples(){ return m_sliceNsamples ;}
195  Double* getSliceSumC()    { return m_sliceSumC; }
196#endif
197  Void transformSkipQuantOneSample(TComTU &rTu, const ComponentID compID, const Pel resiDiff, TCoeff* pcCoeff, const UInt uiPos, const QpParam &cQP, const Bool bUseHalfRoundingPoint);
198  Void invTrSkipDeQuantOneSample(TComTU &rTu, ComponentID compID, TCoeff pcCoeff, Pel &reconSample, const QpParam &cQP, UInt uiPos );
199
200protected:
201#if ADAPTIVE_QP_SELECTION
202  Int     m_qpDelta[MAX_QP+1];
203  Int     m_sliceNsamples[LEVEL_RANGE+1];
204  Double  m_sliceSumC[LEVEL_RANGE+1] ;
205#endif
206  TCoeff* m_plTempCoeff;
207
208//  QpParam  m_cQP; - removed - placed on the stack.
209#if RDOQ_CHROMA_LAMBDA
210  Double   m_lambdas[MAX_NUM_COMPONENT];
211#endif
212  Double   m_dLambda;
213  UInt     m_uiRDOQOffset;
214  UInt     m_uiMaxTrSize;
215  Bool     m_bEnc;
216  Bool     m_useRDOQ;
217  Bool     m_useRDOQTS;
218#if ADAPTIVE_QP_SELECTION
219  Bool     m_bUseAdaptQpSelect;
220#endif
221  Bool     m_useTransformSkipFast;
222
223  Bool     m_scalingListEnabledFlag;
224
225  Int      *m_quantCoef            [SCALING_LIST_SIZE_NUM][SCALING_LIST_NUM][SCALING_LIST_REM_NUM]; ///< array of quantization matrix coefficient 4x4
226  Int      *m_dequantCoef          [SCALING_LIST_SIZE_NUM][SCALING_LIST_NUM][SCALING_LIST_REM_NUM]; ///< array of dequantization matrix coefficient 4x4
227  Double   *m_errScale             [SCALING_LIST_SIZE_NUM][SCALING_LIST_NUM][SCALING_LIST_REM_NUM]; ///< array of quantization matrix coefficient 4x4
228  Double    m_errScaleNoScalingList[SCALING_LIST_SIZE_NUM][SCALING_LIST_NUM][SCALING_LIST_REM_NUM]; ///< array of quantization matrix coefficient 4x4
229
230private:
231  // forward Transform
232  Void xT   ( const ComponentID compID, Bool useDST, Pel* piBlkResi, UInt uiStride, TCoeff* psCoeff, Int iWidth, Int iHeight );
233
234  // skipping Transform
235  Void xTransformSkip ( Pel* piBlkResi, UInt uiStride, TCoeff* psCoeff, TComTU &rTu, const ComponentID component );
236
237  Void signBitHidingHDQ( const ComponentID compID, TCoeff* pQCoef, TCoeff* pCoef, TCoeff* deltaU, const TUEntropyCodingParameters &codingParameters );
238
239  // quantization
240  Void xQuant(       TComTU       &rTu,
241                     TCoeff      * pSrc,
242                     TCoeff      * pDes,
243#if ADAPTIVE_QP_SELECTION
244                     TCoeff      *pArlDes,
245#endif
246                     TCoeff       &uiAbsSum,
247               const ComponentID   compID,
248               const QpParam      &cQP );
249
250  // RDOQ functions
251
252  Void           xRateDistOptQuant (       TComTU       &rTu,
253                                           TCoeff      * plSrcCoeff,
254                                           TCoeff      * piDstCoeff,
255#if ADAPTIVE_QP_SELECTION
256                                           TCoeff      *piArlDstCoeff,
257#endif
258                                           TCoeff       &uiAbsSum,
259                                     const ComponentID   compID,
260                                     const QpParam      &cQP );
261
262__inline UInt              xGetCodedLevel  ( Double&          rd64CodedCost,
263                                             Double&          rd64CodedCost0,
264                                             Double&          rd64CodedCostSig,
265                                             Intermediate_Int lLevelDouble,
266                                             UInt             uiMaxAbsLevel,
267                                             UShort           ui16CtxNumSig,
268                                             UShort           ui16CtxNumOne,
269                                             UShort           ui16CtxNumAbs,
270                                             UShort           ui16AbsGoRice,
271                                             UInt             c1Idx,
272                                             UInt             c2Idx,
273                                             Int              iQBits,
274                                             Double           errorScale,
275                                             Bool             bLast,
276                                             Bool             useLimitedPrefixLength,
277                                             ChannelType      channelType
278                                             ) const;
279
280
281  __inline Int xGetICRate  ( UInt   uiAbsLevel,
282                             UShort ui16CtxNumOne,
283                             UShort ui16CtxNumAbs,
284                             UShort ui16AbsGoRice,
285                             UInt   c1Idx,
286                             UInt   c2Idx,
287                             Bool   useLimitedPrefixLength,
288                             ChannelType channelType
289                           ) const;
290
291  __inline Double xGetRateLast         ( const UInt uiPosX, const UInt uiPosY, const ComponentID component ) const;
292  __inline Double xGetRateSigCoeffGroup( UShort uiSignificanceCoeffGroup, UShort ui16CtxNumSig             ) const;
293  __inline Double xGetRateSigCoef      ( UShort uiSignificance,           UShort ui16CtxNumSig             ) const;
294  __inline Double xGetICost            ( Double dRate                                                      ) const;
295  __inline Double xGetIEPRate          (                                                                   ) const;
296
297
298  // dequantization
299  Void xDeQuant(       TComTU       &rTu,
300                 const TCoeff      * pSrc,
301                       TCoeff      * pDes,
302                 const ComponentID   compID,
303                 const QpParam      &cQP );
304
305  // inverse transform
306  Void xIT    ( const ComponentID compID, Bool useDST, TCoeff* plCoef, Pel* pResidual, UInt uiStride, Int iWidth, Int iHeight );
307
308  // inverse skipping transform
309  Void xITransformSkip ( TCoeff* plCoef, Pel* pResidual, UInt uiStride, TComTU &rTu, const ComponentID component );
310
311public:
312  static Void crossComponentPrediction(      TComTU      &rTu,
313                                       const ComponentID  compID,
314                                       const Pel         *piResiL,
315                                       const Pel         *piResiC,
316                                             Pel         *piResiT,
317                                       const Int          width,
318                                       const Int          height,
319                                       const Int          strideL,
320                                       const Int          strideC,
321                                       const Int          strideT,
322                                       const Bool         reverse);
323
324};// END CLASS DEFINITION TComTrQuant
325
326//! \}
327
328#endif // __TCOMTRQUANT__
Note: See TracBrowser for help on using the repository browser.