source: 3DVCSoftware/branches/HTM-DEV-0.3-dev1/source/Lib/TLibDecoder/TDecSbac.cpp @ 459

Last change on this file since 459 was 459, checked in by hhi, 11 years ago

Integation of depth intra methods in macro H_3D_DIM, including:

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