source: SHVCSoftware/trunk/source/Lib/TLibDecoder/TDecSbac.cpp @ 546

Last change on this file since 546 was 540, checked in by seregin, 11 years ago

merge SHM-4.1-dev branch

  • Property svn:eol-style set to native
File size: 53.1 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-2013, 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     TDecSbac.cpp
35    \brief    Context-adaptive entropy decoder class
36*/
37
38#include "TDecSbac.h"
39
40//! \ingroup TLibDecoder
41//! \{
42
43//////////////////////////////////////////////////////////////////////
44// Construction/Destruction
45//////////////////////////////////////////////////////////////////////
46
47TDecSbac::TDecSbac() 
48// new structure here
49: m_pcBitstream               ( 0 )
50, m_pcTDecBinIf               ( NULL )
51, m_numContextModels          ( 0 )
52, m_cCUSplitFlagSCModel       ( 1,             1,               NUM_SPLIT_FLAG_CTX            , m_contextModels + m_numContextModels, m_numContextModels )
53, m_cCUSkipFlagSCModel        ( 1,             1,               NUM_SKIP_FLAG_CTX             , m_contextModels + m_numContextModels, m_numContextModels)
54, m_cCUMergeFlagExtSCModel    ( 1,             1,               NUM_MERGE_FLAG_EXT_CTX        , m_contextModels + m_numContextModels, m_numContextModels)
55, m_cCUMergeIdxExtSCModel     ( 1,             1,               NUM_MERGE_IDX_EXT_CTX         , m_contextModels + m_numContextModels, m_numContextModels)
56, m_cCUPartSizeSCModel        ( 1,             1,               NUM_PART_SIZE_CTX             , m_contextModels + m_numContextModels, m_numContextModels)
57, m_cCUPredModeSCModel        ( 1,             1,               NUM_PRED_MODE_CTX             , m_contextModels + m_numContextModels, m_numContextModels)
58, m_cCUIntraPredSCModel       ( 1,             1,               NUM_ADI_CTX                   , m_contextModels + m_numContextModels, m_numContextModels)
59, m_cCUChromaPredSCModel      ( 1,             1,               NUM_CHROMA_PRED_CTX           , m_contextModels + m_numContextModels, m_numContextModels)
60, m_cCUDeltaQpSCModel         ( 1,             1,               NUM_DELTA_QP_CTX              , m_contextModels + m_numContextModels, m_numContextModels)
61, m_cCUInterDirSCModel        ( 1,             1,               NUM_INTER_DIR_CTX             , m_contextModels + m_numContextModels, m_numContextModels)
62, m_cCURefPicSCModel          ( 1,             1,               NUM_REF_NO_CTX                , m_contextModels + m_numContextModels, m_numContextModels)
63, m_cCUMvdSCModel             ( 1,             1,               NUM_MV_RES_CTX                , m_contextModels + m_numContextModels, m_numContextModels)
64, m_cCUQtCbfSCModel           ( 1,             2,               NUM_QT_CBF_CTX                , m_contextModels + m_numContextModels, m_numContextModels)
65, m_cCUTransSubdivFlagSCModel ( 1,             1,               NUM_TRANS_SUBDIV_FLAG_CTX     , m_contextModels + m_numContextModels, m_numContextModels)
66, m_cCUQtRootCbfSCModel       ( 1,             1,               NUM_QT_ROOT_CBF_CTX           , m_contextModels + m_numContextModels, m_numContextModels)
67, m_cCUSigCoeffGroupSCModel   ( 1,             2,               NUM_SIG_CG_FLAG_CTX           , m_contextModels + m_numContextModels, m_numContextModels)
68, m_cCUSigSCModel             ( 1,             1,               NUM_SIG_FLAG_CTX              , m_contextModels + m_numContextModels, m_numContextModels)
69, m_cCuCtxLastX               ( 1,             2,               NUM_CTX_LAST_FLAG_XY          , m_contextModels + m_numContextModels, m_numContextModels)
70, m_cCuCtxLastY               ( 1,             2,               NUM_CTX_LAST_FLAG_XY          , m_contextModels + m_numContextModels, m_numContextModels)
71, m_cCUOneSCModel             ( 1,             1,               NUM_ONE_FLAG_CTX              , m_contextModels + m_numContextModels, m_numContextModels)
72, m_cCUAbsSCModel             ( 1,             1,               NUM_ABS_FLAG_CTX              , m_contextModels + m_numContextModels, m_numContextModels)
73, m_cMVPIdxSCModel            ( 1,             1,               NUM_MVP_IDX_CTX               , m_contextModels + m_numContextModels, m_numContextModels)
74, m_cCUAMPSCModel             ( 1,             1,               NUM_CU_AMP_CTX                , m_contextModels + m_numContextModels, m_numContextModels)
75, m_cSaoMergeSCModel      ( 1,             1,               NUM_SAO_MERGE_FLAG_CTX   , m_contextModels + m_numContextModels, m_numContextModels)
76, m_cSaoTypeIdxSCModel        ( 1,             1,               NUM_SAO_TYPE_IDX_CTX          , m_contextModels + m_numContextModels, m_numContextModels)
77, m_cTransformSkipSCModel     ( 1,             2,               NUM_TRANSFORMSKIP_FLAG_CTX    , m_contextModels + m_numContextModels, m_numContextModels)
78, m_CUTransquantBypassFlagSCModel( 1,          1,               NUM_CU_TRANSQUANT_BYPASS_FLAG_CTX, m_contextModels + m_numContextModels, m_numContextModels)
79{
80  assert( m_numContextModels <= MAX_NUM_CTX_MOD );
81}
82
83TDecSbac::~TDecSbac()
84{
85}
86
87// ====================================================================================================================
88// Public member functions
89// ====================================================================================================================
90
91Void TDecSbac::resetEntropy(TComSlice* pSlice)
92{
93  SliceType sliceType  = pSlice->getSliceType();
94  Int       qp         = pSlice->getSliceQp();
95
96  if (pSlice->getPPS()->getCabacInitPresentFlag() && pSlice->getCabacInitFlag())
97  {
98    switch (sliceType)
99    {
100    case P_SLICE:           // change initialization table to B_SLICE initialization
101      sliceType = B_SLICE; 
102      break;
103    case B_SLICE:           // change initialization table to P_SLICE initialization
104      sliceType = P_SLICE; 
105      break;
106    default     :           // should not occur
107      assert(0);
108    }
109  }
110
111  m_cCUSplitFlagSCModel.initBuffer       ( sliceType, qp, (UChar*)INIT_SPLIT_FLAG );
112  m_cCUSkipFlagSCModel.initBuffer        ( sliceType, qp, (UChar*)INIT_SKIP_FLAG );
113  m_cCUMergeFlagExtSCModel.initBuffer    ( sliceType, qp, (UChar*)INIT_MERGE_FLAG_EXT );
114  m_cCUMergeIdxExtSCModel.initBuffer     ( sliceType, qp, (UChar*)INIT_MERGE_IDX_EXT );
115  m_cCUPartSizeSCModel.initBuffer        ( sliceType, qp, (UChar*)INIT_PART_SIZE );
116  m_cCUAMPSCModel.initBuffer             ( sliceType, qp, (UChar*)INIT_CU_AMP_POS );
117  m_cCUPredModeSCModel.initBuffer        ( sliceType, qp, (UChar*)INIT_PRED_MODE );
118  m_cCUIntraPredSCModel.initBuffer       ( sliceType, qp, (UChar*)INIT_INTRA_PRED_MODE );
119  m_cCUChromaPredSCModel.initBuffer      ( sliceType, qp, (UChar*)INIT_CHROMA_PRED_MODE );
120  m_cCUInterDirSCModel.initBuffer        ( sliceType, qp, (UChar*)INIT_INTER_DIR );
121  m_cCUMvdSCModel.initBuffer             ( sliceType, qp, (UChar*)INIT_MVD );
122  m_cCURefPicSCModel.initBuffer          ( sliceType, qp, (UChar*)INIT_REF_PIC );
123  m_cCUDeltaQpSCModel.initBuffer         ( sliceType, qp, (UChar*)INIT_DQP );
124  m_cCUQtCbfSCModel.initBuffer           ( sliceType, qp, (UChar*)INIT_QT_CBF );
125  m_cCUQtRootCbfSCModel.initBuffer       ( sliceType, qp, (UChar*)INIT_QT_ROOT_CBF );
126  m_cCUSigCoeffGroupSCModel.initBuffer   ( sliceType, qp, (UChar*)INIT_SIG_CG_FLAG );
127  m_cCUSigSCModel.initBuffer             ( sliceType, qp, (UChar*)INIT_SIG_FLAG );
128  m_cCuCtxLastX.initBuffer               ( sliceType, qp, (UChar*)INIT_LAST );
129  m_cCuCtxLastY.initBuffer               ( sliceType, qp, (UChar*)INIT_LAST );
130  m_cCUOneSCModel.initBuffer             ( sliceType, qp, (UChar*)INIT_ONE_FLAG );
131  m_cCUAbsSCModel.initBuffer             ( sliceType, qp, (UChar*)INIT_ABS_FLAG );
132  m_cMVPIdxSCModel.initBuffer            ( sliceType, qp, (UChar*)INIT_MVP_IDX );
133  m_cSaoMergeSCModel.initBuffer      ( sliceType, qp, (UChar*)INIT_SAO_MERGE_FLAG );
134  m_cSaoTypeIdxSCModel.initBuffer        ( sliceType, qp, (UChar*)INIT_SAO_TYPE_IDX );
135
136  m_cCUTransSubdivFlagSCModel.initBuffer ( sliceType, qp, (UChar*)INIT_TRANS_SUBDIV_FLAG );
137  m_cTransformSkipSCModel.initBuffer     ( sliceType, qp, (UChar*)INIT_TRANSFORMSKIP_FLAG );
138  m_CUTransquantBypassFlagSCModel.initBuffer( sliceType, qp, (UChar*)INIT_CU_TRANSQUANT_BYPASS_FLAG );
139  m_uiLastDQpNonZero  = 0;
140 
141  // new structure
142  m_uiLastQp          = qp;
143 
144  m_pcTDecBinIf->start();
145}
146
147/** The function does the following: Read out terminate bit. Flush CABAC. Byte-align for next tile.
148 *  Intialize CABAC states. Start CABAC.
149 */
150Void TDecSbac::updateContextTables( SliceType eSliceType, Int iQp )
151{
152  UInt uiBit;
153  m_pcTDecBinIf->decodeBinTrm(uiBit);
154  assert(uiBit); // end_of_sub_stream_one_bit must be equal to 1
155  m_pcTDecBinIf->finish(); 
156  m_pcBitstream->readOutTrailingBits();
157  m_cCUSplitFlagSCModel.initBuffer       ( eSliceType, iQp, (UChar*)INIT_SPLIT_FLAG );
158  m_cCUSkipFlagSCModel.initBuffer        ( eSliceType, iQp, (UChar*)INIT_SKIP_FLAG );
159  m_cCUMergeFlagExtSCModel.initBuffer    ( eSliceType, iQp, (UChar*)INIT_MERGE_FLAG_EXT );
160  m_cCUMergeIdxExtSCModel.initBuffer     ( eSliceType, iQp, (UChar*)INIT_MERGE_IDX_EXT );
161  m_cCUPartSizeSCModel.initBuffer        ( eSliceType, iQp, (UChar*)INIT_PART_SIZE );
162  m_cCUAMPSCModel.initBuffer             ( eSliceType, iQp, (UChar*)INIT_CU_AMP_POS );
163  m_cCUPredModeSCModel.initBuffer        ( eSliceType, iQp, (UChar*)INIT_PRED_MODE );
164  m_cCUIntraPredSCModel.initBuffer       ( eSliceType, iQp, (UChar*)INIT_INTRA_PRED_MODE );
165  m_cCUChromaPredSCModel.initBuffer      ( eSliceType, iQp, (UChar*)INIT_CHROMA_PRED_MODE );
166  m_cCUInterDirSCModel.initBuffer        ( eSliceType, iQp, (UChar*)INIT_INTER_DIR );
167  m_cCUMvdSCModel.initBuffer             ( eSliceType, iQp, (UChar*)INIT_MVD );
168  m_cCURefPicSCModel.initBuffer          ( eSliceType, iQp, (UChar*)INIT_REF_PIC );
169  m_cCUDeltaQpSCModel.initBuffer         ( eSliceType, iQp, (UChar*)INIT_DQP );
170  m_cCUQtCbfSCModel.initBuffer           ( eSliceType, iQp, (UChar*)INIT_QT_CBF );
171  m_cCUQtRootCbfSCModel.initBuffer       ( eSliceType, iQp, (UChar*)INIT_QT_ROOT_CBF );
172  m_cCUSigCoeffGroupSCModel.initBuffer   ( eSliceType, iQp, (UChar*)INIT_SIG_CG_FLAG );
173  m_cCUSigSCModel.initBuffer             ( eSliceType, iQp, (UChar*)INIT_SIG_FLAG );
174  m_cCuCtxLastX.initBuffer               ( eSliceType, iQp, (UChar*)INIT_LAST );
175  m_cCuCtxLastY.initBuffer               ( eSliceType, iQp, (UChar*)INIT_LAST );
176  m_cCUOneSCModel.initBuffer             ( eSliceType, iQp, (UChar*)INIT_ONE_FLAG );
177  m_cCUAbsSCModel.initBuffer             ( eSliceType, iQp, (UChar*)INIT_ABS_FLAG );
178  m_cMVPIdxSCModel.initBuffer            ( eSliceType, iQp, (UChar*)INIT_MVP_IDX );
179  m_cSaoMergeSCModel.initBuffer      ( eSliceType, iQp, (UChar*)INIT_SAO_MERGE_FLAG );
180  m_cSaoTypeIdxSCModel.initBuffer        ( eSliceType, iQp, (UChar*)INIT_SAO_TYPE_IDX );
181  m_cCUTransSubdivFlagSCModel.initBuffer ( eSliceType, iQp, (UChar*)INIT_TRANS_SUBDIV_FLAG );
182  m_cTransformSkipSCModel.initBuffer     ( eSliceType, iQp, (UChar*)INIT_TRANSFORMSKIP_FLAG );
183  m_CUTransquantBypassFlagSCModel.initBuffer( eSliceType, iQp, (UChar*)INIT_CU_TRANSQUANT_BYPASS_FLAG );
184  m_pcTDecBinIf->start();
185}
186
187Void TDecSbac::parseTerminatingBit( UInt& ruiBit )
188{
189  m_pcTDecBinIf->decodeBinTrm( ruiBit );
190  if ( ruiBit )
191  {
192    m_pcTDecBinIf->finish();
193  }
194}
195
196
197Void TDecSbac::xReadUnaryMaxSymbol( UInt& ruiSymbol, ContextModel* pcSCModel, Int iOffset, UInt uiMaxSymbol )
198{
199  if (uiMaxSymbol == 0)
200  {
201    ruiSymbol = 0;
202    return;
203  }
204 
205  m_pcTDecBinIf->decodeBin( ruiSymbol, pcSCModel[0] );
206 
207  if( ruiSymbol == 0 || uiMaxSymbol == 1 )
208  {
209    return;
210  }
211 
212  UInt uiSymbol = 0;
213  UInt uiCont;
214 
215  do
216  {
217    m_pcTDecBinIf->decodeBin( uiCont, pcSCModel[ iOffset ] );
218    uiSymbol++;
219  }
220  while( uiCont && ( uiSymbol < uiMaxSymbol - 1 ) );
221 
222  if( uiCont && ( uiSymbol == uiMaxSymbol - 1 ) )
223  {
224    uiSymbol++;
225  }
226 
227  ruiSymbol = uiSymbol;
228}
229
230Void TDecSbac::xReadEpExGolomb( UInt& ruiSymbol, UInt uiCount )
231{
232  UInt uiSymbol = 0;
233  UInt uiBit = 1;
234 
235  while( uiBit )
236  {
237    m_pcTDecBinIf->decodeBinEP( uiBit );
238    uiSymbol += uiBit << uiCount++;
239  }
240 
241  if ( --uiCount )
242  {
243    UInt bins;
244    m_pcTDecBinIf->decodeBinsEP( bins, uiCount );
245    uiSymbol += bins;
246  }
247 
248  ruiSymbol = uiSymbol;
249}
250
251Void TDecSbac::xReadUnarySymbol( UInt& ruiSymbol, ContextModel* pcSCModel, Int iOffset )
252{
253  m_pcTDecBinIf->decodeBin( ruiSymbol, pcSCModel[0] );
254 
255  if( !ruiSymbol )
256  {
257    return;
258  }
259 
260  UInt uiSymbol = 0;
261  UInt uiCont;
262 
263  do
264  {
265    m_pcTDecBinIf->decodeBin( uiCont, pcSCModel[ iOffset ] );
266    uiSymbol++;
267  }
268  while( uiCont );
269 
270  ruiSymbol = uiSymbol;
271}
272
273
274/** Parsing of coeff_abs_level_remaing
275 * \param ruiSymbol reference to coeff_abs_level_remaing
276 * \param ruiParam reference to parameter
277 * \returns Void
278 */
279Void TDecSbac::xReadCoefRemainExGolomb ( UInt &rSymbol, UInt &rParam )
280{
281
282  UInt prefix   = 0;
283  UInt codeWord = 0;
284  do
285  {
286    prefix++;
287    m_pcTDecBinIf->decodeBinEP( codeWord );
288  }
289  while( codeWord);
290  codeWord  = 1 - codeWord;
291  prefix -= codeWord;
292  codeWord=0;
293  if (prefix < COEF_REMAIN_BIN_REDUCTION )
294  {
295    m_pcTDecBinIf->decodeBinsEP(codeWord,rParam);
296    rSymbol = (prefix<<rParam) + codeWord;
297  }
298  else
299  {
300    m_pcTDecBinIf->decodeBinsEP(codeWord,prefix-COEF_REMAIN_BIN_REDUCTION+rParam);
301    rSymbol = (((1<<(prefix-COEF_REMAIN_BIN_REDUCTION))+COEF_REMAIN_BIN_REDUCTION-1)<<rParam)+codeWord;
302  }
303}
304
305/** Parse I_PCM information.
306 * \param pcCU
307 * \param uiAbsPartIdx
308 * \param uiDepth
309 * \returns Void
310 *
311 * If I_PCM flag indicates that the CU is I_PCM, parse its PCM alignment bits and codes.
312 */
313Void TDecSbac::parseIPCMInfo ( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth )
314{
315  UInt uiSymbol;
316
317    m_pcTDecBinIf->decodeBinTrm(uiSymbol);
318
319    if (uiSymbol)
320    {
321    Bool bIpcmFlag = true;
322
323    pcCU->setPartSizeSubParts  ( SIZE_2Nx2N, uiAbsPartIdx, uiDepth );
324    pcCU->setSizeSubParts      ( g_uiMaxCUWidth>>uiDepth, g_uiMaxCUHeight>>uiDepth, uiAbsPartIdx, uiDepth );
325    pcCU->setTrIdxSubParts     ( 0, uiAbsPartIdx, uiDepth );
326    pcCU->setIPCMFlagSubParts  ( bIpcmFlag, uiAbsPartIdx, uiDepth );
327
328    UInt uiMinCoeffSize = pcCU->getPic()->getMinCUWidth()*pcCU->getPic()->getMinCUHeight();
329    UInt uiLumaOffset   = uiMinCoeffSize*uiAbsPartIdx;
330    UInt uiChromaOffset = uiLumaOffset>>2;
331
332    Pel* piPCMSample;
333    UInt uiWidth;
334    UInt uiHeight;
335    UInt uiSampleBits;
336    UInt uiX, uiY;
337
338    piPCMSample = pcCU->getPCMSampleY() + uiLumaOffset;
339    uiWidth = pcCU->getWidth(uiAbsPartIdx);
340    uiHeight = pcCU->getHeight(uiAbsPartIdx);
341    uiSampleBits = pcCU->getSlice()->getSPS()->getPCMBitDepthLuma();
342
343    for(uiY = 0; uiY < uiHeight; uiY++)
344    {
345      for(uiX = 0; uiX < uiWidth; uiX++)
346      {
347        UInt uiSample;
348        m_pcTDecBinIf->xReadPCMCode(uiSampleBits, uiSample);
349        piPCMSample[uiX] = uiSample;
350      }
351      piPCMSample += uiWidth;
352    }
353
354    piPCMSample = pcCU->getPCMSampleCb() + uiChromaOffset;
355    uiWidth = pcCU->getWidth(uiAbsPartIdx)/2;
356    uiHeight = pcCU->getHeight(uiAbsPartIdx)/2;
357    uiSampleBits = pcCU->getSlice()->getSPS()->getPCMBitDepthChroma();
358#if AUXILIARY_PICTURES
359    ChromaFormat format = pcCU->getSlice()->getChromaFormatIdc();
360    UInt uiGrayVal = 1 << (uiSampleBits - 1);
361#endif
362
363    for(uiY = 0; uiY < uiHeight; uiY++)
364    {
365      for(uiX = 0; uiX < uiWidth; uiX++)
366      {
367        UInt uiSample;
368#if AUXILIARY_PICTURES
369        if (format == CHROMA_400)
370        {
371          uiSample = uiGrayVal;
372        }
373        else
374#endif
375        m_pcTDecBinIf->xReadPCMCode(uiSampleBits, uiSample);
376        piPCMSample[uiX] = uiSample;
377      }
378      piPCMSample += uiWidth;
379    }
380
381    piPCMSample = pcCU->getPCMSampleCr() + uiChromaOffset;
382    uiWidth = pcCU->getWidth(uiAbsPartIdx)/2;
383    uiHeight = pcCU->getHeight(uiAbsPartIdx)/2;
384    uiSampleBits = pcCU->getSlice()->getSPS()->getPCMBitDepthChroma();
385
386    for(uiY = 0; uiY < uiHeight; uiY++)
387    {
388      for(uiX = 0; uiX < uiWidth; uiX++)
389      {
390        UInt uiSample;
391#if AUXILIARY_PICTURES
392        if (format == CHROMA_400)
393        {
394          uiSample = uiGrayVal;
395        }
396        else
397#endif
398        m_pcTDecBinIf->xReadPCMCode(uiSampleBits, uiSample);
399        piPCMSample[uiX] = uiSample;
400      }
401      piPCMSample += uiWidth;
402    }
403
404    m_pcTDecBinIf->start();
405  }
406}
407
408Void TDecSbac::parseCUTransquantBypassFlag( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth )
409{
410  UInt uiSymbol;
411  m_pcTDecBinIf->decodeBin( uiSymbol, m_CUTransquantBypassFlagSCModel.get( 0, 0, 0 ) );
412  pcCU->setCUTransquantBypassSubParts(uiSymbol ? true : false, uiAbsPartIdx, uiDepth);
413}
414
415/** parse skip flag
416 * \param pcCU
417 * \param uiAbsPartIdx
418 * \param uiDepth
419 * \returns Void
420 */
421Void TDecSbac::parseSkipFlag( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth )
422{
423  if( pcCU->getSlice()->isIntra() )
424  {
425    return;
426  }
427 
428  UInt uiSymbol = 0;
429  UInt uiCtxSkip = pcCU->getCtxSkipFlag( uiAbsPartIdx );
430  m_pcTDecBinIf->decodeBin( uiSymbol, m_cCUSkipFlagSCModel.get( 0, 0, uiCtxSkip ) );
431  DTRACE_CABAC_VL( g_nSymbolCounter++ );
432  DTRACE_CABAC_T( "\tSkipFlag" );
433  DTRACE_CABAC_T( "\tuiCtxSkip: ");
434  DTRACE_CABAC_V( uiCtxSkip );
435  DTRACE_CABAC_T( "\tuiSymbol: ");
436  DTRACE_CABAC_V( uiSymbol );
437  DTRACE_CABAC_T( "\n");
438 
439  if( uiSymbol )
440  {
441    pcCU->setSkipFlagSubParts( true,        uiAbsPartIdx, uiDepth );
442    pcCU->setPredModeSubParts( MODE_INTER,  uiAbsPartIdx, uiDepth );
443    pcCU->setPartSizeSubParts( SIZE_2Nx2N, uiAbsPartIdx, uiDepth );
444    pcCU->setSizeSubParts( g_uiMaxCUWidth>>uiDepth, g_uiMaxCUHeight>>uiDepth, uiAbsPartIdx, uiDepth );
445    pcCU->setMergeFlagSubParts( true , uiAbsPartIdx, 0, uiDepth );
446  }
447}
448
449/** parse merge flag
450 * \param pcCU
451 * \param uiAbsPartIdx
452 * \param uiDepth
453 * \param uiPUIdx
454 * \returns Void
455 */
456Void TDecSbac::parseMergeFlag ( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth, UInt uiPUIdx )
457{
458  UInt uiSymbol;
459  m_pcTDecBinIf->decodeBin( uiSymbol, *m_cCUMergeFlagExtSCModel.get( 0 ) );
460  pcCU->setMergeFlagSubParts( uiSymbol ? true : false, uiAbsPartIdx, uiPUIdx, uiDepth );
461
462  DTRACE_CABAC_VL( g_nSymbolCounter++ );
463  DTRACE_CABAC_T( "\tMergeFlag: " );
464  DTRACE_CABAC_V( uiSymbol );
465  DTRACE_CABAC_T( "\tAddress: " );
466  DTRACE_CABAC_V( pcCU->getAddr() );
467  DTRACE_CABAC_T( "\tuiAbsPartIdx: " );
468  DTRACE_CABAC_V( uiAbsPartIdx );
469  DTRACE_CABAC_T( "\n" );
470}
471
472Void TDecSbac::parseMergeIndex ( TComDataCU* pcCU, UInt& ruiMergeIndex )
473{
474  UInt uiUnaryIdx = 0;
475  UInt uiNumCand = pcCU->getSlice()->getMaxNumMergeCand();
476  if ( uiNumCand > 1 )
477  {
478    for( ; uiUnaryIdx < uiNumCand - 1; ++uiUnaryIdx )
479    {
480      UInt uiSymbol = 0;
481      if ( uiUnaryIdx==0 )
482      {
483        m_pcTDecBinIf->decodeBin( uiSymbol, m_cCUMergeIdxExtSCModel.get( 0, 0, 0 ) );
484      }
485      else
486      {
487        m_pcTDecBinIf->decodeBinEP( uiSymbol );
488      }
489      if( uiSymbol == 0 )
490      {
491        break;
492      }
493    }
494  }
495  ruiMergeIndex = uiUnaryIdx;
496
497  DTRACE_CABAC_VL( g_nSymbolCounter++ )
498  DTRACE_CABAC_T( "\tparseMergeIndex()" )
499  DTRACE_CABAC_T( "\tuiMRGIdx= " )
500  DTRACE_CABAC_V( ruiMergeIndex )
501  DTRACE_CABAC_T( "\n" )
502}
503
504Void TDecSbac::parseMVPIdx      ( Int& riMVPIdx )
505{
506  UInt uiSymbol;
507  xReadUnaryMaxSymbol(uiSymbol, m_cMVPIdxSCModel.get(0), 1, AMVP_MAX_NUM_CANDS-1);
508  riMVPIdx = uiSymbol;
509}
510
511Void TDecSbac::parseSplitFlag     ( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth )
512{
513  if( uiDepth == g_uiMaxCUDepth - g_uiAddCUDepth )
514  {
515    pcCU->setDepthSubParts( uiDepth, uiAbsPartIdx );
516    return;
517  }
518 
519  UInt uiSymbol;
520  m_pcTDecBinIf->decodeBin( uiSymbol, m_cCUSplitFlagSCModel.get( 0, 0, pcCU->getCtxSplitFlag( uiAbsPartIdx, uiDepth ) ) );
521  DTRACE_CABAC_VL( g_nSymbolCounter++ )
522  DTRACE_CABAC_T( "\tSplitFlag\n" )
523  pcCU->setDepthSubParts( uiDepth + uiSymbol, uiAbsPartIdx );
524 
525  return;
526}
527
528/** parse partition size
529 * \param pcCU
530 * \param uiAbsPartIdx
531 * \param uiDepth
532 * \returns Void
533 */
534Void TDecSbac::parsePartSize( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth )
535{
536  UInt uiSymbol, uiMode = 0;
537  PartSize eMode;
538
539  if ( pcCU->isIntra( uiAbsPartIdx ) )
540  {
541    uiSymbol = 1;
542    if( uiDepth == g_uiMaxCUDepth - g_uiAddCUDepth )
543    {
544      m_pcTDecBinIf->decodeBin( uiSymbol, m_cCUPartSizeSCModel.get( 0, 0, 0) );
545    }
546    eMode = uiSymbol ? SIZE_2Nx2N : SIZE_NxN;
547    UInt uiTrLevel = 0;   
548    UInt uiWidthInBit  = g_aucConvertToBit[pcCU->getWidth(uiAbsPartIdx)]+2;
549    UInt uiTrSizeInBit = g_aucConvertToBit[pcCU->getSlice()->getSPS()->getMaxTrSize()]+2;
550    uiTrLevel          = uiWidthInBit >= uiTrSizeInBit ? uiWidthInBit - uiTrSizeInBit : 0;
551    if( eMode == SIZE_NxN )
552    {
553      pcCU->setTrIdxSubParts( 1+uiTrLevel, uiAbsPartIdx, uiDepth );
554    }
555    else
556    {
557      pcCU->setTrIdxSubParts( uiTrLevel, uiAbsPartIdx, uiDepth );
558    }
559  }
560  else
561  {
562    UInt uiMaxNumBits = 2;
563    if( uiDepth == g_uiMaxCUDepth - g_uiAddCUDepth && !( (g_uiMaxCUWidth>>uiDepth) == 8 && (g_uiMaxCUHeight>>uiDepth) == 8 ) )
564    {
565      uiMaxNumBits ++;
566    }
567    for ( UInt ui = 0; ui < uiMaxNumBits; ui++ )
568    {
569      m_pcTDecBinIf->decodeBin( uiSymbol, m_cCUPartSizeSCModel.get( 0, 0, ui) );
570      if ( uiSymbol )
571      {
572        break;
573      }
574      uiMode++;
575    }
576    eMode = (PartSize) uiMode;
577    if ( pcCU->getSlice()->getSPS()->getAMPAcc( uiDepth ) )
578    {
579      if (eMode == SIZE_2NxN)
580      {
581        m_pcTDecBinIf->decodeBin(uiSymbol, m_cCUAMPSCModel.get( 0, 0, 0 ));
582        if (uiSymbol == 0)
583        {
584          m_pcTDecBinIf->decodeBinEP(uiSymbol);
585          eMode = (uiSymbol == 0? SIZE_2NxnU : SIZE_2NxnD);
586        }
587      }
588      else if (eMode == SIZE_Nx2N)
589      {
590        m_pcTDecBinIf->decodeBin(uiSymbol, m_cCUAMPSCModel.get( 0, 0, 0 ));
591        if (uiSymbol == 0)
592        {
593          m_pcTDecBinIf->decodeBinEP(uiSymbol);
594          eMode = (uiSymbol == 0? SIZE_nLx2N : SIZE_nRx2N);
595        }
596      }
597    }
598  }
599  pcCU->setPartSizeSubParts( eMode, uiAbsPartIdx, uiDepth );
600  pcCU->setSizeSubParts( g_uiMaxCUWidth>>uiDepth, g_uiMaxCUHeight>>uiDepth, uiAbsPartIdx, uiDepth );
601}
602
603/** parse prediction mode
604 * \param pcCU
605 * \param uiAbsPartIdx
606 * \param uiDepth
607 * \returns Void
608 */
609Void TDecSbac::parsePredMode( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth )
610{
611  if( pcCU->getSlice()->isIntra() )
612  {
613    pcCU->setPredModeSubParts( MODE_INTRA, uiAbsPartIdx, uiDepth );
614    return;
615  }
616 
617  UInt uiSymbol;
618  Int  iPredMode = MODE_INTER;
619  m_pcTDecBinIf->decodeBin( uiSymbol, m_cCUPredModeSCModel.get( 0, 0, 0 ) );
620  iPredMode += uiSymbol;
621  pcCU->setPredModeSubParts( (PredMode)iPredMode, uiAbsPartIdx, uiDepth );
622}
623
624Void TDecSbac::parseIntraDirLumaAng  ( TComDataCU* pcCU, UInt absPartIdx, UInt depth )
625{
626  PartSize mode = pcCU->getPartitionSize( absPartIdx );
627  UInt partNum = mode==SIZE_NxN?4:1;
628  UInt partOffset = ( pcCU->getPic()->getNumPartInCU() >> ( pcCU->getDepth(absPartIdx) << 1 ) ) >> 2;
629  UInt mpmPred[4],symbol;
630  Int j,intraPredMode;   
631  if (mode==SIZE_NxN)
632  {
633    depth++;
634  }
635  for (j=0;j<partNum;j++)
636  {
637    m_pcTDecBinIf->decodeBin( symbol, m_cCUIntraPredSCModel.get( 0, 0, 0) );
638    mpmPred[j] = symbol;
639  }
640  for (j=0;j<partNum;j++)
641  {
642    Int preds[3] = {-1, -1, -1};
643    Int predNum = pcCU->getIntraDirLumaPredictor(absPartIdx+partOffset*j, preds); 
644    if (mpmPred[j])
645    {
646      m_pcTDecBinIf->decodeBinEP( symbol );
647      if (symbol)
648      {
649        m_pcTDecBinIf->decodeBinEP( symbol );
650        symbol++;
651      }
652      intraPredMode = preds[symbol];
653    }
654    else
655    {
656      m_pcTDecBinIf->decodeBinsEP( symbol, 5 );
657      intraPredMode = symbol;
658       
659      //postponed sorting of MPMs (only in remaining branch)
660      if (preds[0] > preds[1])
661      { 
662        std::swap(preds[0], preds[1]); 
663      }
664      if (preds[0] > preds[2])
665      {
666        std::swap(preds[0], preds[2]);
667      }
668      if (preds[1] > preds[2])
669      {
670        std::swap(preds[1], preds[2]);
671      }
672      for ( Int i = 0; i < predNum; i++ )
673      {
674        intraPredMode += ( intraPredMode >= preds[i] );
675      }
676    }
677    pcCU->setLumaIntraDirSubParts( (UChar)intraPredMode, absPartIdx+partOffset*j, depth );
678  }
679}
680
681Void TDecSbac::parseIntraDirChroma( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth )
682{
683  UInt uiSymbol;
684
685#if AUXILIARY_PICTURES
686  if ( pcCU->getSlice()->getChromaFormatIdc() == CHROMA_400 )
687  {
688    uiSymbol = DC_IDX;
689  }
690  else
691  {
692#endif
693  m_pcTDecBinIf->decodeBin( uiSymbol, m_cCUChromaPredSCModel.get( 0, 0, 0 ) );
694
695  if( uiSymbol == 0 )
696  {
697    uiSymbol = DM_CHROMA_IDX;
698  } 
699  else 
700  {
701    {
702      UInt uiIPredMode;
703      m_pcTDecBinIf->decodeBinsEP( uiIPredMode, 2 );
704      UInt uiAllowedChromaDir[ NUM_CHROMA_MODE ];
705      pcCU->getAllowedChromaDir( uiAbsPartIdx, uiAllowedChromaDir );
706      uiSymbol = uiAllowedChromaDir[ uiIPredMode ];
707    }
708  }
709#if AUXILIARY_PICTURES
710  }
711#endif
712  pcCU->setChromIntraDirSubParts( uiSymbol, uiAbsPartIdx, uiDepth );
713  return;
714}
715
716Void TDecSbac::parseInterDir( TComDataCU* pcCU, UInt& ruiInterDir, UInt uiAbsPartIdx )
717{
718  UInt uiSymbol;
719  const UInt uiCtx = pcCU->getCtxInterDir( uiAbsPartIdx );
720  ContextModel *pCtx = m_cCUInterDirSCModel.get( 0 );
721  uiSymbol = 0;
722  if (pcCU->getPartitionSize(uiAbsPartIdx) == SIZE_2Nx2N || pcCU->getHeight(uiAbsPartIdx) != 8 )
723  {
724    m_pcTDecBinIf->decodeBin( uiSymbol, *( pCtx + uiCtx ) );
725  }
726
727  if( uiSymbol )
728  {
729    uiSymbol = 2;
730  }
731  else
732  {
733    m_pcTDecBinIf->decodeBin( uiSymbol, *( pCtx + 4 ) );
734    assert(uiSymbol == 0 || uiSymbol == 1);
735  }
736
737  uiSymbol++;
738  ruiInterDir = uiSymbol;
739  return;
740}
741
742Void TDecSbac::parseRefFrmIdx( TComDataCU* pcCU, Int& riRefFrmIdx, RefPicList eRefList )
743{
744  UInt uiSymbol;
745  {
746    ContextModel *pCtx = m_cCURefPicSCModel.get( 0 );
747    m_pcTDecBinIf->decodeBin( uiSymbol, *pCtx );
748
749    if( uiSymbol )
750    {
751      UInt uiRefNum = pcCU->getSlice()->getNumRefIdx( eRefList ) - 2;
752      pCtx++;
753      UInt ui;
754      for( ui = 0; ui < uiRefNum; ++ui )
755      {
756        if( ui == 0 )
757        {
758          m_pcTDecBinIf->decodeBin( uiSymbol, *pCtx );
759        }
760        else
761        {
762          m_pcTDecBinIf->decodeBinEP( uiSymbol );
763        }
764        if( uiSymbol == 0 )
765        {
766          break;
767        }
768      }
769      uiSymbol = ui + 1;
770    }
771    riRefFrmIdx = uiSymbol;
772  }
773
774  return;
775}
776
777Void TDecSbac::parseMvd( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiPartIdx, UInt uiDepth, RefPicList eRefList )
778{
779  UInt uiSymbol;
780  UInt uiHorAbs;
781  UInt uiVerAbs;
782  UInt uiHorSign = 0;
783  UInt uiVerSign = 0;
784  ContextModel *pCtx = m_cCUMvdSCModel.get( 0 );
785
786  if(pcCU->getSlice()->getMvdL1ZeroFlag() && eRefList == REF_PIC_LIST_1 && pcCU->getInterDir(uiAbsPartIdx)==3)
787  {
788    uiHorAbs=0;
789    uiVerAbs=0;
790  }
791  else
792  {
793    m_pcTDecBinIf->decodeBin( uiHorAbs, *pCtx );
794    m_pcTDecBinIf->decodeBin( uiVerAbs, *pCtx );
795
796    const Bool bHorAbsGr0 = uiHorAbs != 0;
797    const Bool bVerAbsGr0 = uiVerAbs != 0;
798    pCtx++;
799
800    if( bHorAbsGr0 )
801    {
802      m_pcTDecBinIf->decodeBin( uiSymbol, *pCtx );
803      uiHorAbs += uiSymbol;
804    }
805
806    if( bVerAbsGr0 )
807    {
808      m_pcTDecBinIf->decodeBin( uiSymbol, *pCtx );
809      uiVerAbs += uiSymbol;
810    }
811
812    if( bHorAbsGr0 )
813    {
814      if( 2 == uiHorAbs )
815      {
816        xReadEpExGolomb( uiSymbol, 1 );
817        uiHorAbs += uiSymbol;
818      }
819
820      m_pcTDecBinIf->decodeBinEP( uiHorSign );
821    }
822
823    if( bVerAbsGr0 )
824    {
825      if( 2 == uiVerAbs )
826      {
827        xReadEpExGolomb( uiSymbol, 1 );
828        uiVerAbs += uiSymbol;
829      }
830
831      m_pcTDecBinIf->decodeBinEP( uiVerSign );
832    }
833
834  }
835
836  const TComMv cMv( uiHorSign ? -Int( uiHorAbs ): uiHorAbs, uiVerSign ? -Int( uiVerAbs ) : uiVerAbs );
837  pcCU->getCUMvField( eRefList )->setAllMvd( cMv, pcCU->getPartitionSize( uiAbsPartIdx ), uiAbsPartIdx, uiDepth, uiPartIdx );
838  return;
839}
840
841
842Void TDecSbac::parseTransformSubdivFlag( UInt& ruiSubdivFlag, UInt uiLog2TransformBlockSize )
843{
844  m_pcTDecBinIf->decodeBin( ruiSubdivFlag, m_cCUTransSubdivFlagSCModel.get( 0, 0, uiLog2TransformBlockSize ) );
845  DTRACE_CABAC_VL( g_nSymbolCounter++ )
846  DTRACE_CABAC_T( "\tparseTransformSubdivFlag()" )
847  DTRACE_CABAC_T( "\tsymbol=" )
848  DTRACE_CABAC_V( ruiSubdivFlag )
849  DTRACE_CABAC_T( "\tctx=" )
850  DTRACE_CABAC_V( uiLog2TransformBlockSize )
851  DTRACE_CABAC_T( "\n" )
852}
853
854Void TDecSbac::parseQtRootCbf( UInt uiAbsPartIdx, UInt& uiQtRootCbf )
855{
856  UInt uiSymbol;
857  const UInt uiCtx = 0;
858  m_pcTDecBinIf->decodeBin( uiSymbol , m_cCUQtRootCbfSCModel.get( 0, 0, uiCtx ) );
859  DTRACE_CABAC_VL( g_nSymbolCounter++ )
860  DTRACE_CABAC_T( "\tparseQtRootCbf()" )
861  DTRACE_CABAC_T( "\tsymbol=" )
862  DTRACE_CABAC_V( uiSymbol )
863  DTRACE_CABAC_T( "\tctx=" )
864  DTRACE_CABAC_V( uiCtx )
865  DTRACE_CABAC_T( "\tuiAbsPartIdx=" )
866  DTRACE_CABAC_V( uiAbsPartIdx )
867  DTRACE_CABAC_T( "\n" )
868 
869  uiQtRootCbf = uiSymbol;
870}
871
872Void TDecSbac::parseDeltaQP( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth )
873{
874  Int qp;
875  UInt uiDQp;
876  Int  iDQp;
877 
878  UInt uiSymbol;
879
880  xReadUnaryMaxSymbol (uiDQp,  &m_cCUDeltaQpSCModel.get( 0, 0, 0 ), 1, CU_DQP_TU_CMAX);
881
882  if( uiDQp >= CU_DQP_TU_CMAX)
883  {
884    xReadEpExGolomb( uiSymbol, CU_DQP_EG_k );
885    uiDQp+=uiSymbol;
886  }
887
888  if ( uiDQp > 0 )
889  {
890    UInt uiSign;
891#if REPN_FORMAT_IN_VPS
892    Int qpBdOffsetY = pcCU->getSlice()->getQpBDOffsetY();
893#else
894    Int qpBdOffsetY = pcCU->getSlice()->getSPS()->getQpBDOffsetY();
895#endif
896    m_pcTDecBinIf->decodeBinEP(uiSign);
897    iDQp = uiDQp;
898    if(uiSign)
899    {
900      iDQp = -iDQp;
901    }
902    qp = (((Int) pcCU->getRefQP( uiAbsPartIdx ) + iDQp + 52 + 2*qpBdOffsetY )%(52+qpBdOffsetY)) - qpBdOffsetY;
903  }
904  else 
905  {
906    qp = pcCU->getRefQP(uiAbsPartIdx);
907  }
908  pcCU->setQPSubParts(qp, uiAbsPartIdx, uiDepth); 
909  pcCU->setCodedQP(qp);
910}
911
912Void TDecSbac::parseQtCbf( TComDataCU* pcCU, UInt uiAbsPartIdx, TextType eType, UInt uiTrDepth, UInt uiDepth )
913{
914  UInt uiSymbol;
915  const UInt uiCtx = pcCU->getCtxQtCbf( eType, uiTrDepth );
916#if AUXILIARY_PICTURES
917  if (pcCU->getSlice()->getChromaFormatIdc() == CHROMA_400 && (eType == TEXT_CHROMA_U || eType == TEXT_CHROMA_V))
918  {
919    uiSymbol = 0;
920  }
921  else
922  {
923#endif
924  m_pcTDecBinIf->decodeBin( uiSymbol , m_cCUQtCbfSCModel.get( 0, eType ? TEXT_CHROMA: eType, uiCtx ) );
925#if AUXILIARY_PICTURES
926  }
927#endif
928 
929  DTRACE_CABAC_VL( g_nSymbolCounter++ )
930  DTRACE_CABAC_T( "\tparseQtCbf()" )
931  DTRACE_CABAC_T( "\tsymbol=" )
932  DTRACE_CABAC_V( uiSymbol )
933  DTRACE_CABAC_T( "\tctx=" )
934  DTRACE_CABAC_V( uiCtx )
935  DTRACE_CABAC_T( "\tetype=" )
936  DTRACE_CABAC_V( eType )
937  DTRACE_CABAC_T( "\tuiAbsPartIdx=" )
938  DTRACE_CABAC_V( uiAbsPartIdx )
939  DTRACE_CABAC_T( "\n" )
940 
941  pcCU->setCbfSubParts( uiSymbol << uiTrDepth, eType, uiAbsPartIdx, uiDepth );
942}
943
944void TDecSbac::parseTransformSkipFlags (TComDataCU* pcCU, UInt uiAbsPartIdx, UInt width, UInt height, UInt uiDepth, TextType eTType)
945{
946  if (pcCU->getCUTransquantBypass(uiAbsPartIdx))
947  {
948    return;
949  }
950  if(width != 4 || height != 4)
951  {
952    return;
953  }
954 
955  UInt useTransformSkip;
956  m_pcTDecBinIf->decodeBin( useTransformSkip , m_cTransformSkipSCModel.get( 0, eTType? TEXT_CHROMA: TEXT_LUMA, 0 ) );
957  if(eTType!= TEXT_LUMA)
958  {
959    const UInt uiLog2TrafoSize = g_aucConvertToBit[pcCU->getSlice()->getSPS()->getMaxCUWidth()] + 2 - uiDepth;
960    if(uiLog2TrafoSize == 2) 
961    { 
962      uiDepth --;
963    }
964  }
965  DTRACE_CABAC_VL( g_nSymbolCounter++ )
966  DTRACE_CABAC_T("\tparseTransformSkip()");
967  DTRACE_CABAC_T( "\tsymbol=" )
968  DTRACE_CABAC_V( useTransformSkip )
969  DTRACE_CABAC_T( "\tAddr=" )
970  DTRACE_CABAC_V( pcCU->getAddr() )
971  DTRACE_CABAC_T( "\tetype=" )
972  DTRACE_CABAC_V( eTType )
973  DTRACE_CABAC_T( "\tuiAbsPartIdx=" )
974  DTRACE_CABAC_V( uiAbsPartIdx )
975  DTRACE_CABAC_T( "\n" )
976
977  pcCU->setTransformSkipSubParts( useTransformSkip, eTType, uiAbsPartIdx, uiDepth);
978}
979
980/** Parse (X,Y) position of the last significant coefficient
981 * \param uiPosLastX reference to X component of last coefficient
982 * \param uiPosLastY reference to Y component of last coefficient
983 * \param width  Block width
984 * \param height Block height
985 * \param eTType plane type / luminance or chrominance
986 * \param uiScanIdx scan type (zig-zag, hor, ver)
987 *
988 * This method decodes the X and Y component within a block of the last significant coefficient.
989 */
990Void TDecSbac::parseLastSignificantXY( UInt& uiPosLastX, UInt& uiPosLastY, Int width, Int height, TextType eTType, UInt uiScanIdx )
991{
992  UInt uiLast;
993  ContextModel *pCtxX = m_cCuCtxLastX.get( 0, eTType );
994  ContextModel *pCtxY = m_cCuCtxLastY.get( 0, eTType );
995
996  Int blkSizeOffsetX, blkSizeOffsetY, shiftX, shiftY;
997  blkSizeOffsetX = eTType ? 0: (g_aucConvertToBit[ width ] *3 + ((g_aucConvertToBit[ width ] +1)>>2));
998  blkSizeOffsetY = eTType ? 0: (g_aucConvertToBit[ height ]*3 + ((g_aucConvertToBit[ height ]+1)>>2));
999  shiftX= eTType ? g_aucConvertToBit[ width  ] :((g_aucConvertToBit[ width  ]+3)>>2);
1000  shiftY= eTType ? g_aucConvertToBit[ height ] :((g_aucConvertToBit[ height ]+3)>>2);
1001  // posX
1002  for( uiPosLastX = 0; uiPosLastX < g_uiGroupIdx[ width - 1 ]; uiPosLastX++ )
1003  {
1004    m_pcTDecBinIf->decodeBin( uiLast, *( pCtxX + blkSizeOffsetX + (uiPosLastX >>shiftX) ) );
1005    if( !uiLast )
1006    {
1007      break;
1008    }
1009  }
1010
1011  // posY
1012  for( uiPosLastY = 0; uiPosLastY < g_uiGroupIdx[ height - 1 ]; uiPosLastY++ )
1013  {
1014    m_pcTDecBinIf->decodeBin( uiLast, *( pCtxY + blkSizeOffsetY + (uiPosLastY >>shiftY)) );
1015    if( !uiLast )
1016    {
1017      break;
1018    }
1019  }
1020  if ( uiPosLastX > 3 )
1021  {
1022    UInt uiTemp  = 0;
1023    UInt uiCount = ( uiPosLastX - 2 ) >> 1;
1024    for ( Int i = uiCount - 1; i >= 0; i-- )
1025    {
1026      m_pcTDecBinIf->decodeBinEP( uiLast );
1027      uiTemp += uiLast << i;
1028    }
1029    uiPosLastX = g_uiMinInGroup[ uiPosLastX ] + uiTemp;
1030  }
1031  if ( uiPosLastY > 3 )
1032  {
1033    UInt uiTemp  = 0;
1034    UInt uiCount = ( uiPosLastY - 2 ) >> 1;
1035    for ( Int i = uiCount - 1; i >= 0; i-- )
1036    {
1037      m_pcTDecBinIf->decodeBinEP( uiLast );
1038      uiTemp += uiLast << i;
1039    }
1040    uiPosLastY = g_uiMinInGroup[ uiPosLastY ] + uiTemp;
1041  }
1042 
1043  if( uiScanIdx == SCAN_VER )
1044  {
1045    swap( uiPosLastX, uiPosLastY );
1046  }
1047}
1048
1049Void TDecSbac::parseCoeffNxN( TComDataCU* pcCU, TCoeff* pcCoef, UInt uiAbsPartIdx, UInt uiWidth, UInt uiHeight, UInt uiDepth, TextType eTType )
1050{
1051  DTRACE_CABAC_VL( g_nSymbolCounter++ )
1052  DTRACE_CABAC_T( "\tparseCoeffNxN()\teType=" )
1053  DTRACE_CABAC_V( eTType )
1054  DTRACE_CABAC_T( "\twidth=" )
1055  DTRACE_CABAC_V( uiWidth )
1056  DTRACE_CABAC_T( "\theight=" )
1057  DTRACE_CABAC_V( uiHeight )
1058  DTRACE_CABAC_T( "\tdepth=" )
1059  DTRACE_CABAC_V( uiDepth )
1060  DTRACE_CABAC_T( "\tabspartidx=" )
1061  DTRACE_CABAC_V( uiAbsPartIdx )
1062  DTRACE_CABAC_T( "\ttoCU-X=" )
1063  DTRACE_CABAC_V( pcCU->getCUPelX() )
1064  DTRACE_CABAC_T( "\ttoCU-Y=" )
1065  DTRACE_CABAC_V( pcCU->getCUPelY() )
1066  DTRACE_CABAC_T( "\tCU-addr=" )
1067  DTRACE_CABAC_V(  pcCU->getAddr() )
1068  DTRACE_CABAC_T( "\tinCU-X=" )
1069  DTRACE_CABAC_V( g_auiRasterToPelX[ g_auiZscanToRaster[uiAbsPartIdx] ] )
1070  DTRACE_CABAC_T( "\tinCU-Y=" )
1071  DTRACE_CABAC_V( g_auiRasterToPelY[ g_auiZscanToRaster[uiAbsPartIdx] ] )
1072  DTRACE_CABAC_T( "\tpredmode=" )
1073  DTRACE_CABAC_V(  pcCU->getPredictionMode( uiAbsPartIdx ) )
1074  DTRACE_CABAC_T( "\n" )
1075 
1076  if( uiWidth > pcCU->getSlice()->getSPS()->getMaxTrSize() )
1077  {
1078    uiWidth  = pcCU->getSlice()->getSPS()->getMaxTrSize();
1079    uiHeight = pcCU->getSlice()->getSPS()->getMaxTrSize();
1080  }
1081  if(pcCU->getSlice()->getPPS()->getUseTransformSkip())
1082  {
1083    parseTransformSkipFlags( pcCU, uiAbsPartIdx, uiWidth, uiHeight, uiDepth, eTType);
1084  }
1085
1086  eTType = eTType == TEXT_LUMA ? TEXT_LUMA : ( eTType == TEXT_NONE ? TEXT_NONE : TEXT_CHROMA );
1087 
1088  //----- parse significance map -----
1089  const UInt  uiLog2BlockSize   = g_aucConvertToBit[ uiWidth ] + 2;
1090  const UInt  uiMaxNumCoeff     = uiWidth * uiHeight;
1091  const UInt  uiMaxNumCoeffM1   = uiMaxNumCoeff - 1;
1092  UInt uiScanIdx = pcCU->getCoefScanIdx(uiAbsPartIdx, uiWidth, eTType==TEXT_LUMA, pcCU->isIntra(uiAbsPartIdx));
1093 
1094  //===== decode last significant =====
1095  UInt uiPosLastX, uiPosLastY;
1096  parseLastSignificantXY( uiPosLastX, uiPosLastY, uiWidth, uiHeight, eTType, uiScanIdx );
1097  UInt uiBlkPosLast      = uiPosLastX + (uiPosLastY<<uiLog2BlockSize);
1098  pcCoef[ uiBlkPosLast ] = 1;
1099
1100  //===== decode significance flags =====
1101  UInt uiScanPosLast;
1102  const UInt *scan   = g_auiSigLastScan[ uiScanIdx ][ uiLog2BlockSize-1 ];
1103  for( uiScanPosLast = 0; uiScanPosLast < uiMaxNumCoeffM1; uiScanPosLast++ )
1104  {
1105    UInt uiBlkPos = scan[ uiScanPosLast ];
1106    if( uiBlkPosLast == uiBlkPos )
1107    {
1108      break;
1109    }
1110  }
1111
1112  ContextModel * const baseCoeffGroupCtx = m_cCUSigCoeffGroupSCModel.get( 0, eTType );
1113  ContextModel * const baseCtx = (eTType==TEXT_LUMA) ? m_cCUSigSCModel.get( 0, 0 ) : m_cCUSigSCModel.get( 0, 0 ) + NUM_SIG_FLAG_CTX_LUMA;
1114
1115  const Int  iLastScanSet      = uiScanPosLast >> LOG2_SCAN_SET_SIZE;
1116  UInt c1 = 1;
1117  UInt uiGoRiceParam           = 0;
1118
1119  Bool beValid; 
1120  if (pcCU->getCUTransquantBypass(uiAbsPartIdx))
1121  {
1122    beValid = false;
1123  }
1124  else 
1125  {
1126    beValid = pcCU->getSlice()->getPPS()->getSignHideFlag() > 0;
1127  }
1128  UInt absSum = 0;
1129
1130  UInt uiSigCoeffGroupFlag[ MLS_GRP_NUM ];
1131  ::memset( uiSigCoeffGroupFlag, 0, sizeof(UInt) * MLS_GRP_NUM );
1132  const UInt uiNumBlkSide = uiWidth >> (MLS_CG_SIZE >> 1);
1133  const UInt * scanCG;
1134  {
1135    scanCG = g_auiSigLastScan[ uiScanIdx ][ uiLog2BlockSize > 3 ? uiLog2BlockSize-2-1 : 0  ];   
1136    if( uiLog2BlockSize == 3 )
1137    {
1138      scanCG = g_sigLastScan8x8[ uiScanIdx ];
1139    }
1140    else if( uiLog2BlockSize == 5 )
1141    {
1142      scanCG = g_sigLastScanCG32x32;
1143    }
1144  }
1145  Int  iScanPosSig             = (Int) uiScanPosLast;
1146  for( Int iSubSet = iLastScanSet; iSubSet >= 0; iSubSet-- )
1147  {
1148    Int  iSubPos     = iSubSet << LOG2_SCAN_SET_SIZE;
1149    uiGoRiceParam    = 0;
1150    Int numNonZero = 0;
1151   
1152    Int lastNZPosInCG = -1, firstNZPosInCG = SCAN_SET_SIZE;
1153
1154    Int pos[SCAN_SET_SIZE];
1155    if( iScanPosSig == (Int) uiScanPosLast )
1156    {
1157      lastNZPosInCG  = iScanPosSig;
1158      firstNZPosInCG = iScanPosSig;
1159      iScanPosSig--;
1160      pos[ numNonZero ] = uiBlkPosLast;
1161      numNonZero = 1;
1162    }
1163
1164    // decode significant_coeffgroup_flag
1165    Int iCGBlkPos = scanCG[ iSubSet ];
1166    Int iCGPosY   = iCGBlkPos / uiNumBlkSide;
1167    Int iCGPosX   = iCGBlkPos - (iCGPosY * uiNumBlkSide);
1168    if( iSubSet == iLastScanSet || iSubSet == 0)
1169    {
1170      uiSigCoeffGroupFlag[ iCGBlkPos ] = 1;
1171    }
1172    else
1173    {
1174      UInt uiSigCoeffGroup;
1175      UInt uiCtxSig  = TComTrQuant::getSigCoeffGroupCtxInc( uiSigCoeffGroupFlag, iCGPosX, iCGPosY, uiWidth, uiHeight );
1176      m_pcTDecBinIf->decodeBin( uiSigCoeffGroup, baseCoeffGroupCtx[ uiCtxSig ] );
1177      uiSigCoeffGroupFlag[ iCGBlkPos ] = uiSigCoeffGroup;
1178    }
1179
1180    // decode significant_coeff_flag
1181    Int patternSigCtx = TComTrQuant::calcPatternSigCtx( uiSigCoeffGroupFlag, iCGPosX, iCGPosY, uiWidth, uiHeight );
1182    UInt uiBlkPos, uiPosY, uiPosX, uiSig, uiCtxSig;
1183    for( ; iScanPosSig >= iSubPos; iScanPosSig-- )
1184    {
1185      uiBlkPos  = scan[ iScanPosSig ];
1186      uiPosY    = uiBlkPos >> uiLog2BlockSize;
1187      uiPosX    = uiBlkPos - ( uiPosY << uiLog2BlockSize );
1188      uiSig     = 0;
1189     
1190      if( uiSigCoeffGroupFlag[ iCGBlkPos ] )
1191      {
1192        if( iScanPosSig > iSubPos || iSubSet == 0  || numNonZero )
1193        {
1194          uiCtxSig  = TComTrQuant::getSigCtxInc( patternSigCtx, uiScanIdx, uiPosX, uiPosY, uiLog2BlockSize, eTType );
1195          m_pcTDecBinIf->decodeBin( uiSig, baseCtx[ uiCtxSig ] );
1196        }
1197        else
1198        {
1199          uiSig = 1;
1200        }
1201      }
1202      pcCoef[ uiBlkPos ] = uiSig;
1203      if( uiSig )
1204      {
1205        pos[ numNonZero ] = uiBlkPos;
1206        numNonZero ++;
1207        if( lastNZPosInCG == -1 )
1208        {
1209          lastNZPosInCG = iScanPosSig;
1210        }
1211        firstNZPosInCG = iScanPosSig;
1212      }
1213    }
1214   
1215    if( numNonZero )
1216    {
1217      Bool signHidden = ( lastNZPosInCG - firstNZPosInCG >= SBH_THRESHOLD );
1218      absSum = 0;
1219      UInt uiCtxSet    = (iSubSet > 0 && eTType==TEXT_LUMA) ? 2 : 0;
1220      UInt uiBin;
1221      if( c1 == 0 )
1222      {
1223        uiCtxSet++;
1224      }
1225      c1 = 1;
1226      ContextModel *baseCtxMod = ( eTType==TEXT_LUMA ) ? m_cCUOneSCModel.get( 0, 0 ) + 4 * uiCtxSet : m_cCUOneSCModel.get( 0, 0 ) + NUM_ONE_FLAG_CTX_LUMA + 4 * uiCtxSet;
1227      Int absCoeff[SCAN_SET_SIZE];
1228
1229      for ( Int i = 0; i < numNonZero; i++) absCoeff[i] = 1;   
1230      Int numC1Flag = min(numNonZero, C1FLAG_NUMBER);
1231      Int firstC2FlagIdx = -1;
1232
1233      for( Int idx = 0; idx < numC1Flag; idx++ )
1234      {
1235        m_pcTDecBinIf->decodeBin( uiBin, baseCtxMod[c1] );
1236        if( uiBin == 1 )
1237        {
1238          c1 = 0;
1239          if (firstC2FlagIdx == -1)
1240          {
1241            firstC2FlagIdx = idx;
1242          }
1243        }
1244        else if( (c1 < 3) && (c1 > 0) )
1245        {
1246          c1++;
1247        }
1248        absCoeff[ idx ] = uiBin + 1;
1249      }
1250     
1251      if (c1 == 0)
1252      {
1253        baseCtxMod = ( eTType==TEXT_LUMA ) ? m_cCUAbsSCModel.get( 0, 0 ) + uiCtxSet : m_cCUAbsSCModel.get( 0, 0 ) + NUM_ABS_FLAG_CTX_LUMA + uiCtxSet;
1254        if ( firstC2FlagIdx != -1)
1255        {
1256          m_pcTDecBinIf->decodeBin( uiBin, baseCtxMod[0] ); 
1257          absCoeff[ firstC2FlagIdx ] = uiBin + 2;
1258        }
1259      }
1260
1261      UInt coeffSigns;
1262      if ( signHidden && beValid )
1263      {
1264        m_pcTDecBinIf->decodeBinsEP( coeffSigns, numNonZero-1 );
1265        coeffSigns <<= 32 - (numNonZero-1);
1266      }
1267      else
1268      {
1269        m_pcTDecBinIf->decodeBinsEP( coeffSigns, numNonZero );
1270        coeffSigns <<= 32 - numNonZero;
1271      }
1272     
1273      Int iFirstCoeff2 = 1;   
1274      if (c1 == 0 || numNonZero > C1FLAG_NUMBER)
1275      {
1276        for( Int idx = 0; idx < numNonZero; idx++ )
1277        {
1278          UInt baseLevel  = (idx < C1FLAG_NUMBER)? (2 + iFirstCoeff2) : 1;
1279
1280          if( absCoeff[ idx ] == baseLevel)
1281          {
1282            UInt uiLevel;
1283            xReadCoefRemainExGolomb( uiLevel, uiGoRiceParam );
1284            absCoeff[ idx ] = uiLevel + baseLevel;
1285            if(absCoeff[idx]>3*(1<<uiGoRiceParam))
1286            {
1287              uiGoRiceParam = min<UInt>(uiGoRiceParam+ 1, 4);
1288            }
1289          }
1290
1291          if(absCoeff[ idx ] >= 2) 
1292          {
1293            iFirstCoeff2 = 0;
1294          }
1295        }
1296      }
1297
1298      for( Int idx = 0; idx < numNonZero; idx++ )
1299      {
1300        Int blkPos = pos[ idx ];
1301        // Signs applied later.
1302        pcCoef[ blkPos ] = absCoeff[ idx ];
1303        absSum += absCoeff[ idx ];
1304
1305        if ( idx == numNonZero-1 && signHidden && beValid )
1306        {
1307          // Infer sign of 1st element.
1308          if (absSum&0x1)
1309          {
1310            pcCoef[ blkPos ] = -pcCoef[ blkPos ];
1311          }
1312        }
1313        else
1314        {
1315          Int sign = static_cast<Int>( coeffSigns ) >> 31;
1316          pcCoef[ blkPos ] = ( pcCoef[ blkPos ] ^ sign ) - sign;
1317          coeffSigns <<= 1;
1318        }
1319      }
1320    }
1321  }
1322 
1323  return;
1324}
1325
1326
1327Void TDecSbac::parseSaoMaxUvlc ( UInt& val, UInt maxSymbol )
1328{
1329  if (maxSymbol == 0)
1330  {
1331    val = 0;
1332    return;
1333  }
1334
1335  UInt code;
1336  Int  i;
1337  m_pcTDecBinIf->decodeBinEP( code );
1338  if ( code == 0 )
1339  {
1340    val = 0;
1341    return;
1342  }
1343
1344  i=1;
1345  while (1)
1346  {
1347    m_pcTDecBinIf->decodeBinEP( code );
1348    if ( code == 0 )
1349    {
1350      break;
1351    }
1352    i++;
1353    if (i == maxSymbol) 
1354    {
1355      break;
1356    }
1357  }
1358
1359  val = i;
1360}
1361Void TDecSbac::parseSaoUflc (UInt uiLength, UInt&  riVal)
1362{
1363  m_pcTDecBinIf->decodeBinsEP ( riVal, uiLength );
1364}
1365Void TDecSbac::parseSaoMerge (UInt&  ruiVal)
1366{
1367  UInt uiCode;
1368  m_pcTDecBinIf->decodeBin( uiCode, m_cSaoMergeSCModel.get( 0, 0, 0 ) );
1369  ruiVal = (Int)uiCode;
1370}
1371Void TDecSbac::parseSaoTypeIdx (UInt&  ruiVal)
1372{
1373  UInt uiCode;
1374  m_pcTDecBinIf->decodeBin( uiCode, m_cSaoTypeIdxSCModel.get( 0, 0, 0 ) );
1375  if (uiCode == 0) 
1376  {
1377    ruiVal = 0;
1378  }
1379  else
1380  {
1381    m_pcTDecBinIf->decodeBinEP( uiCode ); 
1382    if (uiCode == 0)
1383    {
1384#if HM_CLEANUP_SAO
1385      ruiVal = 1;
1386#else
1387      ruiVal = 5;
1388#endif
1389    }
1390    else
1391    {
1392#if HM_CLEANUP_SAO
1393      ruiVal = 2;
1394#else
1395      ruiVal = 1;
1396#endif
1397    }
1398  }
1399}
1400
1401#if HM_CLEANUP_SAO
1402
1403Void TDecSbac::parseSaoSign(UInt& val)
1404{
1405  m_pcTDecBinIf->decodeBinEP ( val ); 
1406}
1407
1408Void TDecSbac::parseSAOBlkParam (SAOBlkParam& saoBlkParam
1409                                , Bool* sliceEnabled
1410                                , Bool leftMergeAvail
1411                                , Bool aboveMergeAvail
1412                                )
1413{
1414  UInt uiSymbol;
1415
1416  Bool isLeftMerge = false;
1417  Bool isAboveMerge= false;
1418
1419  if(leftMergeAvail)
1420  {
1421    parseSaoMerge(uiSymbol); //sao_merge_left_flag
1422    isLeftMerge = (uiSymbol?true:false);
1423  }
1424
1425  if( aboveMergeAvail && !isLeftMerge)
1426  {
1427    parseSaoMerge(uiSymbol); //sao_merge_up_flag
1428    isAboveMerge = (uiSymbol?true:false);
1429  }
1430
1431  if(isLeftMerge || isAboveMerge) //merge mode
1432  {
1433    saoBlkParam[SAO_Y].modeIdc = saoBlkParam[SAO_Cb].modeIdc = saoBlkParam[SAO_Cr].modeIdc = SAO_MODE_MERGE;
1434    saoBlkParam[SAO_Y].typeIdc = saoBlkParam[SAO_Cb].typeIdc = saoBlkParam[SAO_Cr].typeIdc = (isLeftMerge)?SAO_MERGE_LEFT:SAO_MERGE_ABOVE;
1435  }
1436  else //new or off mode
1437  {   
1438    for(Int compIdx=0; compIdx < NUM_SAO_COMPONENTS; compIdx++)
1439    {
1440      SAOOffset& ctbParam = saoBlkParam[compIdx];
1441
1442      if(!sliceEnabled[compIdx])
1443      {
1444        //off
1445        ctbParam.modeIdc = SAO_MODE_OFF;
1446        continue;
1447      }
1448
1449      //type
1450      if(compIdx == SAO_Y || compIdx == SAO_Cb)
1451      {
1452        parseSaoTypeIdx(uiSymbol); //sao_type_idx_luma or sao_type_idx_chroma
1453
1454        assert(uiSymbol ==0 || uiSymbol ==1 || uiSymbol ==2);
1455
1456        if(uiSymbol ==0) //OFF
1457        {
1458          ctbParam.modeIdc = SAO_MODE_OFF;
1459        }
1460        else if(uiSymbol == 1) //BO
1461        {
1462          ctbParam.modeIdc = SAO_MODE_NEW;
1463          ctbParam.typeIdc = SAO_TYPE_START_BO;
1464        }
1465        else //2, EO
1466        {
1467          ctbParam.modeIdc = SAO_MODE_NEW;
1468          ctbParam.typeIdc = SAO_TYPE_START_EO;
1469        }
1470
1471      }
1472      else //Cr, follow Cb SAO type
1473      {
1474        ctbParam.modeIdc = saoBlkParam[SAO_Cb].modeIdc;
1475        ctbParam.typeIdc = saoBlkParam[SAO_Cb].typeIdc;
1476      }
1477
1478      if(ctbParam.modeIdc == SAO_MODE_NEW)
1479      {
1480        Int offset[4];
1481        for(Int i=0; i< 4; i++)
1482        {
1483          parseSaoMaxUvlc(uiSymbol,  g_saoMaxOffsetQVal[compIdx] ); //sao_offset_abs
1484          offset[i] = (Int)uiSymbol;
1485        }
1486
1487        if(ctbParam.typeIdc == SAO_TYPE_START_BO)
1488        {
1489          for(Int i=0; i< 4; i++)
1490          {
1491            if(offset[i] != 0)
1492            {
1493              parseSaoSign(uiSymbol); //sao_offset_sign
1494              if(uiSymbol)
1495              {
1496                offset[i] = -offset[i];
1497              }
1498            }
1499          }
1500          parseSaoUflc(NUM_SAO_BO_CLASSES_LOG2, uiSymbol ); //sao_band_position
1501          ctbParam.typeAuxInfo = uiSymbol;
1502       
1503          for(Int i=0; i<4; i++)
1504          {
1505            ctbParam.offset[(ctbParam.typeAuxInfo+i)%MAX_NUM_SAO_CLASSES] = offset[i];
1506          }     
1507       
1508        }
1509        else //EO
1510        {
1511          ctbParam.typeAuxInfo = 0;
1512
1513          if(compIdx == SAO_Y || compIdx == SAO_Cb)
1514          {
1515            parseSaoUflc(NUM_SAO_EO_TYPES_LOG2, uiSymbol ); //sao_eo_class_luma or sao_eo_class_chroma
1516            ctbParam.typeIdc += uiSymbol;
1517          }
1518          else
1519          {
1520            ctbParam.typeIdc = saoBlkParam[SAO_Cb].typeIdc;
1521          }
1522          ctbParam.offset[SAO_CLASS_EO_FULL_VALLEY] = offset[0];
1523          ctbParam.offset[SAO_CLASS_EO_HALF_VALLEY] = offset[1];
1524          ctbParam.offset[SAO_CLASS_EO_PLAIN      ] = 0;
1525          ctbParam.offset[SAO_CLASS_EO_HALF_PEAK  ] = -offset[2];
1526          ctbParam.offset[SAO_CLASS_EO_FULL_PEAK  ] = -offset[3];
1527        }
1528      }
1529    }
1530  }
1531}
1532
1533#else
1534
1535inline Void copySaoOneLcuParam(SaoLcuParam* psDst,  SaoLcuParam* psSrc)
1536{
1537  Int i;
1538  psDst->partIdx = psSrc->partIdx;
1539  psDst->typeIdx    = psSrc->typeIdx;
1540  if (psDst->typeIdx != -1)
1541  {
1542    psDst->subTypeIdx = psSrc->subTypeIdx ;
1543    psDst->length  = psSrc->length;
1544    for (i=0;i<psDst->length;i++)
1545    {
1546      psDst->offset[i] = psSrc->offset[i];
1547    }
1548  }
1549  else
1550  {
1551    psDst->length  = 0;
1552    for (i=0;i<SAO_BO_LEN;i++)
1553    {
1554      psDst->offset[i] = 0;
1555    }
1556  }
1557}
1558
1559Void TDecSbac::parseSaoOffset(SaoLcuParam* psSaoLcuParam, UInt compIdx)
1560{
1561  UInt uiSymbol;
1562  static Int iTypeLength[MAX_NUM_SAO_TYPE] =
1563  {
1564    SAO_EO_LEN,
1565    SAO_EO_LEN,
1566    SAO_EO_LEN,
1567    SAO_EO_LEN,
1568    SAO_BO_LEN
1569  }; 
1570
1571  if (compIdx==2)
1572  {
1573    uiSymbol = (UInt)( psSaoLcuParam->typeIdx + 1);
1574  }
1575  else
1576  {
1577    parseSaoTypeIdx(uiSymbol);
1578  }
1579  psSaoLcuParam->typeIdx = (Int)uiSymbol - 1;
1580  if (uiSymbol)
1581  {
1582    psSaoLcuParam->length = iTypeLength[psSaoLcuParam->typeIdx];
1583
1584    Int bitDepth = compIdx ? g_bitDepthC : g_bitDepthY;
1585    Int offsetTh = 1 << min(bitDepth - 5,5);
1586
1587    if( psSaoLcuParam->typeIdx == SAO_BO )
1588    {
1589      for(Int i=0; i< psSaoLcuParam->length; i++)
1590      {
1591        parseSaoMaxUvlc(uiSymbol, offsetTh -1 );
1592        psSaoLcuParam->offset[i] = uiSymbol;
1593      }   
1594      for(Int i=0; i< psSaoLcuParam->length; i++)
1595      {
1596        if (psSaoLcuParam->offset[i] != 0) 
1597        {
1598          m_pcTDecBinIf->decodeBinEP ( uiSymbol);
1599          if (uiSymbol)
1600          {
1601            psSaoLcuParam->offset[i] = -psSaoLcuParam->offset[i] ;
1602          }
1603        }
1604      }
1605      parseSaoUflc(5, uiSymbol );
1606      psSaoLcuParam->subTypeIdx = uiSymbol;
1607    }
1608    else if( psSaoLcuParam->typeIdx < 4 )
1609    {
1610      parseSaoMaxUvlc(uiSymbol, offsetTh -1 ); psSaoLcuParam->offset[0] = uiSymbol;
1611      parseSaoMaxUvlc(uiSymbol, offsetTh -1 ); psSaoLcuParam->offset[1] = uiSymbol;
1612      parseSaoMaxUvlc(uiSymbol, offsetTh -1 ); psSaoLcuParam->offset[2] = -(Int)uiSymbol;
1613      parseSaoMaxUvlc(uiSymbol, offsetTh -1 ); psSaoLcuParam->offset[3] = -(Int)uiSymbol;
1614     if (compIdx != 2)
1615     {
1616       parseSaoUflc(2, uiSymbol );
1617       psSaoLcuParam->subTypeIdx = uiSymbol;
1618       psSaoLcuParam->typeIdx += psSaoLcuParam->subTypeIdx;
1619     }
1620   }
1621  }
1622  else
1623  {
1624    psSaoLcuParam->length = 0;
1625  }
1626}
1627
1628Void TDecSbac::parseSaoOneLcuInterleaving(Int rx, Int ry, SAOParam* pSaoParam, TComDataCU* pcCU, Int iCUAddrInSlice, Int iCUAddrUpInSlice, Int allowMergeLeft, Int allowMergeUp)
1629{
1630  Int iAddr = pcCU->getAddr();
1631  UInt uiSymbol;
1632  for (Int iCompIdx=0; iCompIdx<3; iCompIdx++)
1633  {
1634    pSaoParam->saoLcuParam[iCompIdx][iAddr].mergeUpFlag    = 0;
1635    pSaoParam->saoLcuParam[iCompIdx][iAddr].mergeLeftFlag  = 0;
1636    pSaoParam->saoLcuParam[iCompIdx][iAddr].subTypeIdx     = 0;
1637    pSaoParam->saoLcuParam[iCompIdx][iAddr].typeIdx        = -1;
1638    pSaoParam->saoLcuParam[iCompIdx][iAddr].offset[0]     = 0;
1639    pSaoParam->saoLcuParam[iCompIdx][iAddr].offset[1]     = 0;
1640    pSaoParam->saoLcuParam[iCompIdx][iAddr].offset[2]     = 0;
1641    pSaoParam->saoLcuParam[iCompIdx][iAddr].offset[3]     = 0;
1642
1643  }
1644 if (pSaoParam->bSaoFlag[0] || pSaoParam->bSaoFlag[1] )
1645  {
1646    if (rx>0 && iCUAddrInSlice!=0 && allowMergeLeft)
1647    {
1648      parseSaoMerge(uiSymbol); 
1649      pSaoParam->saoLcuParam[0][iAddr].mergeLeftFlag = (Bool)uiSymbol; 
1650    }
1651    if (pSaoParam->saoLcuParam[0][iAddr].mergeLeftFlag==0)
1652    {
1653      if ((ry > 0) && (iCUAddrUpInSlice>=0) && allowMergeUp)
1654      {
1655        parseSaoMerge(uiSymbol);
1656        pSaoParam->saoLcuParam[0][iAddr].mergeUpFlag = (Bool)uiSymbol;
1657      }
1658    }
1659  }
1660
1661  for (Int iCompIdx=0; iCompIdx<3; iCompIdx++)
1662  {
1663    if ((iCompIdx == 0  && pSaoParam->bSaoFlag[0]) || (iCompIdx > 0  && pSaoParam->bSaoFlag[1]) )
1664    {
1665      if (rx>0 && iCUAddrInSlice!=0 && allowMergeLeft)
1666      {
1667        pSaoParam->saoLcuParam[iCompIdx][iAddr].mergeLeftFlag = pSaoParam->saoLcuParam[0][iAddr].mergeLeftFlag;
1668      }
1669      else
1670      {
1671        pSaoParam->saoLcuParam[iCompIdx][iAddr].mergeLeftFlag = 0;
1672      }
1673
1674      if (pSaoParam->saoLcuParam[iCompIdx][iAddr].mergeLeftFlag==0)
1675      {
1676        if ((ry > 0) && (iCUAddrUpInSlice>=0) && allowMergeUp)
1677        {
1678          pSaoParam->saoLcuParam[iCompIdx][iAddr].mergeUpFlag = pSaoParam->saoLcuParam[0][iAddr].mergeUpFlag;
1679        }
1680        else
1681        {
1682          pSaoParam->saoLcuParam[iCompIdx][iAddr].mergeUpFlag = 0;
1683        }
1684        if (!pSaoParam->saoLcuParam[iCompIdx][iAddr].mergeUpFlag)
1685        {
1686          pSaoParam->saoLcuParam[2][iAddr].typeIdx = pSaoParam->saoLcuParam[1][iAddr].typeIdx;
1687          parseSaoOffset(&(pSaoParam->saoLcuParam[iCompIdx][iAddr]), iCompIdx);
1688        }
1689        else
1690        {
1691          copySaoOneLcuParam(&pSaoParam->saoLcuParam[iCompIdx][iAddr], &pSaoParam->saoLcuParam[iCompIdx][iAddr-pSaoParam->numCuInWidth]);
1692        }
1693      }
1694      else
1695      {
1696        copySaoOneLcuParam(&pSaoParam->saoLcuParam[iCompIdx][iAddr],  &pSaoParam->saoLcuParam[iCompIdx][iAddr-1]);
1697      }
1698    }
1699    else
1700    {
1701      pSaoParam->saoLcuParam[iCompIdx][iAddr].typeIdx = -1;
1702      pSaoParam->saoLcuParam[iCompIdx][iAddr].subTypeIdx = 0;
1703    }
1704  }
1705}
1706
1707#endif
1708
1709/**
1710 - Initialize our contexts from the nominated source.
1711 .
1712 \param pSrc Contexts to be copied.
1713 */
1714Void TDecSbac::xCopyContextsFrom( TDecSbac* pSrc )
1715{
1716  memcpy(m_contextModels, pSrc->m_contextModels, m_numContextModels*sizeof(m_contextModels[0]));
1717}
1718
1719Void TDecSbac::xCopyFrom( TDecSbac* pSrc )
1720{
1721  m_pcTDecBinIf->copyState( pSrc->m_pcTDecBinIf );
1722
1723  m_uiLastQp           = pSrc->m_uiLastQp;
1724  xCopyContextsFrom( pSrc );
1725
1726}
1727
1728Void TDecSbac::load ( TDecSbac* pScr )
1729{
1730  xCopyFrom(pScr);
1731}
1732
1733Void TDecSbac::loadContexts ( TDecSbac* pScr )
1734{
1735  xCopyContextsFrom(pScr);
1736}
1737//! \}
Note: See TracBrowser for help on using the repository browser.