source: 3DVCSoftware/branches/HTM-9.3-dev1-RWTH/source/Lib/TLibDecoder/TDecSbac.cpp @ 816

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