source: 3DVCSoftware/branches/HTM-4.0.1-VSP-dev0/source/Lib/TLibDecoder/TDecSbac.cpp @ 193

Last change on this file since 193 was 193, checked in by mitsubishi-htm, 12 years ago

A second release, as planned

  • Migrate to HTM 4.1
  • Move VSP related switches to cfg file instead of #define in the source code
  • A few bug fixes
  • For VC project files, only VC9 file is updated

TODO

  • Migrate to HTM 5.0, to be used as anchor for CE1 toward Geneva meeting
  • Property svn:eol-style set to native
File size: 76.5 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-2012, 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 HHI_INTER_VIEW_RESIDUAL_PRED
57, m_cResPredFlagSCModel       ( 1,             1,               NUM_RES_PRED_FLAG_CTX         , m_contextModels + m_numContextModels, m_numContextModels)
58#endif
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)
83#else
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)
86#endif
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)
94#endif
95#if HHI_DMM_WEDGE_INTRA || HHI_DMM_PRED_TEX
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)
99#endif
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
106{
107  assert( m_numContextModels <= MAX_NUM_CTX_MOD );
108  m_iSliceGranularity = 0;
109}
110
111TDecSbac::~TDecSbac()
112{
113}
114
115// ====================================================================================================================
116// Public member functions
117// ====================================================================================================================
118
119#if CABAC_INIT_FLAG
120Void TDecSbac::resetEntropy(TComSlice* pSlice)
121{
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 );
152#endif
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 );
157#else
158  m_cCUXPosiSCModel.initBuffer           ( sliceType, qp, (UChar*)INIT_CU_X_POS );
159  m_cCUYPosiSCModel.initBuffer           ( sliceType, qp, (UChar*)INIT_CU_Y_POS );
160#endif
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 );
187#endif
188
189  m_cCUTransSubdivFlagSCModel.initBuffer ( sliceType, qp, (UChar*)INIT_TRANS_SUBDIV_FLAG );
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
196  m_uiLastDQpNonZero  = 0;
197#if HHI_DMM_WEDGE_INTRA || HHI_DMM_PRED_TEX
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 );
201#endif
202 
203  // new structure
204  m_uiLastQp          = qp;
205 
206  m_pcTDecBinIf->start();
207}
208
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
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 
346  if ( --uiCount )
347  {
348    UInt bins;
349    m_pcTDecBinIf->decodeBinsEP( bins, uiCount );
350    uiSymbol += bins;
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
402  if ( ruiGoRiceParam > 0 )
403  {
404    m_pcTDecBinIf->decodeBinsEP( uiRemainder, ruiGoRiceParam );   
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
416#if EIGHT_BITS_RICE_CODE
417  ruiGoRiceParam = g_aauiGoRiceUpdate[ ruiGoRiceParam ][ min<UInt>( ruiSymbol, 23 ) ];
418#else
419  ruiGoRiceParam = g_aauiGoRiceUpdate[ ruiGoRiceParam ][ min<UInt>( ruiSymbol, 15 ) ];
420#endif
421
422  return;
423}
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 )
435{
436  UInt uiSymbol;
437#if BURST_IPCM
438  Int numSubseqIPCM = 0;
439  Bool readPCMSampleFlag = false;
440
441  if(pcCU->getNumSucIPCM() > 0) 
442  {
443    readPCMSampleFlag = true;
444  }
445  else
446  {
447    m_pcTDecBinIf->decodeBinTrm(uiSymbol);
448
449    if (uiSymbol)
450    {
451      readPCMSampleFlag = true;
452      m_pcTDecBinIf->decodeNumSubseqIPCM(numSubseqIPCM);
453      pcCU->setNumSucIPCM(numSubseqIPCM + 1);
454      m_pcTDecBinIf->decodePCMAlignBits();
455    }
456  }
457#else
458  m_pcTDecBinIf->decodeBinTrm(uiSymbol);
459#endif
460
461#if BURST_IPCM
462  if (readPCMSampleFlag == true)
463#else
464  if (uiSymbol)
465#endif
466  {
467    Bool bIpcmFlag = true;
468
469#if !BURST_IPCM
470    m_pcTDecBinIf->decodePCMAlignBits();
471#endif
472
473    pcCU->setPartSizeSubParts  ( SIZE_2Nx2N, uiAbsPartIdx, uiDepth );
474    pcCU->setSizeSubParts      ( g_uiMaxCUWidth>>uiDepth, g_uiMaxCUHeight>>uiDepth, uiAbsPartIdx, uiDepth );
475    pcCU->setIPCMFlagSubParts  ( bIpcmFlag, uiAbsPartIdx, uiDepth );
476
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
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 ) );
563  DTRACE_CABAC_VL( g_nSymbolCounter++ );
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#if FORCE_REF_VSP==1
581Void TDecSbac::parseVspFlag( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth )
582{
583  if( pcCU->getSlice()->isIntra() || pcCU->getSlice()->getViewId()==0 )
584  {
585    return;
586  }
587 
588  UInt uiSymbol = 0;
589  UInt uiCtxSkip = pcCU->getCtxSkipFlag( uiAbsPartIdx );
590  m_pcTDecBinIf->decodeBin( uiSymbol, m_cCUSkipFlagSCModel.get( 0, 0, uiCtxSkip ) );
591  DTRACE_CABAC_VL( g_nSymbolCounter++ );
592  DTRACE_CABAC_T( "\tVspFlag" );
593  DTRACE_CABAC_T( "\tuiCtxSkip: ");
594  DTRACE_CABAC_V( uiCtxSkip );
595  DTRACE_CABAC_T( "\tuiSymbol: ");
596  DTRACE_CABAC_V( uiSymbol );
597  DTRACE_CABAC_T( "\n");
598 
599  if( uiSymbol )
600  {
601    pcCU->setPredModeSubParts( MODE_SYNTH, uiAbsPartIdx, uiDepth );
602  }
603}
604#endif
605
606/** parse merge flag
607 * \param pcCU
608 * \param uiAbsPartIdx
609 * \param uiDepth
610 * \param uiPUIdx
611 * \returns Void
612 */
613Void TDecSbac::parseMergeFlag ( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth, UInt uiPUIdx )
614{
615  UInt uiSymbol;
616  m_pcTDecBinIf->decodeBin( uiSymbol, *m_cCUMergeFlagExtSCModel.get( 0 ) );
617  pcCU->setMergeFlagSubParts( uiSymbol ? true : false, uiAbsPartIdx, uiPUIdx, uiDepth );
618
619  DTRACE_CABAC_VL( g_nSymbolCounter++ );
620  DTRACE_CABAC_T( "\tMergeFlag: " );
621  DTRACE_CABAC_V( uiSymbol );
622  DTRACE_CABAC_T( "\tAddress: " );
623  DTRACE_CABAC_V( pcCU->getAddr() );
624  DTRACE_CABAC_T( "\tuiAbsPartIdx: " );
625  DTRACE_CABAC_V( uiAbsPartIdx );
626  DTRACE_CABAC_T( "\n" );
627}
628
629Void TDecSbac::parseMergeIndex ( TComDataCU* pcCU, UInt& ruiMergeIndex, UInt uiAbsPartIdx, UInt uiDepth )
630{
631  UInt uiNumCand = MRG_MAX_NUM_CANDS;
632#if !MRG_IDX_CTX_RED 
633  UInt auiCtx[4] = { 0, 1, 2, 3 };
634#endif
635  UInt uiUnaryIdx = 0;
636  uiNumCand = pcCU->getSlice()->getMaxNumMergeCand();
637#if HHI_MPI
638#if VSP_N
639  TComDataCU* pcTextCU = pcCU->getSlice()->getSPS()->getUseMVI() ? pcCU->getSlice()->getTexturePic()->getCU( pcCU->getAddr() ) : NULL;
640  Int aiRefIdxVsp[2] = { pcTextCU ? pcTextCU->getCUMvField( RefPicList(0) )->getRefIdx( uiAbsPartIdx ) : -1,
641                         pcTextCU ? pcTextCU->getCUMvField( RefPicList(1) )->getRefIdx( uiAbsPartIdx ) : -1 };
642#if VSP_CFG
643  const Bool bMVIAvailable = (pcCU->getSlice()->getSPS()->getVspDepthPresentFlag() || pcCU->getSlice()->getViewId()==0) 
644                                ? pcCU->getSlice()->getSPS()->getUseMVI() && pcCU->getSlice()->getSliceType() != I_SLICE 
645                                : pcCU->getSlice()->getSPS()->getUseMVI() && pcCU->getSlice()->getSliceType() != I_SLICE
646                                  && !( aiRefIdxVsp[0] >= pcCU->getSlice()->getNumRefIdx( RefPicList(0) ) )
647                                  && !( aiRefIdxVsp[1] >= pcCU->getSlice()->getNumRefIdx( RefPicList(1) ) );
648#else
649  const Bool bMVIAvailable = pcCU->getSlice()->getVspDepthDisableFlag() ? pcCU->getSlice()->getSPS()->getUseMVI() && pcCU->getSlice()->getSliceType() != I_SLICE
650                                                                          && !( aiRefIdxVsp[0] >= 0 && pcTextCU->isVspRef( RefPicList(0), aiRefIdxVsp[0] ) )
651                                                                          && !( aiRefIdxVsp[1] >= 0 && pcTextCU->isVspRef( RefPicList(1), aiRefIdxVsp[1] ) ) 
652                                                                        : pcCU->getSlice()->getSPS()->getUseMVI() && pcCU->getSlice()->getSliceType() != I_SLICE;
653#endif
654#endif
655  const UInt uiMviMergePos = bMVIAvailable ? HHI_MPI_MERGE_POS : uiNumCand;
656#endif
657  if ( uiNumCand > 1 )
658  {
659    for( ; uiUnaryIdx < uiNumCand - 1; ++uiUnaryIdx )
660    {
661      UInt uiSymbol = 0;
662#if MRG_IDX_CTX_RED
663      if ( uiUnaryIdx==0 )
664      {
665        m_pcTDecBinIf->decodeBin( uiSymbol, m_cCUMergeIdxExtSCModel.get( 0, 0, 0 ) );
666      }
667      else
668      {
669        m_pcTDecBinIf->decodeBinEP( uiSymbol );
670      }
671#else
672      m_pcTDecBinIf->decodeBin( uiSymbol, m_cCUMergeIdxExtSCModel.get( 0, 0, auiCtx[uiUnaryIdx] ) );
673#endif
674      if( uiSymbol == 0 )
675      {
676        break;
677      }
678    }
679  }
680  ruiMergeIndex = uiUnaryIdx;
681
682  DTRACE_CABAC_VL( g_nSymbolCounter++ )
683  DTRACE_CABAC_T( "\tparseMergeIndex()" )
684  DTRACE_CABAC_T( "\tuiMRGIdx= " )
685  DTRACE_CABAC_V( ruiMergeIndex )
686  DTRACE_CABAC_T( "\n" )
687#if HHI_MPI
688  if( ruiMergeIndex > uiMviMergePos )
689  {
690    assert( bMVIAvailable );
691    ruiMergeIndex--;
692  }
693  else if( ruiMergeIndex == uiMviMergePos )
694  {
695    assert( bMVIAvailable );
696    pcCU->setTextureModeDepthSubParts( uiDepth, uiAbsPartIdx, uiDepth );
697  }
698#endif
699}
700
701#if HHI_INTER_VIEW_RESIDUAL_PRED
702Void
703TDecSbac::parseResPredFlag( TComDataCU* pcCU, Bool& rbResPredFlag, UInt uiAbsPartIdx, UInt uiDepth )
704{
705  UInt uiCtx    = pcCU->getCtxResPredFlag( uiAbsPartIdx );
706  UInt uiSymbol = 0;
707  m_pcTDecBinIf->decodeBin( uiSymbol, m_cResPredFlagSCModel.get( 0, 0, uiCtx ) );
708  rbResPredFlag = ( uiSymbol != 0 );
709}
710#endif
711
712#if HHI_INTER_VIEW_MOTION_PRED
713Void TDecSbac::parseMVPIdx      ( Int& riMVPIdx, Int iNumAMVPCands )
714{
715  UInt uiSymbol;
716  xReadUnaryMaxSymbol(uiSymbol, m_cMVPIdxSCModel.get(0), 1, iNumAMVPCands-1);
717  riMVPIdx = uiSymbol;
718}
719#else
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#endif
727
728Void TDecSbac::parseSplitFlag     ( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth )
729{
730  if( uiDepth == g_uiMaxCUDepth - g_uiAddCUDepth )
731  {
732    pcCU->setDepthSubParts( uiDepth, uiAbsPartIdx );
733    return;
734  }
735 
736  UInt uiSymbol;
737  m_pcTDecBinIf->decodeBin( uiSymbol, m_cCUSplitFlagSCModel.get( 0, 0, pcCU->getCtxSplitFlag( uiAbsPartIdx, uiDepth ) ) );
738  DTRACE_CABAC_VL( g_nSymbolCounter++ )
739  DTRACE_CABAC_T( "\tSplitFlag\n" )
740  pcCU->setDepthSubParts( uiDepth + uiSymbol, uiAbsPartIdx );
741 
742  return;
743}
744
745/** parse partition size
746 * \param pcCU
747 * \param uiAbsPartIdx
748 * \param uiDepth
749 * \returns Void
750 */
751Void TDecSbac::parsePartSize( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth )
752{
753  UInt uiSymbol, uiMode = 0;
754  PartSize eMode;
755 
756  if ( pcCU->isIntra( uiAbsPartIdx ) )
757  {
758    uiSymbol = 1;
759    if( uiDepth == g_uiMaxCUDepth - g_uiAddCUDepth )
760    {
761      m_pcTDecBinIf->decodeBin( uiSymbol, m_cCUPartSizeSCModel.get( 0, 0, 0) );
762    }
763    eMode = uiSymbol ? SIZE_2Nx2N : SIZE_NxN;
764    UInt uiTrLevel = 0;   
765    UInt uiWidthInBit  = g_aucConvertToBit[pcCU->getWidth(uiAbsPartIdx)]+2;
766    UInt uiTrSizeInBit = g_aucConvertToBit[pcCU->getSlice()->getSPS()->getMaxTrSize()]+2;
767    uiTrLevel          = uiWidthInBit >= uiTrSizeInBit ? uiWidthInBit - uiTrSizeInBit : 0;
768    if( eMode == SIZE_NxN )
769    {
770      pcCU->setTrIdxSubParts( 1+uiTrLevel, uiAbsPartIdx, uiDepth );
771    }
772    else
773    {
774      pcCU->setTrIdxSubParts( uiTrLevel, uiAbsPartIdx, uiDepth );
775    }
776  }
777  else
778  {
779    UInt uiMaxNumBits = 2;
780    if( uiDepth == g_uiMaxCUDepth - g_uiAddCUDepth && !( pcCU->getSlice()->getSPS()->getDisInter4x4() && (g_uiMaxCUWidth>>uiDepth) == 8 && (g_uiMaxCUHeight>>uiDepth) == 8 ) )
781    {
782      uiMaxNumBits ++;
783    }
784    for ( UInt ui = 0; ui < uiMaxNumBits; ui++ )
785    {
786      m_pcTDecBinIf->decodeBin( uiSymbol, m_cCUPartSizeSCModel.get( 0, 0, ui) );
787      if ( uiSymbol )
788      {
789        break;
790      }
791      uiMode++;
792    }
793    eMode = (PartSize) uiMode;
794    if ( pcCU->getSlice()->getSPS()->getAMPAcc( uiDepth ) )
795    {
796      if (eMode == SIZE_2NxN)
797      {
798#if AMP_CTX
799          m_pcTDecBinIf->decodeBin(uiSymbol, m_cCUAMPSCModel.get( 0, 0, 0 ));
800#else
801        m_pcTDecBinIf->decodeBin(uiSymbol, m_cCUYPosiSCModel.get( 0, 0, 0 ));
802#endif
803        if (uiSymbol == 0)
804        {
805#if AMP_CTX
806          m_pcTDecBinIf->decodeBinEP(uiSymbol);
807#else
808          m_pcTDecBinIf->decodeBin(uiSymbol, m_cCUYPosiSCModel.get( 0, 0, 1 ));
809#endif
810          eMode = (uiSymbol == 0? SIZE_2NxnU : SIZE_2NxnD);
811        }
812      }
813      else if (eMode == SIZE_Nx2N)
814      {
815#if AMP_CTX
816        m_pcTDecBinIf->decodeBin(uiSymbol, m_cCUAMPSCModel.get( 0, 0, 0 ));
817#else
818        m_pcTDecBinIf->decodeBin(uiSymbol, m_cCUXPosiSCModel.get( 0, 0, 0 ));
819#endif
820        if (uiSymbol == 0)
821        {
822#if AMP_CTX
823          m_pcTDecBinIf->decodeBinEP(uiSymbol);
824#else
825          m_pcTDecBinIf->decodeBin(uiSymbol, m_cCUXPosiSCModel.get( 0, 0, 1 ));
826#endif
827          eMode = (uiSymbol == 0? SIZE_nLx2N : SIZE_nRx2N);
828        }
829      }
830    }
831  }
832  pcCU->setPartSizeSubParts( eMode, uiAbsPartIdx, uiDepth );
833  pcCU->setSizeSubParts( g_uiMaxCUWidth>>uiDepth, g_uiMaxCUHeight>>uiDepth, uiAbsPartIdx, uiDepth );
834}
835
836/** parse prediction mode
837 * \param pcCU
838 * \param uiAbsPartIdx
839 * \param uiDepth
840 * \returns Void
841 */
842Void TDecSbac::parsePredMode( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth )
843{
844  if( pcCU->getSlice()->isIntra() )
845  {
846    pcCU->setPredModeSubParts( MODE_INTRA, uiAbsPartIdx, uiDepth );
847    return;
848  }
849 
850  UInt uiSymbol;
851  Int  iPredMode = MODE_INTER;
852  m_pcTDecBinIf->decodeBin( uiSymbol, m_cCUPredModeSCModel.get( 0, 0, 0 ) );
853  iPredMode += uiSymbol;
854  pcCU->setPredModeSubParts( (PredMode)iPredMode, uiAbsPartIdx, uiDepth );
855}
856 
857Void TDecSbac::parseIntraDirLumaAng  ( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth )
858{
859  UInt uiSymbol;
860  Int  intraPredMode;
861
862#if HHI_DMM_WEDGE_INTRA || HHI_DMM_PRED_TEX
863  UInt uiFlag = 0;
864  if( pcCU->getSlice()->getSPS()->getUseDMM() && (g_uiMaxCUWidth>>uiDepth) <= DMM_WEDGEMODEL_MAX_SIZE )
865  {
866    m_pcTDecBinIf->decodeBin( uiFlag, m_cDmmFlagSCModel.get(0, 0, 0) );
867  }
868  if( uiFlag )
869  {
870    UInt uiDMMode;
871
872#if HHI_DMM_WEDGE_INTRA && HHI_DMM_PRED_TEX
873    m_pcTDecBinIf->decodeBin( uiSymbol, m_cDmmModeSCModel.get(0, 0, 0) ); uiDMMode  = uiSymbol;
874    m_pcTDecBinIf->decodeBin( uiSymbol, m_cDmmModeSCModel.get(0, 0, 0) ); uiDMMode |= uiSymbol << 1;
875    if ( pcCU->getPartitionSize( uiAbsPartIdx ) != SIZE_NxN && g_uiMaxCUWidth>>uiDepth > 4 )
876    {
877      m_pcTDecBinIf->decodeBin( uiSymbol, m_cDmmModeSCModel.get(0, 0, 0) ); uiDMMode |= uiSymbol << 2;
878    }
879#else
880    m_pcTDecBinIf->decodeBin( uiSymbol, m_cDmmModeSCModel.get(0, 0, 0) ); uiDMMode  = uiSymbol;
881    if ( pcCU->getPartitionSize( uiAbsPartIdx ) != SIZE_NxN && g_uiMaxCUWidth>>uiDepth > 4 )
882    {
883      m_pcTDecBinIf->decodeBin( uiSymbol, m_cDmmModeSCModel.get(0, 0, 0) ); uiDMMode |= uiSymbol << 1;
884    }
885#endif
886    intraPredMode = uiDMMode + NUM_INTRA_MODE;
887
888#if HHI_DMM_WEDGE_INTRA
889    if( intraPredMode == DMM_WEDGE_FULL_IDX )          { xParseWedgeFullInfo          ( pcCU, uiAbsPartIdx, uiDepth ); }
890    if( intraPredMode == DMM_WEDGE_FULL_D_IDX )        { xParseWedgeFullDeltaInfo     ( pcCU, uiAbsPartIdx, uiDepth ); }
891    if( intraPredMode == DMM_WEDGE_PREDDIR_IDX )       { xParseWedgePredDirInfo       ( pcCU, uiAbsPartIdx, uiDepth ); }
892    if( intraPredMode == DMM_WEDGE_PREDDIR_D_IDX )     { xParseWedgePredDirDeltaInfo  ( pcCU, uiAbsPartIdx, uiDepth ); }
893#endif
894#if HHI_DMM_PRED_TEX
895    if( intraPredMode == DMM_WEDGE_PREDTEX_D_IDX )     { xParseWedgePredTexDeltaInfo  ( pcCU, uiAbsPartIdx, uiDepth ); }
896    if( intraPredMode == DMM_CONTOUR_PREDTEX_D_IDX )   { xParseContourPredTexDeltaInfo( pcCU, uiAbsPartIdx, uiDepth ); }
897#endif
898  }
899  else
900  {
901#endif
902#if !LOGI_INTRA_NAME_3MPM
903    Int iIntraIdx = pcCU->getIntraSizeIdx(uiAbsPartIdx);
904#endif
905
906#if LGE_EDGE_INTRA
907    Bool bCodeEdgeIntra = false;
908    if( pcCU->getSlice()->getSPS()->isDepth() )
909    {
910      UInt uiPUWidth = pcCU->getWidth( uiAbsPartIdx ) >> (pcCU->getPartitionSize( uiAbsPartIdx ) == SIZE_NxN ? 1 : 0);
911      if( uiPUWidth <= LGE_EDGE_INTRA_MAX_SIZE && uiPUWidth >= LGE_EDGE_INTRA_MIN_SIZE )
912        bCodeEdgeIntra = true;
913    }
914#endif
915
916#if LOGI_INTRA_NAME_3MPM
917    Int uiPreds[3] = {-1, -1, -1};
918#else
919    Int uiPreds[2] = {-1, -1};
920#endif
921    Int uiPredNum = pcCU->getIntraDirLumaPredictor(uiAbsPartIdx, uiPreds); 
922#if LGE_EDGE_INTRA
923    UInt uiCheckBit = 0;
924#endif
925
926    m_pcTDecBinIf->decodeBin( uiSymbol, m_cCUIntraPredSCModel.get( 0, 0, 0) );
927
928    if ( uiSymbol )
929    {
930      m_pcTDecBinIf->decodeBinEP( uiSymbol );
931#if LOGI_INTRA_NAME_3MPM
932      if (uiSymbol)
933      {
934        m_pcTDecBinIf->decodeBinEP( uiSymbol );
935        uiSymbol++;
936      }
937#endif
938      intraPredMode = uiPreds[uiSymbol];
939    }
940    else
941    {
942      intraPredMode = 0;
943
944#if LOGI_INTRA_NAME_3MPM
945
946      m_pcTDecBinIf->decodeBinsEP( uiSymbol, 5 );
947#if LGE_EDGE_INTRA
948      if (bCodeEdgeIntra)
949      {
950        if (uiSymbol==31)
951        {
952          m_pcTDecBinIf->decodeBinsEP(uiCheckBit,1);
953          if (uiCheckBit)
954            uiSymbol = EDGE_INTRA_IDX;
955        }
956      }
957#endif
958      intraPredMode = uiSymbol;
959
960      //postponed sorting of MPMs (only in remaining branch)
961      if (uiPreds[0] > uiPreds[1])
962      { 
963        std::swap(uiPreds[0], uiPreds[1]); 
964      }
965      if (uiPreds[0] > uiPreds[2])
966      {
967        std::swap(uiPreds[0], uiPreds[2]);
968      }
969      if (uiPreds[1] > uiPreds[2])
970      {
971        std::swap(uiPreds[1], uiPreds[2]);
972      }
973#else
974      m_pcTDecBinIf->decodeBinsEP( uiSymbol, g_aucIntraModeBitsAng[iIntraIdx] - 1 );
975      intraPredMode = uiSymbol;
976
977      if ( intraPredMode == 31 )
978      {
979        m_pcTDecBinIf->decodeBinEP( uiSymbol );
980        intraPredMode += uiSymbol;     
981      }
982#endif
983#if LGE_EDGE_INTRA
984      if ( intraPredMode != EDGE_INTRA_IDX)
985      {
986#endif
987        for ( Int i = 0; i < uiPredNum; i++ )
988        {
989          intraPredMode += ( intraPredMode >= uiPreds[i] );
990        }
991#if LGE_EDGE_INTRA
992      }
993#endif
994    }
995
996#if LGE_EDGE_INTRA
997    if( intraPredMode == EDGE_INTRA_IDX )
998    {
999      xParseEdgeIntraInfo( pcCU, uiAbsPartIdx, uiDepth );
1000#if LGE_EDGE_INTRA_DELTA_DC
1001      m_pcTDecBinIf->decodeBin( uiSymbol, m_cEdgeIntraDeltaDCSCModel.get(0, 0, 0) );
1002      if( uiSymbol )
1003      {
1004        intraPredMode = EDGE_INTRA_DELTA_IDX;
1005        Int iDeltaDC0;
1006        Int iDeltaDC1;
1007
1008        xReadExGolombLevel( (UInt &) iDeltaDC0, m_cEdgeIntraDeltaDCSCModel.get(0, 0, 1) );
1009        if( iDeltaDC0 != 0 )
1010        {
1011          UInt uiSign;
1012          m_pcTDecBinIf->decodeBinEP( uiSign );
1013          if ( uiSign )
1014          {
1015            iDeltaDC0 = -iDeltaDC0;
1016          }
1017        }
1018        xReadExGolombLevel( (UInt &) iDeltaDC1, m_cEdgeIntraDeltaDCSCModel.get(0, 0, 1) );
1019        if( iDeltaDC1 != 0 )
1020        {
1021          UInt uiSign;
1022          m_pcTDecBinIf->decodeBinEP( uiSign );
1023          if ( uiSign )
1024          {
1025            iDeltaDC1 = -iDeltaDC1;
1026          }
1027        }
1028
1029        pcCU->setEdgeDeltaDC0( uiAbsPartIdx, iDeltaDC0 );
1030        pcCU->setEdgeDeltaDC1( uiAbsPartIdx, iDeltaDC1 );
1031      }
1032#endif
1033    }
1034#endif
1035
1036#if HHI_DMM_WEDGE_INTRA || HHI_DMM_PRED_TEX
1037  }
1038#endif
1039
1040  pcCU->setLumaIntraDirSubParts( (UChar)intraPredMode, uiAbsPartIdx, uiDepth );
1041}
1042
1043Void TDecSbac::parseIntraDirChroma( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth )
1044{
1045  UInt uiSymbol;
1046
1047  m_pcTDecBinIf->decodeBin( uiSymbol, m_cCUChromaPredSCModel.get( 0, 0, 0 ) );
1048
1049  if( uiSymbol == 0 )
1050  {
1051    uiSymbol = DM_CHROMA_IDX;
1052  } 
1053  else 
1054  {
1055    if( pcCU->getSlice()->getSPS()->getUseLMChroma() )
1056    {
1057      m_pcTDecBinIf->decodeBin( uiSymbol, m_cCUChromaPredSCModel.get( 0, 0, 1 ) );
1058    }
1059    else
1060    {
1061      uiSymbol = 1;
1062    }
1063
1064    if( uiSymbol == 0 )
1065    {
1066      uiSymbol = LM_CHROMA_IDX;
1067    } 
1068    else
1069    {
1070      UInt uiIPredMode;
1071#if CHROMA_MODE_CODING
1072      m_pcTDecBinIf->decodeBinsEP( uiIPredMode, 2 );
1073#else
1074      xReadUnaryMaxSymbol( uiIPredMode, m_cCUChromaPredSCModel.get( 0, 0 ) + 1, 0, 3 );
1075#endif
1076      UInt uiAllowedChromaDir[ NUM_CHROMA_MODE ];
1077      pcCU->getAllowedChromaDir( uiAbsPartIdx, uiAllowedChromaDir );
1078      uiSymbol = uiAllowedChromaDir[ uiIPredMode ];
1079    }
1080  }
1081  pcCU->setChromIntraDirSubParts( uiSymbol, uiAbsPartIdx, uiDepth );
1082  return;
1083}
1084
1085Void TDecSbac::parseInterDir( TComDataCU* pcCU, UInt& ruiInterDir, UInt uiAbsPartIdx, UInt uiDepth )
1086{
1087  UInt uiSymbol;
1088  const UInt uiCtx = pcCU->getCtxInterDir( uiAbsPartIdx );
1089  ContextModel *pCtx = m_cCUInterDirSCModel.get( 0 );
1090  m_pcTDecBinIf->decodeBin( uiSymbol, *( pCtx + uiCtx ) );
1091
1092  if( uiSymbol )
1093  {
1094    uiSymbol = 2;
1095  }
1096
1097  uiSymbol++;
1098  ruiInterDir = uiSymbol;
1099  return;
1100}
1101
1102Void TDecSbac::parseRefFrmIdx( TComDataCU* pcCU, Int& riRefFrmIdx, UInt uiAbsPartIdx, UInt uiDepth, RefPicList eRefList )
1103{
1104  UInt uiSymbol;
1105
1106  if(pcCU->getSlice()->getNumRefIdx(REF_PIC_LIST_C ) > 0 && eRefList==REF_PIC_LIST_C)
1107  {
1108    ContextModel *pCtx = m_cCURefPicSCModel.get( 0 );
1109    m_pcTDecBinIf->decodeBin( uiSymbol, *pCtx );
1110
1111    if( uiSymbol )
1112    {
1113      xReadUnaryMaxSymbol( uiSymbol, pCtx + 1, 1, pcCU->getSlice()->getNumRefIdx( REF_PIC_LIST_C )-2 );
1114      uiSymbol++;
1115    }
1116    riRefFrmIdx = uiSymbol;
1117  }
1118  else
1119  {
1120    ContextModel *pCtx = m_cCURefPicSCModel.get( 0 );
1121    m_pcTDecBinIf->decodeBin( uiSymbol, *pCtx );
1122
1123    if( uiSymbol )
1124    {
1125      xReadUnaryMaxSymbol( uiSymbol, pCtx + 1, 1, pcCU->getSlice()->getNumRefIdx( eRefList )-2 );
1126      uiSymbol++;
1127    }
1128    riRefFrmIdx = uiSymbol;
1129  }
1130
1131  return;
1132}
1133
1134Void TDecSbac::parseMvd( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiPartIdx, UInt uiDepth, RefPicList eRefList )
1135{
1136  UInt uiSymbol;
1137  UInt uiHorAbs;
1138  UInt uiVerAbs;
1139  UInt uiHorSign = 0;
1140  UInt uiVerSign = 0;
1141  ContextModel *pCtx = m_cCUMvdSCModel.get( 0 );
1142
1143#if H0111_MVD_L1_ZERO
1144  if(pcCU->getSlice()->getMvdL1ZeroFlag() && eRefList == REF_PIC_LIST_1 && pcCU->getInterDir(uiAbsPartIdx)==3)
1145  {
1146    uiHorAbs=0;
1147    uiVerAbs=0;
1148  }
1149  else
1150  {
1151#endif
1152
1153    m_pcTDecBinIf->decodeBin( uiHorAbs, *pCtx );
1154    m_pcTDecBinIf->decodeBin( uiVerAbs, *pCtx );
1155
1156    const Bool bHorAbsGr0 = uiHorAbs != 0;
1157    const Bool bVerAbsGr0 = uiVerAbs != 0;
1158    pCtx++;
1159
1160    if( bHorAbsGr0 )
1161    {
1162      m_pcTDecBinIf->decodeBin( uiSymbol, *pCtx );
1163      uiHorAbs += uiSymbol;
1164    }
1165
1166    if( bVerAbsGr0 )
1167    {
1168      m_pcTDecBinIf->decodeBin( uiSymbol, *pCtx );
1169      uiVerAbs += uiSymbol;
1170    }
1171
1172    if( bHorAbsGr0 )
1173    {
1174      if( 2 == uiHorAbs )
1175      {
1176        xReadEpExGolomb( uiSymbol, 1 );
1177        uiHorAbs += uiSymbol;
1178      }
1179
1180      m_pcTDecBinIf->decodeBinEP( uiHorSign );
1181    }
1182
1183    if( bVerAbsGr0 )
1184    {
1185      if( 2 == uiVerAbs )
1186      {
1187        xReadEpExGolomb( uiSymbol, 1 );
1188        uiVerAbs += uiSymbol;
1189      }
1190
1191      m_pcTDecBinIf->decodeBinEP( uiVerSign );
1192    }
1193
1194#if H0111_MVD_L1_ZERO
1195  }
1196#endif
1197
1198  const TComMv cMv( uiHorSign ? -Int( uiHorAbs ): uiHorAbs, uiVerSign ? -Int( uiVerAbs ) : uiVerAbs );
1199  pcCU->getCUMvField( eRefList )->setAllMvd( cMv, pcCU->getPartitionSize( uiAbsPartIdx ), uiAbsPartIdx, uiDepth, uiPartIdx );
1200  return;
1201}
1202
1203
1204Void TDecSbac::parseTransformSubdivFlag( UInt& ruiSubdivFlag, UInt uiLog2TransformBlockSize )
1205{
1206  m_pcTDecBinIf->decodeBin( ruiSubdivFlag, m_cCUTransSubdivFlagSCModel.get( 0, 0, uiLog2TransformBlockSize ) );
1207  DTRACE_CABAC_VL( g_nSymbolCounter++ )
1208  DTRACE_CABAC_T( "\tparseTransformSubdivFlag()" )
1209  DTRACE_CABAC_T( "\tsymbol=" )
1210  DTRACE_CABAC_V( ruiSubdivFlag )
1211  DTRACE_CABAC_T( "\tctx=" )
1212  DTRACE_CABAC_V( uiLog2TransformBlockSize )
1213  DTRACE_CABAC_T( "\n" )
1214}
1215
1216Void TDecSbac::parseQtRootCbf( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth, UInt& uiQtRootCbf )
1217{
1218  UInt uiSymbol;
1219  const UInt uiCtx = 0;
1220  m_pcTDecBinIf->decodeBin( uiSymbol , m_cCUQtRootCbfSCModel.get( 0, 0, uiCtx ) );
1221  DTRACE_CABAC_VL( g_nSymbolCounter++ )
1222  DTRACE_CABAC_T( "\tparseQtRootCbf()" )
1223  DTRACE_CABAC_T( "\tsymbol=" )
1224  DTRACE_CABAC_V( uiSymbol )
1225  DTRACE_CABAC_T( "\tctx=" )
1226  DTRACE_CABAC_V( uiCtx )
1227  DTRACE_CABAC_T( "\tuiAbsPartIdx=" )
1228  DTRACE_CABAC_V( uiAbsPartIdx )
1229  DTRACE_CABAC_T( "\n" )
1230 
1231  uiQtRootCbf = uiSymbol;
1232}
1233
1234Void TDecSbac::parseDeltaQP( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth )
1235{
1236#if H0736_AVC_STYLE_QP_RANGE
1237  Int qp;
1238#endif
1239  UInt uiDQp;
1240  Int  iDQp;
1241 
1242  m_pcTDecBinIf->decodeBin( uiDQp, m_cCUDeltaQpSCModel.get( 0, 0, 0 ) );
1243 
1244  if ( uiDQp == 0 )
1245  {
1246#if H0736_AVC_STYLE_QP_RANGE
1247    qp = pcCU->getRefQP(uiAbsPartIdx);
1248#else
1249    uiDQp = pcCU->getRefQP(uiAbsPartIdx);
1250#endif
1251  }
1252  else
1253  {
1254    UInt uiSign;
1255#if H0736_AVC_STYLE_QP_RANGE
1256    Int qpBdOffsetY = pcCU->getSlice()->getSPS()->getQpBDOffsetY();
1257#else
1258    UInt uiQpBdOffsetY = 6*(g_uiBitIncrement + g_uiBitDepth - 8);
1259#endif
1260    m_pcTDecBinIf->decodeBinEP(uiSign);
1261
1262#if H0736_AVC_STYLE_QP_RANGE
1263    UInt uiMaxAbsDQpMinus1 = 24 + (qpBdOffsetY/2) + (uiSign);
1264#else
1265    UInt uiMaxAbsDQpMinus1 = 24 + (uiQpBdOffsetY/2) + (uiSign);
1266#endif
1267    UInt uiAbsDQpMinus1;
1268    xReadUnaryMaxSymbol (uiAbsDQpMinus1,  &m_cCUDeltaQpSCModel.get( 0, 0, 1 ), 1, uiMaxAbsDQpMinus1);
1269
1270    iDQp = uiAbsDQpMinus1 + 1;
1271
1272    if(uiSign)
1273    {
1274      iDQp = -iDQp;
1275    }
1276
1277#if H0736_AVC_STYLE_QP_RANGE
1278    qp = (((Int) pcCU->getRefQP( uiAbsPartIdx ) + iDQp + 52 + 2*qpBdOffsetY )%(52+qpBdOffsetY)) - qpBdOffsetY;
1279#else
1280#if LOSSLESS_CODING
1281    uiDQp = (pcCU->getRefQP(uiAbsPartIdx) + iDQp + 52) % 52;
1282#else
1283    uiDQp = pcCU->getRefQP(uiAbsPartIdx) + iDQp;
1284#endif
1285#endif
1286  }
1287 
1288  UInt uiAbsQpCUPartIdx = (uiAbsPartIdx>>(8-(pcCU->getSlice()->getPPS()->getMaxCuDQPDepth()<<1)))<<(8-(pcCU->getSlice()->getPPS()->getMaxCuDQPDepth()<<1)) ;
1289  UInt uiQpCUDepth =   min(uiDepth,pcCU->getSlice()->getPPS()->getMaxCuDQPDepth()) ;
1290#if H0736_AVC_STYLE_QP_RANGE
1291  pcCU->setQPSubParts( qp, uiAbsQpCUPartIdx, uiQpCUDepth );
1292#else
1293  pcCU->setQPSubParts( uiDQp, uiAbsQpCUPartIdx, uiQpCUDepth );
1294#endif
1295}
1296
1297Void TDecSbac::parseQtCbf( TComDataCU* pcCU, UInt uiAbsPartIdx, TextType eType, UInt uiTrDepth, UInt uiDepth )
1298{
1299  UInt uiSymbol;
1300  const UInt uiCtx = pcCU->getCtxQtCbf( uiAbsPartIdx, eType, uiTrDepth );
1301  m_pcTDecBinIf->decodeBin( uiSymbol , m_cCUQtCbfSCModel.get( 0, eType ? TEXT_CHROMA: eType, uiCtx ) );
1302 
1303  DTRACE_CABAC_VL( g_nSymbolCounter++ )
1304  DTRACE_CABAC_T( "\tparseQtCbf()" )
1305  DTRACE_CABAC_T( "\tsymbol=" )
1306  DTRACE_CABAC_V( uiSymbol )
1307  DTRACE_CABAC_T( "\tctx=" )
1308  DTRACE_CABAC_V( uiCtx )
1309  DTRACE_CABAC_T( "\tetype=" )
1310  DTRACE_CABAC_V( eType )
1311  DTRACE_CABAC_T( "\tuiAbsPartIdx=" )
1312  DTRACE_CABAC_V( uiAbsPartIdx )
1313  DTRACE_CABAC_T( "\n" )
1314 
1315  pcCU->setCbfSubParts( uiSymbol << uiTrDepth, eType, uiAbsPartIdx, uiDepth );
1316}
1317
1318/** Parse (X,Y) position of the last significant coefficient
1319 * \param uiPosLastX reference to X component of last coefficient
1320 * \param uiPosLastY reference to Y component of last coefficient
1321 * \param width  Block width
1322 * \param height Block height
1323 * \param eTType plane type / luminance or chrominance
1324 * \param uiScanIdx scan type (zig-zag, hor, ver)
1325 *
1326 * This method decodes the X and Y component within a block of the last significant coefficient.
1327 */
1328Void TDecSbac::parseLastSignificantXY( UInt& uiPosLastX, UInt& uiPosLastY, Int width, Int height, TextType eTType, UInt uiScanIdx )
1329{
1330  UInt uiLast;
1331  ContextModel *pCtxX = m_cCuCtxLastX.get( 0, eTType );
1332  ContextModel *pCtxY = m_cCuCtxLastY.get( 0, eTType );
1333
1334  // posX
1335#if LAST_CTX_REDUCTION
1336  Int widthCtx = eTType ? 4 : width;
1337  const UInt *puiCtxIdxX = g_uiLastCtx + ( g_aucConvertToBit[ widthCtx ] * ( g_aucConvertToBit[ widthCtx ] + 3 ) );
1338#else
1339  const UInt *puiCtxIdxX = g_uiLastCtx + ( g_aucConvertToBit[ width ] * ( g_aucConvertToBit[ width ] + 3 ) );
1340#endif
1341  for( uiPosLastX = 0; uiPosLastX < g_uiGroupIdx[ width - 1 ]; uiPosLastX++ )
1342  {
1343#if LAST_CTX_REDUCTION
1344    if ( eTType  )
1345    {
1346      m_pcTDecBinIf->decodeBin( uiLast, *( pCtxX + (uiPosLastX>>g_aucConvertToBit[ width ])  ) );
1347    }
1348    else
1349    {
1350#endif
1351      m_pcTDecBinIf->decodeBin( uiLast, *( pCtxX + puiCtxIdxX[ uiPosLastX ] ) );
1352#if LAST_CTX_REDUCTION
1353    }
1354#endif
1355    if( !uiLast )
1356    {
1357      break;
1358    }
1359  }
1360
1361  // posY
1362#if LAST_CTX_REDUCTION
1363  Int heightCtx = eTType? 4 : height;
1364  const UInt *puiCtxIdxY = g_uiLastCtx + ( g_aucConvertToBit[ heightCtx ] * ( g_aucConvertToBit[ heightCtx ] + 3 ) );
1365#else
1366  const UInt *puiCtxIdxY = g_uiLastCtx + ( g_aucConvertToBit[ height ] * ( g_aucConvertToBit[ height ] + 3 ) );
1367#endif
1368  for( uiPosLastY = 0; uiPosLastY < g_uiGroupIdx[ height - 1 ]; uiPosLastY++ )
1369  {
1370#if LAST_CTX_REDUCTION
1371    if (eTType)
1372    {
1373      m_pcTDecBinIf->decodeBin( uiLast, *( pCtxY + (uiPosLastY>>g_aucConvertToBit[ height ]) ) );
1374    }
1375    else
1376    {
1377#endif
1378      m_pcTDecBinIf->decodeBin( uiLast, *( pCtxY + puiCtxIdxY[ uiPosLastY ] ) );
1379#if LAST_CTX_REDUCTION
1380    }
1381#endif
1382    if( !uiLast )
1383    {
1384      break;
1385    }
1386  }
1387  if ( uiPosLastX > 3 )
1388  {
1389    UInt uiTemp  = 0;
1390    UInt uiCount = ( uiPosLastX - 2 ) >> 1;
1391    for ( Int i = uiCount - 1; i >= 0; i-- )
1392    {
1393      m_pcTDecBinIf->decodeBinEP( uiLast );
1394      uiTemp += uiLast << i;
1395    }
1396    uiPosLastX = g_uiMinInGroup[ uiPosLastX ] + uiTemp;
1397  }
1398  if ( uiPosLastY > 3 )
1399  {
1400    UInt uiTemp  = 0;
1401    UInt uiCount = ( uiPosLastY - 2 ) >> 1;
1402    for ( Int i = uiCount - 1; i >= 0; i-- )
1403    {
1404      m_pcTDecBinIf->decodeBinEP( uiLast );
1405      uiTemp += uiLast << i;
1406    }
1407    uiPosLastY = g_uiMinInGroup[ uiPosLastY ] + uiTemp;
1408  }
1409 
1410  if( uiScanIdx == SCAN_VER )
1411  {
1412    swap( uiPosLastX, uiPosLastY );
1413  }
1414}
1415
1416Void TDecSbac::parseCoeffNxN( TComDataCU* pcCU, TCoeff* pcCoef, UInt uiAbsPartIdx, UInt uiWidth, UInt uiHeight, UInt uiDepth, TextType eTType )
1417{
1418  DTRACE_CABAC_VL( g_nSymbolCounter++ )
1419  DTRACE_CABAC_T( "\tparseCoeffNxN()\teType=" )
1420  DTRACE_CABAC_V( eTType )
1421  DTRACE_CABAC_T( "\twidth=" )
1422  DTRACE_CABAC_V( uiWidth )
1423  DTRACE_CABAC_T( "\theight=" )
1424  DTRACE_CABAC_V( uiHeight )
1425  DTRACE_CABAC_T( "\tdepth=" )
1426  DTRACE_CABAC_V( uiDepth )
1427  DTRACE_CABAC_T( "\tabspartidx=" )
1428  DTRACE_CABAC_V( uiAbsPartIdx )
1429  DTRACE_CABAC_T( "\ttoCU-X=" )
1430  DTRACE_CABAC_V( pcCU->getCUPelX() )
1431  DTRACE_CABAC_T( "\ttoCU-Y=" )
1432  DTRACE_CABAC_V( pcCU->getCUPelY() )
1433  DTRACE_CABAC_T( "\tCU-addr=" )
1434  DTRACE_CABAC_V(  pcCU->getAddr() )
1435  DTRACE_CABAC_T( "\tinCU-X=" )
1436  DTRACE_CABAC_V( g_auiRasterToPelX[ g_auiZscanToRaster[uiAbsPartIdx] ] )
1437  DTRACE_CABAC_T( "\tinCU-Y=" )
1438  DTRACE_CABAC_V( g_auiRasterToPelY[ g_auiZscanToRaster[uiAbsPartIdx] ] )
1439  DTRACE_CABAC_T( "\tpredmode=" )
1440  DTRACE_CABAC_V(  pcCU->getPredictionMode( uiAbsPartIdx ) )
1441  DTRACE_CABAC_T( "\n" )
1442 
1443  if( uiWidth > pcCU->getSlice()->getSPS()->getMaxTrSize() )
1444  {
1445    uiWidth  = pcCU->getSlice()->getSPS()->getMaxTrSize();
1446    uiHeight = pcCU->getSlice()->getSPS()->getMaxTrSize();
1447  }
1448 
1449  eTType = eTType == TEXT_LUMA ? TEXT_LUMA : ( eTType == TEXT_NONE ? TEXT_NONE : TEXT_CHROMA );
1450 
1451  //----- parse significance map -----
1452  const UInt  uiLog2BlockSize   = g_aucConvertToBit[ uiWidth ] + 2;
1453  const UInt  uiMaxNumCoeff     = uiWidth * uiHeight;
1454  const UInt  uiMaxNumCoeffM1   = uiMaxNumCoeff - 1;
1455  UInt uiScanIdx = pcCU->getCoefScanIdx(uiAbsPartIdx, uiWidth, eTType==TEXT_LUMA, pcCU->isIntra(uiAbsPartIdx));
1456  int blockType = uiLog2BlockSize;
1457  if (uiWidth != uiHeight)
1458  {
1459    uiScanIdx = SCAN_DIAG;
1460    blockType = 4;
1461  }
1462 
1463  //===== decode last significant =====
1464  UInt uiPosLastX, uiPosLastY;
1465  parseLastSignificantXY( uiPosLastX, uiPosLastY, uiWidth, uiHeight, eTType, uiScanIdx );
1466  UInt uiBlkPosLast      = uiPosLastX + (uiPosLastY<<uiLog2BlockSize);
1467  pcCoef[ uiBlkPosLast ] = 1;
1468
1469  //===== decode significance flags =====
1470  UInt uiScanPosLast   = uiBlkPosLast;
1471  if (uiScanIdx == SCAN_ZIGZAG)
1472  {
1473    // Map zigzag to diagonal scan
1474    uiScanIdx = SCAN_DIAG;
1475  }
1476  const UInt * scan;
1477  if (uiWidth == uiHeight)
1478  {
1479    scan = g_auiSigLastScan[ uiScanIdx ][ uiLog2BlockSize-1 ];
1480  }
1481  else
1482  {
1483    scan = g_sigScanNSQT[ uiLog2BlockSize - 2 ];
1484  }
1485  for( uiScanPosLast = 0; uiScanPosLast < uiMaxNumCoeffM1; uiScanPosLast++ )
1486  {
1487    UInt uiBlkPos = scan[ uiScanPosLast ];
1488    if( uiBlkPosLast == uiBlkPos )
1489    {
1490      break;
1491    }
1492  }
1493
1494  ContextModel * const baseCoeffGroupCtx = m_cCUSigCoeffGroupSCModel.get( 0, eTType );
1495  ContextModel * const baseCtx = (eTType==TEXT_LUMA) ? m_cCUSigSCModel.get( 0, 0 ) : m_cCUSigSCModel.get( 0, 0 ) + NUM_SIG_FLAG_CTX_LUMA;
1496
1497  const Int  iLastScanSet      = uiScanPosLast >> LOG2_SCAN_SET_SIZE;
1498  UInt uiNumOne                = 0;
1499  UInt uiGoRiceParam           = 0;
1500
1501#if MULTIBITS_DATA_HIDING
1502  UInt const tsig = pcCU->getSlice()->getPPS()->getTSIG();
1503#if LOSSLESS_CODING
1504  Bool beValid; 
1505  if (pcCU->isLosslessCoded(uiAbsPartIdx))
1506  {
1507    beValid = false;
1508  }
1509  else 
1510  {
1511    beValid = pcCU->getSlice()->getPPS()->getSignHideFlag() > 0;
1512  }
1513#else
1514  Bool beValid = pcCU->getSlice()->getPPS()->getSignHideFlag() > 0;
1515#endif
1516  UInt absSum = 0;
1517#endif  // MULTIBITS_DATA_HIDING
1518
1519  UInt uiSigCoeffGroupFlag[ MLS_GRP_NUM ];
1520  ::memset( uiSigCoeffGroupFlag, 0, sizeof(UInt) * MLS_GRP_NUM );
1521  const UInt uiNumBlkSide = uiWidth >> (MLS_CG_SIZE >> 1);
1522  const UInt * scanCG;
1523  if (uiWidth == uiHeight)
1524  {
1525    scanCG = g_auiSigLastScan[ uiScanIdx ][ uiLog2BlockSize > 3 ? uiLog2BlockSize-2-1 : 0  ];   
1526#if MULTILEVEL_SIGMAP_EXT
1527    if( uiLog2BlockSize == 3 )
1528    {
1529      scanCG = g_sigLastScan8x8[ uiScanIdx ];
1530    }
1531    else if( uiLog2BlockSize == 5 )
1532    {
1533      scanCG = g_sigLastScanCG32x32;
1534    }
1535#endif
1536  }
1537  else
1538  {
1539    scanCG = g_sigCGScanNSQT[ uiLog2BlockSize - 2 ];
1540  }
1541  Int  iScanPosSig             = (Int) uiScanPosLast;
1542  for( Int iSubSet = iLastScanSet; iSubSet >= 0; iSubSet-- )
1543  {
1544    Int  iSubPos     = iSubSet << LOG2_SCAN_SET_SIZE;
1545    uiGoRiceParam    = 0;
1546    Int numNonZero = 0;
1547   
1548#if MULTIBITS_DATA_HIDING
1549    Int lastNZPosInCG = -1, firstNZPosInCG = SCAN_SET_SIZE;
1550#endif
1551
1552    Int pos[SCAN_SET_SIZE];
1553    if( iScanPosSig == (Int) uiScanPosLast )
1554    {
1555#if MULTIBITS_DATA_HIDING
1556      lastNZPosInCG  = iScanPosSig;
1557      firstNZPosInCG = iScanPosSig;
1558#endif
1559      iScanPosSig--;
1560      pos[ numNonZero ] = uiBlkPosLast;
1561      numNonZero = 1;
1562    }
1563
1564#if !MULTILEVEL_SIGMAP_EXT
1565    if( blockType > 3 )
1566    {
1567#endif
1568      // decode significant_coeffgroup_flag
1569      Int iCGBlkPos = scanCG[ iSubSet ];
1570      Int iCGPosY   = iCGBlkPos / uiNumBlkSide;
1571      Int iCGPosX   = iCGBlkPos - (iCGPosY * uiNumBlkSide);
1572#if MULTILEVEL_SIGMAP_EXT
1573      if( uiWidth == 8 && uiHeight == 8 && (uiScanIdx == SCAN_HOR || uiScanIdx == SCAN_VER) )
1574      {
1575        iCGPosY = (uiScanIdx == SCAN_HOR ? iCGBlkPos : 0);
1576        iCGPosX = (uiScanIdx == SCAN_VER ? iCGBlkPos : 0);
1577      }
1578#endif
1579#if !REMOVE_INFER_SIGGRP
1580      Bool bInferredCGFlag = false;
1581#endif
1582#if REMOVE_INFER_SIGGRP
1583      if( iSubSet == iLastScanSet || iSubSet == 0)
1584#else
1585      if( iSubSet == iLastScanSet ) 
1586#endif
1587      {
1588        uiSigCoeffGroupFlag[ iCGBlkPos ] = 1;
1589      }
1590      else
1591      {
1592#if !REMOVE_INFER_SIGGRP
1593#if MULTILEVEL_SIGMAP_EXT
1594        if( !TComTrQuant::bothCGNeighboursOne( uiSigCoeffGroupFlag, iCGPosX, iCGPosY, uiScanIdx, uiWidth, uiHeight) && ( iSubSet ) )
1595#else
1596        if( !TComTrQuant::bothCGNeighboursOne( uiSigCoeffGroupFlag, iCGPosX, iCGPosY, uiWidth, uiHeight) && ( iSubSet ) )
1597#endif
1598        {
1599#endif
1600          UInt uiSigCoeffGroup;
1601#if MULTILEVEL_SIGMAP_EXT
1602          UInt uiCtxSig  = TComTrQuant::getSigCoeffGroupCtxInc( uiSigCoeffGroupFlag, iCGPosX, iCGPosY, uiScanIdx, uiWidth, uiHeight );
1603#else
1604          UInt uiCtxSig  = TComTrQuant::getSigCoeffGroupCtxInc( uiSigCoeffGroupFlag, iCGPosX, iCGPosY, uiWidth, uiHeight );
1605#endif
1606          m_pcTDecBinIf->decodeBin( uiSigCoeffGroup, baseCoeffGroupCtx[ uiCtxSig ] );
1607          uiSigCoeffGroupFlag[ iCGBlkPos ] = uiSigCoeffGroup;
1608#if !REMOVE_INFER_SIGGRP
1609        }
1610        else
1611        {
1612          uiSigCoeffGroupFlag[ iCGBlkPos ] = 1;
1613          bInferredCGFlag = true;
1614        }
1615#endif
1616      }
1617
1618      // decode significant_coeff_flag
1619      UInt uiBlkPos, uiPosY, uiPosX, uiSig, uiCtxSig;
1620      for( ; iScanPosSig >= iSubPos; iScanPosSig-- )
1621      {
1622        uiBlkPos  = scan[ iScanPosSig ];
1623        uiPosY    = uiBlkPos >> uiLog2BlockSize;
1624        uiPosX    = uiBlkPos - ( uiPosY << uiLog2BlockSize );
1625        uiSig     = 0;
1626       
1627        if( uiSigCoeffGroupFlag[ iCGBlkPos ] )
1628        {
1629#if REMOVE_INFER_SIGGRP
1630          if( iScanPosSig > iSubPos || iSubSet == 0  || numNonZero )
1631#else
1632          if( iScanPosSig > iSubPos || bInferredCGFlag || numNonZero )
1633#endif
1634          {
1635            uiCtxSig  = TComTrQuant::getSigCtxInc( pcCoef, uiPosX, uiPosY, blockType, uiWidth, uiHeight, eTType );
1636            m_pcTDecBinIf->decodeBin( uiSig, baseCtx[ uiCtxSig ] );
1637          }
1638          else
1639          {
1640            uiSig = 1;
1641          }
1642        }
1643        pcCoef[ uiBlkPos ] = uiSig;
1644        if( uiSig )
1645        {
1646          pos[ numNonZero ] = uiBlkPos;
1647          numNonZero ++;
1648#if MULTIBITS_DATA_HIDING
1649          if( lastNZPosInCG == -1 )
1650          {
1651            lastNZPosInCG = iScanPosSig;
1652          }
1653          firstNZPosInCG = iScanPosSig;
1654#endif
1655        }
1656      }
1657#if !MULTILEVEL_SIGMAP_EXT
1658    }
1659    else
1660    {
1661      for( ; iScanPosSig >= iSubPos; iScanPosSig-- )
1662      {
1663        UInt uiBlkPos   = scan[ iScanPosSig ];
1664        UInt  uiPosY    = uiBlkPos >> uiLog2BlockSize;
1665        UInt  uiPosX    = uiBlkPos - ( uiPosY << uiLog2BlockSize );
1666        UInt  uiSig     = 0;
1667        UInt  uiCtxSig  = TComTrQuant::getSigCtxInc( pcCoef, uiPosX, uiPosY, blockType, uiWidth, uiHeight, eTType );
1668        m_pcTDecBinIf->decodeBin( uiSig, baseCtx[ uiCtxSig ] );
1669        pcCoef[ uiBlkPos ] = uiSig;
1670        if( uiSig )
1671        {
1672          pos[ numNonZero ] = uiBlkPos;
1673          numNonZero ++;
1674#if MULTIBITS_DATA_HIDING
1675          if( lastNZPosInCG == -1 )
1676          {
1677            lastNZPosInCG = iScanPosSig;
1678          }
1679          firstNZPosInCG = iScanPosSig;
1680#endif
1681        }
1682      }
1683    }
1684#endif
1685
1686   
1687    if( numNonZero )
1688    {
1689#if MULTIBITS_DATA_HIDING
1690      Bool signHidden = ( lastNZPosInCG - firstNZPosInCG >= (Int)tsig );
1691      absSum = 0;
1692#endif  // MULTIBITS_DATA_HIDING
1693
1694      UInt c1 = 1;
1695#if !RESTRICT_GR1GR2FLAG_NUMBER
1696      UInt c2 = 0;
1697#endif
1698#if LEVEL_CTX_LUMA_RED
1699      UInt uiCtxSet    = (iSubSet > 0 && eTType==TEXT_LUMA) ? 2 : 0;
1700#else
1701      UInt uiCtxSet    = (iSubSet > 0 && eTType==TEXT_LUMA) ? 3 : 0;
1702#endif
1703      UInt uiBin;
1704     
1705      if( uiNumOne > 0 )
1706      {
1707        uiCtxSet++;
1708#if !LEVEL_CTX_LUMA_RED
1709        if(eTType==TEXT_LUMA && uiNumOne > 3)
1710        {
1711          uiCtxSet++;
1712        }
1713#endif
1714      }
1715     
1716      uiNumOne       >>= 1;
1717      ContextModel *baseCtxMod = ( eTType==TEXT_LUMA ) ? m_cCUOneSCModel.get( 0, 0 ) + 4 * uiCtxSet : m_cCUOneSCModel.get( 0, 0 ) + NUM_ONE_FLAG_CTX_LUMA + 4 * uiCtxSet;
1718      Int absCoeff[SCAN_SET_SIZE];
1719
1720#if RESTRICT_GR1GR2FLAG_NUMBER
1721      for ( Int i = 0; i < numNonZero; i++) absCoeff[i] = 1;   
1722      Int numC1Flag = min(numNonZero, C1FLAG_NUMBER);
1723      Int firstC2FlagIdx = -1;
1724
1725      for( Int idx = 0; idx < numC1Flag; idx++ )
1726#else
1727      for( Int idx = 0; idx < numNonZero; idx++ )
1728#endif
1729      {
1730        m_pcTDecBinIf->decodeBin( uiBin, baseCtxMod[c1] );
1731        if( uiBin == 1 )
1732        {
1733          c1 = 0;
1734#if RESTRICT_GR1GR2FLAG_NUMBER
1735          if (firstC2FlagIdx == -1)
1736          {
1737            firstC2FlagIdx = idx;
1738          }
1739#endif
1740        }
1741        else if( (c1 < 3) && (c1 > 0) )
1742        {
1743          c1++;
1744        }
1745        absCoeff[ idx ] = uiBin + 1;
1746      }
1747     
1748      if (c1 == 0)
1749      {
1750#if RESTRICT_GR1GR2FLAG_NUMBER
1751        baseCtxMod = ( eTType==TEXT_LUMA ) ? m_cCUAbsSCModel.get( 0, 0 ) + uiCtxSet : m_cCUAbsSCModel.get( 0, 0 ) + NUM_ABS_FLAG_CTX_LUMA + uiCtxSet;
1752        if ( firstC2FlagIdx != -1)
1753        {
1754          m_pcTDecBinIf->decodeBin( uiBin, baseCtxMod[0] ); 
1755          absCoeff[ firstC2FlagIdx ] = uiBin + 2;
1756        }
1757#else   
1758        baseCtxMod = ( eTType==TEXT_LUMA ) ? m_cCUAbsSCModel.get( 0, 0 ) + 3 * uiCtxSet : m_cCUAbsSCModel.get( 0, 0 ) + NUM_ABS_FLAG_CTX_LUMA + 3 * uiCtxSet;
1759        for( Int idx = 0; idx < numNonZero; idx++ )
1760        {
1761          if( absCoeff[ idx ] == 2 ) 
1762          {
1763            m_pcTDecBinIf->decodeBin( uiBin, baseCtxMod[c2] );
1764            absCoeff[ idx ] = uiBin + 2;
1765            c2 += (c2 < 2);
1766            uiNumOne++;
1767          }
1768        }
1769#endif
1770      }
1771
1772#if MULTIBITS_DATA_HIDING
1773      UInt coeffSigns;
1774      if ( signHidden && beValid )
1775      {
1776        m_pcTDecBinIf->decodeBinsEP( coeffSigns, numNonZero-1 );
1777        coeffSigns <<= 32 - (numNonZero-1);
1778      }
1779      else
1780      {
1781        m_pcTDecBinIf->decodeBinsEP( coeffSigns, numNonZero );
1782        coeffSigns <<= 32 - numNonZero;
1783      }
1784#else
1785      UInt coeffSigns;
1786      m_pcTDecBinIf->decodeBinsEP( coeffSigns, numNonZero );
1787      coeffSigns <<= 32 - numNonZero;
1788#endif
1789     
1790#if RESTRICT_GR1GR2FLAG_NUMBER
1791      Int iFirstCoeff2 = 1;   
1792      if (c1 == 0 || numNonZero > C1FLAG_NUMBER)
1793#else
1794      if (c1 == 0)
1795#endif
1796      {
1797        for( Int idx = 0; idx < numNonZero; idx++ )
1798        {
1799#if RESTRICT_GR1GR2FLAG_NUMBER   
1800          UInt baseLevel  = (idx < C1FLAG_NUMBER)? (2 + iFirstCoeff2) : 1;
1801
1802          if( absCoeff[ idx ] == baseLevel)
1803          {
1804            UInt uiLevel;
1805            xReadGoRiceExGolomb( uiLevel, uiGoRiceParam );
1806            absCoeff[ idx ] = uiLevel + baseLevel;
1807          }
1808
1809          if(absCoeff[ idx ] >= 2) 
1810          {
1811            iFirstCoeff2 = 0;
1812            uiNumOne++;
1813          }
1814#else
1815          if( absCoeff[ idx ] == 3 )
1816          {
1817            UInt uiLevel;
1818            xReadGoRiceExGolomb( uiLevel, uiGoRiceParam );
1819            absCoeff[ idx ] = uiLevel + 3;
1820          }
1821#endif
1822        }
1823      }
1824
1825      for( Int idx = 0; idx < numNonZero; idx++ )
1826      {
1827        Int blkPos = pos[ idx ];
1828#if MULTIBITS_DATA_HIDING
1829        // Signs applied later.
1830        pcCoef[ blkPos ] = absCoeff[ idx ];
1831        absSum += absCoeff[ idx ];
1832
1833        if ( idx == numNonZero-1 && signHidden && beValid )
1834        {
1835          // Infer sign of 1st element.
1836          if (absSum&0x1)
1837            pcCoef[ blkPos ] = -pcCoef[ blkPos ];
1838        }
1839        else
1840        {
1841          Int sign = static_cast<Int>( coeffSigns ) >> 31;
1842          pcCoef[ blkPos ] = ( pcCoef[ blkPos ] ^ sign ) - sign;
1843          coeffSigns <<= 1;
1844        }
1845#else
1846        Int sign = static_cast<Int>( coeffSigns ) >> 31;
1847        pcCoef[ blkPos ] = ( absCoeff[ idx ] ^ sign ) - sign;
1848        coeffSigns <<= 1;
1849#endif
1850      }
1851    }
1852    else
1853    {
1854      uiNumOne >>= 1;
1855    }
1856  }
1857 
1858  return;
1859}
1860
1861
1862#if SAO_UNIT_INTERLEAVING
1863Void TDecSbac::parseSaoUvlc (UInt& ruiVal)
1864{
1865  UInt uiCode;
1866  Int  i;
1867
1868  m_pcTDecBinIf->decodeBin( uiCode, m_cSaoUvlcSCModel.get( 0, 0, 0 ) );
1869  if ( uiCode == 0 )
1870  {
1871    ruiVal = 0;
1872    return;
1873  }
1874
1875  i=1;
1876  while (1)
1877  {
1878    m_pcTDecBinIf->decodeBin( uiCode, m_cSaoUvlcSCModel.get( 0, 0, 1 ) );
1879    if ( uiCode == 0 ) break;
1880    i++;
1881  }
1882
1883  ruiVal = i;
1884}
1885
1886Void TDecSbac::parseSaoSvlc (Int&  riVal)
1887{
1888  UInt uiCode;
1889  Int  iSign;
1890  Int  i;
1891
1892  m_pcTDecBinIf->decodeBin( uiCode, m_cSaoSvlcSCModel.get( 0, 0, 0 ) );
1893
1894  if ( uiCode == 0 )
1895  {
1896    riVal = 0;
1897    return;
1898  }
1899
1900  // read sign
1901  m_pcTDecBinIf->decodeBin( uiCode, m_cSaoSvlcSCModel.get( 0, 0, 1 ) );
1902
1903  if ( uiCode == 0 )
1904  {
1905    iSign =  1;
1906  }
1907  else
1908  {
1909    iSign = -1;
1910  }
1911
1912  // read magnitude
1913  i=1;
1914  while (1)
1915  {
1916    m_pcTDecBinIf->decodeBin( uiCode, m_cSaoSvlcSCModel.get( 0, 0, 2 ) );
1917    if ( uiCode == 0 ) break;
1918    i++;
1919  }
1920
1921  riVal = i*iSign;
1922}
1923
1924Void TDecSbac::parseSaoUflc (UInt&  riVal)
1925{
1926  UInt uiSymbol;
1927  riVal = 0;
1928  for (Int i=0;i<5;i++)
1929  {
1930    m_pcTDecBinIf->decodeBinEP ( uiSymbol );
1931    if (uiSymbol)
1932    {
1933      riVal |= (1<<i);
1934    }
1935  }
1936}
1937Void TDecSbac::parseSaoMergeLeft (UInt&  ruiVal, UInt uiCompIdx)
1938{
1939  UInt uiCode;
1940  m_pcTDecBinIf->decodeBin( uiCode, m_cSaoMergeLeftSCModel.get( 0, 0, uiCompIdx ) );
1941  ruiVal = (Int)uiCode;
1942}
1943
1944Void TDecSbac::parseSaoMergeUp (UInt&  ruiVal)
1945{
1946  UInt uiCode;
1947  m_pcTDecBinIf->decodeBin( uiCode, m_cSaoMergeUpSCModel.get( 0, 0, 0 ) );
1948  ruiVal = (Int)uiCode;
1949}
1950Void TDecSbac::parseSaoTypeIdx (UInt&  ruiVal)
1951{
1952  UInt uiCode;
1953  Int  i;
1954  m_pcTDecBinIf->decodeBin( uiCode, m_cSaoTypeIdxSCModel.get( 0, 0, 0 ) );
1955  if ( uiCode == 0 )
1956  {
1957    ruiVal = 0;
1958    return;
1959  }
1960  i=1;
1961  while (1)
1962  {
1963    m_pcTDecBinIf->decodeBin( uiCode, m_cSaoTypeIdxSCModel.get( 0, 0, 1 ) );
1964    if ( uiCode == 0 ) break;
1965    i++;
1966  }
1967  ruiVal = i;
1968}
1969
1970inline Void copySaoOneLcuParam(SaoLcuParam* psDst,  SaoLcuParam* psSrc)
1971{
1972  Int i;
1973  psDst->partIdx = psSrc->partIdx;
1974  psDst->typeIdx    = psSrc->typeIdx;
1975  if (psDst->typeIdx != -1)
1976  {
1977    if (psDst->typeIdx == SAO_BO)
1978    {
1979      psDst->bandPosition = psSrc->bandPosition ;
1980    }
1981    else
1982    {
1983      psDst->bandPosition = 0;
1984    }
1985    psDst->length  = psSrc->length;
1986    for (i=0;i<psDst->length;i++)
1987    {
1988      psDst->offset[i] = psSrc->offset[i];
1989    }
1990  }
1991  else
1992  {
1993    psDst->length  = 0;
1994    for (i=0;i<SAO_BO_LEN;i++)
1995    {
1996      psDst->offset[i] = 0;
1997    }
1998  }
1999}
2000Void TDecSbac::parseSaoOffset(SaoLcuParam* psSaoLcuParam)
2001{
2002  UInt uiSymbol;
2003  Int iSymbol;
2004  static Int iTypeLength[MAX_NUM_SAO_TYPE] = {
2005    SAO_EO_LEN,
2006    SAO_EO_LEN,
2007    SAO_EO_LEN,
2008    SAO_EO_LEN,
2009    SAO_BO_LEN
2010  }; 
2011
2012  parseSaoTypeIdx(uiSymbol);
2013  psSaoLcuParam->typeIdx = (Int)uiSymbol - 1;
2014  if (uiSymbol)
2015  {
2016    psSaoLcuParam->length = iTypeLength[psSaoLcuParam->typeIdx];
2017    if( psSaoLcuParam->typeIdx == SAO_BO )
2018    {
2019      // Parse Left Band Index
2020      parseSaoUflc( uiSymbol );
2021      psSaoLcuParam->bandPosition = uiSymbol;
2022      for(Int i=0; i< psSaoLcuParam->length; i++)
2023      {
2024        parseSaoSvlc(iSymbol);
2025        psSaoLcuParam->offset[i] = iSymbol;
2026      }   
2027    }
2028    else if( psSaoLcuParam->typeIdx < 4 )
2029    {
2030      parseSaoUvlc(uiSymbol); psSaoLcuParam->offset[0] = uiSymbol;
2031      parseSaoUvlc(uiSymbol); psSaoLcuParam->offset[1] = uiSymbol;
2032      parseSaoUvlc(uiSymbol); psSaoLcuParam->offset[2] = -(Int)uiSymbol;
2033      parseSaoUvlc(uiSymbol); psSaoLcuParam->offset[3] = -(Int)uiSymbol;
2034    }
2035  }
2036  else
2037  {
2038    psSaoLcuParam->length = 0;
2039  }
2040}
2041
2042Void TDecSbac::parseSaoOneLcuInterleaving(Int rx, Int ry, SAOParam* pSaoParam, TComDataCU* pcCU, Int iCUAddrInSlice, Int iCUAddrUpInSlice, Bool bLFCrossSliceBoundaryFlag)
2043{
2044  Int iAddr = pcCU->getAddr();
2045  UInt uiSymbol;
2046  for (Int iCompIdx=0; iCompIdx<3; iCompIdx++)
2047  {
2048    pSaoParam->saoLcuParam[iCompIdx][iAddr].mergeUpFlag    = 0;
2049    pSaoParam->saoLcuParam[iCompIdx][iAddr].mergeLeftFlag  = 0;
2050    pSaoParam->saoLcuParam[iCompIdx][iAddr].bandPosition   = 0;
2051    pSaoParam->saoLcuParam[iCompIdx][iAddr].typeIdx        = -1;
2052    pSaoParam->saoLcuParam[iCompIdx][iAddr].offset[0]     = 0;
2053    pSaoParam->saoLcuParam[iCompIdx][iAddr].offset[1]     = 0;
2054    pSaoParam->saoLcuParam[iCompIdx][iAddr].offset[2]     = 0;
2055    pSaoParam->saoLcuParam[iCompIdx][iAddr].offset[3]     = 0;
2056
2057    if (pSaoParam->bSaoFlag[iCompIdx])
2058    {
2059      if (rx>0 && iCUAddrInSlice!=0)
2060      {
2061        parseSaoMergeLeft(uiSymbol,iCompIdx); pSaoParam->saoLcuParam[iCompIdx][iAddr].mergeLeftFlag = (Int)uiSymbol;
2062      }
2063      else
2064      {
2065        pSaoParam->saoLcuParam[iCompIdx][iAddr].mergeLeftFlag = 0;
2066      }
2067
2068      if (pSaoParam->saoLcuParam[iCompIdx][iAddr].mergeLeftFlag==0)
2069      {
2070        if ((ry > 0) && (iCUAddrUpInSlice>0||bLFCrossSliceBoundaryFlag))
2071        {
2072          parseSaoMergeUp(uiSymbol);  pSaoParam->saoLcuParam[iCompIdx][iAddr].mergeUpFlag = uiSymbol;
2073        }
2074        else
2075        {
2076          pSaoParam->saoLcuParam[iCompIdx][iAddr].mergeUpFlag = 0;
2077        }
2078        if (!pSaoParam->saoLcuParam[iCompIdx][iAddr].mergeUpFlag)
2079        {
2080          parseSaoOffset(&(pSaoParam->saoLcuParam[iCompIdx][iAddr]));
2081        }
2082        else
2083        {
2084          copySaoOneLcuParam(&pSaoParam->saoLcuParam[iCompIdx][iAddr], &pSaoParam->saoLcuParam[iCompIdx][iAddr-pSaoParam->numCuInWidth]);
2085        }
2086      }
2087      else
2088      {
2089        copySaoOneLcuParam(&pSaoParam->saoLcuParam[iCompIdx][iAddr],  &pSaoParam->saoLcuParam[iCompIdx][iAddr-1]);
2090      }
2091    }
2092    else
2093    {
2094      pSaoParam->saoLcuParam[iCompIdx][iAddr].typeIdx = -1;
2095      pSaoParam->saoLcuParam[iCompIdx][iAddr].bandPosition = 0;
2096    }
2097  }
2098}
2099#endif
2100
2101/**
2102 - Initialize our contexts from the nominated source.
2103 .
2104 \param pSrc Contexts to be copied.
2105 */
2106Void TDecSbac::xCopyContextsFrom( TDecSbac* pSrc )
2107{
2108  memcpy(m_contextModels, pSrc->m_contextModels, m_numContextModels*sizeof(m_contextModels[0]));
2109}
2110
2111Void TDecSbac::xCopyFrom( TDecSbac* pSrc )
2112{
2113  m_pcTDecBinIf->copyState( pSrc->m_pcTDecBinIf );
2114
2115  m_uiLastQp           = pSrc->m_uiLastQp;
2116  xCopyContextsFrom( pSrc );
2117
2118}
2119
2120Void TDecSbac::load ( TDecSbac* pScr )
2121{
2122  xCopyFrom(pScr);
2123}
2124
2125Void TDecSbac::loadContexts ( TDecSbac* pScr )
2126{
2127  xCopyContextsFrom(pScr);
2128}
2129
2130#if OL_FLUSH
2131Void TDecSbac::decodeFlush ( )
2132{
2133  UInt uiBit;
2134  m_pcTDecBinIf->decodeBinTrm(uiBit);
2135  m_pcTDecBinIf->flush();
2136
2137}
2138#endif
2139
2140#if HHI_DMM_WEDGE_INTRA || HHI_DMM_PRED_TEX || (LGE_EDGE_INTRA && LGE_EDGE_INTRA_DELTA_DC)
2141Void TDecSbac::xReadExGolombLevel( UInt& ruiSymbol, ContextModel& rcSCModel  )
2142{
2143  UInt uiSymbol;
2144  UInt uiCount = 0;
2145  do
2146  {
2147    m_pcTDecBinIf->decodeBin( uiSymbol, rcSCModel );
2148    uiCount++;
2149  }
2150  while( uiSymbol && ( uiCount != 13 ) );
2151
2152  ruiSymbol = uiCount - 1;
2153
2154  if( uiSymbol )
2155  {
2156    xReadEpExGolomb( uiSymbol, 0 );
2157    ruiSymbol += uiSymbol + 1;
2158  }
2159
2160  return;
2161}
2162#endif
2163#if HHI_DMM_WEDGE_INTRA
2164Void TDecSbac::xParseWedgeFullInfo( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth )
2165{
2166  Int iIntraIdx = pcCU->getIntraSizeIdx(uiAbsPartIdx);
2167  Int iBits = g_aucWedgeFullBitsListIdx[iIntraIdx];
2168
2169  UInt uiSymbol, uiTabIdx = 0;
2170  for ( Int i = 0; i < iBits; i++ )
2171  {
2172    m_pcTDecBinIf->decodeBin( uiSymbol, m_cDmmDataSCModel.get(0, 0, 0) );
2173    uiTabIdx += ( uiSymbol && i == 0 ) ? 1 : 0;
2174    uiTabIdx += ( uiSymbol && i == 1 ) ? 2 : 0;
2175    uiTabIdx += ( uiSymbol && i == 2 ) ? 4 : 0;
2176    uiTabIdx += ( uiSymbol && i == 3 ) ? 8 : 0;
2177    uiTabIdx += ( uiSymbol && i == 4 ) ? 16 : 0;
2178    uiTabIdx += ( uiSymbol && i == 5 ) ? 32 : 0;
2179    uiTabIdx += ( uiSymbol && i == 6 ) ? 64 : 0;
2180    uiTabIdx += ( uiSymbol && i == 7 ) ? 128 : 0;
2181    uiTabIdx += ( uiSymbol && i == 8 ) ? 256 : 0;
2182    uiTabIdx += ( uiSymbol && i == 9 ) ? 512 : 0;
2183    uiTabIdx += ( uiSymbol && i == 10 ) ? 1024 : 0;
2184    uiTabIdx += ( uiSymbol && i == 11 ) ? 2048 : 0;
2185    uiTabIdx += ( uiSymbol && i == 12 ) ? 4096 : 0;
2186  }
2187
2188  pcCU->setWedgeFullTabIdxSubParts( uiTabIdx, uiAbsPartIdx, uiDepth );
2189}
2190
2191Void TDecSbac::xParseWedgeFullDeltaInfo( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth )
2192{
2193  Int iIntraIdx = pcCU->getIntraSizeIdx(uiAbsPartIdx);
2194  Int iBits = g_aucWedgeFullBitsListIdx[iIntraIdx];
2195
2196  UInt uiSymbol, uiTabIdx = 0;
2197  for ( Int i = 0; i < iBits; i++ )
2198  {
2199    m_pcTDecBinIf->decodeBin( uiSymbol, m_cDmmDataSCModel.get(0, 0, 0) );
2200    uiTabIdx += ( uiSymbol && i == 0 ) ? 1 : 0;
2201    uiTabIdx += ( uiSymbol && i == 1 ) ? 2 : 0;
2202    uiTabIdx += ( uiSymbol && i == 2 ) ? 4 : 0;
2203    uiTabIdx += ( uiSymbol && i == 3 ) ? 8 : 0;
2204    uiTabIdx += ( uiSymbol && i == 4 ) ? 16 : 0;
2205    uiTabIdx += ( uiSymbol && i == 5 ) ? 32 : 0;
2206    uiTabIdx += ( uiSymbol && i == 6 ) ? 64 : 0;
2207    uiTabIdx += ( uiSymbol && i == 7 ) ? 128 : 0;
2208    uiTabIdx += ( uiSymbol && i == 8 ) ? 256 : 0;
2209    uiTabIdx += ( uiSymbol && i == 9 ) ? 512 : 0;
2210    uiTabIdx += ( uiSymbol && i == 10 ) ? 1024 : 0;
2211    uiTabIdx += ( uiSymbol && i == 11 ) ? 2048 : 0;
2212    uiTabIdx += ( uiSymbol && i == 12 ) ? 4096 : 0;
2213  }
2214
2215  pcCU->setWedgeFullTabIdxSubParts( uiTabIdx, uiAbsPartIdx, uiDepth );
2216
2217  UInt uiDC1, uiDC2;
2218  xReadExGolombLevel( uiDC1, m_cDmmDataSCModel.get(0, 0, 1) );
2219  Int iDC1 = uiDC1;
2220  if ( uiDC1 )
2221  {
2222    UInt uiSign;
2223    m_pcTDecBinIf->decodeBinEP( uiSign );
2224    if ( uiSign )
2225    {
2226      iDC1 = -iDC1;
2227    }
2228  }
2229  xReadExGolombLevel( uiDC2, m_cDmmDataSCModel.get(0, 0, 1) );
2230  Int iDC2 = uiDC2;
2231  if ( uiDC2 )
2232  {
2233    UInt uiSign;
2234    m_pcTDecBinIf->decodeBinEP( uiSign );
2235    if ( uiSign )
2236    {
2237      iDC2 = -iDC2;
2238    }
2239  }
2240
2241  pcCU->setWedgeFullDeltaDC1SubParts( iDC1, uiAbsPartIdx, uiDepth );
2242  pcCU->setWedgeFullDeltaDC2SubParts( iDC2, uiAbsPartIdx, uiDepth );
2243}
2244
2245Void TDecSbac::xParseWedgePredDirInfo( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth )
2246{
2247  if( DMM_WEDGE_PREDDIR_DELTAEND_MAX > 0 )
2248  {
2249    UInt uiDeltaEnd = 0;
2250    m_pcTDecBinIf->decodeBin( uiDeltaEnd, m_cDmmDataSCModel.get(0, 0, 2) );
2251
2252    Int iDeltaEnd;
2253    if( uiDeltaEnd != 0 )
2254    {
2255      UInt uiAbsValMinus1;
2256      UInt uiSymbol;
2257      m_pcTDecBinIf->decodeBin( uiSymbol, m_cDmmDataSCModel.get(0, 0, 2) ); uiAbsValMinus1  = uiSymbol;
2258      m_pcTDecBinIf->decodeBin( uiSymbol, m_cDmmDataSCModel.get(0, 0, 2) ); uiAbsValMinus1 |= uiSymbol << 1;
2259      uiDeltaEnd = uiAbsValMinus1 + 1;
2260
2261      iDeltaEnd = uiDeltaEnd;
2262      UInt uiSign;
2263      m_pcTDecBinIf->decodeBinEP( uiSign );
2264      if( uiSign )
2265      {
2266        iDeltaEnd = -iDeltaEnd;
2267      }
2268    }
2269    else
2270    {
2271      iDeltaEnd = 0;
2272    }
2273    pcCU->setWedgePredDirDeltaEndSubParts( iDeltaEnd, uiAbsPartIdx, uiDepth );
2274  }
2275}
2276
2277Void TDecSbac::xParseWedgePredDirDeltaInfo( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth )
2278{
2279  if( DMM_WEDGE_PREDDIR_DELTAEND_MAX > 0 )
2280  {
2281    UInt uiDeltaEnd = 0;
2282    m_pcTDecBinIf->decodeBin( uiDeltaEnd, m_cDmmDataSCModel.get(0, 0, 2) );
2283
2284    Int iDeltaEnd;
2285    if( uiDeltaEnd != 0 )
2286    {
2287      UInt uiAbsValMinus1;
2288      UInt uiSymbol;
2289      m_pcTDecBinIf->decodeBin( uiSymbol, m_cDmmDataSCModel.get(0, 0, 2) ); uiAbsValMinus1  = uiSymbol;
2290      m_pcTDecBinIf->decodeBin( uiSymbol, m_cDmmDataSCModel.get(0, 0, 2) ); uiAbsValMinus1 |= uiSymbol << 1;
2291      uiDeltaEnd = uiAbsValMinus1 + 1;
2292
2293      iDeltaEnd = uiDeltaEnd;
2294      UInt uiSign;
2295      m_pcTDecBinIf->decodeBinEP( uiSign );
2296      if( uiSign )
2297      {
2298        iDeltaEnd = -iDeltaEnd;
2299      }
2300    }
2301    else
2302    {
2303      iDeltaEnd = 0;
2304    }
2305
2306    pcCU->setWedgePredDirDeltaEndSubParts( iDeltaEnd, uiAbsPartIdx, uiDepth );
2307  }
2308
2309  UInt uiDC1, uiDC2;
2310  xReadExGolombLevel( uiDC1, m_cDmmDataSCModel.get(0, 0, 1) );
2311  Int iDC1 = uiDC1;
2312  if ( uiDC1 )
2313  {
2314    UInt uiSign;
2315    m_pcTDecBinIf->decodeBinEP( uiSign );
2316    if ( uiSign )
2317    {
2318      iDC1 = -iDC1;
2319    }
2320  }
2321  xReadExGolombLevel( uiDC2, m_cDmmDataSCModel.get(0, 0, 1) );
2322  Int iDC2 = uiDC2;
2323  if ( uiDC2 )
2324  {
2325    UInt uiSign;
2326    m_pcTDecBinIf->decodeBinEP( uiSign );
2327    if ( uiSign )
2328    {
2329      iDC2 = -iDC2;
2330    }
2331  }
2332
2333  pcCU->setWedgePredDirDeltaDC1SubParts( iDC1, uiAbsPartIdx, uiDepth );
2334  pcCU->setWedgePredDirDeltaDC2SubParts( iDC2, uiAbsPartIdx, uiDepth );
2335}
2336#endif
2337#if HHI_DMM_PRED_TEX
2338Void TDecSbac::xParseWedgePredTexDeltaInfo( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth )
2339{
2340  UInt uiDC1, uiDC2;
2341  xReadExGolombLevel( uiDC1, m_cDmmDataSCModel.get(0, 0, 1) );
2342  Int iDC1 = uiDC1;
2343  if ( uiDC1 )
2344  {
2345    UInt uiSign;
2346    m_pcTDecBinIf->decodeBinEP( uiSign );
2347    if ( uiSign )
2348    {
2349      iDC1 = -iDC1;
2350    }
2351  }
2352  xReadExGolombLevel( uiDC2, m_cDmmDataSCModel.get(0, 0, 1) );
2353  Int iDC2 = uiDC2;
2354  if ( uiDC2 )
2355  {
2356    UInt uiSign;
2357    m_pcTDecBinIf->decodeBinEP( uiSign );
2358    if ( uiSign )
2359    {
2360      iDC2 = -iDC2;
2361    }
2362  }
2363
2364  pcCU->setWedgePredTexDeltaDC1SubParts( iDC1, uiAbsPartIdx, uiDepth );
2365  pcCU->setWedgePredTexDeltaDC2SubParts( iDC2, uiAbsPartIdx, uiDepth );
2366}
2367
2368Void TDecSbac::xParseContourPredTexDeltaInfo( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth )
2369{
2370  UInt uiDC1, uiDC2;
2371  xReadExGolombLevel( uiDC1, m_cDmmDataSCModel.get(0, 0, 1) );
2372  Int iDC1 = uiDC1;
2373  if ( uiDC1 )
2374  {
2375    UInt uiSign;
2376    m_pcTDecBinIf->decodeBinEP( uiSign );
2377    if ( uiSign )
2378    {
2379      iDC1 = -iDC1;
2380    }
2381  }
2382  xReadExGolombLevel( uiDC2, m_cDmmDataSCModel.get(0, 0, 1) );
2383  Int iDC2 = uiDC2;
2384  if ( uiDC2 )
2385  {
2386    UInt uiSign;
2387    m_pcTDecBinIf->decodeBinEP( uiSign );
2388    if ( uiSign )
2389    {
2390      iDC2 = -iDC2;
2391    }
2392  }
2393
2394  pcCU->setContourPredTexDeltaDC1SubParts( iDC1, uiAbsPartIdx, uiDepth );
2395  pcCU->setContourPredTexDeltaDC2SubParts( iDC2, uiAbsPartIdx, uiDepth );
2396}
2397#endif
2398
2399#if LGE_EDGE_INTRA
2400Void TDecSbac::xParseEdgeIntraInfo( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth )
2401{
2402  UInt uiSymbol = 0;
2403
2404  // 1. Top(0) or Left(1)
2405  UChar ucLeft;
2406  m_pcTDecBinIf->decodeBinEP( uiSymbol );
2407  ucLeft = uiSymbol;
2408
2409  // 2. Start position (lowest bit first)
2410  UChar ucStart = 0;
2411  for( UInt ui = 0; ui < 6 - uiDepth; ui++ )
2412  {
2413    m_pcTDecBinIf->decodeBinEP( uiSymbol );
2414    ucStart |= (uiSymbol << ui);
2415  }
2416
2417  // 3. Number of edges
2418  UChar ucMax = 0;
2419  for( UInt ui = 0; ui < 7 - uiDepth; ui++ )
2420  {
2421    m_pcTDecBinIf->decodeBinEP( uiSymbol );
2422    ucMax |= (uiSymbol << ui);
2423  }
2424  ucMax++; // +1
2425
2426  // 4. Edges
2427  UChar* pucSymbolList = (UChar*) xMalloc( UChar, 256 * LGE_EDGE_INTRA_MAX_EDGE_NUM_PER_4x4 );
2428  UInt uiCtxEdgeIntra = pcCU->getCtxEdgeIntra( uiAbsPartIdx );
2429  for( Int iPtr = 0; iPtr < ucMax; iPtr++ )
2430  {
2431    UChar ucEdge = 0;
2432    UInt  uiReorderEdge = 0;
2433    // Left-friendly direction
2434    // 0 (   0deg) => 0
2435    // 1 (  45deg) => 10
2436    // 2 ( -45deg) => 110
2437    // 3 (  90deg) => 1110
2438    // 4 ( -90deg) => 11110
2439    // 5 ( 135deg) => 111110
2440    // 6 (-135deg) => 111111
2441    // Right-friendly direction
2442    // 0 (   0deg) => 0
2443    // 1 ( -45deg) => 10
2444    // 2 (  45deg) => 110
2445    // 3 ( -90deg) => 1110
2446    // 4 (  90deg) => 11110
2447    // 5 (-135deg) => 111110
2448    // 6 ( 135deg) => 111111
2449    // refer to a paper "An efficient chain code with Huffman coding"
2450    for( UInt ui = 0; ui < 6; ui++ )
2451    {
2452      m_pcTDecBinIf->decodeBin( uiSymbol, m_cEdgeIntraSCModel.get( 0, 0, uiCtxEdgeIntra ) );
2453      ucEdge <<= 1;
2454      ucEdge |= uiSymbol;
2455      if( uiSymbol == 0 )
2456        break;
2457    }
2458
2459    switch( ucEdge )
2460    {
2461    case 0 :  // "0"
2462      uiReorderEdge = 0;
2463      break;
2464    case 2 :  // "10"
2465      uiReorderEdge = 1;
2466      break;
2467    case 6 :  // "110"
2468      uiReorderEdge = 2;
2469      break;
2470    case 14 : // "1110"
2471      uiReorderEdge = 3;
2472      break;
2473    case 30 : // "11110"
2474      uiReorderEdge = 4;
2475      break;
2476    case 62 : // "111110"
2477      uiReorderEdge = 5;
2478      break;
2479    case 63 : // "111111"
2480      uiReorderEdge = 6;
2481      break;
2482    default :
2483      printf("parseIntraEdgeChain: error (unknown code %d)\n",ucEdge);
2484      assert(false);
2485      break;
2486    }
2487    pucSymbolList[iPtr] = uiReorderEdge;
2488  }
2489  /////////////////////
2490  // Edge Reconstruction
2491  Bool* pbRegion = pcCU->getEdgePartition( uiAbsPartIdx );
2492  pcCU->reconPartition( uiAbsPartIdx, uiDepth, ucLeft == 1, ucStart, ucMax, pucSymbolList, pbRegion );
2493  xFree( pucSymbolList );
2494}
2495#endif
2496
2497//! \}
Note: See TracBrowser for help on using the repository browser.