source: 3DVCSoftware/trunk/source/Lib/TLibDecoder/TDecSbac.cpp @ 143

Last change on this file since 143 was 100, checked in by tech, 12 years ago

Adopted modifications:

  • disparity vector generation (A0097)
  • inter-view motion prediction modification (A0049)
  • simplification of disparity vector derivation (A0126)
  • region boundary chain coding (A0070)
  • residual skip intra (A0087)
  • VSO modification (A0033/A0093)

+ Clean ups + Bug fixes

Update of cfg files (A0033 modification 2)

  • Property svn:eol-style set to native
File size: 74.4 KB
RevLine 
[5]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
[56]4 * granted under this license. 
[5]5 *
[56]6 * Copyright (c) 2010-2012, ITU/ISO/IEC
[5]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.
[56]17 *  * Neither the name of the ITU/ISO/IEC nor the names of its contributors may
[5]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 */
[2]33
34/** \file     TDecSbac.cpp
35    \brief    Context-adaptive entropy decoder class
36*/
37
38#include "TDecSbac.h"
39
[56]40//! \ingroup TLibDecoder
41//! \{
42
[2]43//////////////////////////////////////////////////////////////////////
44// Construction/Destruction
45//////////////////////////////////////////////////////////////////////
46
47TDecSbac::TDecSbac() 
48// new structure here
49: m_pcBitstream               ( 0 )
50, m_pcTDecBinIf               ( NULL )
[56]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 HHI_INTER_VIEW_RESIDUAL_PRED
57, m_cResPredFlagSCModel       ( 1,             1,               NUM_RES_PRED_FLAG_CTX         , m_contextModels + m_numContextModels, m_numContextModels)
[2]58#endif
[56]59, m_cCUPartSizeSCModel        ( 1,             1,               NUM_PART_SIZE_CTX             , m_contextModels + m_numContextModels, m_numContextModels)
60, m_cCUPredModeSCModel        ( 1,             1,               NUM_PRED_MODE_CTX             , m_contextModels + m_numContextModels, m_numContextModels)
61, m_cCUAlfCtrlFlagSCModel     ( 1,             1,               NUM_ALF_CTRL_FLAG_CTX         , m_contextModels + m_numContextModels, m_numContextModels)
62, m_cCUIntraPredSCModel       ( 1,             1,               NUM_ADI_CTX                   , m_contextModels + m_numContextModels, m_numContextModels)
63, m_cCUChromaPredSCModel      ( 1,             1,               NUM_CHROMA_PRED_CTX           , m_contextModels + m_numContextModels, m_numContextModels)
64, m_cCUDeltaQpSCModel         ( 1,             1,               NUM_DELTA_QP_CTX              , m_contextModels + m_numContextModels, m_numContextModels)
65, m_cCUInterDirSCModel        ( 1,             1,               NUM_INTER_DIR_CTX             , m_contextModels + m_numContextModels, m_numContextModels)
66, m_cCURefPicSCModel          ( 1,             1,               NUM_REF_NO_CTX                , m_contextModels + m_numContextModels, m_numContextModels)
67, m_cCUMvdSCModel             ( 1,             1,               NUM_MV_RES_CTX                , m_contextModels + m_numContextModels, m_numContextModels)
68, m_cCUQtCbfSCModel           ( 1,             2,               NUM_QT_CBF_CTX                , m_contextModels + m_numContextModels, m_numContextModels)
69, m_cCUTransSubdivFlagSCModel ( 1,             1,               NUM_TRANS_SUBDIV_FLAG_CTX     , m_contextModels + m_numContextModels, m_numContextModels)
70, m_cCUQtRootCbfSCModel       ( 1,             1,               NUM_QT_ROOT_CBF_CTX           , m_contextModels + m_numContextModels, m_numContextModels)
71, m_cCUSigCoeffGroupSCModel   ( 1,             2,               NUM_SIG_CG_FLAG_CTX           , m_contextModels + m_numContextModels, m_numContextModels)
72, m_cCUSigSCModel             ( 1,             1,               NUM_SIG_FLAG_CTX              , m_contextModels + m_numContextModels, m_numContextModels)
73, m_cCuCtxLastX               ( 1,             2,               NUM_CTX_LAST_FLAG_XY          , m_contextModels + m_numContextModels, m_numContextModels)
74, m_cCuCtxLastY               ( 1,             2,               NUM_CTX_LAST_FLAG_XY          , m_contextModels + m_numContextModels, m_numContextModels)
75, m_cCUOneSCModel             ( 1,             1,               NUM_ONE_FLAG_CTX              , m_contextModels + m_numContextModels, m_numContextModels)
76, m_cCUAbsSCModel             ( 1,             1,               NUM_ABS_FLAG_CTX              , m_contextModels + m_numContextModels, m_numContextModels)
77, m_cMVPIdxSCModel            ( 1,             1,               NUM_MVP_IDX_CTX               , m_contextModels + m_numContextModels, m_numContextModels)
78, m_cALFFlagSCModel           ( 1,             1,               NUM_ALF_FLAG_CTX              , m_contextModels + m_numContextModels, m_numContextModels)
79, m_cALFUvlcSCModel           ( 1,             1,               NUM_ALF_UVLC_CTX              , m_contextModels + m_numContextModels, m_numContextModels)
80, m_cALFSvlcSCModel           ( 1,             1,               NUM_ALF_SVLC_CTX              , m_contextModels + m_numContextModels, m_numContextModels)
81#if AMP_CTX
82, m_cCUAMPSCModel             ( 1,             1,               NUM_CU_AMP_CTX                , m_contextModels + m_numContextModels, m_numContextModels)
[2]83#else
[56]84, m_cCUXPosiSCModel           ( 1,             1,               NUM_CU_X_POS_CTX              , m_contextModels + m_numContextModels, m_numContextModels)
85, m_cCUYPosiSCModel           ( 1,             1,               NUM_CU_Y_POS_CTX              , m_contextModels + m_numContextModels, m_numContextModels)
[2]86#endif
[56]87, m_cSaoFlagSCModel           ( 1,             1,               NUM_SAO_FLAG_CTX              , m_contextModels + m_numContextModels, m_numContextModels)
88, m_cSaoUvlcSCModel           ( 1,             1,               NUM_SAO_UVLC_CTX              , m_contextModels + m_numContextModels, m_numContextModels)
89, m_cSaoSvlcSCModel           ( 1,             1,               NUM_SAO_SVLC_CTX              , m_contextModels + m_numContextModels, m_numContextModels)
90#if SAO_UNIT_INTERLEAVING
91, m_cSaoMergeLeftSCModel      ( 1,             1,               NUM_SAO_MERGE_LEFT_FLAG_CTX   , m_contextModels + m_numContextModels, m_numContextModels)
92, m_cSaoMergeUpSCModel        ( 1,             1,               NUM_SAO_MERGE_UP_FLAG_CTX     , m_contextModels + m_numContextModels, m_numContextModels)
93, m_cSaoTypeIdxSCModel        ( 1,             1,               NUM_SAO_TYPE_IDX_CTX          , m_contextModels + m_numContextModels, m_numContextModels)
[2]94#endif
[5]95#if HHI_DMM_WEDGE_INTRA || HHI_DMM_PRED_TEX
[56]96, m_cDmmFlagSCModel           ( 1,             1,               NUM_DMM_FLAG_CTX              , m_contextModels + m_numContextModels, m_numContextModels)
97, m_cDmmModeSCModel           ( 1,             1,               NUM_DMM_MODE_CTX              , m_contextModels + m_numContextModels, m_numContextModels)
98, m_cDmmDataSCModel           ( 1,             1,               NUM_DMM_DATA_CTX              , m_contextModels + m_numContextModels, m_numContextModels)
[2]99#endif
[100]100#if LGE_EDGE_INTRA
101, m_cEdgeIntraSCModel         ( 1,             1,               NUM_EDGE_INTRA_CTX            , m_contextModels + m_numContextModels, m_numContextModels)
102#if LGE_EDGE_INTRA_DELTA_DC
103, m_cEdgeIntraDeltaDCSCModel  ( 1,             1,               NUM_EDGE_INTRA_DELTA_DC_CTX   , m_contextModels + m_numContextModels, m_numContextModels)
104#endif
105#endif
[2]106{
[56]107  assert( m_numContextModels <= MAX_NUM_CTX_MOD );
108  m_iSliceGranularity = 0;
[2]109}
110
111TDecSbac::~TDecSbac()
112{
113}
114
115// ====================================================================================================================
116// Public member functions
117// ====================================================================================================================
118
[56]119#if CABAC_INIT_FLAG
120Void TDecSbac::resetEntropy(TComSlice* pSlice)
[2]121{
[56]122  SliceType sliceType  = pSlice->getSliceType();
123  Int       qp         = pSlice->getSliceQp();
124
125  if (pSlice->getPPS()->getCabacInitPresentFlag() && pSlice->getCabacInitFlag())
126  {
127    switch (sliceType)
128    {
129    case P_SLICE:           // change initialization table to B_SLICE initialization
130      sliceType = B_SLICE; 
131      break;
132    case B_SLICE:           // change initialization table to P_SLICE initialization
133      sliceType = P_SLICE; 
134      break;
135    default     :           // should not occur
136      assert(0);
137    }
138  }
139
140#else
141Void TDecSbac::resetEntropywithQPandInitIDC (Int  qp, Int iID)
142{
143  SliceType sliceType = (SliceType)iID;
144#endif 
145
146  m_cCUSplitFlagSCModel.initBuffer       ( sliceType, qp, (UChar*)INIT_SPLIT_FLAG );
147  m_cCUSkipFlagSCModel.initBuffer        ( sliceType, qp, (UChar*)INIT_SKIP_FLAG );
148  m_cCUMergeFlagExtSCModel.initBuffer    ( sliceType, qp, (UChar*)INIT_MERGE_FLAG_EXT );
149  m_cCUMergeIdxExtSCModel.initBuffer     ( sliceType, qp, (UChar*)INIT_MERGE_IDX_EXT );
150#if HHI_INTER_VIEW_RESIDUAL_PRED
151  m_cResPredFlagSCModel.initBuffer       ( sliceType, qp, (UChar*)INIT_RES_PRED_FLAG );
[2]152#endif
[56]153  m_cCUAlfCtrlFlagSCModel.initBuffer     ( sliceType, qp, (UChar*)INIT_ALF_CTRL_FLAG );
154  m_cCUPartSizeSCModel.initBuffer        ( sliceType, qp, (UChar*)INIT_PART_SIZE );
155#if AMP_CTX
156  m_cCUAMPSCModel.initBuffer             ( sliceType, qp, (UChar*)INIT_CU_AMP_POS );
[2]157#else
[56]158  m_cCUXPosiSCModel.initBuffer           ( sliceType, qp, (UChar*)INIT_CU_X_POS );
159  m_cCUYPosiSCModel.initBuffer           ( sliceType, qp, (UChar*)INIT_CU_Y_POS );
[2]160#endif
[56]161  m_cCUPredModeSCModel.initBuffer        ( sliceType, qp, (UChar*)INIT_PRED_MODE );
162  m_cCUIntraPredSCModel.initBuffer       ( sliceType, qp, (UChar*)INIT_INTRA_PRED_MODE );
163  m_cCUChromaPredSCModel.initBuffer      ( sliceType, qp, (UChar*)INIT_CHROMA_PRED_MODE );
164  m_cCUInterDirSCModel.initBuffer        ( sliceType, qp, (UChar*)INIT_INTER_DIR );
165  m_cCUMvdSCModel.initBuffer             ( sliceType, qp, (UChar*)INIT_MVD );
166  m_cCURefPicSCModel.initBuffer          ( sliceType, qp, (UChar*)INIT_REF_PIC );
167  m_cCUDeltaQpSCModel.initBuffer         ( sliceType, qp, (UChar*)INIT_DQP );
168  m_cCUQtCbfSCModel.initBuffer           ( sliceType, qp, (UChar*)INIT_QT_CBF );
169  m_cCUQtRootCbfSCModel.initBuffer       ( sliceType, qp, (UChar*)INIT_QT_ROOT_CBF );
170  m_cCUSigCoeffGroupSCModel.initBuffer   ( sliceType, qp, (UChar*)INIT_SIG_CG_FLAG );
171  m_cCUSigSCModel.initBuffer             ( sliceType, qp, (UChar*)INIT_SIG_FLAG );
172  m_cCuCtxLastX.initBuffer               ( sliceType, qp, (UChar*)INIT_LAST );
173  m_cCuCtxLastY.initBuffer               ( sliceType, qp, (UChar*)INIT_LAST );
174  m_cCUOneSCModel.initBuffer             ( sliceType, qp, (UChar*)INIT_ONE_FLAG );
175  m_cCUAbsSCModel.initBuffer             ( sliceType, qp, (UChar*)INIT_ABS_FLAG );
176  m_cMVPIdxSCModel.initBuffer            ( sliceType, qp, (UChar*)INIT_MVP_IDX );
177  m_cALFFlagSCModel.initBuffer           ( sliceType, qp, (UChar*)INIT_ALF_FLAG );
178  m_cALFUvlcSCModel.initBuffer           ( sliceType, qp, (UChar*)INIT_ALF_UVLC );
179  m_cALFSvlcSCModel.initBuffer           ( sliceType, qp, (UChar*)INIT_ALF_SVLC );
180  m_cSaoFlagSCModel.initBuffer           ( sliceType, qp, (UChar*)INIT_SAO_FLAG );
181  m_cSaoUvlcSCModel.initBuffer           ( sliceType, qp, (UChar*)INIT_SAO_UVLC );
182  m_cSaoSvlcSCModel.initBuffer           ( sliceType, qp, (UChar*)INIT_SAO_SVLC );
183#if SAO_UNIT_INTERLEAVING
184  m_cSaoMergeLeftSCModel.initBuffer      ( sliceType, qp, (UChar*)INIT_SAO_MERGE_LEFT_FLAG );
185  m_cSaoMergeUpSCModel.initBuffer        ( sliceType, qp, (UChar*)INIT_SAO_MERGE_UP_FLAG );
186  m_cSaoTypeIdxSCModel.initBuffer        ( sliceType, qp, (UChar*)INIT_SAO_TYPE_IDX );
[2]187#endif
[56]188
189  m_cCUTransSubdivFlagSCModel.initBuffer ( sliceType, qp, (UChar*)INIT_TRANS_SUBDIV_FLAG );
[100]190#if LGE_EDGE_INTRA
191  m_cEdgeIntraSCModel.initBuffer         ( sliceType, qp, (UChar*)INIT_EDGE_INTRA );
192#if LGE_EDGE_INTRA_DELTA_DC
193  m_cEdgeIntraDeltaDCSCModel.initBuffer  ( sliceType, qp, (UChar*)INIT_EDGE_INTRA_DELTA_DC );
194#endif
195#endif
[56]196  m_uiLastDQpNonZero  = 0;
[5]197#if HHI_DMM_WEDGE_INTRA || HHI_DMM_PRED_TEX
[56]198  m_cDmmFlagSCModel.initBuffer           ( sliceType, qp, (UChar*)INIT_DMM_FLAG );
199  m_cDmmModeSCModel.initBuffer           ( sliceType, qp, (UChar*)INIT_DMM_MODE );
200  m_cDmmDataSCModel.initBuffer           ( sliceType, qp, (UChar*)INIT_DMM_DATA );
[2]201#endif
202 
203  // new structure
[56]204  m_uiLastQp          = qp;
[2]205 
206  m_pcTDecBinIf->start();
207}
208
[56]209/** The function does the following: Read out terminate bit. Flush CABAC. Byte-align for next tile.
210 *  Intialize CABAC states. Start CABAC.
211 */
212Void TDecSbac::updateContextTables( SliceType eSliceType, Int iQp )
213{
214  UInt uiBit;
215  m_pcTDecBinIf->decodeBinTrm(uiBit);
216  m_pcTDecBinIf->finish(); 
217#if !OL_FLUSH_ALIGN
218  // Account for misaligned CABAC.
219  Int iCABACReadAhead = m_pcTDecBinIf->getBitsReadAhead();
220  iCABACReadAhead--;
221  Int iStreamBits = 8-m_pcBitstream->getNumBitsUntilByteAligned();
222  if (iCABACReadAhead >= iStreamBits)
223  {
224    // Misaligned CABAC has read into the 1st byte of the next tile.
225    // Back up a byte prior to alignment.
226    m_pcBitstream->backupByte();
227  }
228#endif
229  m_pcBitstream->readOutTrailingBits();
230  m_cCUSplitFlagSCModel.initBuffer       ( eSliceType, iQp, (UChar*)INIT_SPLIT_FLAG );
231  m_cCUSkipFlagSCModel.initBuffer        ( eSliceType, iQp, (UChar*)INIT_SKIP_FLAG );
232  m_cCUMergeFlagExtSCModel.initBuffer    ( eSliceType, iQp, (UChar*)INIT_MERGE_FLAG_EXT );
233  m_cCUMergeIdxExtSCModel.initBuffer     ( eSliceType, iQp, (UChar*)INIT_MERGE_IDX_EXT );
234#if HHI_INTER_VIEW_RESIDUAL_PRED
235  m_cResPredFlagSCModel.initBuffer       ( eSliceType, iQp, (UChar*)INIT_RES_PRED_FLAG );
236#endif
237  m_cCUAlfCtrlFlagSCModel.initBuffer     ( eSliceType, iQp, (UChar*)INIT_ALF_CTRL_FLAG );
238  m_cCUPartSizeSCModel.initBuffer        ( eSliceType, iQp, (UChar*)INIT_PART_SIZE );
239#if AMP_CTX
240  m_cCUAMPSCModel.initBuffer             ( eSliceType, iQp, (UChar*)INIT_CU_AMP_POS );
241#else
242  m_cCUXPosiSCModel.initBuffer           ( eSliceType, iQp, (UChar*)INIT_CU_X_POS );
243  m_cCUYPosiSCModel.initBuffer           ( eSliceType, iQp, (UChar*)INIT_CU_Y_POS );
244#endif
245  m_cCUPredModeSCModel.initBuffer        ( eSliceType, iQp, (UChar*)INIT_PRED_MODE );
246  m_cCUIntraPredSCModel.initBuffer       ( eSliceType, iQp, (UChar*)INIT_INTRA_PRED_MODE );
247  m_cCUChromaPredSCModel.initBuffer      ( eSliceType, iQp, (UChar*)INIT_CHROMA_PRED_MODE );
248  m_cCUInterDirSCModel.initBuffer        ( eSliceType, iQp, (UChar*)INIT_INTER_DIR );
249  m_cCUMvdSCModel.initBuffer             ( eSliceType, iQp, (UChar*)INIT_MVD );
250  m_cCURefPicSCModel.initBuffer          ( eSliceType, iQp, (UChar*)INIT_REF_PIC );
251  m_cCUDeltaQpSCModel.initBuffer         ( eSliceType, iQp, (UChar*)INIT_DQP );
252  m_cCUQtCbfSCModel.initBuffer           ( eSliceType, iQp, (UChar*)INIT_QT_CBF );
253  m_cCUQtRootCbfSCModel.initBuffer       ( eSliceType, iQp, (UChar*)INIT_QT_ROOT_CBF );
254  m_cCUSigCoeffGroupSCModel.initBuffer   ( eSliceType, iQp, (UChar*)INIT_SIG_CG_FLAG );
255  m_cCUSigSCModel.initBuffer             ( eSliceType, iQp, (UChar*)INIT_SIG_FLAG );
256  m_cCuCtxLastX.initBuffer               ( eSliceType, iQp, (UChar*)INIT_LAST );
257  m_cCuCtxLastY.initBuffer               ( eSliceType, iQp, (UChar*)INIT_LAST );
258  m_cCUOneSCModel.initBuffer             ( eSliceType, iQp, (UChar*)INIT_ONE_FLAG );
259  m_cCUAbsSCModel.initBuffer             ( eSliceType, iQp, (UChar*)INIT_ABS_FLAG );
260  m_cMVPIdxSCModel.initBuffer            ( eSliceType, iQp, (UChar*)INIT_MVP_IDX );
261  m_cALFFlagSCModel.initBuffer           ( eSliceType, iQp, (UChar*)INIT_ALF_FLAG );
262  m_cALFUvlcSCModel.initBuffer           ( eSliceType, iQp, (UChar*)INIT_ALF_UVLC );
263  m_cALFSvlcSCModel.initBuffer           ( eSliceType, iQp, (UChar*)INIT_ALF_SVLC );
264  m_cSaoFlagSCModel.initBuffer           ( eSliceType, iQp, (UChar*)INIT_SAO_FLAG );
265  m_cSaoUvlcSCModel.initBuffer           ( eSliceType, iQp, (UChar*)INIT_SAO_UVLC );
266  m_cSaoSvlcSCModel.initBuffer           ( eSliceType, iQp, (UChar*)INIT_SAO_SVLC );
267#if SAO_UNIT_INTERLEAVING
268  m_cSaoMergeLeftSCModel.initBuffer      ( eSliceType, iQp, (UChar*)INIT_SAO_MERGE_LEFT_FLAG );
269  m_cSaoMergeUpSCModel.initBuffer        ( eSliceType, iQp, (UChar*)INIT_SAO_MERGE_UP_FLAG );
270  m_cSaoTypeIdxSCModel.initBuffer        ( eSliceType, iQp, (UChar*)INIT_SAO_TYPE_IDX );
271#endif
272  m_cCUTransSubdivFlagSCModel.initBuffer ( eSliceType, iQp, (UChar*)INIT_TRANS_SUBDIV_FLAG );
273#if HHI_DMM_WEDGE_INTRA || HHI_DMM_PRED_TEX
274  m_cDmmFlagSCModel.initBuffer           ( eSliceType, iQp, (UChar*)INIT_DMM_FLAG );
275  m_cDmmModeSCModel.initBuffer           ( eSliceType, iQp, (UChar*)INIT_DMM_MODE );
276  m_cDmmDataSCModel.initBuffer           ( eSliceType, iQp, (UChar*)INIT_DMM_DATA );
277#endif
278
279  m_pcTDecBinIf->start();
280}
281
282Void TDecSbac::readTileMarker( UInt& uiTileIdx, UInt uiBitsUsed )
283{
284  UInt uiSymbol;
285  uiTileIdx = 0;
286  for (Int iShift=uiBitsUsed-1; iShift>=0; iShift--)
287  {
288    m_pcTDecBinIf->decodeBinEP ( uiSymbol );
289    if (uiSymbol)
290    {
291      uiTileIdx |= (1<<iShift);
292    }
293  }
294}
295
[2]296Void TDecSbac::parseTerminatingBit( UInt& ruiBit )
297{
298  m_pcTDecBinIf->decodeBinTrm( ruiBit );
299}
300
301
302Void TDecSbac::xReadUnaryMaxSymbol( UInt& ruiSymbol, ContextModel* pcSCModel, Int iOffset, UInt uiMaxSymbol )
303{
304  if (uiMaxSymbol == 0)
305  {
306    ruiSymbol = 0;
307    return;
308  }
309 
310  m_pcTDecBinIf->decodeBin( ruiSymbol, pcSCModel[0] );
311 
312  if( ruiSymbol == 0 || uiMaxSymbol == 1 )
313  {
314    return;
315  }
316 
317  UInt uiSymbol = 0;
318  UInt uiCont;
319 
320  do
321  {
322    m_pcTDecBinIf->decodeBin( uiCont, pcSCModel[ iOffset ] );
323    uiSymbol++;
324  }
325  while( uiCont && ( uiSymbol < uiMaxSymbol - 1 ) );
326 
327  if( uiCont && ( uiSymbol == uiMaxSymbol - 1 ) )
328  {
329    uiSymbol++;
330  }
331 
332  ruiSymbol = uiSymbol;
333}
334
335Void TDecSbac::xReadEpExGolomb( UInt& ruiSymbol, UInt uiCount )
336{
337  UInt uiSymbol = 0;
338  UInt uiBit = 1;
339 
340  while( uiBit )
341  {
342    m_pcTDecBinIf->decodeBinEP( uiBit );
343    uiSymbol += uiBit << uiCount++;
344  }
345 
[56]346  if ( --uiCount )
[2]347  {
[56]348    UInt bins;
349    m_pcTDecBinIf->decodeBinsEP( bins, uiCount );
350    uiSymbol += bins;
[2]351  }
352 
353  ruiSymbol = uiSymbol;
354}
355
356Void TDecSbac::xReadUnarySymbol( UInt& ruiSymbol, ContextModel* pcSCModel, Int iOffset )
357{
358  m_pcTDecBinIf->decodeBin( ruiSymbol, pcSCModel[0] );
359 
360  if( !ruiSymbol )
361  {
362    return;
363  }
364 
365  UInt uiSymbol = 0;
366  UInt uiCont;
367 
368  do
369  {
370    m_pcTDecBinIf->decodeBin( uiCont, pcSCModel[ iOffset ] );
371    uiSymbol++;
372  }
373  while( uiCont );
374 
375  ruiSymbol = uiSymbol;
376}
377
378/** Parsing of coeff_abs_level_minus3
379 * \param ruiSymbol reference to coeff_abs_level_minus3
380 * \param ruiGoRiceParam reference to Rice parameter
381 * \returns Void
382 */
383Void TDecSbac::xReadGoRiceExGolomb( UInt &ruiSymbol, UInt &ruiGoRiceParam )
384{
385  Bool bExGolomb    = false;
386  UInt uiCodeWord   = 0;
387  UInt uiQuotient   = 0;
388  UInt uiRemainder  = 0;
389  UInt uiMaxVlc     = g_auiGoRiceRange[ ruiGoRiceParam ];
390  UInt uiMaxPreLen  = g_auiGoRicePrefixLen[ ruiGoRiceParam ];
391
392  do
393  {
394    uiQuotient++;
395    m_pcTDecBinIf->decodeBinEP( uiCodeWord );
396  }
397  while( uiCodeWord && uiQuotient < uiMaxPreLen );
398
399  uiCodeWord  = 1 - uiCodeWord;
400  uiQuotient -= uiCodeWord;
401
[56]402  if ( ruiGoRiceParam > 0 )
[2]403  {
[56]404    m_pcTDecBinIf->decodeBinsEP( uiRemainder, ruiGoRiceParam );   
[2]405  }
406
407  ruiSymbol      = uiRemainder + ( uiQuotient << ruiGoRiceParam );
408  bExGolomb      = ruiSymbol == ( uiMaxVlc + 1 );
409
410  if( bExGolomb )
411  {
412    xReadEpExGolomb( uiCodeWord, 0 );
413    ruiSymbol += uiCodeWord;
414  }
415
[56]416#if EIGHT_BITS_RICE_CODE
417  ruiGoRiceParam = g_aauiGoRiceUpdate[ ruiGoRiceParam ][ min<UInt>( ruiSymbol, 23 ) ];
418#else
[2]419  ruiGoRiceParam = g_aauiGoRiceUpdate[ ruiGoRiceParam ][ min<UInt>( ruiSymbol, 15 ) ];
[56]420#endif
[2]421
422  return;
423}
[56]424
425
426/** Parse I_PCM information.
427 * \param pcCU
428 * \param uiAbsPartIdx
429 * \param uiDepth
430 * \returns Void
431 *
432 * If I_PCM flag indicates that the CU is I_PCM, parse its PCM alignment bits and codes.
433 */
434Void TDecSbac::parseIPCMInfo ( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth )
[2]435{
436  UInt uiSymbol;
[56]437#if BURST_IPCM
438  Int numSubseqIPCM = 0;
439  Bool readPCMSampleFlag = false;
440
441  if(pcCU->getNumSucIPCM() > 0) 
[2]442  {
[56]443    readPCMSampleFlag = true;
[2]444  }
[56]445  else
446  {
447    m_pcTDecBinIf->decodeBinTrm(uiSymbol);
[2]448
[56]449    if (uiSymbol)
450    {
451      readPCMSampleFlag = true;
452      m_pcTDecBinIf->decodeNumSubseqIPCM(numSubseqIPCM);
453      pcCU->setNumSucIPCM(numSubseqIPCM + 1);
454      m_pcTDecBinIf->decodePCMAlignBits();
455    }
[2]456  }
[56]457#else
458  m_pcTDecBinIf->decodeBinTrm(uiSymbol);
459#endif
[2]460
[56]461#if BURST_IPCM
462  if (readPCMSampleFlag == true)
463#else
464  if (uiSymbol)
[2]465#endif
466  {
[56]467    Bool bIpcmFlag = true;
468
469#if !BURST_IPCM
470    m_pcTDecBinIf->decodePCMAlignBits();
[2]471#endif
472
[56]473    pcCU->setPartSizeSubParts  ( SIZE_2Nx2N, uiAbsPartIdx, uiDepth );
474    pcCU->setSizeSubParts      ( g_uiMaxCUWidth>>uiDepth, g_uiMaxCUHeight>>uiDepth, uiAbsPartIdx, uiDepth );
475    pcCU->setIPCMFlagSubParts  ( bIpcmFlag, uiAbsPartIdx, uiDepth );
[2]476
[56]477    UInt uiMinCoeffSize = pcCU->getPic()->getMinCUWidth()*pcCU->getPic()->getMinCUHeight();
478    UInt uiLumaOffset   = uiMinCoeffSize*uiAbsPartIdx;
479    UInt uiChromaOffset = uiLumaOffset>>2;
480
481    Pel* piPCMSample;
482    UInt uiWidth;
483    UInt uiHeight;
484    UInt uiSampleBits;
485    UInt uiX, uiY;
486
487    piPCMSample = pcCU->getPCMSampleY() + uiLumaOffset;
488    uiWidth = pcCU->getWidth(uiAbsPartIdx);
489    uiHeight = pcCU->getHeight(uiAbsPartIdx);
490    uiSampleBits = pcCU->getSlice()->getSPS()->getPCMBitDepthLuma();
491
492    for(uiY = 0; uiY < uiHeight; uiY++)
493    {
494      for(uiX = 0; uiX < uiWidth; uiX++)
495      {
496        UInt uiSample;
497        m_pcTDecBinIf->xReadPCMCode(uiSampleBits, uiSample);
498        piPCMSample[uiX] = uiSample;
499      }
500      piPCMSample += uiWidth;
501    }
502
503    piPCMSample = pcCU->getPCMSampleCb() + uiChromaOffset;
504    uiWidth = pcCU->getWidth(uiAbsPartIdx)/2;
505    uiHeight = pcCU->getHeight(uiAbsPartIdx)/2;
506    uiSampleBits = pcCU->getSlice()->getSPS()->getPCMBitDepthChroma();
507
508    for(uiY = 0; uiY < uiHeight; uiY++)
509    {
510      for(uiX = 0; uiX < uiWidth; uiX++)
511      {
512        UInt uiSample;
513        m_pcTDecBinIf->xReadPCMCode(uiSampleBits, uiSample);
514        piPCMSample[uiX] = uiSample;
515      }
516      piPCMSample += uiWidth;
517    }
518
519    piPCMSample = pcCU->getPCMSampleCr() + uiChromaOffset;
520    uiWidth = pcCU->getWidth(uiAbsPartIdx)/2;
521    uiHeight = pcCU->getHeight(uiAbsPartIdx)/2;
522    uiSampleBits = pcCU->getSlice()->getSPS()->getPCMBitDepthChroma();
523
524    for(uiY = 0; uiY < uiHeight; uiY++)
525    {
526      for(uiX = 0; uiX < uiWidth; uiX++)
527      {
528        UInt uiSample;
529        m_pcTDecBinIf->xReadPCMCode(uiSampleBits, uiSample);
530        piPCMSample[uiX] = uiSample;
531      }
532      piPCMSample += uiWidth;
533    }
534
535#if BURST_IPCM
536    pcCU->setNumSucIPCM( pcCU->getNumSucIPCM() - 1);
537    if(pcCU->getNumSucIPCM() == 0)
538    {
539      m_pcTDecBinIf->resetBac();
540    }
541#else
542    m_pcTDecBinIf->resetBac();
543#endif
[2]544  }
545}
546
547/** parse skip flag
548 * \param pcCU
549 * \param uiAbsPartIdx
550 * \param uiDepth
551 * \returns Void
552 */
553Void TDecSbac::parseSkipFlag( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth )
554{
555  if( pcCU->getSlice()->isIntra() )
556  {
557    return;
558  }
559 
560  UInt uiSymbol = 0;
561  UInt uiCtxSkip = pcCU->getCtxSkipFlag( uiAbsPartIdx );
562  m_pcTDecBinIf->decodeBin( uiSymbol, m_cCUSkipFlagSCModel.get( 0, 0, uiCtxSkip ) );
[56]563  DTRACE_CABAC_VL( g_nSymbolCounter++ );
[2]564  DTRACE_CABAC_T( "\tSkipFlag" );
565  DTRACE_CABAC_T( "\tuiCtxSkip: ");
566  DTRACE_CABAC_V( uiCtxSkip );
567  DTRACE_CABAC_T( "\tuiSymbol: ");
568  DTRACE_CABAC_V( uiSymbol );
569  DTRACE_CABAC_T( "\n");
570 
571  if( uiSymbol )
572  {
573    pcCU->setPredModeSubParts( MODE_SKIP,  uiAbsPartIdx, uiDepth );
574    pcCU->setPartSizeSubParts( SIZE_2Nx2N, uiAbsPartIdx, uiDepth );
575    pcCU->setSizeSubParts( g_uiMaxCUWidth>>uiDepth, g_uiMaxCUHeight>>uiDepth, uiAbsPartIdx, uiDepth );
576    pcCU->setMergeFlagSubParts( true , uiAbsPartIdx, 0, uiDepth );
577  }
578}
579
580/** parse merge flag
581 * \param pcCU
582 * \param uiAbsPartIdx
583 * \param uiDepth
584 * \param uiPUIdx
585 * \returns Void
586 */
587Void TDecSbac::parseMergeFlag ( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth, UInt uiPUIdx )
588{
589  UInt uiSymbol;
[56]590  m_pcTDecBinIf->decodeBin( uiSymbol, *m_cCUMergeFlagExtSCModel.get( 0 ) );
[2]591  pcCU->setMergeFlagSubParts( uiSymbol ? true : false, uiAbsPartIdx, uiPUIdx, uiDepth );
592
[56]593  DTRACE_CABAC_VL( g_nSymbolCounter++ );
[2]594  DTRACE_CABAC_T( "\tMergeFlag: " );
595  DTRACE_CABAC_V( uiSymbol );
596  DTRACE_CABAC_T( "\tAddress: " );
597  DTRACE_CABAC_V( pcCU->getAddr() );
598  DTRACE_CABAC_T( "\tuiAbsPartIdx: " );
599  DTRACE_CABAC_V( uiAbsPartIdx );
600  DTRACE_CABAC_T( "\n" );
601}
602
[56]603Void TDecSbac::parseMergeIndex ( TComDataCU* pcCU, UInt& ruiMergeIndex, UInt uiAbsPartIdx, UInt uiDepth )
[2]604{
[56]605  UInt uiNumCand = MRG_MAX_NUM_CANDS;
606#if !MRG_IDX_CTX_RED 
607  UInt auiCtx[4] = { 0, 1, 2, 3 };
608#endif
609  UInt uiUnaryIdx = 0;
610  uiNumCand = pcCU->getSlice()->getMaxNumMergeCand();
[5]611#if HHI_MPI
[2]612  const Bool bMVIAvailable = pcCU->getSlice()->getSPS()->getUseMVI() && pcCU->getSlice()->getSliceType() != I_SLICE;
[56]613  const UInt uiMviMergePos = bMVIAvailable ? HHI_MPI_MERGE_POS : uiNumCand;
[2]614#endif
[56]615  if ( uiNumCand > 1 )
[2]616  {
[56]617    for( ; uiUnaryIdx < uiNumCand - 1; ++uiUnaryIdx )
[2]618    {
[56]619      UInt uiSymbol = 0;
620#if MRG_IDX_CTX_RED
621      if ( uiUnaryIdx==0 )
[2]622      {
[56]623        m_pcTDecBinIf->decodeBin( uiSymbol, m_cCUMergeIdxExtSCModel.get( 0, 0, 0 ) );
[2]624      }
[56]625      else
626      {
627        m_pcTDecBinIf->decodeBinEP( uiSymbol );
628      }
629#else
630      m_pcTDecBinIf->decodeBin( uiSymbol, m_cCUMergeIdxExtSCModel.get( 0, 0, auiCtx[uiUnaryIdx] ) );
[2]631#endif
[56]632      if( uiSymbol == 0 )
[2]633      {
[56]634        break;
[2]635      }
636    }
637  }
638  ruiMergeIndex = uiUnaryIdx;
639
[56]640  DTRACE_CABAC_VL( g_nSymbolCounter++ )
641  DTRACE_CABAC_T( "\tparseMergeIndex()" )
642  DTRACE_CABAC_T( "\tuiMRGIdx= " )
643  DTRACE_CABAC_V( ruiMergeIndex )
644  DTRACE_CABAC_T( "\n" )
[5]645#if HHI_MPI
[2]646  if( ruiMergeIndex > uiMviMergePos )
647  {
[56]648    assert( bMVIAvailable );
[2]649    ruiMergeIndex--;
650  }
651  else if( ruiMergeIndex == uiMviMergePos )
652  {
[56]653    assert( bMVIAvailable );
[2]654    pcCU->setTextureModeDepthSubParts( uiDepth, uiAbsPartIdx, uiDepth );
655  }
656#endif
657}
658
[56]659#if HHI_INTER_VIEW_RESIDUAL_PRED
660Void
[2]661TDecSbac::parseResPredFlag( TComDataCU* pcCU, Bool& rbResPredFlag, UInt uiAbsPartIdx, UInt uiDepth )
662{
[56]663  UInt uiCtx    = pcCU->getCtxResPredFlag( uiAbsPartIdx );
[2]664  UInt uiSymbol = 0;
665  m_pcTDecBinIf->decodeBin( uiSymbol, m_cResPredFlagSCModel.get( 0, 0, uiCtx ) );
666  rbResPredFlag = ( uiSymbol != 0 );
667}
[56]668#endif
[2]669
[56]670#if HHI_INTER_VIEW_MOTION_PRED
671Void TDecSbac::parseMVPIdx      ( Int& riMVPIdx, Int iNumAMVPCands )
[2]672{
673  UInt uiSymbol;
[56]674  xReadUnaryMaxSymbol(uiSymbol, m_cMVPIdxSCModel.get(0), 1, iNumAMVPCands-1);
[2]675  riMVPIdx = uiSymbol;
676}
[56]677#else
678Void TDecSbac::parseMVPIdx      ( Int& riMVPIdx )
679{
680  UInt uiSymbol;
681  xReadUnaryMaxSymbol(uiSymbol, m_cMVPIdxSCModel.get(0), 1, AMVP_MAX_NUM_CANDS-1);
682  riMVPIdx = uiSymbol;
683}
684#endif
[2]685
686Void TDecSbac::parseSplitFlag     ( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth )
687{
688  if( uiDepth == g_uiMaxCUDepth - g_uiAddCUDepth )
689  {
690    pcCU->setDepthSubParts( uiDepth, uiAbsPartIdx );
691    return;
692  }
693 
694  UInt uiSymbol;
695  m_pcTDecBinIf->decodeBin( uiSymbol, m_cCUSplitFlagSCModel.get( 0, 0, pcCU->getCtxSplitFlag( uiAbsPartIdx, uiDepth ) ) );
[56]696  DTRACE_CABAC_VL( g_nSymbolCounter++ )
[2]697  DTRACE_CABAC_T( "\tSplitFlag\n" )
698  pcCU->setDepthSubParts( uiDepth + uiSymbol, uiAbsPartIdx );
699 
700  return;
701}
702
703/** parse partition size
704 * \param pcCU
705 * \param uiAbsPartIdx
706 * \param uiDepth
707 * \returns Void
708 */
709Void TDecSbac::parsePartSize( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth )
710{
711  UInt uiSymbol, uiMode = 0;
712  PartSize eMode;
713 
714  if ( pcCU->isIntra( uiAbsPartIdx ) )
715  {
716    uiSymbol = 1;
717    if( uiDepth == g_uiMaxCUDepth - g_uiAddCUDepth )
718    {
719      m_pcTDecBinIf->decodeBin( uiSymbol, m_cCUPartSizeSCModel.get( 0, 0, 0) );
720    }
721    eMode = uiSymbol ? SIZE_2Nx2N : SIZE_NxN;
[56]722    UInt uiTrLevel = 0;   
723    UInt uiWidthInBit  = g_aucConvertToBit[pcCU->getWidth(uiAbsPartIdx)]+2;
724    UInt uiTrSizeInBit = g_aucConvertToBit[pcCU->getSlice()->getSPS()->getMaxTrSize()]+2;
725    uiTrLevel          = uiWidthInBit >= uiTrSizeInBit ? uiWidthInBit - uiTrSizeInBit : 0;
726    if( eMode == SIZE_NxN )
727    {
728      pcCU->setTrIdxSubParts( 1+uiTrLevel, uiAbsPartIdx, uiDepth );
729    }
730    else
731    {
732      pcCU->setTrIdxSubParts( uiTrLevel, uiAbsPartIdx, uiDepth );
733    }
[2]734  }
735  else
736  {
[56]737    UInt uiMaxNumBits = 2;
738    if( uiDepth == g_uiMaxCUDepth - g_uiAddCUDepth && !( pcCU->getSlice()->getSPS()->getDisInter4x4() && (g_uiMaxCUWidth>>uiDepth) == 8 && (g_uiMaxCUHeight>>uiDepth) == 8 ) )
[2]739    {
[56]740      uiMaxNumBits ++;
[2]741    }
[56]742    for ( UInt ui = 0; ui < uiMaxNumBits; ui++ )
[2]743    {
[56]744      m_pcTDecBinIf->decodeBin( uiSymbol, m_cCUPartSizeSCModel.get( 0, 0, ui) );
745      if ( uiSymbol )
[2]746      {
[56]747        break;
[2]748      }
[56]749      uiMode++;
[2]750    }
751    eMode = (PartSize) uiMode;
[56]752    if ( pcCU->getSlice()->getSPS()->getAMPAcc( uiDepth ) )
[2]753    {
[56]754      if (eMode == SIZE_2NxN)
755      {
756#if AMP_CTX
757          m_pcTDecBinIf->decodeBin(uiSymbol, m_cCUAMPSCModel.get( 0, 0, 0 ));
758#else
759        m_pcTDecBinIf->decodeBin(uiSymbol, m_cCUYPosiSCModel.get( 0, 0, 0 ));
[2]760#endif
[56]761        if (uiSymbol == 0)
762        {
763#if AMP_CTX
764          m_pcTDecBinIf->decodeBinEP(uiSymbol);
765#else
766          m_pcTDecBinIf->decodeBin(uiSymbol, m_cCUYPosiSCModel.get( 0, 0, 1 ));
767#endif
768          eMode = (uiSymbol == 0? SIZE_2NxnU : SIZE_2NxnD);
769        }
[2]770      }
[56]771      else if (eMode == SIZE_Nx2N)
[2]772      {
[56]773#if AMP_CTX
774        m_pcTDecBinIf->decodeBin(uiSymbol, m_cCUAMPSCModel.get( 0, 0, 0 ));
775#else
776        m_pcTDecBinIf->decodeBin(uiSymbol, m_cCUXPosiSCModel.get( 0, 0, 0 ));
[2]777#endif
[56]778        if (uiSymbol == 0)
[2]779        {
[56]780#if AMP_CTX
781          m_pcTDecBinIf->decodeBinEP(uiSymbol);
782#else
783          m_pcTDecBinIf->decodeBin(uiSymbol, m_cCUXPosiSCModel.get( 0, 0, 1 ));
784#endif
785          eMode = (uiSymbol == 0? SIZE_nLx2N : SIZE_nRx2N);
[2]786        }
787      }
788    }
789  }
790  pcCU->setPartSizeSubParts( eMode, uiAbsPartIdx, uiDepth );
791  pcCU->setSizeSubParts( g_uiMaxCUWidth>>uiDepth, g_uiMaxCUHeight>>uiDepth, uiAbsPartIdx, uiDepth );
792}
793
794/** parse prediction mode
795 * \param pcCU
796 * \param uiAbsPartIdx
797 * \param uiDepth
798 * \returns Void
799 */
800Void TDecSbac::parsePredMode( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth )
801{
802  if( pcCU->getSlice()->isIntra() )
803  {
804    pcCU->setPredModeSubParts( MODE_INTRA, uiAbsPartIdx, uiDepth );
805    return;
806  }
807 
808  UInt uiSymbol;
809  Int  iPredMode = MODE_INTER;
[56]810  m_pcTDecBinIf->decodeBin( uiSymbol, m_cCUPredModeSCModel.get( 0, 0, 0 ) );
[2]811  iPredMode += uiSymbol;
812  pcCU->setPredModeSubParts( (PredMode)iPredMode, uiAbsPartIdx, uiDepth );
813}
[56]814 
815Void TDecSbac::parseIntraDirLumaAng  ( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth )
[2]816{
[56]817  UInt uiSymbol;
818  Int  intraPredMode;
[2]819
[5]820#if HHI_DMM_WEDGE_INTRA || HHI_DMM_PRED_TEX
[2]821  UInt uiFlag = 0;
[56]822  if( pcCU->getSlice()->getSPS()->getUseDMM() && (g_uiMaxCUWidth>>uiDepth) <= DMM_WEDGEMODEL_MAX_SIZE )
[2]823  {
[56]824    m_pcTDecBinIf->decodeBin( uiFlag, m_cDmmFlagSCModel.get(0, 0, 0) );
[2]825  }
[56]826  if( uiFlag )
[2]827  {
828    UInt uiDMMode;
[100]829
[5]830#if HHI_DMM_WEDGE_INTRA && HHI_DMM_PRED_TEX
[56]831    m_pcTDecBinIf->decodeBin( uiSymbol, m_cDmmModeSCModel.get(0, 0, 0) ); uiDMMode  = uiSymbol;
832    m_pcTDecBinIf->decodeBin( uiSymbol, m_cDmmModeSCModel.get(0, 0, 0) ); uiDMMode |= uiSymbol << 1;
[2]833    if ( pcCU->getPartitionSize( uiAbsPartIdx ) != SIZE_NxN && g_uiMaxCUWidth>>uiDepth > 4 )
834    {
[56]835      m_pcTDecBinIf->decodeBin( uiSymbol, m_cDmmModeSCModel.get(0, 0, 0) ); uiDMMode |= uiSymbol << 2;
[2]836    }
837#else
[56]838    m_pcTDecBinIf->decodeBin( uiSymbol, m_cDmmModeSCModel.get(0, 0, 0) ); uiDMMode  = uiSymbol;
839    if ( pcCU->getPartitionSize( uiAbsPartIdx ) != SIZE_NxN && g_uiMaxCUWidth>>uiDepth > 4 )
840    {
841      m_pcTDecBinIf->decodeBin( uiSymbol, m_cDmmModeSCModel.get(0, 0, 0) ); uiDMMode |= uiSymbol << 1;
[2]842    }
843#endif
[56]844    intraPredMode = uiDMMode + NUM_INTRA_MODE;
[2]845
[5]846#if HHI_DMM_WEDGE_INTRA
[56]847    if( intraPredMode == DMM_WEDGE_FULL_IDX )          { xParseWedgeFullInfo          ( pcCU, uiAbsPartIdx, uiDepth ); }
848    if( intraPredMode == DMM_WEDGE_FULL_D_IDX )        { xParseWedgeFullDeltaInfo     ( pcCU, uiAbsPartIdx, uiDepth ); }
849    if( intraPredMode == DMM_WEDGE_PREDDIR_IDX )       { xParseWedgePredDirInfo       ( pcCU, uiAbsPartIdx, uiDepth ); }
850    if( intraPredMode == DMM_WEDGE_PREDDIR_D_IDX )     { xParseWedgePredDirDeltaInfo  ( pcCU, uiAbsPartIdx, uiDepth ); }
[5]851#endif
852#if HHI_DMM_PRED_TEX
[56]853    if( intraPredMode == DMM_WEDGE_PREDTEX_D_IDX )     { xParseWedgePredTexDeltaInfo  ( pcCU, uiAbsPartIdx, uiDepth ); }
854    if( intraPredMode == DMM_CONTOUR_PREDTEX_D_IDX )   { xParseContourPredTexDeltaInfo( pcCU, uiAbsPartIdx, uiDepth ); }
[5]855#endif
[2]856  }
857  else
858  {
859#endif
[56]860#if !LOGI_INTRA_NAME_3MPM
[100]861    Int iIntraIdx = pcCU->getIntraSizeIdx(uiAbsPartIdx);
[56]862#endif
[100]863
864#if LGE_EDGE_INTRA
865    Bool bCodeEdgeIntra = false;
866    if( pcCU->getSlice()->getSPS()->isDepth() )
867    {
868      UInt uiPUWidth = pcCU->getWidth( uiAbsPartIdx ) >> (pcCU->getPartitionSize( uiAbsPartIdx ) == SIZE_NxN ? 1 : 0);
869      if( uiPUWidth <= LGE_EDGE_INTRA_MAX_SIZE && uiPUWidth >= LGE_EDGE_INTRA_MIN_SIZE )
870        bCodeEdgeIntra = true;
871    }
872#endif
873
[56]874#if LOGI_INTRA_NAME_3MPM
[100]875    Int uiPreds[3] = {-1, -1, -1};
[2]876#else
[100]877    Int uiPreds[2] = {-1, -1};
[56]878#endif
[100]879    Int uiPredNum = pcCU->getIntraDirLumaPredictor(uiAbsPartIdx, uiPreds); 
880#if LGE_EDGE_INTRA
881    UInt uiCheckBit = 0;
882#endif
883
884    m_pcTDecBinIf->decodeBin( uiSymbol, m_cCUIntraPredSCModel.get( 0, 0, 0) );
885
886    if ( uiSymbol )
[56]887    {
888      m_pcTDecBinIf->decodeBinEP( uiSymbol );
[100]889#if LOGI_INTRA_NAME_3MPM
890      if (uiSymbol)
891      {
892        m_pcTDecBinIf->decodeBinEP( uiSymbol );
893        uiSymbol++;
894      }
[5]895#endif
[100]896      intraPredMode = uiPreds[uiSymbol];
[56]897    }
[100]898    else
[2]899    {
[100]900      intraPredMode = 0;
901
902#if LOGI_INTRA_NAME_3MPM
903
904      m_pcTDecBinIf->decodeBinsEP( uiSymbol, 5 );
905#if LGE_EDGE_INTRA
906      if (bCodeEdgeIntra)
907      {
908        if (uiSymbol==31)
909        {
910          m_pcTDecBinIf->decodeBinsEP(uiCheckBit,1);
911          if (uiCheckBit)
912            uiSymbol = EDGE_INTRA_IDX;
913        }
914      }
915#endif
916      intraPredMode = uiSymbol;
917
918      //postponed sorting of MPMs (only in remaining branch)
919      if (uiPreds[0] > uiPreds[1])
920      { 
921        std::swap(uiPreds[0], uiPreds[1]); 
922      }
923      if (uiPreds[0] > uiPreds[2])
924      {
925        std::swap(uiPreds[0], uiPreds[2]);
926      }
927      if (uiPreds[1] > uiPreds[2])
928      {
929        std::swap(uiPreds[1], uiPreds[2]);
930      }
931#else
932      m_pcTDecBinIf->decodeBinsEP( uiSymbol, g_aucIntraModeBitsAng[iIntraIdx] - 1 );
933      intraPredMode = uiSymbol;
934
935      if ( intraPredMode == 31 )
936      {
937        m_pcTDecBinIf->decodeBinEP( uiSymbol );
938        intraPredMode += uiSymbol;     
939      }
940#endif
941#if LGE_EDGE_INTRA
942      if ( intraPredMode != EDGE_INTRA_IDX)
943      {
944#endif
945        for ( Int i = 0; i < uiPredNum; i++ )
946        {
947          intraPredMode += ( intraPredMode >= uiPreds[i] );
948        }
949#if LGE_EDGE_INTRA
950      }
951#endif
[2]952    }
[100]953
954#if LGE_EDGE_INTRA
955    if( intraPredMode == EDGE_INTRA_IDX )
[2]956    {
[100]957      xParseEdgeIntraInfo( pcCU, uiAbsPartIdx, uiDepth );
958#if LGE_EDGE_INTRA_DELTA_DC
959      m_pcTDecBinIf->decodeBin( uiSymbol, m_cEdgeIntraDeltaDCSCModel.get(0, 0, 0) );
960      if( uiSymbol )
961      {
962        intraPredMode = EDGE_INTRA_DELTA_IDX;
963        Int iDeltaDC0;
964        Int iDeltaDC1;
965
966        xReadExGolombLevel( (UInt &) iDeltaDC0, m_cEdgeIntraDeltaDCSCModel.get(0, 0, 1) );
967        if( iDeltaDC0 != 0 )
968        {
969          UInt uiSign;
970          m_pcTDecBinIf->decodeBinEP( uiSign );
971          if ( uiSign )
972          {
973            iDeltaDC0 = -iDeltaDC0;
974          }
975        }
976        xReadExGolombLevel( (UInt &) iDeltaDC1, m_cEdgeIntraDeltaDCSCModel.get(0, 0, 1) );
977        if( iDeltaDC1 != 0 )
978        {
979          UInt uiSign;
980          m_pcTDecBinIf->decodeBinEP( uiSign );
981          if ( uiSign )
982          {
983            iDeltaDC1 = -iDeltaDC1;
984          }
985        }
986
987        pcCU->setEdgeDeltaDC0( uiAbsPartIdx, iDeltaDC0 );
988        pcCU->setEdgeDeltaDC1( uiAbsPartIdx, iDeltaDC1 );
989      }
990#endif
[2]991    }
[56]992#endif
[100]993
[56]994#if HHI_DMM_WEDGE_INTRA || HHI_DMM_PRED_TEX
995  }
[2]996#endif
[100]997
[56]998  pcCU->setLumaIntraDirSubParts( (UChar)intraPredMode, uiAbsPartIdx, uiDepth );
999}
[2]1000
1001Void TDecSbac::parseIntraDirChroma( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth )
1002{
1003  UInt uiSymbol;
1004
[56]1005  m_pcTDecBinIf->decodeBin( uiSymbol, m_cCUChromaPredSCModel.get( 0, 0, 0 ) );
1006
1007  if( uiSymbol == 0 )
[2]1008  {
[56]1009    uiSymbol = DM_CHROMA_IDX;
[2]1010  } 
1011  else 
1012  {
[56]1013    if( pcCU->getSlice()->getSPS()->getUseLMChroma() )
[2]1014    {
[56]1015      m_pcTDecBinIf->decodeBin( uiSymbol, m_cCUChromaPredSCModel.get( 0, 0, 1 ) );
[2]1016    }
[56]1017    else
1018    {
1019      uiSymbol = 1;
1020    }
[2]1021
[56]1022    if( uiSymbol == 0 )
[2]1023    {
[56]1024      uiSymbol = LM_CHROMA_IDX;
1025    } 
1026    else
1027    {
1028      UInt uiIPredMode;
1029#if CHROMA_MODE_CODING
1030      m_pcTDecBinIf->decodeBinsEP( uiIPredMode, 2 );
1031#else
1032      xReadUnaryMaxSymbol( uiIPredMode, m_cCUChromaPredSCModel.get( 0, 0 ) + 1, 0, 3 );
[2]1033#endif
[56]1034      UInt uiAllowedChromaDir[ NUM_CHROMA_MODE ];
1035      pcCU->getAllowedChromaDir( uiAbsPartIdx, uiAllowedChromaDir );
1036      uiSymbol = uiAllowedChromaDir[ uiIPredMode ];
[2]1037    }
1038  }
1039  pcCU->setChromIntraDirSubParts( uiSymbol, uiAbsPartIdx, uiDepth );
1040  return;
1041}
1042
1043Void TDecSbac::parseInterDir( TComDataCU* pcCU, UInt& ruiInterDir, UInt uiAbsPartIdx, UInt uiDepth )
1044{
1045  UInt uiSymbol;
[56]1046  const UInt uiCtx = pcCU->getCtxInterDir( uiAbsPartIdx );
1047  ContextModel *pCtx = m_cCUInterDirSCModel.get( 0 );
1048  m_pcTDecBinIf->decodeBin( uiSymbol, *( pCtx + uiCtx ) );
1049
1050  if( uiSymbol )
[2]1051  {
1052    uiSymbol = 2;
1053  }
[56]1054
[2]1055  uiSymbol++;
1056  ruiInterDir = uiSymbol;
1057  return;
1058}
1059
1060Void TDecSbac::parseRefFrmIdx( TComDataCU* pcCU, Int& riRefFrmIdx, UInt uiAbsPartIdx, UInt uiDepth, RefPicList eRefList )
1061{
1062  UInt uiSymbol;
1063
1064  if(pcCU->getSlice()->getNumRefIdx(REF_PIC_LIST_C ) > 0 && eRefList==REF_PIC_LIST_C)
1065  {
[56]1066    ContextModel *pCtx = m_cCURefPicSCModel.get( 0 );
1067    m_pcTDecBinIf->decodeBin( uiSymbol, *pCtx );
[2]1068
[56]1069    if( uiSymbol )
[2]1070    {
[56]1071      xReadUnaryMaxSymbol( uiSymbol, pCtx + 1, 1, pcCU->getSlice()->getNumRefIdx( REF_PIC_LIST_C )-2 );
[2]1072      uiSymbol++;
1073    }
1074    riRefFrmIdx = uiSymbol;
1075  }
1076  else
1077  {
[56]1078    ContextModel *pCtx = m_cCURefPicSCModel.get( 0 );
1079    m_pcTDecBinIf->decodeBin( uiSymbol, *pCtx );
[2]1080
[56]1081    if( uiSymbol )
1082    {
1083      xReadUnaryMaxSymbol( uiSymbol, pCtx + 1, 1, pcCU->getSlice()->getNumRefIdx( eRefList )-2 );
1084      uiSymbol++;
1085    }
1086    riRefFrmIdx = uiSymbol;
[2]1087  }
1088
1089  return;
1090}
1091
[56]1092Void TDecSbac::parseMvd( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiPartIdx, UInt uiDepth, RefPicList eRefList )
[2]1093{
1094  UInt uiSymbol;
[56]1095  UInt uiHorAbs;
1096  UInt uiVerAbs;
1097  UInt uiHorSign = 0;
1098  UInt uiVerSign = 0;
1099  ContextModel *pCtx = m_cCUMvdSCModel.get( 0 );
[2]1100
[56]1101#if H0111_MVD_L1_ZERO
1102  if(pcCU->getSlice()->getMvdL1ZeroFlag() && eRefList == REF_PIC_LIST_1 && pcCU->getInterDir(uiAbsPartIdx)==3)
1103  {
1104    uiHorAbs=0;
1105    uiVerAbs=0;
1106  }
1107  else
1108  {
[2]1109#endif
1110
[56]1111    m_pcTDecBinIf->decodeBin( uiHorAbs, *pCtx );
1112    m_pcTDecBinIf->decodeBin( uiVerAbs, *pCtx );
[2]1113
[56]1114    const Bool bHorAbsGr0 = uiHorAbs != 0;
1115    const Bool bVerAbsGr0 = uiVerAbs != 0;
1116    pCtx++;
1117
1118    if( bHorAbsGr0 )
1119    {
1120      m_pcTDecBinIf->decodeBin( uiSymbol, *pCtx );
1121      uiHorAbs += uiSymbol;
1122    }
1123
1124    if( bVerAbsGr0 )
1125    {
1126      m_pcTDecBinIf->decodeBin( uiSymbol, *pCtx );
1127      uiVerAbs += uiSymbol;
1128    }
1129
1130    if( bHorAbsGr0 )
1131    {
1132      if( 2 == uiHorAbs )
1133      {
1134        xReadEpExGolomb( uiSymbol, 1 );
1135        uiHorAbs += uiSymbol;
1136      }
1137
1138      m_pcTDecBinIf->decodeBinEP( uiHorSign );
1139    }
1140
1141    if( bVerAbsGr0 )
1142    {
1143      if( 2 == uiVerAbs )
1144      {
1145        xReadEpExGolomb( uiSymbol, 1 );
1146        uiVerAbs += uiSymbol;
1147      }
1148
1149      m_pcTDecBinIf->decodeBinEP( uiVerSign );
1150    }
1151
1152#if H0111_MVD_L1_ZERO
1153  }
[2]1154#endif
1155
[56]1156  const TComMv cMv( uiHorSign ? -Int( uiHorAbs ): uiHorAbs, uiVerSign ? -Int( uiVerAbs ) : uiVerAbs );
1157  pcCU->getCUMvField( eRefList )->setAllMvd( cMv, pcCU->getPartitionSize( uiAbsPartIdx ), uiAbsPartIdx, uiDepth, uiPartIdx );
[2]1158  return;
1159}
1160
1161
1162Void TDecSbac::parseTransformSubdivFlag( UInt& ruiSubdivFlag, UInt uiLog2TransformBlockSize )
1163{
1164  m_pcTDecBinIf->decodeBin( ruiSubdivFlag, m_cCUTransSubdivFlagSCModel.get( 0, 0, uiLog2TransformBlockSize ) );
[56]1165  DTRACE_CABAC_VL( g_nSymbolCounter++ )
[2]1166  DTRACE_CABAC_T( "\tparseTransformSubdivFlag()" )
1167  DTRACE_CABAC_T( "\tsymbol=" )
1168  DTRACE_CABAC_V( ruiSubdivFlag )
1169  DTRACE_CABAC_T( "\tctx=" )
1170  DTRACE_CABAC_V( uiLog2TransformBlockSize )
1171  DTRACE_CABAC_T( "\n" )
1172}
1173
1174Void TDecSbac::parseQtRootCbf( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth, UInt& uiQtRootCbf )
1175{
1176  UInt uiSymbol;
[56]1177  const UInt uiCtx = 0;
[2]1178  m_pcTDecBinIf->decodeBin( uiSymbol , m_cCUQtRootCbfSCModel.get( 0, 0, uiCtx ) );
[56]1179  DTRACE_CABAC_VL( g_nSymbolCounter++ )
[2]1180  DTRACE_CABAC_T( "\tparseQtRootCbf()" )
1181  DTRACE_CABAC_T( "\tsymbol=" )
1182  DTRACE_CABAC_V( uiSymbol )
1183  DTRACE_CABAC_T( "\tctx=" )
1184  DTRACE_CABAC_V( uiCtx )
1185  DTRACE_CABAC_T( "\tuiAbsPartIdx=" )
1186  DTRACE_CABAC_V( uiAbsPartIdx )
1187  DTRACE_CABAC_T( "\n" )
1188 
1189  uiQtRootCbf = uiSymbol;
1190}
1191
1192Void TDecSbac::parseDeltaQP( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth )
1193{
[56]1194#if H0736_AVC_STYLE_QP_RANGE
1195  Int qp;
1196#endif
[2]1197  UInt uiDQp;
1198  Int  iDQp;
1199 
1200  m_pcTDecBinIf->decodeBin( uiDQp, m_cCUDeltaQpSCModel.get( 0, 0, 0 ) );
1201 
1202  if ( uiDQp == 0 )
1203  {
[56]1204#if H0736_AVC_STYLE_QP_RANGE
1205    qp = pcCU->getRefQP(uiAbsPartIdx);
1206#else
1207    uiDQp = pcCU->getRefQP(uiAbsPartIdx);
1208#endif
[2]1209  }
1210  else
1211  {
[56]1212    UInt uiSign;
1213#if H0736_AVC_STYLE_QP_RANGE
1214    Int qpBdOffsetY = pcCU->getSlice()->getSPS()->getQpBDOffsetY();
1215#else
1216    UInt uiQpBdOffsetY = 6*(g_uiBitIncrement + g_uiBitDepth - 8);
1217#endif
1218    m_pcTDecBinIf->decodeBinEP(uiSign);
1219
1220#if H0736_AVC_STYLE_QP_RANGE
1221    UInt uiMaxAbsDQpMinus1 = 24 + (qpBdOffsetY/2) + (uiSign);
1222#else
1223    UInt uiMaxAbsDQpMinus1 = 24 + (uiQpBdOffsetY/2) + (uiSign);
1224#endif
1225    UInt uiAbsDQpMinus1;
1226    xReadUnaryMaxSymbol (uiAbsDQpMinus1,  &m_cCUDeltaQpSCModel.get( 0, 0, 1 ), 1, uiMaxAbsDQpMinus1);
1227
1228    iDQp = uiAbsDQpMinus1 + 1;
1229
1230    if(uiSign)
[2]1231    {
1232      iDQp = -iDQp;
1233    }
[56]1234
1235#if H0736_AVC_STYLE_QP_RANGE
1236    qp = (((Int) pcCU->getRefQP( uiAbsPartIdx ) + iDQp + 52 + 2*qpBdOffsetY )%(52+qpBdOffsetY)) - qpBdOffsetY;
1237#else
1238#if LOSSLESS_CODING
1239    uiDQp = (pcCU->getRefQP(uiAbsPartIdx) + iDQp + 52) % 52;
1240#else
1241    uiDQp = pcCU->getRefQP(uiAbsPartIdx) + iDQp;
1242#endif
1243#endif
[2]1244  }
1245 
[56]1246  UInt uiAbsQpCUPartIdx = (uiAbsPartIdx>>(8-(pcCU->getSlice()->getPPS()->getMaxCuDQPDepth()<<1)))<<(8-(pcCU->getSlice()->getPPS()->getMaxCuDQPDepth()<<1)) ;
1247  UInt uiQpCUDepth =   min(uiDepth,pcCU->getSlice()->getPPS()->getMaxCuDQPDepth()) ;
1248#if H0736_AVC_STYLE_QP_RANGE
1249  pcCU->setQPSubParts( qp, uiAbsQpCUPartIdx, uiQpCUDepth );
1250#else
1251  pcCU->setQPSubParts( uiDQp, uiAbsQpCUPartIdx, uiQpCUDepth );
1252#endif
[2]1253}
1254
1255Void TDecSbac::parseQtCbf( TComDataCU* pcCU, UInt uiAbsPartIdx, TextType eType, UInt uiTrDepth, UInt uiDepth )
1256{
1257  UInt uiSymbol;
1258  const UInt uiCtx = pcCU->getCtxQtCbf( uiAbsPartIdx, eType, uiTrDepth );
[56]1259  m_pcTDecBinIf->decodeBin( uiSymbol , m_cCUQtCbfSCModel.get( 0, eType ? TEXT_CHROMA: eType, uiCtx ) );
[2]1260 
[56]1261  DTRACE_CABAC_VL( g_nSymbolCounter++ )
[2]1262  DTRACE_CABAC_T( "\tparseQtCbf()" )
1263  DTRACE_CABAC_T( "\tsymbol=" )
1264  DTRACE_CABAC_V( uiSymbol )
1265  DTRACE_CABAC_T( "\tctx=" )
1266  DTRACE_CABAC_V( uiCtx )
1267  DTRACE_CABAC_T( "\tetype=" )
1268  DTRACE_CABAC_V( eType )
1269  DTRACE_CABAC_T( "\tuiAbsPartIdx=" )
1270  DTRACE_CABAC_V( uiAbsPartIdx )
1271  DTRACE_CABAC_T( "\n" )
1272 
1273  pcCU->setCbfSubParts( uiSymbol << uiTrDepth, eType, uiAbsPartIdx, uiDepth );
1274}
1275
1276/** Parse (X,Y) position of the last significant coefficient
1277 * \param uiPosLastX reference to X component of last coefficient
1278 * \param uiPosLastY reference to Y component of last coefficient
[56]1279 * \param width  Block width
1280 * \param height Block height
[2]1281 * \param eTType plane type / luminance or chrominance
1282 * \param uiScanIdx scan type (zig-zag, hor, ver)
[56]1283 *
[2]1284 * This method decodes the X and Y component within a block of the last significant coefficient.
1285 */
[56]1286Void TDecSbac::parseLastSignificantXY( UInt& uiPosLastX, UInt& uiPosLastY, Int width, Int height, TextType eTType, UInt uiScanIdx )
[2]1287{
1288  UInt uiLast;
[56]1289  ContextModel *pCtxX = m_cCuCtxLastX.get( 0, eTType );
1290  ContextModel *pCtxY = m_cCuCtxLastY.get( 0, eTType );
[2]1291
[56]1292  // posX
1293#if LAST_CTX_REDUCTION
1294  Int widthCtx = eTType ? 4 : width;
1295  const UInt *puiCtxIdxX = g_uiLastCtx + ( g_aucConvertToBit[ widthCtx ] * ( g_aucConvertToBit[ widthCtx ] + 3 ) );
1296#else
1297  const UInt *puiCtxIdxX = g_uiLastCtx + ( g_aucConvertToBit[ width ] * ( g_aucConvertToBit[ width ] + 3 ) );
1298#endif
1299  for( uiPosLastX = 0; uiPosLastX < g_uiGroupIdx[ width - 1 ]; uiPosLastX++ )
[2]1300  {
[56]1301#if LAST_CTX_REDUCTION
1302    if ( eTType  )
[2]1303    {
[56]1304      m_pcTDecBinIf->decodeBin( uiLast, *( pCtxX + (uiPosLastX>>g_aucConvertToBit[ width ])  ) );
1305    }
1306    else
1307    {
1308#endif
1309      m_pcTDecBinIf->decodeBin( uiLast, *( pCtxX + puiCtxIdxX[ uiPosLastX ] ) );
1310#if LAST_CTX_REDUCTION
1311    }
1312#endif
1313    if( !uiLast )
1314    {
[2]1315      break;
1316    }
1317  }
1318
[56]1319  // posY
1320#if LAST_CTX_REDUCTION
1321  Int heightCtx = eTType? 4 : height;
1322  const UInt *puiCtxIdxY = g_uiLastCtx + ( g_aucConvertToBit[ heightCtx ] * ( g_aucConvertToBit[ heightCtx ] + 3 ) );
1323#else
1324  const UInt *puiCtxIdxY = g_uiLastCtx + ( g_aucConvertToBit[ height ] * ( g_aucConvertToBit[ height ] + 3 ) );
1325#endif
1326  for( uiPosLastY = 0; uiPosLastY < g_uiGroupIdx[ height - 1 ]; uiPosLastY++ )
[2]1327  {
[56]1328#if LAST_CTX_REDUCTION
1329    if (eTType)
[2]1330    {
[56]1331      m_pcTDecBinIf->decodeBin( uiLast, *( pCtxY + (uiPosLastY>>g_aucConvertToBit[ height ]) ) );
1332    }
1333    else
1334    {
1335#endif
1336      m_pcTDecBinIf->decodeBin( uiLast, *( pCtxY + puiCtxIdxY[ uiPosLastY ] ) );
1337#if LAST_CTX_REDUCTION
1338    }
1339#endif
1340    if( !uiLast )
1341    {
[2]1342      break;
1343    }
1344  }
[56]1345  if ( uiPosLastX > 3 )
1346  {
1347    UInt uiTemp  = 0;
1348    UInt uiCount = ( uiPosLastX - 2 ) >> 1;
1349    for ( Int i = uiCount - 1; i >= 0; i-- )
1350    {
1351      m_pcTDecBinIf->decodeBinEP( uiLast );
1352      uiTemp += uiLast << i;
1353    }
1354    uiPosLastX = g_uiMinInGroup[ uiPosLastX ] + uiTemp;
1355  }
1356  if ( uiPosLastY > 3 )
1357  {
1358    UInt uiTemp  = 0;
1359    UInt uiCount = ( uiPosLastY - 2 ) >> 1;
1360    for ( Int i = uiCount - 1; i >= 0; i-- )
1361    {
1362      m_pcTDecBinIf->decodeBinEP( uiLast );
1363      uiTemp += uiLast << i;
1364    }
1365    uiPosLastY = g_uiMinInGroup[ uiPosLastY ] + uiTemp;
1366  }
1367 
[2]1368  if( uiScanIdx == SCAN_VER )
1369  {
1370    swap( uiPosLastX, uiPosLastY );
1371  }
1372}
1373
1374Void TDecSbac::parseCoeffNxN( TComDataCU* pcCU, TCoeff* pcCoef, UInt uiAbsPartIdx, UInt uiWidth, UInt uiHeight, UInt uiDepth, TextType eTType )
1375{
[56]1376  DTRACE_CABAC_VL( g_nSymbolCounter++ )
[2]1377  DTRACE_CABAC_T( "\tparseCoeffNxN()\teType=" )
1378  DTRACE_CABAC_V( eTType )
1379  DTRACE_CABAC_T( "\twidth=" )
1380  DTRACE_CABAC_V( uiWidth )
1381  DTRACE_CABAC_T( "\theight=" )
1382  DTRACE_CABAC_V( uiHeight )
1383  DTRACE_CABAC_T( "\tdepth=" )
1384  DTRACE_CABAC_V( uiDepth )
1385  DTRACE_CABAC_T( "\tabspartidx=" )
1386  DTRACE_CABAC_V( uiAbsPartIdx )
1387  DTRACE_CABAC_T( "\ttoCU-X=" )
1388  DTRACE_CABAC_V( pcCU->getCUPelX() )
1389  DTRACE_CABAC_T( "\ttoCU-Y=" )
1390  DTRACE_CABAC_V( pcCU->getCUPelY() )
1391  DTRACE_CABAC_T( "\tCU-addr=" )
1392  DTRACE_CABAC_V(  pcCU->getAddr() )
1393  DTRACE_CABAC_T( "\tinCU-X=" )
1394  DTRACE_CABAC_V( g_auiRasterToPelX[ g_auiZscanToRaster[uiAbsPartIdx] ] )
1395  DTRACE_CABAC_T( "\tinCU-Y=" )
1396  DTRACE_CABAC_V( g_auiRasterToPelY[ g_auiZscanToRaster[uiAbsPartIdx] ] )
1397  DTRACE_CABAC_T( "\tpredmode=" )
1398  DTRACE_CABAC_V(  pcCU->getPredictionMode( uiAbsPartIdx ) )
1399  DTRACE_CABAC_T( "\n" )
1400 
1401  if( uiWidth > pcCU->getSlice()->getSPS()->getMaxTrSize() )
1402  {
1403    uiWidth  = pcCU->getSlice()->getSPS()->getMaxTrSize();
1404    uiHeight = pcCU->getSlice()->getSPS()->getMaxTrSize();
1405  }
1406 
1407  eTType = eTType == TEXT_LUMA ? TEXT_LUMA : ( eTType == TEXT_NONE ? TEXT_NONE : TEXT_CHROMA );
1408 
1409  //----- parse significance map -----
1410  const UInt  uiLog2BlockSize   = g_aucConvertToBit[ uiWidth ] + 2;
[56]1411  const UInt  uiMaxNumCoeff     = uiWidth * uiHeight;
[2]1412  const UInt  uiMaxNumCoeffM1   = uiMaxNumCoeff - 1;
[56]1413  UInt uiScanIdx = pcCU->getCoefScanIdx(uiAbsPartIdx, uiWidth, eTType==TEXT_LUMA, pcCU->isIntra(uiAbsPartIdx));
1414  int blockType = uiLog2BlockSize;
1415  if (uiWidth != uiHeight)
1416  {
1417    uiScanIdx = SCAN_DIAG;
1418    blockType = 4;
1419  }
[2]1420 
[56]1421  //===== decode last significant =====
1422  UInt uiPosLastX, uiPosLastY;
1423  parseLastSignificantXY( uiPosLastX, uiPosLastY, uiWidth, uiHeight, eTType, uiScanIdx );
1424  UInt uiBlkPosLast      = uiPosLastX + (uiPosLastY<<uiLog2BlockSize);
1425  pcCoef[ uiBlkPosLast ] = 1;
[2]1426
[56]1427  //===== decode significance flags =====
1428  UInt uiScanPosLast   = uiBlkPosLast;
1429  if (uiScanIdx == SCAN_ZIGZAG)
1430  {
1431    // Map zigzag to diagonal scan
1432    uiScanIdx = SCAN_DIAG;
1433  }
1434  const UInt * scan;
1435  if (uiWidth == uiHeight)
1436  {
1437    scan = g_auiSigLastScan[ uiScanIdx ][ uiLog2BlockSize-1 ];
1438  }
1439  else
1440  {
1441    scan = g_sigScanNSQT[ uiLog2BlockSize - 2 ];
1442  }
1443  for( uiScanPosLast = 0; uiScanPosLast < uiMaxNumCoeffM1; uiScanPosLast++ )
1444  {
1445    UInt uiBlkPos = scan[ uiScanPosLast ];
1446    if( uiBlkPosLast == uiBlkPos )
[2]1447    {
[56]1448      break;
[2]1449    }
[56]1450  }
[2]1451
[56]1452  ContextModel * const baseCoeffGroupCtx = m_cCUSigCoeffGroupSCModel.get( 0, eTType );
1453  ContextModel * const baseCtx = (eTType==TEXT_LUMA) ? m_cCUSigSCModel.get( 0, 0 ) : m_cCUSigSCModel.get( 0, 0 ) + NUM_SIG_FLAG_CTX_LUMA;
1454
1455  const Int  iLastScanSet      = uiScanPosLast >> LOG2_SCAN_SET_SIZE;
1456  UInt uiNumOne                = 0;
1457  UInt uiGoRiceParam           = 0;
1458
1459#if MULTIBITS_DATA_HIDING
1460  UInt const tsig = pcCU->getSlice()->getPPS()->getTSIG();
1461#if LOSSLESS_CODING
1462  Bool beValid; 
1463  if (pcCU->isLosslessCoded(uiAbsPartIdx))
[2]1464  {
[56]1465    beValid = false;
1466  }
1467  else 
1468  {
1469    beValid = pcCU->getSlice()->getPPS()->getSignHideFlag() > 0;
1470  }
[2]1471#else
[56]1472  Bool beValid = pcCU->getSlice()->getPPS()->getSignHideFlag() > 0;
[2]1473#endif
[56]1474  UInt absSum = 0;
1475#endif  // MULTIBITS_DATA_HIDING
1476
1477  UInt uiSigCoeffGroupFlag[ MLS_GRP_NUM ];
1478  ::memset( uiSigCoeffGroupFlag, 0, sizeof(UInt) * MLS_GRP_NUM );
1479  const UInt uiNumBlkSide = uiWidth >> (MLS_CG_SIZE >> 1);
1480  const UInt * scanCG;
1481  if (uiWidth == uiHeight)
1482  {
1483    scanCG = g_auiSigLastScan[ uiScanIdx ][ uiLog2BlockSize > 3 ? uiLog2BlockSize-2-1 : 0  ];   
1484#if MULTILEVEL_SIGMAP_EXT
1485    if( uiLog2BlockSize == 3 )
[2]1486    {
[56]1487      scanCG = g_sigLastScan8x8[ uiScanIdx ];
[2]1488    }
[56]1489    else if( uiLog2BlockSize == 5 )
1490    {
1491      scanCG = g_sigLastScanCG32x32;
1492    }
1493#endif
[2]1494  }
[56]1495  else
[2]1496  {
[56]1497    scanCG = g_sigCGScanNSQT[ uiLog2BlockSize - 2 ];
[2]1498  }
[56]1499  Int  iScanPosSig             = (Int) uiScanPosLast;
1500  for( Int iSubSet = iLastScanSet; iSubSet >= 0; iSubSet-- )
1501  {
1502    Int  iSubPos     = iSubSet << LOG2_SCAN_SET_SIZE;
1503    uiGoRiceParam    = 0;
1504    Int numNonZero = 0;
1505   
1506#if MULTIBITS_DATA_HIDING
1507    Int lastNZPosInCG = -1, firstNZPosInCG = SCAN_SET_SIZE;
[2]1508#endif
[56]1509
1510    Int pos[SCAN_SET_SIZE];
1511    if( iScanPosSig == (Int) uiScanPosLast )
1512    {
1513#if MULTIBITS_DATA_HIDING
1514      lastNZPosInCG  = iScanPosSig;
1515      firstNZPosInCG = iScanPosSig;
[2]1516#endif
[56]1517      iScanPosSig--;
1518      pos[ numNonZero ] = uiBlkPosLast;
1519      numNonZero = 1;
1520    }
[2]1521
[56]1522#if !MULTILEVEL_SIGMAP_EXT
1523    if( blockType > 3 )
[2]1524    {
1525#endif
[56]1526      // decode significant_coeffgroup_flag
1527      Int iCGBlkPos = scanCG[ iSubSet ];
1528      Int iCGPosY   = iCGBlkPos / uiNumBlkSide;
1529      Int iCGPosX   = iCGBlkPos - (iCGPosY * uiNumBlkSide);
1530#if MULTILEVEL_SIGMAP_EXT
1531      if( uiWidth == 8 && uiHeight == 8 && (uiScanIdx == SCAN_HOR || uiScanIdx == SCAN_VER) )
[2]1532      {
[56]1533        iCGPosY = (uiScanIdx == SCAN_HOR ? iCGBlkPos : 0);
1534        iCGPosX = (uiScanIdx == SCAN_VER ? iCGBlkPos : 0);
[2]1535      }
[56]1536#endif
1537#if !REMOVE_INFER_SIGGRP
1538      Bool bInferredCGFlag = false;
1539#endif
1540#if REMOVE_INFER_SIGGRP
1541      if( iSubSet == iLastScanSet || iSubSet == 0)
1542#else
1543      if( iSubSet == iLastScanSet ) 
1544#endif
[2]1545      {
[56]1546        uiSigCoeffGroupFlag[ iCGBlkPos ] = 1;
1547      }
1548      else
1549      {
1550#if !REMOVE_INFER_SIGGRP
1551#if MULTILEVEL_SIGMAP_EXT
1552        if( !TComTrQuant::bothCGNeighboursOne( uiSigCoeffGroupFlag, iCGPosX, iCGPosY, uiScanIdx, uiWidth, uiHeight) && ( iSubSet ) )
1553#else
1554        if( !TComTrQuant::bothCGNeighboursOne( uiSigCoeffGroupFlag, iCGPosX, iCGPosY, uiWidth, uiHeight) && ( iSubSet ) )
1555#endif
[2]1556        {
[56]1557#endif
1558          UInt uiSigCoeffGroup;
1559#if MULTILEVEL_SIGMAP_EXT
1560          UInt uiCtxSig  = TComTrQuant::getSigCoeffGroupCtxInc( uiSigCoeffGroupFlag, iCGPosX, iCGPosY, uiScanIdx, uiWidth, uiHeight );
1561#else
1562          UInt uiCtxSig  = TComTrQuant::getSigCoeffGroupCtxInc( uiSigCoeffGroupFlag, iCGPosX, iCGPosY, uiWidth, uiHeight );
1563#endif
1564          m_pcTDecBinIf->decodeBin( uiSigCoeffGroup, baseCoeffGroupCtx[ uiCtxSig ] );
1565          uiSigCoeffGroupFlag[ iCGBlkPos ] = uiSigCoeffGroup;
1566#if !REMOVE_INFER_SIGGRP
[2]1567        }
1568        else
1569        {
[56]1570          uiSigCoeffGroupFlag[ iCGBlkPos ] = 1;
1571          bInferredCGFlag = true;
[2]1572        }
[56]1573#endif
1574      }
1575
1576      // decode significant_coeff_flag
1577      UInt uiBlkPos, uiPosY, uiPosX, uiSig, uiCtxSig;
1578      for( ; iScanPosSig >= iSubPos; iScanPosSig-- )
1579      {
1580        uiBlkPos  = scan[ iScanPosSig ];
1581        uiPosY    = uiBlkPos >> uiLog2BlockSize;
1582        uiPosX    = uiBlkPos - ( uiPosY << uiLog2BlockSize );
1583        uiSig     = 0;
[2]1584       
[56]1585        if( uiSigCoeffGroupFlag[ iCGBlkPos ] )
[2]1586        {
[56]1587#if REMOVE_INFER_SIGGRP
1588          if( iScanPosSig > iSubPos || iSubSet == 0  || numNonZero )
1589#else
1590          if( iScanPosSig > iSubPos || bInferredCGFlag || numNonZero )
1591#endif
[2]1592          {
[56]1593            uiCtxSig  = TComTrQuant::getSigCtxInc( pcCoef, uiPosX, uiPosY, blockType, uiWidth, uiHeight, eTType );
1594            m_pcTDecBinIf->decodeBin( uiSig, baseCtx[ uiCtxSig ] );
[2]1595          }
[56]1596          else
1597          {
1598            uiSig = 1;
1599          }
[2]1600        }
[56]1601        pcCoef[ uiBlkPos ] = uiSig;
1602        if( uiSig )
[2]1603        {
[56]1604          pos[ numNonZero ] = uiBlkPos;
1605          numNonZero ++;
1606#if MULTIBITS_DATA_HIDING
1607          if( lastNZPosInCG == -1 )
[2]1608          {
[56]1609            lastNZPosInCG = iScanPosSig;
1610          }
1611          firstNZPosInCG = iScanPosSig;
[2]1612#endif
1613        }
[56]1614      }
1615#if !MULTILEVEL_SIGMAP_EXT
1616    }
1617    else
1618    {
1619      for( ; iScanPosSig >= iSubPos; iScanPosSig-- )
1620      {
1621        UInt uiBlkPos   = scan[ iScanPosSig ];
1622        UInt  uiPosY    = uiBlkPos >> uiLog2BlockSize;
1623        UInt  uiPosX    = uiBlkPos - ( uiPosY << uiLog2BlockSize );
1624        UInt  uiSig     = 0;
1625        UInt  uiCtxSig  = TComTrQuant::getSigCtxInc( pcCoef, uiPosX, uiPosY, blockType, uiWidth, uiHeight, eTType );
1626        m_pcTDecBinIf->decodeBin( uiSig, baseCtx[ uiCtxSig ] );
1627        pcCoef[ uiBlkPos ] = uiSig;
1628        if( uiSig )
[2]1629        {
[56]1630          pos[ numNonZero ] = uiBlkPos;
1631          numNonZero ++;
1632#if MULTIBITS_DATA_HIDING
1633          if( lastNZPosInCG == -1 )
[2]1634          {
[56]1635            lastNZPosInCG = iScanPosSig;
[2]1636          }
[56]1637          firstNZPosInCG = iScanPosSig;
1638#endif
[2]1639        }
1640      }
1641    }
[56]1642#endif
1643
[2]1644   
[56]1645    if( numNonZero )
[2]1646    {
[56]1647#if MULTIBITS_DATA_HIDING
1648      Bool signHidden = ( lastNZPosInCG - firstNZPosInCG >= (Int)tsig );
1649      absSum = 0;
1650#endif  // MULTIBITS_DATA_HIDING
1651
1652      UInt c1 = 1;
1653#if !RESTRICT_GR1GR2FLAG_NUMBER
1654      UInt c2 = 0;
1655#endif
1656#if LEVEL_CTX_LUMA_RED
1657      UInt uiCtxSet    = (iSubSet > 0 && eTType==TEXT_LUMA) ? 2 : 0;
1658#else
1659      UInt uiCtxSet    = (iSubSet > 0 && eTType==TEXT_LUMA) ? 3 : 0;
1660#endif
1661      UInt uiBin;
[2]1662     
[56]1663      if( uiNumOne > 0 )
[2]1664      {
[56]1665        uiCtxSet++;
1666#if !LEVEL_CTX_LUMA_RED
1667        if(eTType==TEXT_LUMA && uiNumOne > 3)
[2]1668        {
[56]1669          uiCtxSet++;
[2]1670        }
[56]1671#endif
1672      }
1673     
1674      uiNumOne       >>= 1;
1675      ContextModel *baseCtxMod = ( eTType==TEXT_LUMA ) ? m_cCUOneSCModel.get( 0, 0 ) + 4 * uiCtxSet : m_cCUOneSCModel.get( 0, 0 ) + NUM_ONE_FLAG_CTX_LUMA + 4 * uiCtxSet;
1676      Int absCoeff[SCAN_SET_SIZE];
1677
1678#if RESTRICT_GR1GR2FLAG_NUMBER
1679      for ( Int i = 0; i < numNonZero; i++) absCoeff[i] = 1;   
1680      Int numC1Flag = min(numNonZero, C1FLAG_NUMBER);
1681      Int firstC2FlagIdx = -1;
1682
1683      for( Int idx = 0; idx < numC1Flag; idx++ )
1684#else
1685      for( Int idx = 0; idx < numNonZero; idx++ )
1686#endif
1687      {
1688        m_pcTDecBinIf->decodeBin( uiBin, baseCtxMod[c1] );
1689        if( uiBin == 1 )
[2]1690        {
[56]1691          c1 = 0;
1692#if RESTRICT_GR1GR2FLAG_NUMBER
1693          if (firstC2FlagIdx == -1)
1694          {
1695            firstC2FlagIdx = idx;
1696          }
1697#endif
1698        }
1699        else if( (c1 < 3) && (c1 > 0) )
1700        {
[2]1701          c1++;
1702        }
[56]1703        absCoeff[ idx ] = uiBin + 1;
1704      }
1705     
1706      if (c1 == 0)
1707      {
1708#if RESTRICT_GR1GR2FLAG_NUMBER
1709        baseCtxMod = ( eTType==TEXT_LUMA ) ? m_cCUAbsSCModel.get( 0, 0 ) + uiCtxSet : m_cCUAbsSCModel.get( 0, 0 ) + NUM_ABS_FLAG_CTX_LUMA + uiCtxSet;
1710        if ( firstC2FlagIdx != -1)
[2]1711        {
[56]1712          m_pcTDecBinIf->decodeBin( uiBin, baseCtxMod[0] ); 
1713          absCoeff[ firstC2FlagIdx ] = uiBin + 2;
[2]1714        }
[56]1715#else   
1716        baseCtxMod = ( eTType==TEXT_LUMA ) ? m_cCUAbsSCModel.get( 0, 0 ) + 3 * uiCtxSet : m_cCUAbsSCModel.get( 0, 0 ) + NUM_ABS_FLAG_CTX_LUMA + 3 * uiCtxSet;
1717        for( Int idx = 0; idx < numNonZero; idx++ )
1718        {
1719          if( absCoeff[ idx ] == 2 ) 
1720          {
1721            m_pcTDecBinIf->decodeBin( uiBin, baseCtxMod[c2] );
1722            absCoeff[ idx ] = uiBin + 2;
1723            c2 += (c2 < 2);
1724            uiNumOne++;
1725          }
1726        }
1727#endif
[2]1728      }
[56]1729
1730#if MULTIBITS_DATA_HIDING
1731      UInt coeffSigns;
1732      if ( signHidden && beValid )
1733      {
1734        m_pcTDecBinIf->decodeBinsEP( coeffSigns, numNonZero-1 );
1735        coeffSigns <<= 32 - (numNonZero-1);
1736      }
1737      else
1738      {
1739        m_pcTDecBinIf->decodeBinsEP( coeffSigns, numNonZero );
1740        coeffSigns <<= 32 - numNonZero;
1741      }
1742#else
1743      UInt coeffSigns;
1744      m_pcTDecBinIf->decodeBinsEP( coeffSigns, numNonZero );
1745      coeffSigns <<= 32 - numNonZero;
1746#endif
[2]1747     
[56]1748#if RESTRICT_GR1GR2FLAG_NUMBER
1749      Int iFirstCoeff2 = 1;   
1750      if (c1 == 0 || numNonZero > C1FLAG_NUMBER)
1751#else
1752      if (c1 == 0)
1753#endif
[2]1754      {
[56]1755        for( Int idx = 0; idx < numNonZero; idx++ )
[2]1756        {
[56]1757#if RESTRICT_GR1GR2FLAG_NUMBER   
1758          UInt baseLevel  = (idx < C1FLAG_NUMBER)? (2 + iFirstCoeff2) : 1;
[2]1759
[56]1760          if( absCoeff[ idx ] == baseLevel)
[2]1761          {
[56]1762            UInt uiLevel;
[2]1763            xReadGoRiceExGolomb( uiLevel, uiGoRiceParam );
[56]1764            absCoeff[ idx ] = uiLevel + baseLevel;
[2]1765          }
[56]1766
1767          if(absCoeff[ idx ] >= 2) 
[2]1768          {
[56]1769            iFirstCoeff2 = 0;
1770            uiNumOne++;
[2]1771          }
1772#else
[56]1773          if( absCoeff[ idx ] == 3 )
1774          {
1775            UInt uiLevel;
1776            xReadGoRiceExGolomb( uiLevel, uiGoRiceParam );
1777            absCoeff[ idx ] = uiLevel + 3;
1778          }
[2]1779#endif
1780        }
1781      }
[56]1782
1783      for( Int idx = 0; idx < numNonZero; idx++ )
[2]1784      {
[56]1785        Int blkPos = pos[ idx ];
1786#if MULTIBITS_DATA_HIDING
1787        // Signs applied later.
1788        pcCoef[ blkPos ] = absCoeff[ idx ];
1789        absSum += absCoeff[ idx ];
1790
1791        if ( idx == numNonZero-1 && signHidden && beValid )
1792        {
1793          // Infer sign of 1st element.
1794          if (absSum&0x1)
1795            pcCoef[ blkPos ] = -pcCoef[ blkPos ];
1796        }
1797        else
1798        {
1799          Int sign = static_cast<Int>( coeffSigns ) >> 31;
1800          pcCoef[ blkPos ] = ( pcCoef[ blkPos ] ^ sign ) - sign;
1801          coeffSigns <<= 1;
1802        }
1803#else
1804        Int sign = static_cast<Int>( coeffSigns ) >> 31;
1805        pcCoef[ blkPos ] = ( absCoeff[ idx ] ^ sign ) - sign;
1806        coeffSigns <<= 1;
1807#endif
[2]1808      }
1809    }
[56]1810    else
1811    {
1812      uiNumOne >>= 1;
1813    }
[2]1814  }
1815 
1816  return;
1817}
1818
1819
[56]1820#if SAO_UNIT_INTERLEAVING
1821Void TDecSbac::parseSaoUvlc (UInt& ruiVal)
[2]1822{
1823  UInt uiCode;
1824  Int  i;
[56]1825
1826  m_pcTDecBinIf->decodeBin( uiCode, m_cSaoUvlcSCModel.get( 0, 0, 0 ) );
[2]1827  if ( uiCode == 0 )
1828  {
1829    ruiVal = 0;
1830    return;
1831  }
[56]1832
[2]1833  i=1;
1834  while (1)
1835  {
[56]1836    m_pcTDecBinIf->decodeBin( uiCode, m_cSaoUvlcSCModel.get( 0, 0, 1 ) );
[2]1837    if ( uiCode == 0 ) break;
1838    i++;
1839  }
[56]1840
[2]1841  ruiVal = i;
1842}
1843
[56]1844Void TDecSbac::parseSaoSvlc (Int&  riVal)
[2]1845{
1846  UInt uiCode;
1847  Int  iSign;
1848  Int  i;
[56]1849
1850  m_pcTDecBinIf->decodeBin( uiCode, m_cSaoSvlcSCModel.get( 0, 0, 0 ) );
1851
[2]1852  if ( uiCode == 0 )
1853  {
1854    riVal = 0;
1855    return;
1856  }
[56]1857
[2]1858  // read sign
[56]1859  m_pcTDecBinIf->decodeBin( uiCode, m_cSaoSvlcSCModel.get( 0, 0, 1 ) );
1860
1861  if ( uiCode == 0 )
1862  {
1863    iSign =  1;
1864  }
1865  else
1866  {
1867    iSign = -1;
1868  }
1869
[2]1870  // read magnitude
1871  i=1;
1872  while (1)
1873  {
[56]1874    m_pcTDecBinIf->decodeBin( uiCode, m_cSaoSvlcSCModel.get( 0, 0, 2 ) );
[2]1875    if ( uiCode == 0 ) break;
1876    i++;
1877  }
[56]1878
[2]1879  riVal = i*iSign;
1880}
1881
[56]1882Void TDecSbac::parseSaoUflc (UInt&  riVal)
[2]1883{
1884  UInt uiSymbol;
[56]1885  riVal = 0;
1886  for (Int i=0;i<5;i++)
1887  {
1888    m_pcTDecBinIf->decodeBinEP ( uiSymbol );
1889    if (uiSymbol)
1890    {
1891      riVal |= (1<<i);
1892    }
1893  }
[2]1894}
[56]1895Void TDecSbac::parseSaoMergeLeft (UInt&  ruiVal, UInt uiCompIdx)
1896{
1897  UInt uiCode;
1898  m_pcTDecBinIf->decodeBin( uiCode, m_cSaoMergeLeftSCModel.get( 0, 0, uiCompIdx ) );
1899  ruiVal = (Int)uiCode;
1900}
[2]1901
[56]1902Void TDecSbac::parseSaoMergeUp (UInt&  ruiVal)
[2]1903{
1904  UInt uiCode;
[56]1905  m_pcTDecBinIf->decodeBin( uiCode, m_cSaoMergeUpSCModel.get( 0, 0, 0 ) );
1906  ruiVal = (Int)uiCode;
1907}
1908Void TDecSbac::parseSaoTypeIdx (UInt&  ruiVal)
1909{
1910  UInt uiCode;
[2]1911  Int  i;
[56]1912  m_pcTDecBinIf->decodeBin( uiCode, m_cSaoTypeIdxSCModel.get( 0, 0, 0 ) );
[2]1913  if ( uiCode == 0 )
1914  {
1915    ruiVal = 0;
1916    return;
1917  }
1918  i=1;
1919  while (1)
1920  {
[56]1921    m_pcTDecBinIf->decodeBin( uiCode, m_cSaoTypeIdxSCModel.get( 0, 0, 1 ) );
[2]1922    if ( uiCode == 0 ) break;
1923    i++;
1924  }
1925  ruiVal = i;
1926}
1927
[56]1928inline Void copySaoOneLcuParam(SaoLcuParam* psDst,  SaoLcuParam* psSrc)
[2]1929{
[56]1930  Int i;
1931  psDst->partIdx = psSrc->partIdx;
1932  psDst->typeIdx    = psSrc->typeIdx;
1933  if (psDst->typeIdx != -1)
1934  {
1935    if (psDst->typeIdx == SAO_BO)
1936    {
1937      psDst->bandPosition = psSrc->bandPosition ;
1938    }
1939    else
1940    {
1941      psDst->bandPosition = 0;
1942    }
1943    psDst->length  = psSrc->length;
1944    for (i=0;i<psDst->length;i++)
1945    {
1946      psDst->offset[i] = psSrc->offset[i];
1947    }
1948  }
1949  else
1950  {
1951    psDst->length  = 0;
1952    for (i=0;i<SAO_BO_LEN;i++)
1953    {
1954      psDst->offset[i] = 0;
1955    }
1956  }
1957}
1958Void TDecSbac::parseSaoOffset(SaoLcuParam* psSaoLcuParam)
1959{
1960  UInt uiSymbol;
1961  Int iSymbol;
1962  static Int iTypeLength[MAX_NUM_SAO_TYPE] = {
1963    SAO_EO_LEN,
1964    SAO_EO_LEN,
1965    SAO_EO_LEN,
1966    SAO_EO_LEN,
1967    SAO_BO_LEN
1968  }; 
[2]1969
[56]1970  parseSaoTypeIdx(uiSymbol);
1971  psSaoLcuParam->typeIdx = (Int)uiSymbol - 1;
1972  if (uiSymbol)
1973  {
1974    psSaoLcuParam->length = iTypeLength[psSaoLcuParam->typeIdx];
1975    if( psSaoLcuParam->typeIdx == SAO_BO )
1976    {
1977      // Parse Left Band Index
1978      parseSaoUflc( uiSymbol );
1979      psSaoLcuParam->bandPosition = uiSymbol;
1980      for(Int i=0; i< psSaoLcuParam->length; i++)
1981      {
1982        parseSaoSvlc(iSymbol);
1983        psSaoLcuParam->offset[i] = iSymbol;
1984      }   
1985    }
1986    else if( psSaoLcuParam->typeIdx < 4 )
1987    {
1988      parseSaoUvlc(uiSymbol); psSaoLcuParam->offset[0] = uiSymbol;
1989      parseSaoUvlc(uiSymbol); psSaoLcuParam->offset[1] = uiSymbol;
1990      parseSaoUvlc(uiSymbol); psSaoLcuParam->offset[2] = -(Int)uiSymbol;
1991      parseSaoUvlc(uiSymbol); psSaoLcuParam->offset[3] = -(Int)uiSymbol;
1992    }
1993  }
1994  else
1995  {
1996    psSaoLcuParam->length = 0;
1997  }
1998}
[2]1999
[56]2000Void TDecSbac::parseSaoOneLcuInterleaving(Int rx, Int ry, SAOParam* pSaoParam, TComDataCU* pcCU, Int iCUAddrInSlice, Int iCUAddrUpInSlice, Bool bLFCrossSliceBoundaryFlag)
2001{
2002  Int iAddr = pcCU->getAddr();
2003  UInt uiSymbol;
2004  for (Int iCompIdx=0; iCompIdx<3; iCompIdx++)
[2]2005  {
[56]2006    pSaoParam->saoLcuParam[iCompIdx][iAddr].mergeUpFlag    = 0;
2007    pSaoParam->saoLcuParam[iCompIdx][iAddr].mergeLeftFlag  = 0;
2008    pSaoParam->saoLcuParam[iCompIdx][iAddr].bandPosition   = 0;
2009    pSaoParam->saoLcuParam[iCompIdx][iAddr].typeIdx        = -1;
2010    pSaoParam->saoLcuParam[iCompIdx][iAddr].offset[0]     = 0;
2011    pSaoParam->saoLcuParam[iCompIdx][iAddr].offset[1]     = 0;
2012    pSaoParam->saoLcuParam[iCompIdx][iAddr].offset[2]     = 0;
2013    pSaoParam->saoLcuParam[iCompIdx][iAddr].offset[3]     = 0;
2014
2015    if (pSaoParam->bSaoFlag[iCompIdx])
2016    {
2017      if (rx>0 && iCUAddrInSlice!=0)
2018      {
2019        parseSaoMergeLeft(uiSymbol,iCompIdx); pSaoParam->saoLcuParam[iCompIdx][iAddr].mergeLeftFlag = (Int)uiSymbol;
2020      }
2021      else
2022      {
2023        pSaoParam->saoLcuParam[iCompIdx][iAddr].mergeLeftFlag = 0;
2024      }
2025
2026      if (pSaoParam->saoLcuParam[iCompIdx][iAddr].mergeLeftFlag==0)
2027      {
2028        if ((ry > 0) && (iCUAddrUpInSlice>0||bLFCrossSliceBoundaryFlag))
2029        {
2030          parseSaoMergeUp(uiSymbol);  pSaoParam->saoLcuParam[iCompIdx][iAddr].mergeUpFlag = uiSymbol;
2031        }
2032        else
2033        {
2034          pSaoParam->saoLcuParam[iCompIdx][iAddr].mergeUpFlag = 0;
2035        }
2036        if (!pSaoParam->saoLcuParam[iCompIdx][iAddr].mergeUpFlag)
2037        {
2038          parseSaoOffset(&(pSaoParam->saoLcuParam[iCompIdx][iAddr]));
2039        }
2040        else
2041        {
2042          copySaoOneLcuParam(&pSaoParam->saoLcuParam[iCompIdx][iAddr], &pSaoParam->saoLcuParam[iCompIdx][iAddr-pSaoParam->numCuInWidth]);
2043        }
2044      }
2045      else
2046      {
2047        copySaoOneLcuParam(&pSaoParam->saoLcuParam[iCompIdx][iAddr],  &pSaoParam->saoLcuParam[iCompIdx][iAddr-1]);
2048      }
2049    }
2050    else
2051    {
2052      pSaoParam->saoLcuParam[iCompIdx][iAddr].typeIdx = -1;
2053      pSaoParam->saoLcuParam[iCompIdx][iAddr].bandPosition = 0;
2054    }
[2]2055  }
[56]2056}
2057#endif
[2]2058
[56]2059/**
2060 - Initialize our contexts from the nominated source.
2061 .
2062 \param pSrc Contexts to be copied.
2063 */
2064Void TDecSbac::xCopyContextsFrom( TDecSbac* pSrc )
2065{
2066  memcpy(m_contextModels, pSrc->m_contextModels, m_numContextModels*sizeof(m_contextModels[0]));
2067}
[2]2068
[56]2069Void TDecSbac::xCopyFrom( TDecSbac* pSrc )
2070{
2071  m_pcTDecBinIf->copyState( pSrc->m_pcTDecBinIf );
[2]2072
[56]2073  m_uiLastQp           = pSrc->m_uiLastQp;
2074  xCopyContextsFrom( pSrc );
2075
2076}
2077
2078Void TDecSbac::load ( TDecSbac* pScr )
2079{
2080  xCopyFrom(pScr);
2081}
2082
2083Void TDecSbac::loadContexts ( TDecSbac* pScr )
2084{
2085  xCopyContextsFrom(pScr);
2086}
2087
2088#if OL_FLUSH
2089Void TDecSbac::decodeFlush ( )
2090{
2091  UInt uiBit;
2092  m_pcTDecBinIf->decodeBinTrm(uiBit);
2093  m_pcTDecBinIf->flush();
2094
2095}
2096#endif
2097
[100]2098#if HHI_DMM_WEDGE_INTRA || HHI_DMM_PRED_TEX || (LGE_EDGE_INTRA && LGE_EDGE_INTRA_DELTA_DC)
[56]2099Void TDecSbac::xReadExGolombLevel( UInt& ruiSymbol, ContextModel& rcSCModel  )
2100{
2101  UInt uiSymbol;
2102  UInt uiCount = 0;
2103  do
[2]2104  {
[56]2105    m_pcTDecBinIf->decodeBin( uiSymbol, rcSCModel );
2106    uiCount++;
[2]2107  }
[56]2108  while( uiSymbol && ( uiCount != 13 ) );
[2]2109
[56]2110  ruiSymbol = uiCount - 1;
2111
2112  if( uiSymbol )
2113  {
2114    xReadEpExGolomb( uiSymbol, 0 );
2115    ruiSymbol += uiSymbol + 1;
2116  }
2117
2118  return;
[2]2119}
2120#endif
[56]2121#if HHI_DMM_WEDGE_INTRA
2122Void TDecSbac::xParseWedgeFullInfo( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth )
2123{
2124  Int iIntraIdx = pcCU->getIntraSizeIdx(uiAbsPartIdx);
2125  Int iBits = g_aucWedgeFullBitsListIdx[iIntraIdx];
2126
2127  UInt uiSymbol, uiTabIdx = 0;
2128  for ( Int i = 0; i < iBits; i++ )
2129  {
2130    m_pcTDecBinIf->decodeBin( uiSymbol, m_cDmmDataSCModel.get(0, 0, 0) );
2131    uiTabIdx += ( uiSymbol && i == 0 ) ? 1 : 0;
2132    uiTabIdx += ( uiSymbol && i == 1 ) ? 2 : 0;
2133    uiTabIdx += ( uiSymbol && i == 2 ) ? 4 : 0;
2134    uiTabIdx += ( uiSymbol && i == 3 ) ? 8 : 0;
2135    uiTabIdx += ( uiSymbol && i == 4 ) ? 16 : 0;
2136    uiTabIdx += ( uiSymbol && i == 5 ) ? 32 : 0;
2137    uiTabIdx += ( uiSymbol && i == 6 ) ? 64 : 0;
2138    uiTabIdx += ( uiSymbol && i == 7 ) ? 128 : 0;
2139    uiTabIdx += ( uiSymbol && i == 8 ) ? 256 : 0;
2140    uiTabIdx += ( uiSymbol && i == 9 ) ? 512 : 0;
2141    uiTabIdx += ( uiSymbol && i == 10 ) ? 1024 : 0;
2142    uiTabIdx += ( uiSymbol && i == 11 ) ? 2048 : 0;
2143    uiTabIdx += ( uiSymbol && i == 12 ) ? 4096 : 0;
2144  }
2145
2146  pcCU->setWedgeFullTabIdxSubParts( uiTabIdx, uiAbsPartIdx, uiDepth );
2147}
2148
2149Void TDecSbac::xParseWedgeFullDeltaInfo( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth )
2150{
2151  Int iIntraIdx = pcCU->getIntraSizeIdx(uiAbsPartIdx);
2152  Int iBits = g_aucWedgeFullBitsListIdx[iIntraIdx];
2153
2154  UInt uiSymbol, uiTabIdx = 0;
2155  for ( Int i = 0; i < iBits; i++ )
2156  {
2157    m_pcTDecBinIf->decodeBin( uiSymbol, m_cDmmDataSCModel.get(0, 0, 0) );
2158    uiTabIdx += ( uiSymbol && i == 0 ) ? 1 : 0;
2159    uiTabIdx += ( uiSymbol && i == 1 ) ? 2 : 0;
2160    uiTabIdx += ( uiSymbol && i == 2 ) ? 4 : 0;
2161    uiTabIdx += ( uiSymbol && i == 3 ) ? 8 : 0;
2162    uiTabIdx += ( uiSymbol && i == 4 ) ? 16 : 0;
2163    uiTabIdx += ( uiSymbol && i == 5 ) ? 32 : 0;
2164    uiTabIdx += ( uiSymbol && i == 6 ) ? 64 : 0;
2165    uiTabIdx += ( uiSymbol && i == 7 ) ? 128 : 0;
2166    uiTabIdx += ( uiSymbol && i == 8 ) ? 256 : 0;
2167    uiTabIdx += ( uiSymbol && i == 9 ) ? 512 : 0;
2168    uiTabIdx += ( uiSymbol && i == 10 ) ? 1024 : 0;
2169    uiTabIdx += ( uiSymbol && i == 11 ) ? 2048 : 0;
2170    uiTabIdx += ( uiSymbol && i == 12 ) ? 4096 : 0;
2171  }
2172
2173  pcCU->setWedgeFullTabIdxSubParts( uiTabIdx, uiAbsPartIdx, uiDepth );
2174
2175  UInt uiDC1, uiDC2;
2176  xReadExGolombLevel( uiDC1, m_cDmmDataSCModel.get(0, 0, 1) );
2177  Int iDC1 = uiDC1;
2178  if ( uiDC1 )
2179  {
2180    UInt uiSign;
2181    m_pcTDecBinIf->decodeBinEP( uiSign );
2182    if ( uiSign )
2183    {
2184      iDC1 = -iDC1;
2185    }
2186  }
2187  xReadExGolombLevel( uiDC2, m_cDmmDataSCModel.get(0, 0, 1) );
2188  Int iDC2 = uiDC2;
2189  if ( uiDC2 )
2190  {
2191    UInt uiSign;
2192    m_pcTDecBinIf->decodeBinEP( uiSign );
2193    if ( uiSign )
2194    {
2195      iDC2 = -iDC2;
2196    }
2197  }
2198
2199  pcCU->setWedgeFullDeltaDC1SubParts( iDC1, uiAbsPartIdx, uiDepth );
2200  pcCU->setWedgeFullDeltaDC2SubParts( iDC2, uiAbsPartIdx, uiDepth );
2201}
2202
2203Void TDecSbac::xParseWedgePredDirInfo( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth )
2204{
2205  if( DMM_WEDGE_PREDDIR_DELTAEND_MAX > 0 )
2206  {
2207    UInt uiDeltaEnd = 0;
2208    m_pcTDecBinIf->decodeBin( uiDeltaEnd, m_cDmmDataSCModel.get(0, 0, 2) );
2209
2210    Int iDeltaEnd;
2211    if( uiDeltaEnd != 0 )
2212    {
2213      UInt uiAbsValMinus1;
2214      UInt uiSymbol;
2215      m_pcTDecBinIf->decodeBin( uiSymbol, m_cDmmDataSCModel.get(0, 0, 2) ); uiAbsValMinus1  = uiSymbol;
2216      m_pcTDecBinIf->decodeBin( uiSymbol, m_cDmmDataSCModel.get(0, 0, 2) ); uiAbsValMinus1 |= uiSymbol << 1;
2217      uiDeltaEnd = uiAbsValMinus1 + 1;
2218
2219      iDeltaEnd = uiDeltaEnd;
2220      UInt uiSign;
2221      m_pcTDecBinIf->decodeBinEP( uiSign );
2222      if( uiSign )
2223      {
2224        iDeltaEnd = -iDeltaEnd;
2225      }
2226    }
2227    else
2228    {
2229      iDeltaEnd = 0;
2230    }
2231    pcCU->setWedgePredDirDeltaEndSubParts( iDeltaEnd, uiAbsPartIdx, uiDepth );
2232  }
2233}
2234
2235Void TDecSbac::xParseWedgePredDirDeltaInfo( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth )
2236{
2237  if( DMM_WEDGE_PREDDIR_DELTAEND_MAX > 0 )
2238  {
2239    UInt uiDeltaEnd = 0;
2240    m_pcTDecBinIf->decodeBin( uiDeltaEnd, m_cDmmDataSCModel.get(0, 0, 2) );
2241
2242    Int iDeltaEnd;
2243    if( uiDeltaEnd != 0 )
2244    {
2245      UInt uiAbsValMinus1;
2246      UInt uiSymbol;
2247      m_pcTDecBinIf->decodeBin( uiSymbol, m_cDmmDataSCModel.get(0, 0, 2) ); uiAbsValMinus1  = uiSymbol;
2248      m_pcTDecBinIf->decodeBin( uiSymbol, m_cDmmDataSCModel.get(0, 0, 2) ); uiAbsValMinus1 |= uiSymbol << 1;
2249      uiDeltaEnd = uiAbsValMinus1 + 1;
2250
2251      iDeltaEnd = uiDeltaEnd;
2252      UInt uiSign;
2253      m_pcTDecBinIf->decodeBinEP( uiSign );
2254      if( uiSign )
2255      {
2256        iDeltaEnd = -iDeltaEnd;
2257      }
2258    }
2259    else
2260    {
2261      iDeltaEnd = 0;
2262    }
2263
2264    pcCU->setWedgePredDirDeltaEndSubParts( iDeltaEnd, uiAbsPartIdx, uiDepth );
2265  }
2266
2267  UInt uiDC1, uiDC2;
2268  xReadExGolombLevel( uiDC1, m_cDmmDataSCModel.get(0, 0, 1) );
2269  Int iDC1 = uiDC1;
2270  if ( uiDC1 )
2271  {
2272    UInt uiSign;
2273    m_pcTDecBinIf->decodeBinEP( uiSign );
2274    if ( uiSign )
2275    {
2276      iDC1 = -iDC1;
2277    }
2278  }
2279  xReadExGolombLevel( uiDC2, m_cDmmDataSCModel.get(0, 0, 1) );
2280  Int iDC2 = uiDC2;
2281  if ( uiDC2 )
2282  {
2283    UInt uiSign;
2284    m_pcTDecBinIf->decodeBinEP( uiSign );
2285    if ( uiSign )
2286    {
2287      iDC2 = -iDC2;
2288    }
2289  }
2290
2291  pcCU->setWedgePredDirDeltaDC1SubParts( iDC1, uiAbsPartIdx, uiDepth );
2292  pcCU->setWedgePredDirDeltaDC2SubParts( iDC2, uiAbsPartIdx, uiDepth );
2293}
2294#endif
2295#if HHI_DMM_PRED_TEX
2296Void TDecSbac::xParseWedgePredTexDeltaInfo( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth )
2297{
2298  UInt uiDC1, uiDC2;
2299  xReadExGolombLevel( uiDC1, m_cDmmDataSCModel.get(0, 0, 1) );
2300  Int iDC1 = uiDC1;
2301  if ( uiDC1 )
2302  {
2303    UInt uiSign;
2304    m_pcTDecBinIf->decodeBinEP( uiSign );
2305    if ( uiSign )
2306    {
2307      iDC1 = -iDC1;
2308    }
2309  }
2310  xReadExGolombLevel( uiDC2, m_cDmmDataSCModel.get(0, 0, 1) );
2311  Int iDC2 = uiDC2;
2312  if ( uiDC2 )
2313  {
2314    UInt uiSign;
2315    m_pcTDecBinIf->decodeBinEP( uiSign );
2316    if ( uiSign )
2317    {
2318      iDC2 = -iDC2;
2319    }
2320  }
2321
2322  pcCU->setWedgePredTexDeltaDC1SubParts( iDC1, uiAbsPartIdx, uiDepth );
2323  pcCU->setWedgePredTexDeltaDC2SubParts( iDC2, uiAbsPartIdx, uiDepth );
2324}
2325
2326Void TDecSbac::xParseContourPredTexDeltaInfo( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth )
2327{
2328  UInt uiDC1, uiDC2;
2329  xReadExGolombLevel( uiDC1, m_cDmmDataSCModel.get(0, 0, 1) );
2330  Int iDC1 = uiDC1;
2331  if ( uiDC1 )
2332  {
2333    UInt uiSign;
2334    m_pcTDecBinIf->decodeBinEP( uiSign );
2335    if ( uiSign )
2336    {
2337      iDC1 = -iDC1;
2338    }
2339  }
2340  xReadExGolombLevel( uiDC2, m_cDmmDataSCModel.get(0, 0, 1) );
2341  Int iDC2 = uiDC2;
2342  if ( uiDC2 )
2343  {
2344    UInt uiSign;
2345    m_pcTDecBinIf->decodeBinEP( uiSign );
2346    if ( uiSign )
2347    {
2348      iDC2 = -iDC2;
2349    }
2350  }
2351
2352  pcCU->setContourPredTexDeltaDC1SubParts( iDC1, uiAbsPartIdx, uiDepth );
2353  pcCU->setContourPredTexDeltaDC2SubParts( iDC2, uiAbsPartIdx, uiDepth );
2354}
2355#endif
[100]2356
2357#if LGE_EDGE_INTRA
2358Void TDecSbac::xParseEdgeIntraInfo( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth )
2359{
2360  UInt uiSymbol = 0;
2361
2362  // 1. Top(0) or Left(1)
2363  UChar ucLeft;
2364  m_pcTDecBinIf->decodeBinEP( uiSymbol );
2365  ucLeft = uiSymbol;
2366
2367  // 2. Start position (lowest bit first)
2368  UChar ucStart = 0;
2369  for( UInt ui = 0; ui < 6 - uiDepth; ui++ )
2370  {
2371    m_pcTDecBinIf->decodeBinEP( uiSymbol );
2372    ucStart |= (uiSymbol << ui);
2373  }
2374
2375  // 3. Number of edges
2376  UChar ucMax = 0;
2377  for( UInt ui = 0; ui < 7 - uiDepth; ui++ )
2378  {
2379    m_pcTDecBinIf->decodeBinEP( uiSymbol );
2380    ucMax |= (uiSymbol << ui);
2381  }
2382  ucMax++; // +1
2383
2384  // 4. Edges
2385  UChar* pucSymbolList = (UChar*) xMalloc( UChar, 256 * LGE_EDGE_INTRA_MAX_EDGE_NUM_PER_4x4 );
2386  UInt uiCtxEdgeIntra = pcCU->getCtxEdgeIntra( uiAbsPartIdx );
2387  for( Int iPtr = 0; iPtr < ucMax; iPtr++ )
2388  {
2389    UChar ucEdge = 0;
2390    UInt  uiReorderEdge = 0;
2391    // Left-friendly direction
2392    // 0 (   0deg) => 0
2393    // 1 (  45deg) => 10
2394    // 2 ( -45deg) => 110
2395    // 3 (  90deg) => 1110
2396    // 4 ( -90deg) => 11110
2397    // 5 ( 135deg) => 111110
2398    // 6 (-135deg) => 111111
2399    // Right-friendly direction
2400    // 0 (   0deg) => 0
2401    // 1 ( -45deg) => 10
2402    // 2 (  45deg) => 110
2403    // 3 ( -90deg) => 1110
2404    // 4 (  90deg) => 11110
2405    // 5 (-135deg) => 111110
2406    // 6 ( 135deg) => 111111
2407    // refer to a paper "An efficient chain code with Huffman coding"
2408    for( UInt ui = 0; ui < 6; ui++ )
2409    {
2410      m_pcTDecBinIf->decodeBin( uiSymbol, m_cEdgeIntraSCModel.get( 0, 0, uiCtxEdgeIntra ) );
2411      ucEdge <<= 1;
2412      ucEdge |= uiSymbol;
2413      if( uiSymbol == 0 )
2414        break;
2415    }
2416
2417    switch( ucEdge )
2418    {
2419    case 0 :  // "0"
2420      uiReorderEdge = 0;
2421      break;
2422    case 2 :  // "10"
2423      uiReorderEdge = 1;
2424      break;
2425    case 6 :  // "110"
2426      uiReorderEdge = 2;
2427      break;
2428    case 14 : // "1110"
2429      uiReorderEdge = 3;
2430      break;
2431    case 30 : // "11110"
2432      uiReorderEdge = 4;
2433      break;
2434    case 62 : // "111110"
2435      uiReorderEdge = 5;
2436      break;
2437    case 63 : // "111111"
2438      uiReorderEdge = 6;
2439      break;
2440    default :
2441      printf("parseIntraEdgeChain: error (unknown code %d)\n",ucEdge);
2442      assert(false);
2443      break;
2444    }
2445    pucSymbolList[iPtr] = uiReorderEdge;
2446  }
2447  /////////////////////
2448  // Edge Reconstruction
2449  Bool* pbRegion = pcCU->getEdgePartition( uiAbsPartIdx );
2450  pcCU->reconPartition( uiAbsPartIdx, uiDepth, ucLeft == 1, ucStart, ucMax, pucSymbolList, pbRegion );
2451  xFree( pucSymbolList );
2452}
2453#endif
2454
[56]2455//! \}
Note: See TracBrowser for help on using the repository browser.