Changeset 56 in 3DVCSoftware for trunk/source/Lib/TLibDecoder/TDecSbac.cpp


Ignore:
Timestamp:
11 May 2012, 21:20:17 (12 years ago)
Author:
hschwarz
Message:

updated trunk (move to HM6.1)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/source/Lib/TLibDecoder/TDecSbac.cpp

    r5 r56  
    22 * License, included below. This software may be subject to other third party
    33 * and contributor rights, including patent rights, and no such rights are
    4  * granted under this license.
     4 * granted under this license. 
    55 *
    6  * Copyright (c) 2010-2011, ISO/IEC
     6 * Copyright (c) 2010-2012, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
     
    1515 *    this list of conditions and the following disclaimer in the documentation
    1616 *    and/or other materials provided with the distribution.
    17  *  * Neither the name of the ISO/IEC nor the names of its contributors may
     17 *  * Neither the name of the ITU/ISO/IEC nor the names of its contributors may
    1818 *    be used to endorse or promote products derived from this software without
    1919 *    specific prior written permission.
     
    3232 */
    3333
    34 
    35 
    3634/** \file     TDecSbac.cpp
    3735    \brief    Context-adaptive entropy decoder class
     
    3937
    4038#include "TDecSbac.h"
     39
     40//! \ingroup TLibDecoder
     41//! \{
    4142
    4243//////////////////////////////////////////////////////////////////////
     
    4849: m_pcBitstream               ( 0 )
    4950, m_pcTDecBinIf               ( NULL )
    50 , m_bAlfCtrl                  ( false )
    51 , m_uiMaxAlfCtrlDepth         ( 0 )
    52 , m_cCUSkipFlagSCModel        ( 1,             1,               NUM_SKIP_FLAG_CTX             )
    53 , m_cCUSplitFlagSCModel       ( 1,             1,               NUM_SPLIT_FLAG_CTX            )
    54 , m_cCUMergeFlagExtSCModel    ( 1,             1,               NUM_MERGE_FLAG_EXT_CTX        )
    55 , m_cCUMergeIdxExtSCModel     ( 1,             1,               NUM_MERGE_IDX_EXT_CTX         )
    56 , m_cCUMVMergeIdxExtSCModel   ( 1,             1,               NUM_MV_MERGE_IDX_EXT_CTX      )
    57 , m_cResPredFlagSCModel       ( 1,             1,               NUM_RES_PRED_FLAG_CTX         )
    58 , m_cCUAlfCtrlFlagSCModel     ( 1,             1,               NUM_ALF_CTRL_FLAG_CTX         )
    59 , m_cCUPartSizeSCModel        ( 1,             1,               NUM_PART_SIZE_CTX             )
    60 , m_cCUPredModeSCModel        ( 1,             1,               NUM_PRED_MODE_CTX             )
    61 , m_cCUIntraPredSCModel       ( 1,             1,               NUM_ADI_CTX                   )
    62 #if ADD_PLANAR_MODE
    63 , m_cPlanarFlagSCModel        ( 1,             1,               NUM_PLANARFLAG_CTX            )
    64 #endif
    65 , m_cCUChromaPredSCModel      ( 1,             1,               NUM_CHROMA_PRED_CTX           )
    66 , m_cCUInterDirSCModel        ( 1,             1,               NUM_INTER_DIR_CTX             )
    67 , m_cCURefPicSCModel          ( 1,             1,               NUM_REF_NO_CTX                )
    68 , m_cCUMvdSCModel             ( 1,             2,               NUM_MV_RES_CTX                )
    69 , m_cCUTransSubdivFlagSCModel ( 1,             1,               NUM_TRANS_SUBDIV_FLAG_CTX     )
    70 , m_cCUQtRootCbfSCModel       ( 1,             1,               NUM_QT_ROOT_CBF_CTX           )
    71 , m_cCUDeltaQpSCModel         ( 1,             1,               NUM_DELTA_QP_CTX              )
    72 , m_cCUQtCbfSCModel           ( 1,             3,               NUM_QT_CBF_CTX                )
    73 #if SIMPLE_CONTEXT_SIG
    74 , m_cCUSigSCModel             ( 4,             2,               NUM_SIG_FLAG_CTX              )
    75 #else
    76 , m_cCUSigSCModel             ( MAX_CU_DEPTH,  2,               NUM_SIG_FLAG_CTX              )
    77 #endif
    78 #if PCP_SIGMAP_SIMPLE_LAST
    79 , m_cCuCtxLastX               ( 1,             2,               NUM_CTX_LAST_FLAG_XY          )
    80 , m_cCuCtxLastY               ( 1,             2,               NUM_CTX_LAST_FLAG_XY          )
    81 #else
    82 , m_cCULastSCModel            ( MAX_CU_DEPTH,  2,               NUM_LAST_FLAG_CTX             )
    83 #endif
    84 , m_cCUOneSCModel             ( 1,             2,               NUM_ONE_FLAG_CTX              )
    85 , m_cCUAbsSCModel             ( 1,             2,               NUM_ABS_FLAG_CTX              )
    86 , m_cMVPIdxSCModel            ( 1,             1,               NUM_MVP_IDX_CTX               )
    87 , m_cALFFlagSCModel           ( 1,             1,               NUM_ALF_FLAG_CTX              )
    88 , m_cALFUvlcSCModel           ( 1,             1,               NUM_ALF_UVLC_CTX              )
    89 , m_cALFSvlcSCModel           ( 1,             1,               NUM_ALF_SVLC_CTX              )
    90 #if MTK_SAO
    91 , m_cAOFlagSCModel            ( 1,             1,               NUM_AO_FLAG_CTX              )
    92 , m_cAOUvlcSCModel            ( 1,             1,               NUM_AO_UVLC_CTX              )
    93 , m_cAOSvlcSCModel            ( 1,             1,               NUM_AO_SVLC_CTX              )
    94 #endif
    95 , m_cViewIdxSCModel           ( 1,             1,               NUM_VIEW_IDX_CTX              )
     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
    9695#if HHI_DMM_WEDGE_INTRA || HHI_DMM_PRED_TEX
    97 , m_cIntraDMMSCModel          ( 1,             1,               NUM_DMM_CTX                   )
    98 , m_cIntraWedgeSCModel        ( 1,             1,               NUM_WEDGE_CTX                 )
    99 #endif
    100 {
     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{
     101  assert( m_numContextModels <= MAX_NUM_CTX_MOD );
     102  m_iSliceGranularity = 0;
    101103}
    102104
     
    109111// ====================================================================================================================
    110112
    111 Void TDecSbac::resetEntropy          (TComSlice* pcSlice)
    112 {
    113   Int  iQp              = pcSlice->getSliceQp();
    114   SliceType eSliceType  = pcSlice->getSliceType();
    115  
    116   m_cCUSplitFlagSCModel.initBuffer       ( eSliceType, iQp, (Short*)INIT_SPLIT_FLAG );
    117   m_cCUSkipFlagSCModel.initBuffer        ( eSliceType, iQp, (Short*)INIT_SKIP_FLAG );
    118   m_cCUMergeFlagExtSCModel.initBuffer    ( eSliceType, iQp, (Short*)INIT_MERGE_FLAG_EXT );
    119   m_cCUMergeIdxExtSCModel.initBuffer     ( eSliceType, iQp, (Short*)INIT_MERGE_IDX_EXT );
    120   m_cCUMVMergeIdxExtSCModel.initBuffer   ( eSliceType, iQp, (Short*)INIT_MV_MERGE_IDX_EXT );
    121   m_cResPredFlagSCModel.initBuffer       ( eSliceType, iQp, (Short*)INIT_RES_PRED_FLAG );
    122   m_cCUAlfCtrlFlagSCModel.initBuffer     ( eSliceType, iQp, (Short*)INIT_ALF_CTRL_FLAG );
    123   m_cCUPartSizeSCModel.initBuffer        ( eSliceType, iQp, (Short*)INIT_PART_SIZE );
    124   m_cCUPredModeSCModel.initBuffer        ( eSliceType, iQp, (Short*)INIT_PRED_MODE );
    125   m_cCUIntraPredSCModel.initBuffer       ( eSliceType, iQp, (Short*)INIT_INTRA_PRED_MODE );
    126 #if ADD_PLANAR_MODE
    127   m_cPlanarFlagSCModel.initBuffer        ( eSliceType, iQp, (Short*)INIT_PLANARFLAG );
    128 #endif
    129   m_cCUChromaPredSCModel.initBuffer      ( eSliceType, iQp, (Short*)INIT_CHROMA_PRED_MODE );
    130   m_cCUInterDirSCModel.initBuffer        ( eSliceType, iQp, (Short*)INIT_INTER_DIR );
    131   m_cCUMvdSCModel.initBuffer             ( eSliceType, iQp, (Short*)INIT_MVD );
    132   m_cCURefPicSCModel.initBuffer          ( eSliceType, iQp, (Short*)INIT_REF_PIC );
    133   m_cCUDeltaQpSCModel.initBuffer         ( eSliceType, iQp, (Short*)INIT_DQP );
    134   m_cCUQtCbfSCModel.initBuffer           ( eSliceType, iQp, (Short*)INIT_QT_CBF );
    135   m_cCUQtRootCbfSCModel.initBuffer       ( eSliceType, iQp, (Short*)INIT_QT_ROOT_CBF );
    136   m_cCUSigSCModel.initBuffer             ( eSliceType, iQp, (Short*)INIT_SIG_FLAG );
    137 #if PCP_SIGMAP_SIMPLE_LAST
    138   m_cCuCtxLastX.initBuffer               ( eSliceType, iQp, (Short*)INIT_LAST_X );
    139   m_cCuCtxLastY.initBuffer               ( eSliceType, iQp, (Short*)INIT_LAST_Y );
    140 #else
    141   m_cCULastSCModel.initBuffer            ( eSliceType, iQp, (Short*)INIT_LAST_FLAG );
    142 #endif
    143   m_cCUOneSCModel.initBuffer             ( eSliceType, iQp, (Short*)INIT_ONE_FLAG );
    144   m_cCUAbsSCModel.initBuffer             ( eSliceType, iQp, (Short*)INIT_ABS_FLAG );
    145   m_cMVPIdxSCModel.initBuffer            ( eSliceType, iQp, (Short*)INIT_MVP_IDX );
    146   m_cALFFlagSCModel.initBuffer           ( eSliceType, iQp, (Short*)INIT_ALF_FLAG );
    147   m_cALFUvlcSCModel.initBuffer           ( eSliceType, iQp, (Short*)INIT_ALF_UVLC );
    148   m_cALFSvlcSCModel.initBuffer           ( eSliceType, iQp, (Short*)INIT_ALF_SVLC );
    149 #if MTK_SAO
    150   m_cAOFlagSCModel.initBuffer           ( eSliceType, iQp, (Short*)INIT_AO_FLAG );
    151   m_cAOUvlcSCModel.initBuffer           ( eSliceType, iQp, (Short*)INIT_AO_UVLC );
    152   m_cAOSvlcSCModel.initBuffer           ( eSliceType, iQp, (Short*)INIT_AO_SVLC );
    153 #endif
    154   m_cCUTransSubdivFlagSCModel.initBuffer ( eSliceType, iQp, (Short*)INIT_TRANS_SUBDIV_FLAG );
    155   m_cViewIdxSCModel.initBuffer           ( eSliceType, iQp, (Short*)INIT_VIEW_IDX );
     113#if CABAC_INIT_FLAG
     114Void TDecSbac::resetEntropy(TComSlice* pSlice)
     115{
     116  SliceType sliceType  = pSlice->getSliceType();
     117  Int       qp         = pSlice->getSliceQp();
     118
     119  if (pSlice->getPPS()->getCabacInitPresentFlag() && pSlice->getCabacInitFlag())
     120  {
     121    switch (sliceType)
     122    {
     123    case P_SLICE:           // change initialization table to B_SLICE initialization
     124      sliceType = B_SLICE;
     125      break;
     126    case B_SLICE:           // change initialization table to P_SLICE initialization
     127      sliceType = P_SLICE;
     128      break;
     129    default     :           // should not occur
     130      assert(0);
     131    }
     132  }
     133
     134#else
     135Void TDecSbac::resetEntropywithQPandInitIDC (Int  qp, Int iID)
     136{
     137  SliceType sliceType = (SliceType)iID;
     138#endif 
     139
     140  m_cCUSplitFlagSCModel.initBuffer       ( sliceType, qp, (UChar*)INIT_SPLIT_FLAG );
     141  m_cCUSkipFlagSCModel.initBuffer        ( sliceType, qp, (UChar*)INIT_SKIP_FLAG );
     142  m_cCUMergeFlagExtSCModel.initBuffer    ( sliceType, qp, (UChar*)INIT_MERGE_FLAG_EXT );
     143  m_cCUMergeIdxExtSCModel.initBuffer     ( sliceType, qp, (UChar*)INIT_MERGE_IDX_EXT );
     144#if HHI_INTER_VIEW_RESIDUAL_PRED
     145  m_cResPredFlagSCModel.initBuffer       ( sliceType, qp, (UChar*)INIT_RES_PRED_FLAG );
     146#endif
     147  m_cCUAlfCtrlFlagSCModel.initBuffer     ( sliceType, qp, (UChar*)INIT_ALF_CTRL_FLAG );
     148  m_cCUPartSizeSCModel.initBuffer        ( sliceType, qp, (UChar*)INIT_PART_SIZE );
     149#if AMP_CTX
     150  m_cCUAMPSCModel.initBuffer             ( sliceType, qp, (UChar*)INIT_CU_AMP_POS );
     151#else
     152  m_cCUXPosiSCModel.initBuffer           ( sliceType, qp, (UChar*)INIT_CU_X_POS );
     153  m_cCUYPosiSCModel.initBuffer           ( sliceType, qp, (UChar*)INIT_CU_Y_POS );
     154#endif
     155  m_cCUPredModeSCModel.initBuffer        ( sliceType, qp, (UChar*)INIT_PRED_MODE );
     156  m_cCUIntraPredSCModel.initBuffer       ( sliceType, qp, (UChar*)INIT_INTRA_PRED_MODE );
     157  m_cCUChromaPredSCModel.initBuffer      ( sliceType, qp, (UChar*)INIT_CHROMA_PRED_MODE );
     158  m_cCUInterDirSCModel.initBuffer        ( sliceType, qp, (UChar*)INIT_INTER_DIR );
     159  m_cCUMvdSCModel.initBuffer             ( sliceType, qp, (UChar*)INIT_MVD );
     160  m_cCURefPicSCModel.initBuffer          ( sliceType, qp, (UChar*)INIT_REF_PIC );
     161  m_cCUDeltaQpSCModel.initBuffer         ( sliceType, qp, (UChar*)INIT_DQP );
     162  m_cCUQtCbfSCModel.initBuffer           ( sliceType, qp, (UChar*)INIT_QT_CBF );
     163  m_cCUQtRootCbfSCModel.initBuffer       ( sliceType, qp, (UChar*)INIT_QT_ROOT_CBF );
     164  m_cCUSigCoeffGroupSCModel.initBuffer   ( sliceType, qp, (UChar*)INIT_SIG_CG_FLAG );
     165  m_cCUSigSCModel.initBuffer             ( sliceType, qp, (UChar*)INIT_SIG_FLAG );
     166  m_cCuCtxLastX.initBuffer               ( sliceType, qp, (UChar*)INIT_LAST );
     167  m_cCuCtxLastY.initBuffer               ( sliceType, qp, (UChar*)INIT_LAST );
     168  m_cCUOneSCModel.initBuffer             ( sliceType, qp, (UChar*)INIT_ONE_FLAG );
     169  m_cCUAbsSCModel.initBuffer             ( sliceType, qp, (UChar*)INIT_ABS_FLAG );
     170  m_cMVPIdxSCModel.initBuffer            ( sliceType, qp, (UChar*)INIT_MVP_IDX );
     171  m_cALFFlagSCModel.initBuffer           ( sliceType, qp, (UChar*)INIT_ALF_FLAG );
     172  m_cALFUvlcSCModel.initBuffer           ( sliceType, qp, (UChar*)INIT_ALF_UVLC );
     173  m_cALFSvlcSCModel.initBuffer           ( sliceType, qp, (UChar*)INIT_ALF_SVLC );
     174  m_cSaoFlagSCModel.initBuffer           ( sliceType, qp, (UChar*)INIT_SAO_FLAG );
     175  m_cSaoUvlcSCModel.initBuffer           ( sliceType, qp, (UChar*)INIT_SAO_UVLC );
     176  m_cSaoSvlcSCModel.initBuffer           ( sliceType, qp, (UChar*)INIT_SAO_SVLC );
     177#if SAO_UNIT_INTERLEAVING
     178  m_cSaoMergeLeftSCModel.initBuffer      ( sliceType, qp, (UChar*)INIT_SAO_MERGE_LEFT_FLAG );
     179  m_cSaoMergeUpSCModel.initBuffer        ( sliceType, qp, (UChar*)INIT_SAO_MERGE_UP_FLAG );
     180  m_cSaoTypeIdxSCModel.initBuffer        ( sliceType, qp, (UChar*)INIT_SAO_TYPE_IDX );
     181#endif
     182
     183  m_cCUTransSubdivFlagSCModel.initBuffer ( sliceType, qp, (UChar*)INIT_TRANS_SUBDIV_FLAG );
     184  m_uiLastDQpNonZero  = 0;
    156185#if HHI_DMM_WEDGE_INTRA || HHI_DMM_PRED_TEX
    157   m_cIntraDMMSCModel.initBuffer          ( eSliceType, iQp, (Short*)INIT_INTRA_DMM );
    158   m_cIntraWedgeSCModel.initBuffer        ( eSliceType, iQp, (Short*)INIT_INTRA_WEDGELET );
    159 #endif
    160  
    161   m_uiLastDQpNonZero  = 0;
     186  m_cDmmFlagSCModel.initBuffer           ( sliceType, qp, (UChar*)INIT_DMM_FLAG );
     187  m_cDmmModeSCModel.initBuffer           ( sliceType, qp, (UChar*)INIT_DMM_MODE );
     188  m_cDmmDataSCModel.initBuffer           ( sliceType, qp, (UChar*)INIT_DMM_DATA );
     189#endif
    162190 
    163191  // new structure
    164   m_uiLastQp          = iQp;
     192  m_uiLastQp          = qp;
    165193 
    166194  m_pcTDecBinIf->start();
     195}
     196
     197/** The function does the following: Read out terminate bit. Flush CABAC. Byte-align for next tile.
     198 *  Intialize CABAC states. Start CABAC.
     199 */
     200Void TDecSbac::updateContextTables( SliceType eSliceType, Int iQp )
     201{
     202  UInt uiBit;
     203  m_pcTDecBinIf->decodeBinTrm(uiBit);
     204  m_pcTDecBinIf->finish(); 
     205#if !OL_FLUSH_ALIGN
     206  // Account for misaligned CABAC.
     207  Int iCABACReadAhead = m_pcTDecBinIf->getBitsReadAhead();
     208  iCABACReadAhead--;
     209  Int iStreamBits = 8-m_pcBitstream->getNumBitsUntilByteAligned();
     210  if (iCABACReadAhead >= iStreamBits)
     211  {
     212    // Misaligned CABAC has read into the 1st byte of the next tile.
     213    // Back up a byte prior to alignment.
     214    m_pcBitstream->backupByte();
     215  }
     216#endif
     217  m_pcBitstream->readOutTrailingBits();
     218  m_cCUSplitFlagSCModel.initBuffer       ( eSliceType, iQp, (UChar*)INIT_SPLIT_FLAG );
     219  m_cCUSkipFlagSCModel.initBuffer        ( eSliceType, iQp, (UChar*)INIT_SKIP_FLAG );
     220  m_cCUMergeFlagExtSCModel.initBuffer    ( eSliceType, iQp, (UChar*)INIT_MERGE_FLAG_EXT );
     221  m_cCUMergeIdxExtSCModel.initBuffer     ( eSliceType, iQp, (UChar*)INIT_MERGE_IDX_EXT );
     222#if HHI_INTER_VIEW_RESIDUAL_PRED
     223  m_cResPredFlagSCModel.initBuffer       ( eSliceType, iQp, (UChar*)INIT_RES_PRED_FLAG );
     224#endif
     225  m_cCUAlfCtrlFlagSCModel.initBuffer     ( eSliceType, iQp, (UChar*)INIT_ALF_CTRL_FLAG );
     226  m_cCUPartSizeSCModel.initBuffer        ( eSliceType, iQp, (UChar*)INIT_PART_SIZE );
     227#if AMP_CTX
     228  m_cCUAMPSCModel.initBuffer             ( eSliceType, iQp, (UChar*)INIT_CU_AMP_POS );
     229#else
     230  m_cCUXPosiSCModel.initBuffer           ( eSliceType, iQp, (UChar*)INIT_CU_X_POS );
     231  m_cCUYPosiSCModel.initBuffer           ( eSliceType, iQp, (UChar*)INIT_CU_Y_POS );
     232#endif
     233  m_cCUPredModeSCModel.initBuffer        ( eSliceType, iQp, (UChar*)INIT_PRED_MODE );
     234  m_cCUIntraPredSCModel.initBuffer       ( eSliceType, iQp, (UChar*)INIT_INTRA_PRED_MODE );
     235  m_cCUChromaPredSCModel.initBuffer      ( eSliceType, iQp, (UChar*)INIT_CHROMA_PRED_MODE );
     236  m_cCUInterDirSCModel.initBuffer        ( eSliceType, iQp, (UChar*)INIT_INTER_DIR );
     237  m_cCUMvdSCModel.initBuffer             ( eSliceType, iQp, (UChar*)INIT_MVD );
     238  m_cCURefPicSCModel.initBuffer          ( eSliceType, iQp, (UChar*)INIT_REF_PIC );
     239  m_cCUDeltaQpSCModel.initBuffer         ( eSliceType, iQp, (UChar*)INIT_DQP );
     240  m_cCUQtCbfSCModel.initBuffer           ( eSliceType, iQp, (UChar*)INIT_QT_CBF );
     241  m_cCUQtRootCbfSCModel.initBuffer       ( eSliceType, iQp, (UChar*)INIT_QT_ROOT_CBF );
     242  m_cCUSigCoeffGroupSCModel.initBuffer   ( eSliceType, iQp, (UChar*)INIT_SIG_CG_FLAG );
     243  m_cCUSigSCModel.initBuffer             ( eSliceType, iQp, (UChar*)INIT_SIG_FLAG );
     244  m_cCuCtxLastX.initBuffer               ( eSliceType, iQp, (UChar*)INIT_LAST );
     245  m_cCuCtxLastY.initBuffer               ( eSliceType, iQp, (UChar*)INIT_LAST );
     246  m_cCUOneSCModel.initBuffer             ( eSliceType, iQp, (UChar*)INIT_ONE_FLAG );
     247  m_cCUAbsSCModel.initBuffer             ( eSliceType, iQp, (UChar*)INIT_ABS_FLAG );
     248  m_cMVPIdxSCModel.initBuffer            ( eSliceType, iQp, (UChar*)INIT_MVP_IDX );
     249  m_cALFFlagSCModel.initBuffer           ( eSliceType, iQp, (UChar*)INIT_ALF_FLAG );
     250  m_cALFUvlcSCModel.initBuffer           ( eSliceType, iQp, (UChar*)INIT_ALF_UVLC );
     251  m_cALFSvlcSCModel.initBuffer           ( eSliceType, iQp, (UChar*)INIT_ALF_SVLC );
     252  m_cSaoFlagSCModel.initBuffer           ( eSliceType, iQp, (UChar*)INIT_SAO_FLAG );
     253  m_cSaoUvlcSCModel.initBuffer           ( eSliceType, iQp, (UChar*)INIT_SAO_UVLC );
     254  m_cSaoSvlcSCModel.initBuffer           ( eSliceType, iQp, (UChar*)INIT_SAO_SVLC );
     255#if SAO_UNIT_INTERLEAVING
     256  m_cSaoMergeLeftSCModel.initBuffer      ( eSliceType, iQp, (UChar*)INIT_SAO_MERGE_LEFT_FLAG );
     257  m_cSaoMergeUpSCModel.initBuffer        ( eSliceType, iQp, (UChar*)INIT_SAO_MERGE_UP_FLAG );
     258  m_cSaoTypeIdxSCModel.initBuffer        ( eSliceType, iQp, (UChar*)INIT_SAO_TYPE_IDX );
     259#endif
     260  m_cCUTransSubdivFlagSCModel.initBuffer ( eSliceType, iQp, (UChar*)INIT_TRANS_SUBDIV_FLAG );
     261#if HHI_DMM_WEDGE_INTRA || HHI_DMM_PRED_TEX
     262  m_cDmmFlagSCModel.initBuffer           ( eSliceType, iQp, (UChar*)INIT_DMM_FLAG );
     263  m_cDmmModeSCModel.initBuffer           ( eSliceType, iQp, (UChar*)INIT_DMM_MODE );
     264  m_cDmmDataSCModel.initBuffer           ( eSliceType, iQp, (UChar*)INIT_DMM_DATA );
     265#endif
     266
     267  m_pcTDecBinIf->start();
     268}
     269
     270Void TDecSbac::readTileMarker( UInt& uiTileIdx, UInt uiBitsUsed )
     271{
     272  UInt uiSymbol;
     273  uiTileIdx = 0;
     274  for (Int iShift=uiBitsUsed-1; iShift>=0; iShift--)
     275  {
     276    m_pcTDecBinIf->decodeBinEP ( uiSymbol );
     277    if (uiSymbol)
     278    {
     279      uiTileIdx |= (1<<iShift);
     280    }
     281  }
    167282}
    168283
     
    206321}
    207322
    208 #if MVD_CTX
    209 /** Decode a motion vector difference
    210  * \param riMvdComp motion vector difference
    211  * \param uiAbsSumL motion vector difference of left PU
    212  * \param uiAbsSumA motion vector difference of above PU
    213  * \param uiCtx index for context set based on vertical or horizontal component
    214  */
    215 Void TDecSbac::xReadMvd( Int& riMvdComp, UInt uiAbsSumL, UInt uiAbsSumA, UInt uiCtx )
    216 #else
    217 Void TDecSbac::xReadMvd( Int& riMvdComp, UInt uiAbsSum, UInt uiCtx )
    218 #endif
    219 {
    220   UInt uiLocalCtx = 0;
    221 
    222 #if MVD_CTX
    223   uiLocalCtx += (uiAbsSumA>16) ? 1 : 0;
    224   uiLocalCtx += (uiAbsSumL>16) ? 1 : 0;
    225 #else
    226   if( uiAbsSum >= 3 )
    227   {
    228     uiLocalCtx += ( uiAbsSum > 32) ? 2 : 1;
    229   }
    230 #endif
    231 
    232   riMvdComp = 0;
    233  
    234   UInt uiSymbol;
    235   m_pcTDecBinIf->decodeBin( uiSymbol, m_cCUMvdSCModel.get( 0, uiCtx, uiLocalCtx ) );
    236  
    237   if (!uiSymbol)
    238   {
    239     return;
    240   }
    241  
    242   xReadExGolombMvd( uiSymbol, &m_cCUMvdSCModel.get( 0, uiCtx, 3 ), 3 );
    243   uiSymbol++;
    244  
    245   UInt uiSign;
    246   m_pcTDecBinIf->decodeBinEP( uiSign );
    247  
    248   riMvdComp = ( 0 != uiSign ) ? -(Int)uiSymbol : (Int)uiSymbol;
    249  
    250   return;
    251 }
    252 
    253 Void TDecSbac::xReadExGolombMvd( UInt& ruiSymbol, ContextModel* pcSCModel, UInt uiMaxBin )
    254 {
    255   UInt uiSymbol;
    256  
    257   m_pcTDecBinIf->decodeBin( ruiSymbol, pcSCModel[0] );
    258  
    259   if( !ruiSymbol )
    260   {
    261     return;
    262   }
    263  
    264   m_pcTDecBinIf->decodeBin( uiSymbol, pcSCModel[1] );
    265  
    266   ruiSymbol = 1;
    267  
    268   if( !uiSymbol )
    269   {
    270     return;
    271   }
    272  
    273   pcSCModel += 2;
    274   UInt uiCount = 2;
    275  
    276   do
    277   {
    278     if( uiMaxBin == uiCount )
    279     {
    280       pcSCModel++;
    281     }
    282     m_pcTDecBinIf->decodeBin( uiSymbol, *pcSCModel );
    283     uiCount++;
    284   }
    285   while( uiSymbol && ( uiCount != 8 ) );
    286  
    287   ruiSymbol = uiCount - 1;
    288  
    289   if( uiSymbol )
    290   {
    291     xReadEpExGolomb( uiSymbol, 3 );
    292     ruiSymbol += uiSymbol + 1;
    293   }
    294  
    295   return;
    296 }
    297 
    298323Void TDecSbac::xReadEpExGolomb( UInt& ruiSymbol, UInt uiCount )
    299324{
     
    307332  }
    308333 
    309   uiCount--;
    310   while( uiCount-- )
    311   {
    312     m_pcTDecBinIf->decodeBinEP( uiBit );
    313     uiSymbol += uiBit << uiCount;
     334  if ( --uiCount )
     335  {
     336    UInt bins;
     337    m_pcTDecBinIf->decodeBinsEP( bins, uiCount );
     338    uiSymbol += bins;
    314339  }
    315340 
    316341  ruiSymbol = uiSymbol;
    317  
    318   return;
    319342}
    320343
     
    341364}
    342365
    343 #if E253
    344366/** Parsing of coeff_abs_level_minus3
    345367 * \param ruiSymbol reference to coeff_abs_level_minus3
     
    366388  uiQuotient -= uiCodeWord;
    367389
    368   for( UInt ui = 0; ui < ruiGoRiceParam; ui++ )
    369   {
    370     m_pcTDecBinIf->decodeBinEP( uiCodeWord );
    371     if( uiCodeWord )
    372     {
    373       uiRemainder += 1 << ui;
    374     }
     390  if ( ruiGoRiceParam > 0 )
     391  {
     392    m_pcTDecBinIf->decodeBinsEP( uiRemainder, ruiGoRiceParam );   
    375393  }
    376394
     
    384402  }
    385403
     404#if EIGHT_BITS_RICE_CODE
     405  ruiGoRiceParam = g_aauiGoRiceUpdate[ ruiGoRiceParam ][ min<UInt>( ruiSymbol, 23 ) ];
     406#else
    386407  ruiGoRiceParam = g_aauiGoRiceUpdate[ ruiGoRiceParam ][ min<UInt>( ruiSymbol, 15 ) ];
     408#endif
    387409
    388410  return;
    389411}
    390 #if HHI_DMM_WEDGE_INTRA || HHI_DMM_PRED_TEX
    391 Void TDecSbac::xReadExGolombLevel( UInt& ruiSymbol, ContextModel& rcSCModel  )
     412
     413
     414/** Parse I_PCM information.
     415 * \param pcCU
     416 * \param uiAbsPartIdx
     417 * \param uiDepth
     418 * \returns Void
     419 *
     420 * If I_PCM flag indicates that the CU is I_PCM, parse its PCM alignment bits and codes.
     421 */
     422Void TDecSbac::parseIPCMInfo ( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth )
    392423{
    393424  UInt uiSymbol;
    394   UInt uiCount = 0;
    395   do
    396   {
    397     m_pcTDecBinIf->decodeBin( uiSymbol, rcSCModel );
    398     uiCount++;
    399   }
    400   while( uiSymbol && ( uiCount != 13 ) );
    401 
    402   ruiSymbol = uiCount - 1;
    403 
    404   if( uiSymbol )
    405   {
    406     xReadEpExGolomb( uiSymbol, 0 );
    407     ruiSymbol += uiSymbol + 1;
    408   }
    409 
    410   return;
    411 }
    412 #endif
    413 #else
    414 Void TDecSbac::xReadExGolombLevel( UInt& ruiSymbol, ContextModel& rcSCModel  )
    415 {
    416   UInt uiSymbol;
    417   UInt uiCount = 0;
    418   do
    419   {
    420     m_pcTDecBinIf->decodeBin( uiSymbol, rcSCModel );
    421     uiCount++;
    422   }
    423   while( uiSymbol && ( uiCount != 13 ) );
    424  
    425   ruiSymbol = uiCount - 1;
    426  
    427   if( uiSymbol )
    428   {
    429     xReadEpExGolomb( uiSymbol, 0 );
    430     ruiSymbol += uiSymbol + 1;
    431   }
    432  
    433   return;
    434 }
    435 #endif
    436 
    437 Void TDecSbac::parseAlfCtrlDepth( UInt& ruiAlfCtrlDepth )
    438 {
    439   UInt uiSymbol;
    440   xReadUnaryMaxSymbol( uiSymbol, m_cALFUvlcSCModel.get( 0 ), 1, g_uiMaxCUDepth - 1 );
    441   ruiAlfCtrlDepth = uiSymbol;
    442 }
    443 
    444 Void TDecSbac::parseAlfCtrlFlag( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth )
    445 {
    446   if( !m_bAlfCtrl )
    447   {
    448     return;
    449   }
    450  
    451   if( uiDepth > m_uiMaxAlfCtrlDepth && !pcCU->isFirstAbsZorderIdxInDepth( uiAbsPartIdx, m_uiMaxAlfCtrlDepth ) )
    452   {
    453     return;
    454   }
    455  
    456   UInt uiSymbol;
    457   m_pcTDecBinIf->decodeBin( uiSymbol, m_cCUAlfCtrlFlagSCModel.get( 0, 0, pcCU->getCtxAlfCtrlFlag( uiAbsPartIdx ) ) );
    458  
    459   if( uiDepth > m_uiMaxAlfCtrlDepth )
    460   {
    461     pcCU->setAlfCtrlFlagSubParts( uiSymbol, uiAbsPartIdx, m_uiMaxAlfCtrlDepth );
     425#if BURST_IPCM
     426  Int numSubseqIPCM = 0;
     427  Bool readPCMSampleFlag = false;
     428
     429  if(pcCU->getNumSucIPCM() > 0)
     430  {
     431    readPCMSampleFlag = true;
    462432  }
    463433  else
    464434  {
    465     pcCU->setAlfCtrlFlagSubParts( uiSymbol, uiAbsPartIdx, uiDepth );
     435    m_pcTDecBinIf->decodeBinTrm(uiSymbol);
     436
     437    if (uiSymbol)
     438    {
     439      readPCMSampleFlag = true;
     440      m_pcTDecBinIf->decodeNumSubseqIPCM(numSubseqIPCM);
     441      pcCU->setNumSucIPCM(numSubseqIPCM + 1);
     442      m_pcTDecBinIf->decodePCMAlignBits();
     443    }
     444  }
     445#else
     446  m_pcTDecBinIf->decodeBinTrm(uiSymbol);
     447#endif
     448
     449#if BURST_IPCM
     450  if (readPCMSampleFlag == true)
     451#else
     452  if (uiSymbol)
     453#endif
     454  {
     455    Bool bIpcmFlag = true;
     456
     457#if !BURST_IPCM
     458    m_pcTDecBinIf->decodePCMAlignBits();
     459#endif
     460
     461    pcCU->setPartSizeSubParts  ( SIZE_2Nx2N, uiAbsPartIdx, uiDepth );
     462    pcCU->setSizeSubParts      ( g_uiMaxCUWidth>>uiDepth, g_uiMaxCUHeight>>uiDepth, uiAbsPartIdx, uiDepth );
     463    pcCU->setIPCMFlagSubParts  ( bIpcmFlag, uiAbsPartIdx, uiDepth );
     464
     465    UInt uiMinCoeffSize = pcCU->getPic()->getMinCUWidth()*pcCU->getPic()->getMinCUHeight();
     466    UInt uiLumaOffset   = uiMinCoeffSize*uiAbsPartIdx;
     467    UInt uiChromaOffset = uiLumaOffset>>2;
     468
     469    Pel* piPCMSample;
     470    UInt uiWidth;
     471    UInt uiHeight;
     472    UInt uiSampleBits;
     473    UInt uiX, uiY;
     474
     475    piPCMSample = pcCU->getPCMSampleY() + uiLumaOffset;
     476    uiWidth = pcCU->getWidth(uiAbsPartIdx);
     477    uiHeight = pcCU->getHeight(uiAbsPartIdx);
     478    uiSampleBits = pcCU->getSlice()->getSPS()->getPCMBitDepthLuma();
     479
     480    for(uiY = 0; uiY < uiHeight; uiY++)
     481    {
     482      for(uiX = 0; uiX < uiWidth; uiX++)
     483      {
     484        UInt uiSample;
     485        m_pcTDecBinIf->xReadPCMCode(uiSampleBits, uiSample);
     486        piPCMSample[uiX] = uiSample;
     487      }
     488      piPCMSample += uiWidth;
     489    }
     490
     491    piPCMSample = pcCU->getPCMSampleCb() + uiChromaOffset;
     492    uiWidth = pcCU->getWidth(uiAbsPartIdx)/2;
     493    uiHeight = pcCU->getHeight(uiAbsPartIdx)/2;
     494    uiSampleBits = pcCU->getSlice()->getSPS()->getPCMBitDepthChroma();
     495
     496    for(uiY = 0; uiY < uiHeight; uiY++)
     497    {
     498      for(uiX = 0; uiX < uiWidth; uiX++)
     499      {
     500        UInt uiSample;
     501        m_pcTDecBinIf->xReadPCMCode(uiSampleBits, uiSample);
     502        piPCMSample[uiX] = uiSample;
     503      }
     504      piPCMSample += uiWidth;
     505    }
     506
     507    piPCMSample = pcCU->getPCMSampleCr() + uiChromaOffset;
     508    uiWidth = pcCU->getWidth(uiAbsPartIdx)/2;
     509    uiHeight = pcCU->getHeight(uiAbsPartIdx)/2;
     510    uiSampleBits = pcCU->getSlice()->getSPS()->getPCMBitDepthChroma();
     511
     512    for(uiY = 0; uiY < uiHeight; uiY++)
     513    {
     514      for(uiX = 0; uiX < uiWidth; uiX++)
     515      {
     516        UInt uiSample;
     517        m_pcTDecBinIf->xReadPCMCode(uiSampleBits, uiSample);
     518        piPCMSample[uiX] = uiSample;
     519      }
     520      piPCMSample += uiWidth;
     521    }
     522
     523#if BURST_IPCM
     524    pcCU->setNumSucIPCM( pcCU->getNumSucIPCM() - 1);
     525    if(pcCU->getNumSucIPCM() == 0)
     526    {
     527      m_pcTDecBinIf->resetBac();
     528    }
     529#else
     530    m_pcTDecBinIf->resetBac();
     531#endif
    466532  }
    467533}
     
    483549  UInt uiCtxSkip = pcCU->getCtxSkipFlag( uiAbsPartIdx );
    484550  m_pcTDecBinIf->decodeBin( uiSymbol, m_cCUSkipFlagSCModel.get( 0, 0, uiCtxSkip ) );
    485   DTRACE_CABAC_V( g_nSymbolCounter++ );
     551  DTRACE_CABAC_VL( g_nSymbolCounter++ );
    486552  DTRACE_CABAC_T( "\tSkipFlag" );
    487553  DTRACE_CABAC_T( "\tuiCtxSkip: ");
     
    496562    pcCU->setPartSizeSubParts( SIZE_2Nx2N, uiAbsPartIdx, uiDepth );
    497563    pcCU->setSizeSubParts( g_uiMaxCUWidth>>uiDepth, g_uiMaxCUHeight>>uiDepth, uiAbsPartIdx, uiDepth );
    498    
    499 #if HHI_MRG_SKIP
    500564    pcCU->setMergeFlagSubParts( true , uiAbsPartIdx, 0, uiDepth );
    501 #else
    502     TComMv cZeroMv(0,0);
    503     pcCU->getCUMvField( REF_PIC_LIST_0 )->setAllMvd    ( cZeroMv, SIZE_2Nx2N, uiAbsPartIdx, 0, uiDepth );
    504     pcCU->getCUMvField( REF_PIC_LIST_1 )->setAllMvd    ( cZeroMv, SIZE_2Nx2N, uiAbsPartIdx, 0, uiDepth );
    505    
    506     pcCU->setTrIdxSubParts( 0, uiAbsPartIdx, uiDepth );
    507     pcCU->setCbfSubParts  ( 0, 0, 0, uiAbsPartIdx, uiDepth );
    508    
    509     if ( pcCU->getSlice()->isInterP() )
    510     {
    511       pcCU->setInterDirSubParts( 1, uiAbsPartIdx, 0, uiDepth );
    512      
    513       if ( pcCU->getSlice()->getNumRefIdx( REF_PIC_LIST_0 ) > 0 )
    514         pcCU->getCUMvField( REF_PIC_LIST_0 )->setAllRefIdx(  0, SIZE_2Nx2N, uiAbsPartIdx, 0, uiDepth );
    515       if ( pcCU->getSlice()->getNumRefIdx( REF_PIC_LIST_1 ) > 0 )
    516         pcCU->getCUMvField( REF_PIC_LIST_1 )->setAllRefIdx( NOT_VALID, SIZE_2Nx2N, uiAbsPartIdx, 0, uiDepth );
    517     }
    518     else
    519     {
    520       pcCU->setInterDirSubParts( 3, uiAbsPartIdx, 0, uiDepth );
    521      
    522       if ( pcCU->getSlice()->getNumRefIdx( REF_PIC_LIST_0 ) > 0 )
    523         pcCU->getCUMvField( REF_PIC_LIST_0 )->setAllRefIdx(  0, SIZE_2Nx2N, uiAbsPartIdx, 0, uiDepth );
    524       if ( pcCU->getSlice()->getNumRefIdx( REF_PIC_LIST_1 ) > 0 )
    525         pcCU->getCUMvField( REF_PIC_LIST_1 )->setAllRefIdx( 0, SIZE_2Nx2N, uiAbsPartIdx, 0, uiDepth );
    526     }
    527 #endif // HHI_MRG_SKIP
    528565  }
    529566}
     
    539576{
    540577  UInt uiSymbol;
    541   UInt uiCtx = 0;
    542 #if CHANGE_MERGE_CONTEXT
    543   uiCtx = pcCU->getCtxMergeFlag( uiAbsPartIdx );
    544 #else
    545   for(UInt uiIter = 0; uiIter < MRG_MAX_NUM_CANDS; uiIter++ )
    546   {
    547     if( pcCU->getNeighbourCandIdx( uiIter, uiAbsPartIdx ) == uiIter + 1 )
    548     {
    549       if( uiIter == 0 )
    550       {
    551         uiCtx++;
    552       }
    553       else if( uiIter == 1 )
    554       {
    555         uiCtx++;
    556       }
    557     }
    558   }
    559 #endif
    560   m_pcTDecBinIf->decodeBin( uiSymbol, m_cCUMergeFlagExtSCModel.get( 0, 0, uiCtx ) );
     578  m_pcTDecBinIf->decodeBin( uiSymbol, *m_cCUMergeFlagExtSCModel.get( 0 ) );
    561579  pcCU->setMergeFlagSubParts( uiSymbol ? true : false, uiAbsPartIdx, uiPUIdx, uiDepth );
    562580
    563   DTRACE_CABAC_V( g_nSymbolCounter++ );
     581  DTRACE_CABAC_VL( g_nSymbolCounter++ );
    564582  DTRACE_CABAC_T( "\tMergeFlag: " );
    565583  DTRACE_CABAC_V( uiSymbol );
     
    568586  DTRACE_CABAC_T( "\tuiAbsPartIdx: " );
    569587  DTRACE_CABAC_V( uiAbsPartIdx );
    570   for( UInt ui = 0; ui < MRG_MAX_NUM_CANDS; ui++ )
    571   {
    572     DTRACE_CABAC_T( "\tNumMrgCand: " );
    573     DTRACE_CABAC_V( ui );
    574     DTRACE_CABAC_T( "\t==\t" );
    575     DTRACE_CABAC_V( UInt( pcCU->getNeighbourCandIdx( ui, uiAbsPartIdx ) ) );
    576   }
    577588  DTRACE_CABAC_T( "\n" );
    578589}
    579590
    580 
    581 #if HHI_INTER_VIEW_MOTION_PRED || HHI_MPI
    582 Void TDecSbac::parseMergeIndexMV( TComDataCU* pcCU, UInt& ruiMergeIndex, UInt uiAbsPartIdx, UInt uiDepth )
    583 {
     591Void TDecSbac::parseMergeIndex ( TComDataCU* pcCU, UInt& ruiMergeIndex, UInt uiAbsPartIdx, UInt uiDepth )
     592{
     593  UInt uiNumCand = MRG_MAX_NUM_CANDS;
     594#if !MRG_IDX_CTX_RED 
     595  UInt auiCtx[4] = { 0, 1, 2, 3 };
     596#endif
     597  UInt uiUnaryIdx = 0;
     598  uiNumCand = pcCU->getSlice()->getMaxNumMergeCand();
    584599#if HHI_MPI
    585600  const Bool bMVIAvailable = pcCU->getSlice()->getSPS()->getUseMVI() && pcCU->getSlice()->getSliceType() != I_SLICE;
    586   const UInt uiMviMergePos = bMVIAvailable ? HHI_MPI_MERGE_POS : MRG_MAX_NUM_CANDS;
    587 #endif
    588   //--- set number of candidates and availability ---
    589   Bool  abAvailable[ MRG_MAX_NUM_CANDS ];
    590   UInt  uiNumCand = 0;
    591   for( UInt uiIdx = 0; uiIdx < MRG_MAX_NUM_CANDS; uiIdx++ )
    592   {
    593 #if HHI_MPI
    594     if( uiIdx == uiMviMergePos )
    595     {
    596       abAvailable[ uiIdx ] = true;
    597       uiNumCand++;
    598     }
    599     else if( uiIdx > uiMviMergePos )
    600     {
    601       if( ( abAvailable[ uiIdx ] = ( pcCU->getNeighbourCandIdx( uiIdx - 1, uiAbsPartIdx ) == uiIdx ) ) )
    602       {
    603         uiNumCand++;
    604       }
    605     }
    606     else
    607 #endif
    608     if( ( abAvailable[ uiIdx ] = ( pcCU->getNeighbourCandIdx( uiIdx, uiAbsPartIdx ) == uiIdx + 1 ) ) )
    609     {
    610       uiNumCand++;
    611     }
    612   }
    613   AOF( uiNumCand > 1 );
    614 
    615   //--- determine contexts ---
    616   AOF( NUM_MV_MERGE_IDX_EXT_CTX >= MRG_MAX_NUM_CANDS - 1 );
    617   UInt  auiCtx[ MRG_MAX_NUM_CANDS - 1 ];
    618   for( UInt uiIdx = 0; uiIdx < MRG_MAX_NUM_CANDS - 1; uiIdx++ )
    619   {
    620     auiCtx[ uiIdx ] = MRG_MAX_NUM_CANDS;
    621     if( uiNumCand > uiIdx + 1 )
    622     {
    623       Bool bAvComb    = false;
    624       for( UInt uiCId = uiIdx; uiCId < MRG_MAX_NUM_CANDS - 1; uiCId++ )
    625       {
    626         bAvComb = ( bAvComb || abAvailable[ uiCId ] );
    627         if( abAvailable[ uiCId + 1 ] && bAvComb )
    628         {
    629           auiCtx[ uiIdx ] = uiCId;
    630           break;
    631         }
    632       }
    633       AOT( auiCtx[ uiIdx ] == MRG_MAX_NUM_CANDS );
    634     }
    635   }
    636 
    637   //--- parse unary index ---
    638   UInt uiUnaryIdx = 0;
    639   for( ; uiUnaryIdx < uiNumCand - 1; uiUnaryIdx++ )
    640   {
    641     UInt uiSymbol = 0;
    642     m_pcTDecBinIf->decodeBin( uiSymbol, m_cCUMVMergeIdxExtSCModel.get( 0, 0, auiCtx[uiUnaryIdx] ) );
    643     if( uiSymbol == 0 )
    644     {
    645       break;
    646     }
    647   }
    648 
    649   //--- determine merge index ---
     601  const UInt uiMviMergePos = bMVIAvailable ? HHI_MPI_MERGE_POS : uiNumCand;
     602#endif
     603  if ( uiNumCand > 1 )
     604  {
     605    for( ; uiUnaryIdx < uiNumCand - 1; ++uiUnaryIdx )
     606    {
     607      UInt uiSymbol = 0;
     608#if MRG_IDX_CTX_RED
     609      if ( uiUnaryIdx==0 )
     610      {
     611        m_pcTDecBinIf->decodeBin( uiSymbol, m_cCUMergeIdxExtSCModel.get( 0, 0, 0 ) );
     612      }
     613      else
     614      {
     615        m_pcTDecBinIf->decodeBinEP( uiSymbol );
     616      }
     617#else
     618      m_pcTDecBinIf->decodeBin( uiSymbol, m_cCUMergeIdxExtSCModel.get( 0, 0, auiCtx[uiUnaryIdx] ) );
     619#endif
     620      if( uiSymbol == 0 )
     621      {
     622        break;
     623      }
     624    }
     625  }
    650626  ruiMergeIndex = uiUnaryIdx;
    651   for( UInt uiIdx = 0; uiIdx <= ruiMergeIndex; uiIdx++ )
    652   {
    653     if( ! abAvailable[ uiIdx ] )
    654     {
    655       ruiMergeIndex++;
    656     }
    657   }
    658 
    659 #if HHI_MPI
    660   if( ruiMergeIndex > uiMviMergePos )
    661   {
    662     ruiMergeIndex--;
    663   }
    664   else if( ruiMergeIndex == uiMviMergePos )
    665   {
    666     pcCU->setTextureModeDepthSubParts( uiDepth, uiAbsPartIdx, uiDepth );
    667   }
    668 #endif
    669 
    670   //--- trace ---
    671   DTRACE_CABAC_V( g_nSymbolCounter++ );
    672   DTRACE_CABAC_T( "\tparseMergeIndex():" );
    673   DTRACE_CABAC_T( "   MRGIdx = " );
    674   DTRACE_CABAC_V( ruiMergeIndex );
    675   DTRACE_CABAC_T( "   UnaryIdx = " );
    676   DTRACE_CABAC_V( uiUnaryIdx );
    677   DTRACE_CABAC_T( "   NumCand = " );
    678   DTRACE_CABAC_V( uiNumCand );
    679   DTRACE_CABAC_T( "   Availibility = " );
    680   for( UInt uiIdx = 0; uiIdx < MRG_MAX_NUM_CANDS; uiIdx++ )
    681   {
    682     DTRACE_CABAC_V( abAvailable[ uiIdx ] ? 1 : 0 );
    683   }
    684   DTRACE_CABAC_T( "   Contexts = " );
    685   for( UInt uiIdx = 0; uiIdx < MRG_MAX_NUM_CANDS - 1; uiIdx++ )
    686   {
    687     DTRACE_CABAC_V( auiCtx[ uiIdx ] );
    688   }
    689   DTRACE_CABAC_T( "\n" );
    690 }
    691 #endif
    692 
    693 
    694 Void TDecSbac::parseMergeIndex ( TComDataCU* pcCU, UInt& ruiMergeIndex, UInt uiAbsPartIdx, UInt uiDepth )
    695 {
    696 #if HHI_INTER_VIEW_MOTION_PRED || HHI_MPI
    697   if(
    698 #if HHI_INTER_VIEW_MOTION_PRED
    699       ( pcCU->getSlice()->getSPS()->getViewId() > 0 && ( pcCU->getSlice()->getSPS()->getMultiviewMvPredMode() & PDM_USE_FOR_MERGE ) == PDM_USE_FOR_MERGE ) ||
    700 #endif
    701 #if HHI_MPI
    702       ( pcCU->getSlice()->getSPS()->getUseMVI() && pcCU->getSlice()->getSliceType() != I_SLICE && pcCU->getPartitionSize( uiAbsPartIdx ) == SIZE_2Nx2N ) ||
    703 #endif
    704       0
    705     )
    706   {
    707     parseMergeIndexMV( pcCU, ruiMergeIndex, uiAbsPartIdx, uiDepth );
    708     return;
    709   }
    710 #endif
    711 
    712   Bool bLeftInvolved = false;
    713   Bool bAboveInvolved = false;
    714   Bool bCollocatedInvolved = false;
    715   Bool bCornerInvolved = false;
    716   Bool bCornerBLInvolved = false;
    717   UInt uiNumCand = 0;
    718   for( UInt uiIter = 0; uiIter < MRG_MAX_NUM_CANDS; ++uiIter )
    719   {
    720     if( pcCU->getNeighbourCandIdx( uiIter, uiAbsPartIdx ) == uiIter + 1 )
    721     {
    722       uiNumCand++;
    723       if( uiIter == 0 )
    724       {
    725         bLeftInvolved = true;
    726       }
    727       else if( uiIter == 1 )
    728       {
    729         bAboveInvolved = true;
    730       }
    731       else if( uiIter == 2 )
    732       {
    733         bCollocatedInvolved = true;
    734       }
    735       else if( uiIter == 3 )
    736       {
    737         bCornerInvolved = true;
    738       }
    739       else if( uiIter == 4 )
    740       {
    741         bCornerBLInvolved = true;
    742       }
    743     }
    744   }
    745   assert( uiNumCand > 1 );
    746 
    747   UInt auiCtx[4] = { 0, 0, 0, 3 };
    748   if( bLeftInvolved && bAboveInvolved )
    749   {
    750     auiCtx[0] = 0;
    751   }
    752   else if( bLeftInvolved || bAboveInvolved )
    753   {
    754     auiCtx[0] = bCollocatedInvolved ? 1 : 2;
    755   }
    756   else
    757   {
    758     auiCtx[0] = bCollocatedInvolved ? 2 : 3;
    759   }
    760 
    761   if( uiNumCand >= 3 )
    762   {
    763     if( bAboveInvolved )
    764     {
    765       auiCtx[1] = bCollocatedInvolved ? 1 : 2;
    766     }
    767     else
    768     {
    769       auiCtx[1] = bCollocatedInvolved ? 2 : 3;
    770     }
    771   }
    772 
    773   if( uiNumCand >= 4 )
    774   {
    775     auiCtx[2] =  bCollocatedInvolved ? 2 : 3;
    776   }
    777 
    778   UInt uiUnaryIdx = 0;
    779   for( ; uiUnaryIdx < uiNumCand - 1; ++uiUnaryIdx )
    780   {
    781     UInt uiSymbol = 0;
    782     m_pcTDecBinIf->decodeBin( uiSymbol, m_cCUMergeIdxExtSCModel.get( 0, 0, auiCtx[uiUnaryIdx] ) );
    783     if( uiSymbol == 0 )
    784     {
    785       break;
    786     }
    787   }
    788 
    789   if( !bLeftInvolved )
    790   {
    791     ++uiUnaryIdx;
    792   }
    793   if( !bAboveInvolved && uiUnaryIdx >= 1 )
    794   {
    795     ++uiUnaryIdx;
    796   }
    797   if( !bCollocatedInvolved && uiUnaryIdx >= 2 )
    798   {
    799     ++uiUnaryIdx;
    800   }
    801   if( !bCornerInvolved && uiUnaryIdx >= 3 )
    802   {
    803     ++uiUnaryIdx;
    804   }
    805 
    806   ruiMergeIndex = uiUnaryIdx;
    807 
    808   DTRACE_CABAC_V( g_nSymbolCounter++ )
     627
     628  DTRACE_CABAC_VL( g_nSymbolCounter++ )
    809629  DTRACE_CABAC_T( "\tparseMergeIndex()" )
    810630  DTRACE_CABAC_T( "\tuiMRGIdx= " )
    811631  DTRACE_CABAC_V( ruiMergeIndex )
    812   DTRACE_CABAC_T( "\tuiNumCand= " )
    813   DTRACE_CABAC_V( uiNumCand )
    814   DTRACE_CABAC_T( "\tbLeftInvolved= " )
    815   DTRACE_CABAC_V( bLeftInvolved )
    816   DTRACE_CABAC_T( "\tbAboveInvolved= " )
    817   DTRACE_CABAC_V( bAboveInvolved )
    818   DTRACE_CABAC_T( "\tbCollocatedInvolved= " )
    819   DTRACE_CABAC_V( bCollocatedInvolved )
    820   DTRACE_CABAC_T( "\tbCornerRTInvolved= " )
    821   DTRACE_CABAC_V( bCornerInvolved )
    822   DTRACE_CABAC_T( "\tbCornerBLInvolved= " )
    823   DTRACE_CABAC_V( bCornerBLInvolved )
    824632  DTRACE_CABAC_T( "\n" )
    825 }
    826 
    827 
    828 Void
     633#if HHI_MPI
     634  if( ruiMergeIndex > uiMviMergePos )
     635  {
     636    assert( bMVIAvailable );
     637    ruiMergeIndex--;
     638  }
     639  else if( ruiMergeIndex == uiMviMergePos )
     640  {
     641    assert( bMVIAvailable );
     642    pcCU->setTextureModeDepthSubParts( uiDepth, uiAbsPartIdx, uiDepth );
     643  }
     644#endif
     645}
     646
     647#if HHI_INTER_VIEW_RESIDUAL_PRED
     648Void
    829649TDecSbac::parseResPredFlag( TComDataCU* pcCU, Bool& rbResPredFlag, UInt uiAbsPartIdx, UInt uiDepth )
    830650{
    831   UInt uiCtx    = 0;
     651  UInt uiCtx    = pcCU->getCtxResPredFlag( uiAbsPartIdx );
    832652  UInt uiSymbol = 0;
    833653  m_pcTDecBinIf->decodeBin( uiSymbol, m_cResPredFlagSCModel.get( 0, 0, uiCtx ) );
    834654  rbResPredFlag = ( uiSymbol != 0 );
    835655}
    836 
    837 
    838 Void TDecSbac::parseMVPIdx      ( TComDataCU* pcCU, Int& riMVPIdx, Int iMVPNum, UInt uiAbsPartIdx, UInt uiDepth, RefPicList eRefList )
     656#endif
     657
     658#if HHI_INTER_VIEW_MOTION_PRED
     659Void TDecSbac::parseMVPIdx      ( Int& riMVPIdx, Int iNumAMVPCands )
    839660{
    840661  UInt uiSymbol;
    841   xReadUnaryMaxSymbol(uiSymbol, m_cMVPIdxSCModel.get(0), 1, iMVPNum-1);
    842 
     662  xReadUnaryMaxSymbol(uiSymbol, m_cMVPIdxSCModel.get(0), 1, iNumAMVPCands-1);
    843663  riMVPIdx = uiSymbol;
    844664}
     665#else
     666Void TDecSbac::parseMVPIdx      ( Int& riMVPIdx )
     667{
     668  UInt uiSymbol;
     669  xReadUnaryMaxSymbol(uiSymbol, m_cMVPIdxSCModel.get(0), 1, AMVP_MAX_NUM_CANDS-1);
     670  riMVPIdx = uiSymbol;
     671}
     672#endif
    845673
    846674Void TDecSbac::parseSplitFlag     ( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth )
     
    854682  UInt uiSymbol;
    855683  m_pcTDecBinIf->decodeBin( uiSymbol, m_cCUSplitFlagSCModel.get( 0, 0, pcCU->getCtxSplitFlag( uiAbsPartIdx, uiDepth ) ) );
    856   DTRACE_CABAC_V( g_nSymbolCounter++ )
     684  DTRACE_CABAC_VL( g_nSymbolCounter++ )
    857685  DTRACE_CABAC_T( "\tSplitFlag\n" )
    858686  pcCU->setDepthSubParts( uiDepth + uiSymbol, uiAbsPartIdx );
     
    874702  if ( pcCU->isIntra( uiAbsPartIdx ) )
    875703  {
    876 #if MTK_DISABLE_INTRA_NxN_SPLIT
    877704    uiSymbol = 1;
    878705    if( uiDepth == g_uiMaxCUDepth - g_uiAddCUDepth )
    879 #endif
    880706    {
    881707      m_pcTDecBinIf->decodeBin( uiSymbol, m_cCUPartSizeSCModel.get( 0, 0, 0) );
    882708    }
    883709    eMode = uiSymbol ? SIZE_2Nx2N : SIZE_NxN;
     710    UInt uiTrLevel = 0;   
     711    UInt uiWidthInBit  = g_aucConvertToBit[pcCU->getWidth(uiAbsPartIdx)]+2;
     712    UInt uiTrSizeInBit = g_aucConvertToBit[pcCU->getSlice()->getSPS()->getMaxTrSize()]+2;
     713    uiTrLevel          = uiWidthInBit >= uiTrSizeInBit ? uiWidthInBit - uiTrSizeInBit : 0;
     714    if( eMode == SIZE_NxN )
     715    {
     716      pcCU->setTrIdxSubParts( 1+uiTrLevel, uiAbsPartIdx, uiDepth );
     717    }
     718    else
     719    {
     720      pcCU->setTrIdxSubParts( uiTrLevel, uiAbsPartIdx, uiDepth );
     721    }
    884722  }
    885723  else
    886724  {
    887 #if HHI_RMP_SWITCH
    888     if ( !pcCU->getSlice()->getSPS()->getUseRMP())
    889     {
    890       m_pcTDecBinIf->decodeBin( uiSymbol, m_cCUPartSizeSCModel.get( 0, 0, 0) );
    891       if( uiSymbol )
    892         uiMode = 0;
    893       else
    894         uiMode = 3;
    895     }
    896     else
    897 #endif
    898     {
    899       UInt uiMaxNumBits = 3;
    900       for ( UInt ui = 0; ui < uiMaxNumBits; ui++ )
    901       {
    902         m_pcTDecBinIf->decodeBin( uiSymbol, m_cCUPartSizeSCModel.get( 0, 0, ui) );
    903         if ( uiSymbol )
     725    UInt uiMaxNumBits = 2;
     726    if( uiDepth == g_uiMaxCUDepth - g_uiAddCUDepth && !( pcCU->getSlice()->getSPS()->getDisInter4x4() && (g_uiMaxCUWidth>>uiDepth) == 8 && (g_uiMaxCUHeight>>uiDepth) == 8 ) )
     727    {
     728      uiMaxNumBits ++;
     729    }
     730    for ( UInt ui = 0; ui < uiMaxNumBits; ui++ )
     731    {
     732      m_pcTDecBinIf->decodeBin( uiSymbol, m_cCUPartSizeSCModel.get( 0, 0, ui) );
     733      if ( uiSymbol )
     734      {
     735        break;
     736      }
     737      uiMode++;
     738    }
     739    eMode = (PartSize) uiMode;
     740    if ( pcCU->getSlice()->getSPS()->getAMPAcc( uiDepth ) )
     741    {
     742      if (eMode == SIZE_2NxN)
     743      {
     744#if AMP_CTX
     745          m_pcTDecBinIf->decodeBin(uiSymbol, m_cCUAMPSCModel.get( 0, 0, 0 ));
     746#else
     747        m_pcTDecBinIf->decodeBin(uiSymbol, m_cCUYPosiSCModel.get( 0, 0, 0 ));
     748#endif
     749        if (uiSymbol == 0)
    904750        {
    905           break;
     751#if AMP_CTX
     752          m_pcTDecBinIf->decodeBinEP(uiSymbol);
     753#else
     754          m_pcTDecBinIf->decodeBin(uiSymbol, m_cCUYPosiSCModel.get( 0, 0, 1 ));
     755#endif
     756          eMode = (uiSymbol == 0? SIZE_2NxnU : SIZE_2NxnD);
    906757        }
    907         uiMode++;
    908       }
    909     }
    910     eMode = (PartSize) uiMode;
    911    
    912     if (pcCU->getSlice()->isInterB() && uiMode == 3)
    913     {
    914 #if HHI_DISABLE_INTER_NxN_SPLIT
    915       uiSymbol = 0;
    916       if( uiDepth == g_uiMaxCUDepth - g_uiAddCUDepth )
    917 #endif
    918       {
    919         m_pcTDecBinIf->decodeBin( uiSymbol, m_cCUPartSizeSCModel.get( 0, 0, 3) );
    920       }
    921      
    922       if (uiSymbol == 0)
    923       {
    924         pcCU->setPredModeSubParts( MODE_INTRA, uiAbsPartIdx, uiDepth );
    925 #if MTK_DISABLE_INTRA_NxN_SPLIT
    926         if( uiDepth == g_uiMaxCUDepth - g_uiAddCUDepth )
    927 #endif
     758      }
     759      else if (eMode == SIZE_Nx2N)
     760      {
     761#if AMP_CTX
     762        m_pcTDecBinIf->decodeBin(uiSymbol, m_cCUAMPSCModel.get( 0, 0, 0 ));
     763#else
     764        m_pcTDecBinIf->decodeBin(uiSymbol, m_cCUXPosiSCModel.get( 0, 0, 0 ));
     765#endif
     766        if (uiSymbol == 0)
    928767        {
    929           m_pcTDecBinIf->decodeBin( uiSymbol, m_cCUPartSizeSCModel.get( 0, 0, 4) );
     768#if AMP_CTX
     769          m_pcTDecBinIf->decodeBinEP(uiSymbol);
     770#else
     771          m_pcTDecBinIf->decodeBin(uiSymbol, m_cCUXPosiSCModel.get( 0, 0, 1 ));
     772#endif
     773          eMode = (uiSymbol == 0? SIZE_nLx2N : SIZE_nRx2N);
    930774        }
    931         if (uiSymbol == 0)
    932           eMode = SIZE_2Nx2N;
    933       }
    934     }
    935   }
    936  
     775      }
     776    }
     777  }
    937778  pcCU->setPartSizeSubParts( eMode, uiAbsPartIdx, uiDepth );
    938779  pcCU->setSizeSubParts( g_uiMaxCUWidth>>uiDepth, g_uiMaxCUHeight>>uiDepth, uiAbsPartIdx, uiDepth );
    939  
    940   UInt uiTrLevel = 0;
    941  
    942   UInt uiWidthInBit  = g_aucConvertToBit[pcCU->getWidth(uiAbsPartIdx)]+2;
    943   UInt uiTrSizeInBit = g_aucConvertToBit[pcCU->getSlice()->getSPS()->getMaxTrSize()]+2;
    944   uiTrLevel          = uiWidthInBit >= uiTrSizeInBit ? uiWidthInBit - uiTrSizeInBit : 0;
    945  
    946   if( pcCU->getPredictionMode(uiAbsPartIdx) == MODE_INTRA )
    947   {
    948     if( pcCU->getPartitionSize( uiAbsPartIdx ) == SIZE_NxN )
    949     {
    950       pcCU->setTrIdxSubParts( 1+uiTrLevel, uiAbsPartIdx, uiDepth );
    951     }
    952     else
    953     {
    954       pcCU->setTrIdxSubParts( uiTrLevel, uiAbsPartIdx, uiDepth );
    955     }
    956   }
    957780}
    958781
     
    973796  UInt uiSymbol;
    974797  Int  iPredMode = MODE_INTER;
    975   if ( pcCU->getSlice()->isInterB() )
    976   {
    977     pcCU->setPredModeSubParts( (PredMode)iPredMode, uiAbsPartIdx, uiDepth );
    978     return;
    979   }
    980   m_pcTDecBinIf->decodeBin( uiSymbol, m_cCUPredModeSCModel.get( 0, 0, 1 ) );
     798  m_pcTDecBinIf->decodeBin( uiSymbol, m_cCUPredModeSCModel.get( 0, 0, 0 ) );
    981799  iPredMode += uiSymbol;
    982800  pcCU->setPredModeSubParts( (PredMode)iPredMode, uiAbsPartIdx, uiDepth );
    983801}
    984 
    985 #if HHI_DMM_WEDGE_INTRA
    986 Void TDecSbac::xParseWedgeFullInfo( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth )
    987 {
    988   Int iIntraIdx = pcCU->getIntraSizeIdx(uiAbsPartIdx);
    989   Int iBits = g_aucWedgeFullBitsListIdx[iIntraIdx];
    990 
    991   UInt uiSymbol, uiTabIdx = 0;
    992   for ( Int i = 0; i < iBits; i++ )
    993   {
    994     m_pcTDecBinIf->decodeBin( uiSymbol, m_cIntraWedgeSCModel.get(0, 0, 0) );
    995     uiTabIdx += ( uiSymbol && i == 0 ) ? 1 : 0;
    996     uiTabIdx += ( uiSymbol && i == 1 ) ? 2 : 0;
    997     uiTabIdx += ( uiSymbol && i == 2 ) ? 4 : 0;
    998     uiTabIdx += ( uiSymbol && i == 3 ) ? 8 : 0;
    999     uiTabIdx += ( uiSymbol && i == 4 ) ? 16 : 0;
    1000     uiTabIdx += ( uiSymbol && i == 5 ) ? 32 : 0;
    1001     uiTabIdx += ( uiSymbol && i == 6 ) ? 64 : 0;
    1002     uiTabIdx += ( uiSymbol && i == 7 ) ? 128 : 0;
    1003     uiTabIdx += ( uiSymbol && i == 8 ) ? 256 : 0;
    1004     uiTabIdx += ( uiSymbol && i == 9 ) ? 512 : 0;
    1005     uiTabIdx += ( uiSymbol && i == 10 ) ? 1024 : 0;
    1006     uiTabIdx += ( uiSymbol && i == 11 ) ? 2048 : 0;
    1007     uiTabIdx += ( uiSymbol && i == 12 ) ? 4096 : 0;
    1008   }
    1009   pcCU->setWedgeFullTabIdxSubParts( uiTabIdx, uiAbsPartIdx, uiDepth );
    1010 }
    1011 
    1012 Void TDecSbac::xParseWedgeFullDeltaInfo( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth )
    1013 {
    1014   Int iIntraIdx = pcCU->getIntraSizeIdx(uiAbsPartIdx);
    1015   Int iBits = g_aucWedgeFullBitsListIdx[iIntraIdx];
    1016 
    1017   UInt uiSymbol, uiTabIdx = 0;
    1018   for ( Int i = 0; i < iBits; i++ )
    1019   {
    1020     m_pcTDecBinIf->decodeBin( uiSymbol, m_cIntraWedgeSCModel.get(0, 0, 0) );
    1021     uiTabIdx += ( uiSymbol && i == 0 ) ? 1 : 0;
    1022     uiTabIdx += ( uiSymbol && i == 1 ) ? 2 : 0;
    1023     uiTabIdx += ( uiSymbol && i == 2 ) ? 4 : 0;
    1024     uiTabIdx += ( uiSymbol && i == 3 ) ? 8 : 0;
    1025     uiTabIdx += ( uiSymbol && i == 4 ) ? 16 : 0;
    1026     uiTabIdx += ( uiSymbol && i == 5 ) ? 32 : 0;
    1027     uiTabIdx += ( uiSymbol && i == 6 ) ? 64 : 0;
    1028     uiTabIdx += ( uiSymbol && i == 7 ) ? 128 : 0;
    1029     uiTabIdx += ( uiSymbol && i == 8 ) ? 256 : 0;
    1030     uiTabIdx += ( uiSymbol && i == 9 ) ? 512 : 0;
    1031     uiTabIdx += ( uiSymbol && i == 10 ) ? 1024 : 0;
    1032     uiTabIdx += ( uiSymbol && i == 11 ) ? 2048 : 0;
    1033     uiTabIdx += ( uiSymbol && i == 12 ) ? 4096 : 0;
    1034   }
    1035   pcCU->setWedgeFullTabIdxSubParts( uiTabIdx, uiAbsPartIdx, uiDepth );
    1036 
    1037   UInt uiDC1, uiDC2;
    1038   xReadExGolombLevel( uiDC1, m_cIntraWedgeSCModel.get(0, 0, 1) );
    1039   Int iDC1 = uiDC1;
    1040   if ( uiDC1 )
    1041   {
    1042     UInt uiSign;
    1043     m_pcTDecBinIf->decodeBinEP( uiSign );
    1044     if ( uiSign )
    1045     {
    1046       iDC1 = -iDC1;
    1047     }
    1048   }
    1049   xReadExGolombLevel( uiDC2, m_cIntraWedgeSCModel.get(0, 0, 1) );
    1050   Int iDC2 = uiDC2;
    1051   if ( uiDC2 )
    1052   {
    1053     UInt uiSign;
    1054     m_pcTDecBinIf->decodeBinEP( uiSign );
    1055     if ( uiSign )
    1056     {
    1057       iDC2 = -iDC2;
    1058     }
    1059   }
    1060 
    1061   pcCU->setWedgeFullDeltaDC1SubParts( iDC1, uiAbsPartIdx, uiDepth );
    1062   pcCU->setWedgeFullDeltaDC2SubParts( iDC2, uiAbsPartIdx, uiDepth );
    1063 }
    1064 
    1065 Void TDecSbac::xParseWedgePredDirInfo( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth )
    1066 {
    1067   if( DMM_WEDGE_PREDDIR_DELTAEND_MAX > 0 )
    1068   {
    1069     UInt uiDeltaEnd = 0;
    1070     m_pcTDecBinIf->decodeBin( uiDeltaEnd, m_cIntraWedgeSCModel.get(0, 0, 3) );
    1071 
    1072     Int iDeltaEnd;
    1073     if( uiDeltaEnd != 0 )
    1074     {
    1075       UInt uiAbsValMinus1;
    1076       UInt uiSymbol;
    1077       m_pcTDecBinIf->decodeBin( uiSymbol, m_cIntraWedgeSCModel.get(0, 0, 3) ); uiAbsValMinus1  = uiSymbol;
    1078       m_pcTDecBinIf->decodeBin( uiSymbol, m_cIntraWedgeSCModel.get(0, 0, 3) ); uiAbsValMinus1 |= uiSymbol << 1;
    1079       uiDeltaEnd = uiAbsValMinus1 + 1;
    1080      
    1081       iDeltaEnd = uiDeltaEnd;
    1082       UInt uiSign;
    1083       m_pcTDecBinIf->decodeBinEP( uiSign );
    1084       if( uiSign )
    1085       {
    1086         iDeltaEnd = -iDeltaEnd;
    1087       }
    1088     }
    1089     else
    1090     {
    1091       iDeltaEnd = 0;
    1092     }
    1093     pcCU->setWedgePredDirDeltaEndSubParts( iDeltaEnd, uiAbsPartIdx, uiDepth );
    1094   }
    1095 }
    1096 
    1097 Void TDecSbac::xParseWedgePredDirDeltaInfo( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth )
    1098 {
    1099   if( DMM_WEDGE_PREDDIR_DELTAEND_MAX > 0 )
    1100   {
    1101     UInt uiDeltaEnd = 0;
    1102     m_pcTDecBinIf->decodeBin( uiDeltaEnd, m_cIntraWedgeSCModel.get(0, 0, 3) );
    1103 
    1104     Int iDeltaEnd;
    1105     if( uiDeltaEnd != 0 )
    1106     {
    1107       UInt uiAbsValMinus1;
    1108       UInt uiSymbol;
    1109       m_pcTDecBinIf->decodeBin( uiSymbol, m_cIntraWedgeSCModel.get(0, 0, 3) ); uiAbsValMinus1  = uiSymbol;
    1110       m_pcTDecBinIf->decodeBin( uiSymbol, m_cIntraWedgeSCModel.get(0, 0, 3) ); uiAbsValMinus1 |= uiSymbol << 1;
    1111       uiDeltaEnd = uiAbsValMinus1 + 1;
    1112 
    1113       iDeltaEnd = uiDeltaEnd;
    1114       UInt uiSign;
    1115       m_pcTDecBinIf->decodeBinEP( uiSign );
    1116       if( uiSign )
    1117       {
    1118         iDeltaEnd = -iDeltaEnd;
    1119       }
    1120     }
    1121     else
    1122     {
    1123       iDeltaEnd = 0;
    1124     }
    1125 
    1126     pcCU->setWedgePredDirDeltaEndSubParts( iDeltaEnd, uiAbsPartIdx, uiDepth );
    1127   }
    1128 
    1129   UInt uiDC1, uiDC2;
    1130   xReadExGolombLevel( uiDC1, m_cIntraWedgeSCModel.get(0, 0, 1) );
    1131   Int iDC1 = uiDC1;
    1132   if ( uiDC1 )
    1133   {
    1134     UInt uiSign;
    1135     m_pcTDecBinIf->decodeBinEP( uiSign );
    1136     if ( uiSign )
    1137     {
    1138       iDC1 = -iDC1;
    1139     }
    1140   }
    1141   xReadExGolombLevel( uiDC2, m_cIntraWedgeSCModel.get(0, 0, 1) );
    1142   Int iDC2 = uiDC2;
    1143   if ( uiDC2 )
    1144   {
    1145     UInt uiSign;
    1146     m_pcTDecBinIf->decodeBinEP( uiSign );
    1147     if ( uiSign )
    1148     {
    1149       iDC2 = -iDC2;
    1150     }
    1151   }
    1152 
    1153   pcCU->setWedgePredDirDeltaDC1SubParts( iDC1, uiAbsPartIdx, uiDepth );
    1154   pcCU->setWedgePredDirDeltaDC2SubParts( iDC2, uiAbsPartIdx, uiDepth );
    1155 }
    1156 #endif
    1157 #if HHI_DMM_PRED_TEX
    1158 Void TDecSbac::xParseWedgePredTexDeltaInfo( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth )
    1159 {
    1160   UInt uiDC1, uiDC2;
    1161   xReadExGolombLevel( uiDC1, m_cIntraWedgeSCModel.get(0, 0, 1) );
    1162   Int iDC1 = uiDC1;
    1163   if ( uiDC1 )
    1164   {
    1165     UInt uiSign;
    1166     m_pcTDecBinIf->decodeBinEP( uiSign );
    1167     if ( uiSign )
    1168     {
    1169       iDC1 = -iDC1;
    1170     }
    1171   }
    1172   xReadExGolombLevel( uiDC2, m_cIntraWedgeSCModel.get(0, 0, 1) );
    1173   Int iDC2 = uiDC2;
    1174   if ( uiDC2 )
    1175   {
    1176     UInt uiSign;
    1177     m_pcTDecBinIf->decodeBinEP( uiSign );
    1178     if ( uiSign )
    1179     {
    1180       iDC2 = -iDC2;
    1181     }
    1182   }
    1183 
    1184   pcCU->setWedgePredTexDeltaDC1SubParts( iDC1, uiAbsPartIdx, uiDepth );
    1185   pcCU->setWedgePredTexDeltaDC2SubParts( iDC2, uiAbsPartIdx, uiDepth );
    1186 }
    1187 
    1188 Void TDecSbac::xParseContourPredTexDeltaInfo( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth )
    1189 {
    1190   UInt uiDC1, uiDC2;
    1191   xReadExGolombLevel( uiDC1, m_cIntraWedgeSCModel.get(0, 0, 1) );
    1192   Int iDC1 = uiDC1;
    1193   if ( uiDC1 )
    1194 {
    1195     UInt uiSign;
    1196     m_pcTDecBinIf->decodeBinEP( uiSign );
    1197     if ( uiSign )
    1198     {
    1199       iDC1 = -iDC1;
    1200     }
    1201   }
    1202   xReadExGolombLevel( uiDC2, m_cIntraWedgeSCModel.get(0, 0, 1) );
    1203   Int iDC2 = uiDC2;
    1204   if ( uiDC2 )
    1205   {
    1206     UInt uiSign;
    1207     m_pcTDecBinIf->decodeBinEP( uiSign );
    1208     if ( uiSign )
    1209     {
    1210       iDC2 = -iDC2;
    1211     }
    1212   }
    1213 
    1214   pcCU->setContourPredTexDeltaDC1SubParts( iDC1, uiAbsPartIdx, uiDepth );
    1215   pcCU->setContourPredTexDeltaDC2SubParts( iDC2, uiAbsPartIdx, uiDepth );
    1216 }
    1217 #endif
    1218 
    1219 #if MTK_DCM_MPM
    1220 Void TDecSbac::parseIntraDirLumaAng( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth )
    1221 {
    1222   Int  uiIPredMode;
     802 
     803Void TDecSbac::parseIntraDirLumaAng  ( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth )
     804{
    1223805  UInt uiSymbol;
    1224  
     806  Int  intraPredMode;
     807
    1225808#if HHI_DMM_WEDGE_INTRA || HHI_DMM_PRED_TEX
    1226809  UInt uiFlag = 0;
    1227   if ( pcCU->getSlice()->getSPS()->isDepth() && pcCU->getSlice()->getSPS()->getUseDMM() && g_uiMaxCUWidth>>uiDepth < 64 )
    1228   {
    1229     m_pcTDecBinIf->decodeBin( uiFlag, m_cIntraDMMSCModel.get(0, 0, 0) );
    1230   }
    1231   if ( uiFlag )
     810  if( pcCU->getSlice()->getSPS()->getUseDMM() && (g_uiMaxCUWidth>>uiDepth) <= DMM_WEDGEMODEL_MAX_SIZE )
     811  {
     812    m_pcTDecBinIf->decodeBin( uiFlag, m_cDmmFlagSCModel.get(0, 0, 0) );
     813  }
     814  if( uiFlag )
    1232815  {
    1233816    UInt uiDMMode;
    1234 
     817 
    1235818#if HHI_DMM_WEDGE_INTRA && HHI_DMM_PRED_TEX
    1236     m_pcTDecBinIf->decodeBin( uiSymbol, m_cIntraDMMSCModel.get(0, 0, 1) ); uiDMMode  = uiSymbol;
    1237     m_pcTDecBinIf->decodeBin( uiSymbol, m_cIntraDMMSCModel.get(0, 0, 1) ); uiDMMode |= uiSymbol << 1;
     819    m_pcTDecBinIf->decodeBin( uiSymbol, m_cDmmModeSCModel.get(0, 0, 0) ); uiDMMode  = uiSymbol;
     820    m_pcTDecBinIf->decodeBin( uiSymbol, m_cDmmModeSCModel.get(0, 0, 0) ); uiDMMode |= uiSymbol << 1;
    1238821    if ( pcCU->getPartitionSize( uiAbsPartIdx ) != SIZE_NxN && g_uiMaxCUWidth>>uiDepth > 4 )
    1239822    {
    1240       m_pcTDecBinIf->decodeBin( uiSymbol, m_cIntraDMMSCModel.get(0, 0, 1) ); uiDMMode |= uiSymbol << 2;
    1241     }
    1242 #else
    1243         m_pcTDecBinIf->decodeBin( uiSymbol, m_cIntraDMMSCModel.get(0, 0, 1) ); uiDMMode  = uiSymbol;
    1244       if ( pcCU->getPartitionSize( uiAbsPartIdx ) != SIZE_NxN && g_uiMaxCUWidth>>uiDepth > 4 )
    1245       {
    1246       m_pcTDecBinIf->decodeBin( uiSymbol, m_cIntraDMMSCModel.get(0, 0, 1) ); uiDMMode |= uiSymbol << 1;
    1247     }
    1248 #endif
    1249     uiIPredMode = uiDMMode + MAX_MODE_ID_INTRA_DIR + 1;
     823      m_pcTDecBinIf->decodeBin( uiSymbol, m_cDmmModeSCModel.get(0, 0, 0) ); uiDMMode |= uiSymbol << 2;
     824    }
     825#else
     826    m_pcTDecBinIf->decodeBin( uiSymbol, m_cDmmModeSCModel.get(0, 0, 0) ); uiDMMode  = uiSymbol;
     827    if ( pcCU->getPartitionSize( uiAbsPartIdx ) != SIZE_NxN && g_uiMaxCUWidth>>uiDepth > 4 )
     828    {
     829      m_pcTDecBinIf->decodeBin( uiSymbol, m_cDmmModeSCModel.get(0, 0, 0) ); uiDMMode |= uiSymbol << 1;
     830    }
     831#endif
     832    intraPredMode = uiDMMode + NUM_INTRA_MODE;
    1250833
    1251834#if HHI_DMM_WEDGE_INTRA
    1252     if( uiIPredMode == DMM_WEDGE_FULL_IDX )          { xParseWedgeFullInfo          ( pcCU, uiAbsPartIdx, uiDepth ); }
    1253     if( uiIPredMode == DMM_WEDGE_FULL_D_IDX )        { xParseWedgeFullDeltaInfo     ( pcCU, uiAbsPartIdx, uiDepth ); }
    1254     if( uiIPredMode == DMM_WEDGE_PREDDIR_IDX )       { xParseWedgePredDirInfo       ( pcCU, uiAbsPartIdx, uiDepth ); }
    1255     if( uiIPredMode == DMM_WEDGE_PREDDIR_D_IDX )     { xParseWedgePredDirDeltaInfo  ( pcCU, uiAbsPartIdx, uiDepth ); }
     835    if( intraPredMode == DMM_WEDGE_FULL_IDX )          { xParseWedgeFullInfo          ( pcCU, uiAbsPartIdx, uiDepth ); }
     836    if( intraPredMode == DMM_WEDGE_FULL_D_IDX )        { xParseWedgeFullDeltaInfo     ( pcCU, uiAbsPartIdx, uiDepth ); }
     837    if( intraPredMode == DMM_WEDGE_PREDDIR_IDX )       { xParseWedgePredDirInfo       ( pcCU, uiAbsPartIdx, uiDepth ); }
     838    if( intraPredMode == DMM_WEDGE_PREDDIR_D_IDX )     { xParseWedgePredDirDeltaInfo  ( pcCU, uiAbsPartIdx, uiDepth ); }
    1256839#endif
    1257840#if HHI_DMM_PRED_TEX
    1258     if( uiIPredMode == DMM_WEDGE_PREDTEX_D_IDX )     { xParseWedgePredTexDeltaInfo  ( pcCU, uiAbsPartIdx, uiDepth ); }
    1259     if( uiIPredMode == DMM_CONTOUR_PREDTEX_D_IDX )   { xParseContourPredTexDeltaInfo( pcCU, uiAbsPartIdx, uiDepth ); }
     841    if( intraPredMode == DMM_WEDGE_PREDTEX_D_IDX )     { xParseWedgePredTexDeltaInfo  ( pcCU, uiAbsPartIdx, uiDepth ); }
     842    if( intraPredMode == DMM_CONTOUR_PREDTEX_D_IDX )   { xParseContourPredTexDeltaInfo( pcCU, uiAbsPartIdx, uiDepth ); }
    1260843#endif
    1261844  }
    1262845  else
    1263 #endif
    1264   {
    1265     Int iIntraIdx = pcCU->getIntraSizeIdx(uiAbsPartIdx);
     846  {
     847#endif
     848#if !LOGI_INTRA_NAME_3MPM
     849  Int iIntraIdx = pcCU->getIntraSizeIdx(uiAbsPartIdx);
     850#endif
     851 
     852#if LOGI_INTRA_NAME_3MPM
     853  Int uiPreds[3] = {-1, -1, -1};
     854#else
     855  Int uiPreds[2] = {-1, -1};
     856#endif
     857  Int uiPredNum = pcCU->getIntraDirLumaPredictor(uiAbsPartIdx, uiPreds); 
     858 
     859  m_pcTDecBinIf->decodeBin( uiSymbol, m_cCUIntraPredSCModel.get( 0, 0, 0) );
     860 
     861  if ( uiSymbol )
     862  {
     863    m_pcTDecBinIf->decodeBinEP( uiSymbol );
     864#if LOGI_INTRA_NAME_3MPM
     865    if (uiSymbol)
     866    {
     867      m_pcTDecBinIf->decodeBinEP( uiSymbol );
     868      uiSymbol++;
     869    }
     870#endif
     871    intraPredMode = uiPreds[uiSymbol];
     872  }
     873  else
     874  {
     875    intraPredMode = 0;
     876   
     877#if LOGI_INTRA_NAME_3MPM
    1266878   
    1267     Int uiPreds[2] = {-1, -1};
    1268     Int uiPredNum = pcCU->getIntraDirLumaPredictor(uiAbsPartIdx, uiPreds); 
    1269 
    1270     m_pcTDecBinIf->decodeBin( uiSymbol, m_cCUIntraPredSCModel.get( 0, 0, 0) );
    1271    
    1272     if ( uiSymbol )
    1273     {
    1274       if(uiPredNum == 1)   
    1275       {
    1276         uiIPredMode = uiPreds[0];
    1277       }
    1278       else
    1279       {
    1280         m_pcTDecBinIf->decodeBin( uiSymbol, m_cCUIntraPredSCModel.get( 0, 0, 2) );
    1281         uiIPredMode = uiPreds[uiSymbol];
    1282       }
     879    m_pcTDecBinIf->decodeBinsEP( uiSymbol, 5 );
     880    intraPredMode = uiSymbol;
     881   
     882   //postponed sorting of MPMs (only in remaining branch)
     883    if (uiPreds[0] > uiPreds[1])
     884    {
     885      std::swap(uiPreds[0], uiPreds[1]);
     886    }
     887    if (uiPreds[0] > uiPreds[2])
     888    {
     889      std::swap(uiPreds[0], uiPreds[2]);
     890    }
     891    if (uiPreds[1] > uiPreds[2])
     892    {
     893      std::swap(uiPreds[1], uiPreds[2]);
     894    }
     895#else
     896    m_pcTDecBinIf->decodeBinsEP( uiSymbol, g_aucIntraModeBitsAng[iIntraIdx] - 1 );
     897    intraPredMode = uiSymbol;
     898   
     899    if ( intraPredMode == 31 )
     900    {
     901      m_pcTDecBinIf->decodeBinEP( uiSymbol );
     902      intraPredMode += uiSymbol;     
     903    }
     904#endif
     905    for ( Int i = 0; i < uiPredNum; i++ )
     906    {
     907      intraPredMode += ( intraPredMode >= uiPreds[i] );
     908    }
     909  }
     910#if HHI_DMM_WEDGE_INTRA || HHI_DMM_PRED_TEX
     911  }
     912#endif
     913 
     914  pcCU->setLumaIntraDirSubParts( (UChar)intraPredMode, uiAbsPartIdx, uiDepth );
     915}
     916
     917Void TDecSbac::parseIntraDirChroma( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth )
     918{
     919  UInt uiSymbol;
     920
     921  m_pcTDecBinIf->decodeBin( uiSymbol, m_cCUChromaPredSCModel.get( 0, 0, 0 ) );
     922
     923  if( uiSymbol == 0 )
     924  {
     925    uiSymbol = DM_CHROMA_IDX;
     926  }
     927  else
     928  {
     929    if( pcCU->getSlice()->getSPS()->getUseLMChroma() )
     930    {
     931      m_pcTDecBinIf->decodeBin( uiSymbol, m_cCUChromaPredSCModel.get( 0, 0, 1 ) );
    1283932    }
    1284933    else
    1285934    {
    1286       if ( g_aucIntraModeBitsAng[iIntraIdx] < 6 )
    1287       {
    1288         m_pcTDecBinIf->decodeBin( uiSymbol, m_cCUIntraPredSCModel.get( 0, 0, 1 ) ); uiIPredMode  = uiSymbol;
    1289         if ( g_aucIntraModeBitsAng[iIntraIdx] > 2 ) { m_pcTDecBinIf->decodeBin( uiSymbol, m_cCUIntraPredSCModel.get( 0, 0, 1 ) ); uiIPredMode |= uiSymbol << 1; }
    1290         if ( g_aucIntraModeBitsAng[iIntraIdx] > 3 ) { m_pcTDecBinIf->decodeBin( uiSymbol, m_cCUIntraPredSCModel.get( 0, 0, 1 ) ); uiIPredMode |= uiSymbol << 2; }
    1291         if ( g_aucIntraModeBitsAng[iIntraIdx] > 4 ) { m_pcTDecBinIf->decodeBin( uiSymbol, m_cCUIntraPredSCModel.get( 0, 0, 1 ) ); uiIPredMode |= uiSymbol << 3; }
    1292       }
    1293       else
    1294       {
    1295         m_pcTDecBinIf->decodeBin( uiSymbol, m_cCUIntraPredSCModel.get( 0, 0, 1 ) ); uiIPredMode  = uiSymbol;
    1296         m_pcTDecBinIf->decodeBin( uiSymbol, m_cCUIntraPredSCModel.get( 0, 0, 1 ) ); uiIPredMode |= uiSymbol << 1;
    1297         m_pcTDecBinIf->decodeBin( uiSymbol, m_cCUIntraPredSCModel.get( 0, 0, 1 ) ); uiIPredMode |= uiSymbol << 2;
    1298         m_pcTDecBinIf->decodeBin( uiSymbol, m_cCUIntraPredSCModel.get( 0, 0, 1 ) ); uiIPredMode |= uiSymbol << 3;
    1299         m_pcTDecBinIf->decodeBin( uiSymbol, m_cCUIntraPredSCModel.get( 0, 0, 1 ) ); uiIPredMode |= uiSymbol << 4;
    1300 
    1301         if (uiIPredMode == 31)
    1302         { // Escape coding for the last two modes
    1303           m_pcTDecBinIf->decodeBin( uiSymbol, m_cCUIntraPredSCModel.get( 0, 0, 1 ) );
    1304           uiIPredMode = uiSymbol ? 32 : 31;
    1305         }
    1306       }
    1307 
    1308       for(UInt i = 0; i < uiPredNum; i++)
    1309       {
    1310         if(uiIPredMode >= uiPreds[i]) {  uiIPredMode ++; }
    1311       }
    1312     }
    1313 #if ADD_PLANAR_MODE
    1314     if (uiIPredMode == 2)
    1315     {
    1316       UInt planarFlag;
    1317       m_pcTDecBinIf->decodeBin( planarFlag, m_cPlanarFlagSCModel.get(0,0,0) );
    1318       if ( planarFlag )
    1319       {
    1320         uiIPredMode = PLANAR_IDX;
    1321       }
    1322     }
    1323 #endif
    1324   }
    1325 
    1326   pcCU->setLumaIntraDirSubParts( (UChar)uiIPredMode, uiAbsPartIdx, uiDepth );
    1327 }
    1328 #else
    1329 Void TDecSbac::parseIntraDirLumaAng  ( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth )
    1330 {
    1331   Int  uiIPredMode;
     935      uiSymbol = 1;
     936    }
     937
     938    if( uiSymbol == 0 )
     939    {
     940      uiSymbol = LM_CHROMA_IDX;
     941    }
     942    else
     943    {
     944      UInt uiIPredMode;
     945#if CHROMA_MODE_CODING
     946      m_pcTDecBinIf->decodeBinsEP( uiIPredMode, 2 );
     947#else
     948      xReadUnaryMaxSymbol( uiIPredMode, m_cCUChromaPredSCModel.get( 0, 0 ) + 1, 0, 3 );
     949#endif
     950      UInt uiAllowedChromaDir[ NUM_CHROMA_MODE ];
     951      pcCU->getAllowedChromaDir( uiAbsPartIdx, uiAllowedChromaDir );
     952      uiSymbol = uiAllowedChromaDir[ uiIPredMode ];
     953    }
     954  }
     955  pcCU->setChromIntraDirSubParts( uiSymbol, uiAbsPartIdx, uiDepth );
     956  return;
     957}
     958
     959Void TDecSbac::parseInterDir( TComDataCU* pcCU, UInt& ruiInterDir, UInt uiAbsPartIdx, UInt uiDepth )
     960{
    1332961  UInt uiSymbol;
    1333 
    1334 #if HHI_DMM_WEDGE_INTRA || HHI_DMM_PRED_TEX
    1335   UInt uiFlag = 0;
    1336   if ( pcCU->getSlice()->getSPS()->isDepth() && pcCU->getSlice()->getSPS()->getUseDMM() && g_uiMaxCUWidth>>uiDepth < 64 )
    1337   {
    1338     m_pcTDecBinIf->decodeBin( uiFlag, m_cIntraDMMSCModel.get(0, 0, 0) );
    1339   }
    1340   if ( uiFlag )
    1341   {
    1342     UInt uiDMMode;
    1343 
    1344 #if HHI_DMM_WEDGE_INTRA && HHI_DMM_PRED_TEX
    1345     m_pcTDecBinIf->decodeBin( uiSymbol, m_cIntraDMMSCModel.get(0, 0, 1) ); uiDMMode  = uiSymbol;
    1346     m_pcTDecBinIf->decodeBin( uiSymbol, m_cIntraDMMSCModel.get(0, 0, 1) ); uiDMMode |= uiSymbol << 1;
    1347       if ( pcCU->getPartitionSize( uiAbsPartIdx ) != SIZE_NxN && g_uiMaxCUWidth>>uiDepth > 4 )
    1348       {
    1349       m_pcTDecBinIf->decodeBin( uiSymbol, m_cIntraDMMSCModel.get(0, 0, 1) ); uiDMMode |= uiSymbol << 2;
    1350         }
    1351 #else
    1352       m_pcTDecBinIf->decodeBin( uiSymbol, m_cIntraDMMSCModel.get(0, 0, 1) ); uiDMMode  = uiSymbol;
    1353       if ( pcCU->getPartitionSize( uiAbsPartIdx ) != SIZE_NxN && g_uiMaxCUWidth>>uiDepth > 4 )
    1354       {
    1355       m_pcTDecBinIf->decodeBin( uiSymbol, m_cIntraDMMSCModel.get(0, 0, 1) ); uiDMMode |= uiSymbol << 1;
    1356     }
    1357 #endif
    1358     uiIPredMode = g_aucAdditionalIntraModeList[uiDMMode];
    1359 
    1360 #if HHI_DMM_WEDGE_INTRA
    1361     if( uiIPredMode == DMM_WEDGE_FULL_IDX )          { xParseWedgeFullInfo          ( pcCU, uiAbsPartIdx, uiDepth ); }
    1362     if( uiIPredMode == DMM_WEDGE_FULL_D_IDX )        { xParseWedgeFullDeltaInfo     ( pcCU, uiAbsPartIdx, uiDepth ); }
    1363     if( uiIPredMode == DMM_WEDGE_PREDDIR_IDX )       { xParseWedgePredDirInfo       ( pcCU, uiAbsPartIdx, uiDepth ); }
    1364     if( uiIPredMode == DMM_WEDGE_PREDDIR_D_IDX )     { xParseWedgePredDirDeltaInfo  ( pcCU, uiAbsPartIdx, uiDepth ); }
    1365 #endif
    1366 #if HHI_DMM_PRED_TEX
    1367     if( uiIPredMode == DMM_WEDGE_PREDTEX_D_IDX )     { xParseWedgePredTexDeltaInfo  ( pcCU, uiAbsPartIdx, uiDepth ); }
    1368     if( uiIPredMode == DMM_CONTOUR_PREDTEX_D_IDX )   { xParseContourPredTexDeltaInfo( pcCU, uiAbsPartIdx, uiDepth ); }
    1369 #endif
    1370   }
    1371   else
    1372 #endif
    1373   {
    1374   Int  iMostProbable = pcCU->getMostProbableIntraDirLuma( uiAbsPartIdx );
    1375  
    1376   m_pcTDecBinIf->decodeBin( uiSymbol, m_cCUIntraPredSCModel.get( 0, 0, 0) );
    1377  
    1378   if ( uiSymbol )
    1379     uiIPredMode = iMostProbable;
    1380   else
    1381   {
    1382     Int iIntraIdx = pcCU->getIntraSizeIdx(uiAbsPartIdx);
    1383     if ( g_aucIntraModeBitsAng[iIntraIdx] < 6 )
    1384     {
    1385       m_pcTDecBinIf->decodeBin( uiSymbol, m_cCUIntraPredSCModel.get( 0, 0, 1 ) ); uiIPredMode  = uiSymbol;
    1386       if ( g_aucIntraModeBitsAng[iIntraIdx] > 2 ) { m_pcTDecBinIf->decodeBin( uiSymbol, m_cCUIntraPredSCModel.get( 0, 0, 1 ) ); uiIPredMode |= uiSymbol << 1; }
    1387       if ( g_aucIntraModeBitsAng[iIntraIdx] > 3 ) { m_pcTDecBinIf->decodeBin( uiSymbol, m_cCUIntraPredSCModel.get( 0, 0, 1 ) ); uiIPredMode |= uiSymbol << 2; }
    1388       if ( g_aucIntraModeBitsAng[iIntraIdx] > 4 ) { m_pcTDecBinIf->decodeBin( uiSymbol, m_cCUIntraPredSCModel.get( 0, 0, 1 ) ); uiIPredMode |= uiSymbol << 3; }
    1389     }
    1390     else
    1391     {
    1392       m_pcTDecBinIf->decodeBin( uiSymbol, m_cCUIntraPredSCModel.get( 0, 0, 1 ) ); uiIPredMode  = uiSymbol;
    1393       m_pcTDecBinIf->decodeBin( uiSymbol, m_cCUIntraPredSCModel.get( 0, 0, 1 ) ); uiIPredMode |= uiSymbol << 1;
    1394       m_pcTDecBinIf->decodeBin( uiSymbol, m_cCUIntraPredSCModel.get( 0, 0, 1 ) ); uiIPredMode |= uiSymbol << 2;
    1395       m_pcTDecBinIf->decodeBin( uiSymbol, m_cCUIntraPredSCModel.get( 0, 0, 1 ) ); uiIPredMode |= uiSymbol << 3;
    1396       m_pcTDecBinIf->decodeBin( uiSymbol, m_cCUIntraPredSCModel.get( 0, 0, 1 ) ); uiIPredMode |= uiSymbol << 4;
    1397      
    1398       if (uiIPredMode == 31)
    1399       { // Escape coding for the last two modes
    1400         m_pcTDecBinIf->decodeBin( uiSymbol, m_cCUIntraPredSCModel.get( 0, 0, 1 ) );
    1401         uiIPredMode = uiSymbol ? 32 : 31;
    1402       }
    1403     }
    1404    
    1405     if (uiIPredMode >= iMostProbable)
    1406       uiIPredMode++;
    1407   }
    1408  
    1409 #if ADD_PLANAR_MODE
    1410   if (uiIPredMode == 2)
    1411   {
    1412     UInt planarFlag;
    1413     m_pcTDecBinIf->decodeBin( planarFlag, m_cPlanarFlagSCModel.get(0,0,0) );
    1414     if ( planarFlag )
    1415     {
    1416       uiIPredMode = PLANAR_IDX;
    1417     }
    1418   }
    1419 #endif
    1420   }
    1421 
    1422   pcCU->setLumaIntraDirSubParts( (UChar)uiIPredMode, uiAbsPartIdx, uiDepth );
    1423 }
    1424 #endif
    1425 Void TDecSbac::parseIntraDirChroma( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth )
    1426 {
    1427   UInt uiSymbol;
    1428  
    1429 #if CHROMA_CODEWORD
    1430   UInt uiMode = pcCU->getLumaIntraDir(uiAbsPartIdx);
    1431 #if ADD_PLANAR_MODE
    1432   if ( (uiMode == 2 ) || (uiMode == PLANAR_IDX) )
    1433   {
    1434     uiMode = 4;
    1435   }
    1436 #endif
    1437 
    1438 #if LM_CHROMA
    1439   Int  iMaxMode = pcCU->getSlice()->getSPS()->getUseLMChroma() ? 3 : 4;
    1440   Int  iMax = uiMode < iMaxMode ? 2 : 3;
    1441  
    1442   m_pcTDecBinIf->decodeBin( uiSymbol, m_cCUChromaPredSCModel.get( 0, 0, pcCU->getCtxIntraDirChroma( uiAbsPartIdx ) ) );
    1443  
    1444   if ( uiSymbol )
    1445   {
    1446     xReadUnaryMaxSymbol( uiSymbol, m_cCUChromaPredSCModel.get( 0, 0 ) + 3, 0, iMax );
    1447     uiSymbol++;
    1448   }
    1449  
    1450   //switch codeword
    1451   if (uiSymbol == 0)
    1452   {
    1453     uiSymbol = 4;
    1454   }
    1455   else if (uiSymbol == 1 && pcCU->getSlice()->getSPS()->getUseLMChroma())
    1456   {
    1457     uiSymbol = 3;
    1458   }
    1459   else
    1460   {
    1461 #if CHROMA_CODEWORD_SWITCH
    1462     uiSymbol = ChromaMapping[iMax-2][uiSymbol];
    1463 #endif
    1464 
    1465     if (pcCU->getSlice()->getSPS()->getUseLMChroma())
    1466        uiSymbol --;
    1467 
    1468     if (uiSymbol <= uiMode)
    1469        uiSymbol --;
    1470   }
    1471 #else // <-- LM_CHROMA
    1472   Int  iMax = uiMode < 4 ? 2 : 3;
    1473  
    1474   m_pcTDecBinIf->decodeBin( uiSymbol, m_cCUChromaPredSCModel.get( 0, 0, pcCU->getCtxIntraDirChroma( uiAbsPartIdx ) ) );
    1475  
    1476   if ( uiSymbol )
    1477   {
    1478     xReadUnaryMaxSymbol( uiSymbol, m_cCUChromaPredSCModel.get( 0, 0 ) + 3, 0, iMax );
    1479     uiSymbol++;
    1480   }
    1481  
    1482   //switch codeword
    1483   if (uiSymbol == 0)
    1484   {
    1485     uiSymbol = 4;
    1486   }
    1487 #if CHROMA_CODEWORD_SWITCH
    1488   else
    1489   {
    1490     uiSymbol = ChromaMapping[iMax-2][uiSymbol];
    1491     if (uiSymbol <= uiMode)
    1492     {
    1493       uiSymbol --;
    1494     }
    1495   }
    1496 #else
    1497   else if (uiSymbol <= uiMode)
    1498   {
    1499     uiSymbol --;
    1500   }
    1501 #endif
    1502 #endif // <-- LM_CHROMA
    1503 
    1504 #else // CHROMA_CODEWORD
    1505   m_pcTDecBinIf->decodeBin( uiSymbol, m_cCUChromaPredSCModel.get( 0, 0, pcCU->getCtxIntraDirChroma( uiAbsPartIdx ) ) );
    1506  
    1507   if ( uiSymbol )
    1508   {
    1509     xReadUnaryMaxSymbol( uiSymbol, m_cCUChromaPredSCModel.get( 0, 0 ) + 3, 0, 3 );
    1510     uiSymbol++;
    1511   }
    1512 #endif
    1513  
    1514 #if ADD_PLANAR_MODE
    1515   if (uiSymbol == 2)
    1516   {
    1517 #if CHROMA_CODEWORD
    1518     uiMode = pcCU->getLumaIntraDir(uiAbsPartIdx);
    1519     if (uiMode == 2)
    1520     {
    1521       uiSymbol = PLANAR_IDX;
    1522     }
    1523     else if (uiMode != PLANAR_IDX)
    1524 #endif
    1525     {
    1526       UInt planarFlag;
    1527       m_pcTDecBinIf->decodeBin( planarFlag, m_cPlanarFlagSCModel.get(0,0,1) );
    1528       if ( planarFlag )
    1529       {
    1530         uiSymbol = PLANAR_IDX;
    1531       }
    1532     }
    1533   }
    1534 #endif
    1535   pcCU->setChromIntraDirSubParts( uiSymbol, uiAbsPartIdx, uiDepth );
    1536  
    1537   return;
    1538 }
    1539 
    1540 Void TDecSbac::parseInterDir( TComDataCU* pcCU, UInt& ruiInterDir, UInt uiAbsPartIdx, UInt uiDepth )
    1541 {
    1542   UInt uiSymbol;
    1543   UInt uiCtx = pcCU->getCtxInterDir( uiAbsPartIdx );
    1544  
    1545   m_pcTDecBinIf->decodeBin( uiSymbol, m_cCUInterDirSCModel.get( 0, 0, uiCtx ) );
    1546  
    1547   if ( uiSymbol )
     962  const UInt uiCtx = pcCU->getCtxInterDir( uiAbsPartIdx );
     963  ContextModel *pCtx = m_cCUInterDirSCModel.get( 0 );
     964  m_pcTDecBinIf->decodeBin( uiSymbol, *( pCtx + uiCtx ) );
     965
     966  if( uiSymbol )
    1548967  {
    1549968    uiSymbol = 2;
    1550969  }
    1551 #if DCM_COMB_LIST
    1552   else if(pcCU->getSlice()->getNumRefIdx(REF_PIC_LIST_C) > 0)
    1553   {
    1554     uiSymbol = 0;
    1555   }
    1556 #endif
    1557   else if ( pcCU->getSlice()->getNoBackPredFlag() )
    1558   {
    1559     uiSymbol = 0;
    1560   }
    1561   else
    1562   {
    1563     m_pcTDecBinIf->decodeBin( uiSymbol, m_cCUInterDirSCModel.get( 0, 0, 3 ) );
    1564   }
     970
    1565971  uiSymbol++;
    1566972  ruiInterDir = uiSymbol;
     
    1572978  UInt uiSymbol;
    1573979
    1574 #if DCM_COMB_LIST
    1575980  if(pcCU->getSlice()->getNumRefIdx(REF_PIC_LIST_C ) > 0 && eRefList==REF_PIC_LIST_C)
    1576981  {
    1577     UInt uiCtx;
    1578 
    1579     uiCtx = pcCU->getCtxRefIdx( uiAbsPartIdx, RefPicList(pcCU->getSlice()->getListIdFromIdxOfLC(0)) );
    1580 
    1581     m_pcTDecBinIf->decodeBin ( uiSymbol, m_cCURefPicSCModel.get( 0, 0, uiCtx ) );
    1582 
    1583     if ( uiSymbol )
    1584     {
    1585       xReadUnaryMaxSymbol( uiSymbol, &m_cCURefPicSCModel.get( 0, 0, 4 ), 1, pcCU->getSlice()->getNumRefIdx( REF_PIC_LIST_C )-2 );
    1586 
     982    ContextModel *pCtx = m_cCURefPicSCModel.get( 0 );
     983    m_pcTDecBinIf->decodeBin( uiSymbol, *pCtx );
     984
     985    if( uiSymbol )
     986    {
     987      xReadUnaryMaxSymbol( uiSymbol, pCtx + 1, 1, pcCU->getSlice()->getNumRefIdx( REF_PIC_LIST_C )-2 );
    1587988      uiSymbol++;
    1588989    }
    1589 
    1590990    riRefFrmIdx = uiSymbol;
    1591991  }
    1592992  else
    1593993  {
    1594 #endif
    1595 
    1596   UInt uiCtx = pcCU->getCtxRefIdx( uiAbsPartIdx, eRefList );
    1597  
    1598   m_pcTDecBinIf->decodeBin ( uiSymbol, m_cCURefPicSCModel.get( 0, 0, uiCtx ) );
    1599   if ( uiSymbol )
    1600   {
    1601     xReadUnaryMaxSymbol( uiSymbol, &m_cCURefPicSCModel.get( 0, 0, 4 ), 1, pcCU->getSlice()->getNumRefIdx( eRefList )-2 );
    1602    
    1603     uiSymbol++;
    1604   }
    1605   riRefFrmIdx = uiSymbol;
    1606 
    1607 #if DCM_COMB_LIST
    1608   }
    1609 #endif
     994    ContextModel *pCtx = m_cCURefPicSCModel.get( 0 );
     995    m_pcTDecBinIf->decodeBin( uiSymbol, *pCtx );
     996
     997    if( uiSymbol )
     998    {
     999      xReadUnaryMaxSymbol( uiSymbol, pCtx + 1, 1, pcCU->getSlice()->getNumRefIdx( eRefList )-2 );
     1000      uiSymbol++;
     1001    }
     1002    riRefFrmIdx = uiSymbol;
     1003  }
    16101004
    16111005  return;
    16121006}
    16131007
    1614 Void TDecSbac::parseViewIdx(Int &riViewIdx)
    1615 {
    1616   assert(0) ; // not implemented yet
     1008Void TDecSbac::parseMvd( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiPartIdx, UInt uiDepth, RefPicList eRefList )
     1009{
    16171010  UInt uiSymbol;
    1618   xReadUnaryMaxSymbol(uiSymbol, &m_cViewIdxSCModel.get(0,0,4), 1, MAX_NUMBER_VIEWS);
    1619   riViewIdx = uiSymbol;
    1620 }
    1621 
    1622 Void TDecSbac::parseMvd( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiPartIdx, UInt uiDepth, RefPicList eRefList )
    1623 {
    1624   Int iHor, iVer;
    1625   UInt uiAbsPartIdxL, uiAbsPartIdxA;
    1626 #if MVD_CTX
    1627   Int iHorPredL, iVerPredL;
    1628   Int iHorPredA, iVerPredA;
    1629 #else
    1630   Int iHorPred, iVerPred;
    1631 #endif
    1632 
    1633   TComDataCU* pcCUL   = pcCU->getPULeft ( uiAbsPartIdxL, pcCU->getZorderIdxInCU() + uiAbsPartIdx );
    1634   TComDataCU* pcCUA   = pcCU->getPUAbove( uiAbsPartIdxA, pcCU->getZorderIdxInCU() + uiAbsPartIdx );
    1635  
    1636   TComCUMvField* pcCUMvFieldL = ( pcCUL == NULL || pcCUL->isIntra( uiAbsPartIdxL ) ) ? NULL : pcCUL->getCUMvField( eRefList );
    1637   TComCUMvField* pcCUMvFieldA = ( pcCUA == NULL || pcCUA->isIntra( uiAbsPartIdxA ) ) ? NULL : pcCUA->getCUMvField( eRefList );
    1638 
    1639 #if MVD_CTX
    1640   iHorPredL = ( (pcCUMvFieldL == NULL) ? 0 : pcCUMvFieldL->getMvd( uiAbsPartIdxL ).getAbsHor() );
    1641   iVerPredL = ( (pcCUMvFieldL == NULL) ? 0 : pcCUMvFieldL->getMvd( uiAbsPartIdxL ).getAbsVer() );
    1642   iHorPredA = ( (pcCUMvFieldA == NULL) ? 0 : pcCUMvFieldA->getMvd( uiAbsPartIdxA ).getAbsHor() );
    1643   iVerPredA = ( (pcCUMvFieldA == NULL) ? 0 : pcCUMvFieldA->getMvd( uiAbsPartIdxA ).getAbsVer() );
    1644 #else
    1645   iHorPred = ( (pcCUMvFieldL == NULL) ? 0 : pcCUMvFieldL->getMvd( uiAbsPartIdxL ).getAbsHor() ) +
    1646   ( (pcCUMvFieldA == NULL) ? 0 : pcCUMvFieldA->getMvd( uiAbsPartIdxA ).getAbsHor() );
    1647   iVerPred = ( (pcCUMvFieldL == NULL) ? 0 : pcCUMvFieldL->getMvd( uiAbsPartIdxL ).getAbsVer() ) +
    1648   ( (pcCUMvFieldA == NULL) ? 0 : pcCUMvFieldA->getMvd( uiAbsPartIdxA ).getAbsVer() );
    1649 #endif
    1650 
    1651   TComMv cTmpMv( 0, 0 );
    1652   pcCU->getCUMvField( eRefList )->setAllMv( cTmpMv, pcCU->getPartitionSize( uiAbsPartIdx ), uiAbsPartIdx, uiPartIdx, uiDepth );
    1653  
    1654 #if MVD_CTX
    1655   xReadMvd( iHor, iHorPredL, iHorPredA, 0 );
    1656   xReadMvd( iVer, iVerPredL, iVerPredA, 1 );
    1657 #else
    1658   xReadMvd( iHor, iHorPred, 0 );
    1659   xReadMvd( iVer, iVerPred, 1 );
    1660 #endif 
    1661 
    1662   // set mvd
    1663   TComMv cMv( iHor, iVer );
    1664   pcCU->getCUMvField( eRefList )->setAllMvd( cMv, pcCU->getPartitionSize( uiAbsPartIdx ), uiAbsPartIdx, uiPartIdx, uiDepth );
    1665  
     1011  UInt uiHorAbs;
     1012  UInt uiVerAbs;
     1013  UInt uiHorSign = 0;
     1014  UInt uiVerSign = 0;
     1015  ContextModel *pCtx = m_cCUMvdSCModel.get( 0 );
     1016
     1017#if H0111_MVD_L1_ZERO
     1018  if(pcCU->getSlice()->getMvdL1ZeroFlag() && eRefList == REF_PIC_LIST_1 && pcCU->getInterDir(uiAbsPartIdx)==3)
     1019  {
     1020    uiHorAbs=0;
     1021    uiVerAbs=0;
     1022  }
     1023  else
     1024  {
     1025#endif
     1026
     1027    m_pcTDecBinIf->decodeBin( uiHorAbs, *pCtx );
     1028    m_pcTDecBinIf->decodeBin( uiVerAbs, *pCtx );
     1029
     1030    const Bool bHorAbsGr0 = uiHorAbs != 0;
     1031    const Bool bVerAbsGr0 = uiVerAbs != 0;
     1032    pCtx++;
     1033
     1034    if( bHorAbsGr0 )
     1035    {
     1036      m_pcTDecBinIf->decodeBin( uiSymbol, *pCtx );
     1037      uiHorAbs += uiSymbol;
     1038    }
     1039
     1040    if( bVerAbsGr0 )
     1041    {
     1042      m_pcTDecBinIf->decodeBin( uiSymbol, *pCtx );
     1043      uiVerAbs += uiSymbol;
     1044    }
     1045
     1046    if( bHorAbsGr0 )
     1047    {
     1048      if( 2 == uiHorAbs )
     1049      {
     1050        xReadEpExGolomb( uiSymbol, 1 );
     1051        uiHorAbs += uiSymbol;
     1052      }
     1053
     1054      m_pcTDecBinIf->decodeBinEP( uiHorSign );
     1055    }
     1056
     1057    if( bVerAbsGr0 )
     1058    {
     1059      if( 2 == uiVerAbs )
     1060      {
     1061        xReadEpExGolomb( uiSymbol, 1 );
     1062        uiVerAbs += uiSymbol;
     1063      }
     1064
     1065      m_pcTDecBinIf->decodeBinEP( uiVerSign );
     1066    }
     1067
     1068#if H0111_MVD_L1_ZERO
     1069  }
     1070#endif
     1071
     1072  const TComMv cMv( uiHorSign ? -Int( uiHorAbs ): uiHorAbs, uiVerSign ? -Int( uiVerAbs ) : uiVerAbs );
     1073  pcCU->getCUMvField( eRefList )->setAllMvd( cMv, pcCU->getPartitionSize( uiAbsPartIdx ), uiAbsPartIdx, uiDepth, uiPartIdx );
    16661074  return;
    16671075}
     
    16711079{
    16721080  m_pcTDecBinIf->decodeBin( ruiSubdivFlag, m_cCUTransSubdivFlagSCModel.get( 0, 0, uiLog2TransformBlockSize ) );
    1673   DTRACE_CABAC_V( g_nSymbolCounter++ )
     1081  DTRACE_CABAC_VL( g_nSymbolCounter++ )
    16741082  DTRACE_CABAC_T( "\tparseTransformSubdivFlag()" )
    16751083  DTRACE_CABAC_T( "\tsymbol=" )
     
    16831091{
    16841092  UInt uiSymbol;
    1685   const UInt uiCtx = pcCU->getCtxQtRootCbf( uiAbsPartIdx );
     1093  const UInt uiCtx = 0;
    16861094  m_pcTDecBinIf->decodeBin( uiSymbol , m_cCUQtRootCbfSCModel.get( 0, 0, uiCtx ) );
    1687   DTRACE_CABAC_V( g_nSymbolCounter++ )
     1095  DTRACE_CABAC_VL( g_nSymbolCounter++ )
    16881096  DTRACE_CABAC_T( "\tparseQtRootCbf()" )
    16891097  DTRACE_CABAC_T( "\tsymbol=" )
     
    17001108Void TDecSbac::parseDeltaQP( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth )
    17011109{
     1110#if H0736_AVC_STYLE_QP_RANGE
     1111  Int qp;
     1112#endif
    17021113  UInt uiDQp;
    17031114  Int  iDQp;
     
    17071118  if ( uiDQp == 0 )
    17081119  {
    1709     uiDQp = pcCU->getSlice()->getSliceQp();
     1120#if H0736_AVC_STYLE_QP_RANGE
     1121    qp = pcCU->getRefQP(uiAbsPartIdx);
     1122#else
     1123    uiDQp = pcCU->getRefQP(uiAbsPartIdx);
     1124#endif
    17101125  }
    17111126  else
    17121127  {
    1713     xReadUnarySymbol( uiDQp, &m_cCUDeltaQpSCModel.get( 0, 0, 2 ), 1 );
    1714     iDQp = ( uiDQp + 2 ) / 2;
    1715    
    1716     if ( uiDQp & 1 )
     1128    UInt uiSign;
     1129#if H0736_AVC_STYLE_QP_RANGE
     1130    Int qpBdOffsetY = pcCU->getSlice()->getSPS()->getQpBDOffsetY();
     1131#else
     1132    UInt uiQpBdOffsetY = 6*(g_uiBitIncrement + g_uiBitDepth - 8);
     1133#endif
     1134    m_pcTDecBinIf->decodeBinEP(uiSign);
     1135
     1136#if H0736_AVC_STYLE_QP_RANGE
     1137    UInt uiMaxAbsDQpMinus1 = 24 + (qpBdOffsetY/2) + (uiSign);
     1138#else
     1139    UInt uiMaxAbsDQpMinus1 = 24 + (uiQpBdOffsetY/2) + (uiSign);
     1140#endif
     1141    UInt uiAbsDQpMinus1;
     1142    xReadUnaryMaxSymbol (uiAbsDQpMinus1,  &m_cCUDeltaQpSCModel.get( 0, 0, 1 ), 1, uiMaxAbsDQpMinus1);
     1143
     1144    iDQp = uiAbsDQpMinus1 + 1;
     1145
     1146    if(uiSign)
    17171147    {
    17181148      iDQp = -iDQp;
    17191149    }
    1720     uiDQp = pcCU->getSlice()->getSliceQp() + iDQp;
    1721   }
    1722  
    1723   pcCU->setQPSubParts( uiDQp, uiAbsPartIdx, uiDepth );
     1150
     1151#if H0736_AVC_STYLE_QP_RANGE
     1152    qp = (((Int) pcCU->getRefQP( uiAbsPartIdx ) + iDQp + 52 + 2*qpBdOffsetY )%(52+qpBdOffsetY)) - qpBdOffsetY;
     1153#else
     1154#if LOSSLESS_CODING
     1155    uiDQp = (pcCU->getRefQP(uiAbsPartIdx) + iDQp + 52) % 52;
     1156#else
     1157    uiDQp = pcCU->getRefQP(uiAbsPartIdx) + iDQp;
     1158#endif
     1159#endif
     1160  }
     1161 
     1162  UInt uiAbsQpCUPartIdx = (uiAbsPartIdx>>(8-(pcCU->getSlice()->getPPS()->getMaxCuDQPDepth()<<1)))<<(8-(pcCU->getSlice()->getPPS()->getMaxCuDQPDepth()<<1)) ;
     1163  UInt uiQpCUDepth =   min(uiDepth,pcCU->getSlice()->getPPS()->getMaxCuDQPDepth()) ;
     1164#if H0736_AVC_STYLE_QP_RANGE
     1165  pcCU->setQPSubParts( qp, uiAbsQpCUPartIdx, uiQpCUDepth );
     1166#else
     1167  pcCU->setQPSubParts( uiDQp, uiAbsQpCUPartIdx, uiQpCUDepth );
     1168#endif
    17241169}
    17251170
     
    17281173  UInt uiSymbol;
    17291174  const UInt uiCtx = pcCU->getCtxQtCbf( uiAbsPartIdx, eType, uiTrDepth );
    1730   m_pcTDecBinIf->decodeBin( uiSymbol , m_cCUQtCbfSCModel.get( 0, eType ? eType - 1: eType, uiCtx ) );
    1731  
    1732   DTRACE_CABAC_V( g_nSymbolCounter++ )
     1175  m_pcTDecBinIf->decodeBin( uiSymbol , m_cCUQtCbfSCModel.get( 0, eType ? TEXT_CHROMA: eType, uiCtx ) );
     1176 
     1177  DTRACE_CABAC_VL( g_nSymbolCounter++ )
    17331178  DTRACE_CABAC_T( "\tparseQtCbf()" )
    17341179  DTRACE_CABAC_T( "\tsymbol=" )
     
    17451190}
    17461191
    1747 
    1748 #if PCP_SIGMAP_SIMPLE_LAST
    17491192/** Parse (X,Y) position of the last significant coefficient
    17501193 * \param uiPosLastX reference to X component of last coefficient
    17511194 * \param uiPosLastY reference to Y component of last coefficient
    1752  * \param uiWidth block width
     1195 * \param width  Block width
     1196 * \param height Block height
    17531197 * \param eTType plane type / luminance or chrominance
    1754  * \param uiCTXIdx block size context
    17551198 * \param uiScanIdx scan type (zig-zag, hor, ver)
    1756  * \returns Void
     1199 *
    17571200 * This method decodes the X and Y component within a block of the last significant coefficient.
    17581201 */
    1759 __inline Void TDecSbac::parseLastSignificantXY( UInt& uiPosLastX, UInt& uiPosLastY, const UInt uiWidth, const TextType eTType, const UInt uiCTXIdx, const UInt uiScanIdx )
     1202Void TDecSbac::parseLastSignificantXY( UInt& uiPosLastX, UInt& uiPosLastY, Int width, Int height, TextType eTType, UInt uiScanIdx )
    17601203{
    17611204  UInt uiLast;
    1762   const UInt uiCtxOffset = g_uiCtxXYOffset[uiCTXIdx];
    1763 
    1764   for(uiPosLastX=0; uiPosLastX<uiWidth-1; uiPosLastX++)
    1765   {
    1766     m_pcTDecBinIf->decodeBin( uiLast, m_cCuCtxLastX.get( 0, eTType, uiCtxOffset + g_uiCtxXY[uiPosLastX] ) );
    1767     if(uiLast)
     1205  ContextModel *pCtxX = m_cCuCtxLastX.get( 0, eTType );
     1206  ContextModel *pCtxY = m_cCuCtxLastY.get( 0, eTType );
     1207
     1208  // posX
     1209#if LAST_CTX_REDUCTION
     1210  Int widthCtx = eTType ? 4 : width;
     1211  const UInt *puiCtxIdxX = g_uiLastCtx + ( g_aucConvertToBit[ widthCtx ] * ( g_aucConvertToBit[ widthCtx ] + 3 ) );
     1212#else
     1213  const UInt *puiCtxIdxX = g_uiLastCtx + ( g_aucConvertToBit[ width ] * ( g_aucConvertToBit[ width ] + 3 ) );
     1214#endif
     1215  for( uiPosLastX = 0; uiPosLastX < g_uiGroupIdx[ width - 1 ]; uiPosLastX++ )
     1216  {
     1217#if LAST_CTX_REDUCTION
     1218    if ( eTType  )
     1219    {
     1220      m_pcTDecBinIf->decodeBin( uiLast, *( pCtxX + (uiPosLastX>>g_aucConvertToBit[ width ])  ) );
     1221    }
     1222    else
     1223    {
     1224#endif
     1225      m_pcTDecBinIf->decodeBin( uiLast, *( pCtxX + puiCtxIdxX[ uiPosLastX ] ) );
     1226#if LAST_CTX_REDUCTION
     1227    }
     1228#endif
     1229    if( !uiLast )
    17681230    {
    17691231      break;
     
    17711233  }
    17721234
    1773   for(uiPosLastY=0; uiPosLastY<uiWidth-1; uiPosLastY++)
    1774   {
    1775     m_pcTDecBinIf->decodeBin( uiLast, m_cCuCtxLastY.get( 0, eTType, uiCtxOffset + g_uiCtxXY[uiPosLastY] ) );
    1776     if(uiLast)
     1235  // posY
     1236#if LAST_CTX_REDUCTION
     1237  Int heightCtx = eTType? 4 : height;
     1238  const UInt *puiCtxIdxY = g_uiLastCtx + ( g_aucConvertToBit[ heightCtx ] * ( g_aucConvertToBit[ heightCtx ] + 3 ) );
     1239#else
     1240  const UInt *puiCtxIdxY = g_uiLastCtx + ( g_aucConvertToBit[ height ] * ( g_aucConvertToBit[ height ] + 3 ) );
     1241#endif
     1242  for( uiPosLastY = 0; uiPosLastY < g_uiGroupIdx[ height - 1 ]; uiPosLastY++ )
     1243  {
     1244#if LAST_CTX_REDUCTION
     1245    if (eTType)
     1246    {
     1247      m_pcTDecBinIf->decodeBin( uiLast, *( pCtxY + (uiPosLastY>>g_aucConvertToBit[ height ]) ) );
     1248    }
     1249    else
     1250    {
     1251#endif
     1252      m_pcTDecBinIf->decodeBin( uiLast, *( pCtxY + puiCtxIdxY[ uiPosLastY ] ) );
     1253#if LAST_CTX_REDUCTION
     1254    }
     1255#endif
     1256    if( !uiLast )
    17771257    {
    17781258      break;
    17791259    }
    17801260  }
    1781 
     1261  if ( uiPosLastX > 3 )
     1262  {
     1263    UInt uiTemp  = 0;
     1264    UInt uiCount = ( uiPosLastX - 2 ) >> 1;
     1265    for ( Int i = uiCount - 1; i >= 0; i-- )
     1266    {
     1267      m_pcTDecBinIf->decodeBinEP( uiLast );
     1268      uiTemp += uiLast << i;
     1269    }
     1270    uiPosLastX = g_uiMinInGroup[ uiPosLastX ] + uiTemp;
     1271  }
     1272  if ( uiPosLastY > 3 )
     1273  {
     1274    UInt uiTemp  = 0;
     1275    UInt uiCount = ( uiPosLastY - 2 ) >> 1;
     1276    for ( Int i = uiCount - 1; i >= 0; i-- )
     1277    {
     1278      m_pcTDecBinIf->decodeBinEP( uiLast );
     1279      uiTemp += uiLast << i;
     1280    }
     1281    uiPosLastY = g_uiMinInGroup[ uiPosLastY ] + uiTemp;
     1282  }
     1283 
    17821284  if( uiScanIdx == SCAN_VER )
    17831285  {
     
    17851287  }
    17861288}
    1787 #endif
    17881289
    17891290Void TDecSbac::parseCoeffNxN( TComDataCU* pcCU, TCoeff* pcCoef, UInt uiAbsPartIdx, UInt uiWidth, UInt uiHeight, UInt uiDepth, TextType eTType )
    17901291{
    1791   DTRACE_CABAC_V( g_nSymbolCounter++ )
     1292  DTRACE_CABAC_VL( g_nSymbolCounter++ )
    17921293  DTRACE_CABAC_T( "\tparseCoeffNxN()\teType=" )
    17931294  DTRACE_CABAC_V( eTType )
     
    18201321  }
    18211322 
    1822   UInt uiCTXIdx;
    1823  
    1824   switch(uiWidth)
    1825   {
    1826     case  2: uiCTXIdx = 6; break;
    1827     case  4: uiCTXIdx = 5; break;
    1828     case  8: uiCTXIdx = 4; break;
    1829     case 16: uiCTXIdx = 3; break;
    1830     case 32: uiCTXIdx = 2; break;
    1831     case 64: uiCTXIdx = 1; break;
    1832     default: uiCTXIdx = 0; break;
    1833   }
    1834  
    18351323  eTType = eTType == TEXT_LUMA ? TEXT_LUMA : ( eTType == TEXT_NONE ? TEXT_NONE : TEXT_CHROMA );
    18361324 
    18371325  //----- parse significance map -----
    18381326  const UInt  uiLog2BlockSize   = g_aucConvertToBit[ uiWidth ] + 2;
    1839   const UInt  uiMaxNumCoeff     = 1 << ( uiLog2BlockSize << 1 );
     1327  const UInt  uiMaxNumCoeff     = uiWidth * uiHeight;
    18401328  const UInt  uiMaxNumCoeffM1   = uiMaxNumCoeff - 1;
    1841   const UInt  uiNum4x4Blk       = max<UInt>( 1, uiMaxNumCoeff >> 4 );
    1842 #if !PCP_SIGMAP_SIMPLE_LAST
    1843   bool        bLastReceived     = false;
    1844 #endif
    1845 #if QC_MDCS
    1846   const UInt uiScanIdx = pcCU->getCoefScanIdx(uiAbsPartIdx, uiWidth, eTType==TEXT_LUMA, pcCU->isIntra(uiAbsPartIdx));
    1847 #endif //QC_MDCS
    1848  
    1849 #if PCP_SIGMAP_SIMPLE_LAST
    1850     //===== decode last significant =====
    1851     UInt uiPosLastX, uiPosLastY;
    1852     parseLastSignificantXY( uiPosLastX, uiPosLastY, uiWidth, eTType, uiCTXIdx, uiScanIdx );
    1853     UInt uiBlkPosLast      = uiPosLastX + (uiPosLastY<<uiLog2BlockSize);
    1854     pcCoef[ uiBlkPosLast ] = 1;
    1855 
    1856     //===== decode significance flags =====
    1857     for( UInt uiScanPos = 0; uiScanPos < uiMaxNumCoeffM1; uiScanPos++ )
    1858     {
    1859 #if QC_MDCS
    1860       UInt uiBlkPos = g_auiSigLastScan[uiScanIdx][uiLog2BlockSize-1][uiScanPos];
    1861 #else
    1862       UInt  uiBlkPos  = g_auiFrameScanXY[ uiLog2BlockSize-1 ][ uiScanPos ];
    1863 #endif //QC_MDCS
    1864       if( uiBlkPosLast == uiBlkPos )
    1865       {
    1866         break;
    1867       }
    1868       UInt  uiPosY    = uiBlkPos >> uiLog2BlockSize;
    1869       UInt  uiPosX    = uiBlkPos - ( uiPosY << uiLog2BlockSize );
    1870       UInt  uiSig     = 0;
    1871       UInt  uiCtxSig  = TComTrQuant::getSigCtxInc( pcCoef, uiPosX, uiPosY, uiLog2BlockSize, uiWidth );
    1872 #if SIMPLE_CONTEXT_SIG
    1873       if( uiCtxSig < 4 || eTType )
    1874       {
    1875         m_pcTDecBinIf->decodeBin( uiSig, m_cCUSigSCModel.get( uiCTXIdx-2, eTType, uiCtxSig ) );
     1329  UInt uiScanIdx = pcCU->getCoefScanIdx(uiAbsPartIdx, uiWidth, eTType==TEXT_LUMA, pcCU->isIntra(uiAbsPartIdx));
     1330  int blockType = uiLog2BlockSize;
     1331  if (uiWidth != uiHeight)
     1332  {
     1333    uiScanIdx = SCAN_DIAG;
     1334    blockType = 4;
     1335  }
     1336 
     1337  //===== decode last significant =====
     1338  UInt uiPosLastX, uiPosLastY;
     1339  parseLastSignificantXY( uiPosLastX, uiPosLastY, uiWidth, uiHeight, eTType, uiScanIdx );
     1340  UInt uiBlkPosLast      = uiPosLastX + (uiPosLastY<<uiLog2BlockSize);
     1341  pcCoef[ uiBlkPosLast ] = 1;
     1342
     1343  //===== decode significance flags =====
     1344  UInt uiScanPosLast   = uiBlkPosLast;
     1345  if (uiScanIdx == SCAN_ZIGZAG)
     1346  {
     1347    // Map zigzag to diagonal scan
     1348    uiScanIdx = SCAN_DIAG;
     1349  }
     1350  const UInt * scan;
     1351  if (uiWidth == uiHeight)
     1352  {
     1353    scan = g_auiSigLastScan[ uiScanIdx ][ uiLog2BlockSize-1 ];
     1354  }
     1355  else
     1356  {
     1357    scan = g_sigScanNSQT[ uiLog2BlockSize - 2 ];
     1358  }
     1359  for( uiScanPosLast = 0; uiScanPosLast < uiMaxNumCoeffM1; uiScanPosLast++ )
     1360  {
     1361    UInt uiBlkPos = scan[ uiScanPosLast ];
     1362    if( uiBlkPosLast == uiBlkPos )
     1363    {
     1364      break;
     1365    }
     1366  }
     1367
     1368  ContextModel * const baseCoeffGroupCtx = m_cCUSigCoeffGroupSCModel.get( 0, eTType );
     1369  ContextModel * const baseCtx = (eTType==TEXT_LUMA) ? m_cCUSigSCModel.get( 0, 0 ) : m_cCUSigSCModel.get( 0, 0 ) + NUM_SIG_FLAG_CTX_LUMA;
     1370
     1371  const Int  iLastScanSet      = uiScanPosLast >> LOG2_SCAN_SET_SIZE;
     1372  UInt uiNumOne                = 0;
     1373  UInt uiGoRiceParam           = 0;
     1374
     1375#if MULTIBITS_DATA_HIDING
     1376  UInt const tsig = pcCU->getSlice()->getPPS()->getTSIG();
     1377#if LOSSLESS_CODING
     1378  Bool beValid;
     1379  if (pcCU->isLosslessCoded(uiAbsPartIdx))
     1380  {
     1381    beValid = false;
     1382  }
     1383  else
     1384  {
     1385    beValid = pcCU->getSlice()->getPPS()->getSignHideFlag() > 0;
     1386  }
     1387#else
     1388  Bool beValid = pcCU->getSlice()->getPPS()->getSignHideFlag() > 0;
     1389#endif
     1390  UInt absSum = 0;
     1391#endif  // MULTIBITS_DATA_HIDING
     1392
     1393  UInt uiSigCoeffGroupFlag[ MLS_GRP_NUM ];
     1394  ::memset( uiSigCoeffGroupFlag, 0, sizeof(UInt) * MLS_GRP_NUM );
     1395  const UInt uiNumBlkSide = uiWidth >> (MLS_CG_SIZE >> 1);
     1396  const UInt * scanCG;
     1397  if (uiWidth == uiHeight)
     1398  {
     1399    scanCG = g_auiSigLastScan[ uiScanIdx ][ uiLog2BlockSize > 3 ? uiLog2BlockSize-2-1 : 0  ];   
     1400#if MULTILEVEL_SIGMAP_EXT
     1401    if( uiLog2BlockSize == 3 )
     1402    {
     1403      scanCG = g_sigLastScan8x8[ uiScanIdx ];
     1404    }
     1405    else if( uiLog2BlockSize == 5 )
     1406    {
     1407      scanCG = g_sigLastScanCG32x32;
     1408    }
     1409#endif
     1410  }
     1411  else
     1412  {
     1413    scanCG = g_sigCGScanNSQT[ uiLog2BlockSize - 2 ];
     1414  }
     1415  Int  iScanPosSig             = (Int) uiScanPosLast;
     1416  for( Int iSubSet = iLastScanSet; iSubSet >= 0; iSubSet-- )
     1417  {
     1418    Int  iSubPos     = iSubSet << LOG2_SCAN_SET_SIZE;
     1419    uiGoRiceParam    = 0;
     1420    Int numNonZero = 0;
     1421   
     1422#if MULTIBITS_DATA_HIDING
     1423    Int lastNZPosInCG = -1, firstNZPosInCG = SCAN_SET_SIZE;
     1424#endif
     1425
     1426    Int pos[SCAN_SET_SIZE];
     1427    if( iScanPosSig == (Int) uiScanPosLast )
     1428    {
     1429#if MULTIBITS_DATA_HIDING
     1430      lastNZPosInCG  = iScanPosSig;
     1431      firstNZPosInCG = iScanPosSig;
     1432#endif
     1433      iScanPosSig--;
     1434      pos[ numNonZero ] = uiBlkPosLast;
     1435      numNonZero = 1;
     1436    }
     1437
     1438#if !MULTILEVEL_SIGMAP_EXT
     1439    if( blockType > 3 )
     1440    {
     1441#endif
     1442      // decode significant_coeffgroup_flag
     1443      Int iCGBlkPos = scanCG[ iSubSet ];
     1444      Int iCGPosY   = iCGBlkPos / uiNumBlkSide;
     1445      Int iCGPosX   = iCGBlkPos - (iCGPosY * uiNumBlkSide);
     1446#if MULTILEVEL_SIGMAP_EXT
     1447      if( uiWidth == 8 && uiHeight == 8 && (uiScanIdx == SCAN_HOR || uiScanIdx == SCAN_VER) )
     1448      {
     1449        iCGPosY = (uiScanIdx == SCAN_HOR ? iCGBlkPos : 0);
     1450        iCGPosX = (uiScanIdx == SCAN_VER ? iCGBlkPos : 0);
     1451      }
     1452#endif
     1453#if !REMOVE_INFER_SIGGRP
     1454      Bool bInferredCGFlag = false;
     1455#endif
     1456#if REMOVE_INFER_SIGGRP
     1457      if( iSubSet == iLastScanSet || iSubSet == 0)
     1458#else
     1459      if( iSubSet == iLastScanSet )
     1460#endif
     1461      {
     1462        uiSigCoeffGroupFlag[ iCGBlkPos ] = 1;
    18761463      }
    18771464      else
    18781465      {
    1879         m_pcTDecBinIf->decodeBin( uiSig, m_cCUSigSCModel.get( uiCTXIdx-2 ? uiCTXIdx-2 : 1 , eTType, uiCtxSig ) );
    1880       }
    1881 #else
    1882       m_pcTDecBinIf->decodeBin( uiSig, m_cCUSigSCModel.get( uiCTXIdx, eTType, uiCtxSig ) );
    1883 #endif
    1884       pcCoef[ uiBlkPos ] = uiSig;
    1885     }
    1886 
    1887 #else
    1888   for( UInt uiScanPos = 0; uiScanPos < uiMaxNumCoeffM1; uiScanPos++ )
    1889   {
    1890 #if QC_MDCS
    1891     UInt uiBlkPos = g_auiSigLastScan[uiScanIdx][uiLog2BlockSize-1][uiScanPos];
    1892 #else
    1893     UInt  uiBlkPos  = g_auiFrameScanXY[ uiLog2BlockSize-1 ][ uiScanPos ];
    1894 #endif //QC_MDCS
    1895     UInt  uiPosY    = uiBlkPos >> uiLog2BlockSize;
    1896     UInt  uiPosX    = uiBlkPos - ( uiPosY << uiLog2BlockSize );
    1897    
    1898     //===== code significance flag =====
    1899     UInt  uiSig     = 0;
    1900     UInt  uiCtxSig  = TComTrQuant::getSigCtxInc( pcCoef, uiPosX, uiPosY, uiLog2BlockSize, uiWidth );
    1901 #if SIMPLE_CONTEXT_SIG
    1902       if( uiCtxSig < 4 || eTType )
    1903       {
    1904         m_pcTDecBinIf->decodeBin( uiSig, m_cCUSigSCModel.get( uiCTXIdx-2, eTType, uiCtxSig ) );
    1905       }
    1906       else
    1907       {
    1908         m_pcTDecBinIf->decodeBin( uiSig, m_cCUSigSCModel.get( uiCTXIdx-2 ? uiCTXIdx-2 : 1 , eTType, uiCtxSig ) );
    1909       }
    1910 #else
    1911     m_pcTDecBinIf->decodeBin( uiSig, m_cCUSigSCModel.get( uiCTXIdx, eTType, uiCtxSig ) );
    1912 #endif
    1913     if( uiSig )
    1914     {
    1915       pcCoef[ uiBlkPos ] = 1;
    1916      
    1917       //===== code last flag =====
    1918       UInt  uiLast     = 0;
    1919       UInt  uiCtxLast  = TComTrQuant::getLastCtxInc( uiPosX, uiPosY, uiLog2BlockSize );
    1920       m_pcTDecBinIf->decodeBin( uiLast, m_cCULastSCModel.get( uiCTXIdx, eTType, uiCtxLast ) );
    1921      
    1922       if( uiLast )
    1923       {
    1924         bLastReceived = true;
    1925         break;
    1926       }
    1927     }
    1928   }
    1929   if( !bLastReceived )
    1930   {
    1931     pcCoef[ uiMaxNumCoeffM1 ] = 1;
    1932   }
    1933 #endif
    1934  
    1935   /*
    1936    * Sign and bin0 PCP (Section 3.2 and 3.3 of JCTVC-B088)
    1937    */
    1938   Int  c1, c2;
    1939   UInt uiSign;
    1940   UInt uiLevel;
    1941 #if E253
    1942   UInt uiGoRiceParam = 0;
    1943 #endif
    1944 
    1945   if( uiNum4x4Blk > 1 )
    1946   {
    1947     Bool b1stBlk  = true;
    1948     UInt uiNumOne = 0;
    1949    
    1950     for( UInt uiSubBlk = 0; uiSubBlk < uiNum4x4Blk; uiSubBlk++ )
    1951     {
    1952       UInt uiCtxSet    = 0;
    1953       UInt uiSubNumSig = 0;
    1954       UInt uiSubPosX   = 0;
    1955       UInt uiSubPosY   = 0;
    1956 #if E253
    1957       uiGoRiceParam    = 0;
    1958 #endif
    1959 
    1960       uiSubPosX = g_auiFrameScanX[ g_aucConvertToBit[ uiWidth ] - 1 ][ uiSubBlk ] << 2;
    1961       uiSubPosY = g_auiFrameScanY[ g_aucConvertToBit[ uiWidth ] - 1 ][ uiSubBlk ] << 2;
    1962      
    1963       TCoeff* piCurr = &pcCoef[ uiSubPosX + uiSubPosY * uiWidth ];
    1964      
    1965       for( UInt uiY = 0; uiY < 4; uiY++ )
    1966       {
    1967         for( UInt uiX = 0; uiX < 4; uiX++ )
     1466#if !REMOVE_INFER_SIGGRP
     1467#if MULTILEVEL_SIGMAP_EXT
     1468        if( !TComTrQuant::bothCGNeighboursOne( uiSigCoeffGroupFlag, iCGPosX, iCGPosY, uiScanIdx, uiWidth, uiHeight) && ( iSubSet ) )
     1469#else
     1470        if( !TComTrQuant::bothCGNeighboursOne( uiSigCoeffGroupFlag, iCGPosX, iCGPosY, uiWidth, uiHeight) && ( iSubSet ) )
     1471#endif
    19681472        {
    1969           if( piCurr[ uiX ] )
    1970           {
    1971             uiSubNumSig++;
    1972           }
    1973         }
    1974         piCurr += uiWidth;
    1975       }
    1976      
    1977       if( uiSubNumSig > 0 )
    1978       {
    1979         c1 = 1;
    1980         c2 = 0;
    1981        
    1982         if( b1stBlk )
    1983         {
    1984           b1stBlk  = false;
    1985           uiCtxSet = 5;
     1473#endif
     1474          UInt uiSigCoeffGroup;
     1475#if MULTILEVEL_SIGMAP_EXT
     1476          UInt uiCtxSig  = TComTrQuant::getSigCoeffGroupCtxInc( uiSigCoeffGroupFlag, iCGPosX, iCGPosY, uiScanIdx, uiWidth, uiHeight );
     1477#else
     1478          UInt uiCtxSig  = TComTrQuant::getSigCoeffGroupCtxInc( uiSigCoeffGroupFlag, iCGPosX, iCGPosY, uiWidth, uiHeight );
     1479#endif
     1480          m_pcTDecBinIf->decodeBin( uiSigCoeffGroup, baseCoeffGroupCtx[ uiCtxSig ] );
     1481          uiSigCoeffGroupFlag[ iCGBlkPos ] = uiSigCoeffGroup;
     1482#if !REMOVE_INFER_SIGGRP
    19861483        }
    19871484        else
    19881485        {
    1989           uiCtxSet = ( uiNumOne >> 2 ) + 1;
    1990           uiNumOne = 0;
     1486          uiSigCoeffGroupFlag[ iCGBlkPos ] = 1;
     1487          bInferredCGFlag = true;
    19911488        }
     1489#endif
     1490      }
     1491
     1492      // decode significant_coeff_flag
     1493      UInt uiBlkPos, uiPosY, uiPosX, uiSig, uiCtxSig;
     1494      for( ; iScanPosSig >= iSubPos; iScanPosSig-- )
     1495      {
     1496        uiBlkPos  = scan[ iScanPosSig ];
     1497        uiPosY    = uiBlkPos >> uiLog2BlockSize;
     1498        uiPosX    = uiBlkPos - ( uiPosY << uiLog2BlockSize );
     1499        uiSig     = 0;
    19921500       
    1993         for( UInt uiScanPos = 0; uiScanPos < 16; uiScanPos++ )
     1501        if( uiSigCoeffGroupFlag[ iCGBlkPos ] )
    19941502        {
    1995           UInt  uiBlkPos  = g_auiFrameScanXY[ 1 ][ 15 - uiScanPos ];
    1996           UInt  uiPosY    = uiBlkPos >> 2;
    1997           UInt  uiPosX    = uiBlkPos - ( uiPosY << 2 );
    1998           UInt  uiIndex   = ( ( uiSubPosY + uiPosY ) << uiLog2BlockSize ) + uiSubPosX + uiPosX;
    1999          
    2000           uiLevel = pcCoef[ uiIndex ];
    2001          
    2002           if( uiLevel )
     1503#if REMOVE_INFER_SIGGRP
     1504          if( iScanPosSig > iSubPos || iSubSet == 0  || numNonZero )
     1505#else
     1506          if( iScanPosSig > iSubPos || bInferredCGFlag || numNonZero )
     1507#endif
    20031508          {
    2004             UInt uiCtx = min<UInt>(c1, 4);
    2005             m_pcTDecBinIf->decodeBin( uiLevel, m_cCUOneSCModel.get( 0, eTType, ( uiCtxSet << 2 ) + uiCtxSet + uiCtx ) );
    2006             if( uiLevel == 1 )
    2007             {
    2008               c1      = 0;
    2009               uiLevel = 2;
    2010             }
    2011             else if( c1 )
    2012             {
    2013               c1++;
    2014               uiLevel++;
    2015             }
    2016             else
    2017             {
    2018               uiLevel++;
    2019             }
    2020             pcCoef[ uiIndex ] = uiLevel;
     1509            uiCtxSig  = TComTrQuant::getSigCtxInc( pcCoef, uiPosX, uiPosY, blockType, uiWidth, uiHeight, eTType );
     1510            m_pcTDecBinIf->decodeBin( uiSig, baseCtx[ uiCtxSig ] );
     1511          }
     1512          else
     1513          {
     1514            uiSig = 1;
    20211515          }
    20221516        }
    2023        
    2024         for( UInt uiScanPos = 0; uiScanPos < 16; uiScanPos++ )
     1517        pcCoef[ uiBlkPos ] = uiSig;
     1518        if( uiSig )
    20251519        {
    2026           UInt  uiBlkPos  = g_auiFrameScanXY[ 1 ][ 15 - uiScanPos ];
    2027           UInt  uiPosY    = uiBlkPos >> 2;
    2028           UInt  uiPosX    = uiBlkPos - ( uiPosY << 2 );
    2029           UInt  uiIndex   = ( ( uiSubPosY + uiPosY ) << uiLog2BlockSize ) + uiSubPosX + uiPosX;
    2030          
    2031           uiLevel = pcCoef[ uiIndex ];
    2032          
    2033           if( uiLevel )
     1520          pos[ numNonZero ] = uiBlkPos;
     1521          numNonZero ++;
     1522#if MULTIBITS_DATA_HIDING
     1523          if( lastNZPosInCG == -1 )
    20341524          {
    2035             if( uiLevel == 2 )
    2036             {
    2037               UInt uiCtx = min<UInt>(c2, 4);
    2038               c2++;
    2039               uiNumOne++;
    2040 #if E253
    2041               m_pcTDecBinIf->decodeBin( uiLevel, m_cCUAbsSCModel.get( 0, eTType, ( uiCtxSet << 2 ) + uiCtxSet + uiCtx ) );
    2042 
    2043               if( uiLevel )
    2044               {
    2045                 xReadGoRiceExGolomb( uiLevel, uiGoRiceParam );
    2046                 uiLevel += 3;
    2047               }
    2048               else
    2049               {
    2050                 uiLevel = 2;
    2051               }
    2052 #else
    2053               xReadExGolombLevel( uiLevel, m_cCUAbsSCModel.get( 0, eTType, ( uiCtxSet << 2 ) + uiCtxSet + uiCtx ) );
    2054               uiLevel += 2;
    2055 #endif
    2056             }
    2057             pcCoef[ uiIndex ] = uiLevel;
     1525            lastNZPosInCG = iScanPosSig;
     1526          }
     1527          firstNZPosInCG = iScanPosSig;
     1528#endif
     1529        }
     1530      }
     1531#if !MULTILEVEL_SIGMAP_EXT
     1532    }
     1533    else
     1534    {
     1535      for( ; iScanPosSig >= iSubPos; iScanPosSig-- )
     1536      {
     1537        UInt uiBlkPos   = scan[ iScanPosSig ];
     1538        UInt  uiPosY    = uiBlkPos >> uiLog2BlockSize;
     1539        UInt  uiPosX    = uiBlkPos - ( uiPosY << uiLog2BlockSize );
     1540        UInt  uiSig     = 0;
     1541        UInt  uiCtxSig  = TComTrQuant::getSigCtxInc( pcCoef, uiPosX, uiPosY, blockType, uiWidth, uiHeight, eTType );
     1542        m_pcTDecBinIf->decodeBin( uiSig, baseCtx[ uiCtxSig ] );
     1543        pcCoef[ uiBlkPos ] = uiSig;
     1544        if( uiSig )
     1545        {
     1546          pos[ numNonZero ] = uiBlkPos;
     1547          numNonZero ++;
     1548#if MULTIBITS_DATA_HIDING
     1549          if( lastNZPosInCG == -1 )
     1550          {
     1551            lastNZPosInCG = iScanPosSig;
     1552          }
     1553          firstNZPosInCG = iScanPosSig;
     1554#endif
     1555        }
     1556      }
     1557    }
     1558#endif
     1559
     1560   
     1561    if( numNonZero )
     1562    {
     1563#if MULTIBITS_DATA_HIDING
     1564      Bool signHidden = ( lastNZPosInCG - firstNZPosInCG >= (Int)tsig );
     1565      absSum = 0;
     1566#endif  // MULTIBITS_DATA_HIDING
     1567
     1568      UInt c1 = 1;
     1569#if !RESTRICT_GR1GR2FLAG_NUMBER
     1570      UInt c2 = 0;
     1571#endif
     1572#if LEVEL_CTX_LUMA_RED
     1573      UInt uiCtxSet    = (iSubSet > 0 && eTType==TEXT_LUMA) ? 2 : 0;
     1574#else
     1575      UInt uiCtxSet    = (iSubSet > 0 && eTType==TEXT_LUMA) ? 3 : 0;
     1576#endif
     1577      UInt uiBin;
     1578     
     1579      if( uiNumOne > 0 )
     1580      {
     1581        uiCtxSet++;
     1582#if !LEVEL_CTX_LUMA_RED
     1583        if(eTType==TEXT_LUMA && uiNumOne > 3)
     1584        {
     1585          uiCtxSet++;
     1586        }
     1587#endif
     1588      }
     1589     
     1590      uiNumOne       >>= 1;
     1591      ContextModel *baseCtxMod = ( eTType==TEXT_LUMA ) ? m_cCUOneSCModel.get( 0, 0 ) + 4 * uiCtxSet : m_cCUOneSCModel.get( 0, 0 ) + NUM_ONE_FLAG_CTX_LUMA + 4 * uiCtxSet;
     1592      Int absCoeff[SCAN_SET_SIZE];
     1593
     1594#if RESTRICT_GR1GR2FLAG_NUMBER
     1595      for ( Int i = 0; i < numNonZero; i++) absCoeff[i] = 1;   
     1596      Int numC1Flag = min(numNonZero, C1FLAG_NUMBER);
     1597      Int firstC2FlagIdx = -1;
     1598
     1599      for( Int idx = 0; idx < numC1Flag; idx++ )
     1600#else
     1601      for( Int idx = 0; idx < numNonZero; idx++ )
     1602#endif
     1603      {
     1604        m_pcTDecBinIf->decodeBin( uiBin, baseCtxMod[c1] );
     1605        if( uiBin == 1 )
     1606        {
     1607          c1 = 0;
     1608#if RESTRICT_GR1GR2FLAG_NUMBER
     1609          if (firstC2FlagIdx == -1)
     1610          {
     1611            firstC2FlagIdx = idx;
     1612          }
     1613#endif
     1614        }
     1615        else if( (c1 < 3) && (c1 > 0) )
     1616        {
     1617          c1++;
     1618        }
     1619        absCoeff[ idx ] = uiBin + 1;
     1620      }
     1621     
     1622      if (c1 == 0)
     1623      {
     1624#if RESTRICT_GR1GR2FLAG_NUMBER
     1625        baseCtxMod = ( eTType==TEXT_LUMA ) ? m_cCUAbsSCModel.get( 0, 0 ) + uiCtxSet : m_cCUAbsSCModel.get( 0, 0 ) + NUM_ABS_FLAG_CTX_LUMA + uiCtxSet;
     1626        if ( firstC2FlagIdx != -1)
     1627        {
     1628          m_pcTDecBinIf->decodeBin( uiBin, baseCtxMod[0] );
     1629          absCoeff[ firstC2FlagIdx ] = uiBin + 2;
     1630        }
     1631#else   
     1632        baseCtxMod = ( eTType==TEXT_LUMA ) ? m_cCUAbsSCModel.get( 0, 0 ) + 3 * uiCtxSet : m_cCUAbsSCModel.get( 0, 0 ) + NUM_ABS_FLAG_CTX_LUMA + 3 * uiCtxSet;
     1633        for( Int idx = 0; idx < numNonZero; idx++ )
     1634        {
     1635          if( absCoeff[ idx ] == 2 )
     1636          {
     1637            m_pcTDecBinIf->decodeBin( uiBin, baseCtxMod[c2] );
     1638            absCoeff[ idx ] = uiBin + 2;
     1639            c2 += (c2 < 2);
     1640            uiNumOne++;
    20581641          }
    20591642        }
    2060        
    2061         for( UInt uiScanPos = 0; uiScanPos < 16; uiScanPos++ )
     1643#endif
     1644      }
     1645
     1646#if MULTIBITS_DATA_HIDING
     1647      UInt coeffSigns;
     1648      if ( signHidden && beValid )
     1649      {
     1650        m_pcTDecBinIf->decodeBinsEP( coeffSigns, numNonZero-1 );
     1651        coeffSigns <<= 32 - (numNonZero-1);
     1652      }
     1653      else
     1654      {
     1655        m_pcTDecBinIf->decodeBinsEP( coeffSigns, numNonZero );
     1656        coeffSigns <<= 32 - numNonZero;
     1657      }
     1658#else
     1659      UInt coeffSigns;
     1660      m_pcTDecBinIf->decodeBinsEP( coeffSigns, numNonZero );
     1661      coeffSigns <<= 32 - numNonZero;
     1662#endif
     1663     
     1664#if RESTRICT_GR1GR2FLAG_NUMBER
     1665      Int iFirstCoeff2 = 1;   
     1666      if (c1 == 0 || numNonZero > C1FLAG_NUMBER)
     1667#else
     1668      if (c1 == 0)
     1669#endif
     1670      {
     1671        for( Int idx = 0; idx < numNonZero; idx++ )
    20621672        {
    2063           UInt  uiBlkPos  = g_auiFrameScanXY[ 1 ][ 15 - uiScanPos ];
    2064           UInt  uiPosY    = uiBlkPos >> 2;
    2065           UInt  uiPosX    = uiBlkPos - ( uiPosY << 2 );
    2066           UInt  uiIndex   = (uiSubPosY + uiPosY) * uiWidth + uiSubPosX + uiPosX;
    2067          
    2068           uiLevel = pcCoef[ uiIndex ];
    2069          
    2070           if( uiLevel )
     1673#if RESTRICT_GR1GR2FLAG_NUMBER   
     1674          UInt baseLevel  = (idx < C1FLAG_NUMBER)? (2 + iFirstCoeff2) : 1;
     1675
     1676          if( absCoeff[ idx ] == baseLevel)
    20711677          {
    2072             m_pcTDecBinIf->decodeBinEP( uiSign );
    2073             pcCoef[ uiIndex ] = ( uiSign ? -(Int)uiLevel : (Int)uiLevel );
     1678            UInt uiLevel;
     1679            xReadGoRiceExGolomb( uiLevel, uiGoRiceParam );
     1680            absCoeff[ idx ] = uiLevel + baseLevel;
    20741681          }
     1682
     1683          if(absCoeff[ idx ] >= 2) 
     1684          {
     1685            iFirstCoeff2 = 0;
     1686            uiNumOne++;
     1687          }
     1688#else
     1689          if( absCoeff[ idx ] == 3 )
     1690          {
     1691            UInt uiLevel;
     1692            xReadGoRiceExGolomb( uiLevel, uiGoRiceParam );
     1693            absCoeff[ idx ] = uiLevel + 3;
     1694          }
     1695#endif
    20751696        }
    20761697      }
    2077     }
    2078   }
    2079   else
    2080   {
    2081     c1 = 1;
    2082     c2 = 0;
    2083    
    2084     for( UInt uiScanPos = 0; uiScanPos < 16; uiScanPos++ )
    2085     {
    2086       UInt uiIndex = g_auiFrameScanXY[ 1 ][ 15 - uiScanPos ];
    2087       uiLevel = pcCoef[ uiIndex ];
    2088      
    2089       if( uiLevel )
    2090       {
    2091         UInt uiCtx = min<UInt>(c1, 4);
    2092         m_pcTDecBinIf->decodeBin( uiLevel, m_cCUOneSCModel.get( 0, eTType, uiCtx ) );
    2093         if( uiLevel == 1 )
     1698
     1699      for( Int idx = 0; idx < numNonZero; idx++ )
     1700      {
     1701        Int blkPos = pos[ idx ];
     1702#if MULTIBITS_DATA_HIDING
     1703        // Signs applied later.
     1704        pcCoef[ blkPos ] = absCoeff[ idx ];
     1705        absSum += absCoeff[ idx ];
     1706
     1707        if ( idx == numNonZero-1 && signHidden && beValid )
    20941708        {
    2095           c1      = 0;
    2096           uiLevel = 2;
    2097         }
    2098         else if( c1 )
    2099         {
    2100           c1++;
    2101           uiLevel++;
     1709          // Infer sign of 1st element.
     1710          if (absSum&0x1)
     1711            pcCoef[ blkPos ] = -pcCoef[ blkPos ];
    21021712        }
    21031713        else
    21041714        {
    2105           uiLevel++;
     1715          Int sign = static_cast<Int>( coeffSigns ) >> 31;
     1716          pcCoef[ blkPos ] = ( pcCoef[ blkPos ] ^ sign ) - sign;
     1717          coeffSigns <<= 1;
    21061718        }
    2107         pcCoef[ uiIndex ] = uiLevel;
    2108       }
    2109     }
    2110    
    2111     for( UInt uiScanPos = 0; uiScanPos < 16; uiScanPos++ )
    2112     {
    2113       UInt uiIndex = g_auiFrameScanXY[ 1 ][ 15 - uiScanPos ];
    2114       uiLevel = pcCoef[ uiIndex ];
    2115      
    2116       if( uiLevel )
    2117       {
    2118         if( uiLevel == 2 )
    2119         {
    2120           UInt uiCtx = min<UInt>(c2, 4);
    2121           c2++;
    2122 #if E253
    2123           m_pcTDecBinIf->decodeBin( uiLevel, m_cCUAbsSCModel.get( 0, eTType, uiCtx ) );
    2124 
    2125           if( uiLevel )
    2126           {
    2127             xReadGoRiceExGolomb( uiLevel, uiGoRiceParam );
    2128             uiLevel += 3;
    2129           }
    2130           else
    2131           {
    2132             uiLevel = 2;
    2133           }
    2134 #else
    2135           xReadExGolombLevel( uiLevel, m_cCUAbsSCModel.get( 0, eTType, uiCtx ) );
    2136           uiLevel += 2;
    2137 #endif
    2138         }
    2139         pcCoef[ uiIndex ] = uiLevel;
    2140       }
    2141     }
    2142    
    2143     for( UInt uiScanPos = 0; uiScanPos < 16; uiScanPos++ )
    2144     {
    2145       UInt uiIndex = g_auiFrameScanXY[ 1 ][ 15 - uiScanPos ];
    2146       uiLevel = pcCoef[ uiIndex ];
    2147      
    2148       if( uiLevel )
    2149       {
    2150         m_pcTDecBinIf->decodeBinEP( uiSign );
    2151         pcCoef[ uiIndex ] = ( uiSign ? -(Int)uiLevel : (Int)uiLevel );
    2152       }
     1719#else
     1720        Int sign = static_cast<Int>( coeffSigns ) >> 31;
     1721        pcCoef[ blkPos ] = ( absCoeff[ idx ] ^ sign ) - sign;
     1722        coeffSigns <<= 1;
     1723#endif
     1724      }
     1725    }
     1726    else
     1727    {
     1728      uiNumOne >>= 1;
    21531729    }
    21541730  }
     
    21571733}
    21581734
    2159 Void TDecSbac::parseAlfFlag (UInt& ruiVal)
    2160 {
    2161   UInt uiSymbol;
    2162   m_pcTDecBinIf->decodeBin( uiSymbol, m_cALFFlagSCModel.get( 0, 0, 0 ) );
    2163  
    2164   ruiVal = uiSymbol;
    2165 }
    2166 
    2167 #if TSB_ALF_HEADER
    2168 Void TDecSbac::parseAlfFlagNum( UInt& ruiVal, UInt minValue, UInt depth )
    2169 {
    2170   UInt uiLength = 0;
    2171   UInt maxValue = (minValue << (depth*2));
    2172   UInt temp = maxValue - minValue;
    2173   for(UInt i=0; i<32; i++)
    2174   {
    2175     if(temp&0x1)
    2176     {
    2177       uiLength = i+1;
    2178     }
    2179     temp = (temp >> 1);
    2180   }
    2181   ruiVal = 0;
    2182   UInt uiBit;
    2183   if(uiLength)
    2184   {
    2185     while( uiLength-- )
    2186     {
    2187       m_pcTDecBinIf->decodeBinEP( uiBit );
    2188       ruiVal += uiBit << uiLength;
    2189     }
    2190   }
    2191   else
    2192   {
    2193     ruiVal = 0;
    2194   }
    2195   ruiVal += minValue;
    2196 }
    2197 
    2198 Void TDecSbac::parseAlfCtrlFlag( UInt &ruiAlfCtrlFlag )
    2199 {
    2200   UInt uiSymbol;
    2201   m_pcTDecBinIf->decodeBin( uiSymbol, m_cCUAlfCtrlFlagSCModel.get( 0, 0, 0 ) );
    2202   ruiAlfCtrlFlag = uiSymbol;
    2203 }
    2204 #endif
    2205 
    2206 Void TDecSbac::parseAlfUvlc (UInt& ruiVal)
     1735
     1736#if SAO_UNIT_INTERLEAVING
     1737Void TDecSbac::parseSaoUvlc (UInt& ruiVal)
    22071738{
    22081739  UInt uiCode;
    22091740  Int  i;
    2210  
    2211   m_pcTDecBinIf->decodeBin( uiCode, m_cALFUvlcSCModel.get( 0, 0, 0 ) );
     1741
     1742  m_pcTDecBinIf->decodeBin( uiCode, m_cSaoUvlcSCModel.get( 0, 0, 0 ) );
    22121743  if ( uiCode == 0 )
    22131744  {
     
    22151746    return;
    22161747  }
    2217  
     1748
    22181749  i=1;
    22191750  while (1)
    22201751  {
    2221     m_pcTDecBinIf->decodeBin( uiCode, m_cALFUvlcSCModel.get( 0, 0, 1 ) );
     1752    m_pcTDecBinIf->decodeBin( uiCode, m_cSaoUvlcSCModel.get( 0, 0, 1 ) );
    22221753    if ( uiCode == 0 ) break;
    22231754    i++;
    22241755  }
    2225  
     1756
    22261757  ruiVal = i;
    22271758}
    22281759
    2229 Void TDecSbac::parseAlfSvlc (Int&  riVal)
     1760Void TDecSbac::parseSaoSvlc (Int&  riVal)
    22301761{
    22311762  UInt uiCode;
    22321763  Int  iSign;
    22331764  Int  i;
    2234  
    2235   m_pcTDecBinIf->decodeBin( uiCode, m_cALFSvlcSCModel.get( 0, 0, 0 ) );
    2236  
     1765
     1766  m_pcTDecBinIf->decodeBin( uiCode, m_cSaoSvlcSCModel.get( 0, 0, 0 ) );
     1767
    22371768  if ( uiCode == 0 )
    22381769  {
     
    22401771    return;
    22411772  }
    2242  
     1773
    22431774  // read sign
    2244   m_pcTDecBinIf->decodeBin( uiCode, m_cALFSvlcSCModel.get( 0, 0, 1 ) );
    2245  
    2246   if ( uiCode == 0 ) iSign =  1;
    2247   else               iSign = -1;
    2248  
     1775  m_pcTDecBinIf->decodeBin( uiCode, m_cSaoSvlcSCModel.get( 0, 0, 1 ) );
     1776
     1777  if ( uiCode == 0 )
     1778  {
     1779    iSign =  1;
     1780  }
     1781  else
     1782  {
     1783    iSign = -1;
     1784  }
     1785
    22491786  // read magnitude
    22501787  i=1;
    22511788  while (1)
    22521789  {
    2253     m_pcTDecBinIf->decodeBin( uiCode, m_cALFSvlcSCModel.get( 0, 0, 2 ) );
     1790    m_pcTDecBinIf->decodeBin( uiCode, m_cSaoSvlcSCModel.get( 0, 0, 2 ) );
    22541791    if ( uiCode == 0 ) break;
    22551792    i++;
    22561793  }
    2257  
     1794
    22581795  riVal = i*iSign;
    22591796}
    22601797
    2261 #if MTK_SAO
    2262 Void TDecSbac::parseAoFlag (UInt& ruiVal)
     1798Void TDecSbac::parseSaoUflc (UInt&  riVal)
    22631799{
    22641800  UInt uiSymbol;
    2265   m_pcTDecBinIf->decodeBin( uiSymbol, m_cAOFlagSCModel.get( 0, 0, 0 ) );
    2266 
    2267   ruiVal = uiSymbol;
    2268 }
    2269 
    2270 Void TDecSbac::parseAoUvlc (UInt& ruiVal)
     1801  riVal = 0;
     1802  for (Int i=0;i<5;i++)
     1803  {
     1804    m_pcTDecBinIf->decodeBinEP ( uiSymbol );
     1805    if (uiSymbol)
     1806    {
     1807      riVal |= (1<<i);
     1808    }
     1809  }
     1810}
     1811Void TDecSbac::parseSaoMergeLeft (UInt&  ruiVal, UInt uiCompIdx)
     1812{
     1813  UInt uiCode;
     1814  m_pcTDecBinIf->decodeBin( uiCode, m_cSaoMergeLeftSCModel.get( 0, 0, uiCompIdx ) );
     1815  ruiVal = (Int)uiCode;
     1816}
     1817
     1818Void TDecSbac::parseSaoMergeUp (UInt&  ruiVal)
     1819{
     1820  UInt uiCode;
     1821  m_pcTDecBinIf->decodeBin( uiCode, m_cSaoMergeUpSCModel.get( 0, 0, 0 ) );
     1822  ruiVal = (Int)uiCode;
     1823}
     1824Void TDecSbac::parseSaoTypeIdx (UInt&  ruiVal)
    22711825{
    22721826  UInt uiCode;
    22731827  Int  i;
    2274 
    2275   m_pcTDecBinIf->decodeBin( uiCode, m_cAOUvlcSCModel.get( 0, 0, 0 ) );
     1828  m_pcTDecBinIf->decodeBin( uiCode, m_cSaoTypeIdxSCModel.get( 0, 0, 0 ) );
    22761829  if ( uiCode == 0 )
    22771830  {
     
    22791832    return;
    22801833  }
    2281 
    22821834  i=1;
    22831835  while (1)
    22841836  {
    2285     m_pcTDecBinIf->decodeBin( uiCode, m_cAOUvlcSCModel.get( 0, 0, 1 ) );
     1837    m_pcTDecBinIf->decodeBin( uiCode, m_cSaoTypeIdxSCModel.get( 0, 0, 1 ) );
    22861838    if ( uiCode == 0 ) break;
    22871839    i++;
    22881840  }
    2289 
    22901841  ruiVal = i;
    22911842}
    22921843
    2293 Void TDecSbac::parseAoSvlc (Int&  riVal)
    2294 {
    2295   UInt uiCode;
    2296   Int  iSign;
    2297   Int  i;
    2298 
    2299   m_pcTDecBinIf->decodeBin( uiCode, m_cAOSvlcSCModel.get( 0, 0, 0 ) );
    2300 
    2301   if ( uiCode == 0 )
    2302   {
    2303     riVal = 0;
    2304     return;
    2305   }
    2306 
    2307   // read sign
    2308   m_pcTDecBinIf->decodeBin( uiCode, m_cAOSvlcSCModel.get( 0, 0, 1 ) );
    2309 
    2310   if ( uiCode == 0 ) iSign =  1;
    2311   else               iSign = -1;
    2312 
    2313   // read magnitude
    2314   i=1;
    2315   while (1)
    2316   {
    2317     m_pcTDecBinIf->decodeBin( uiCode, m_cAOSvlcSCModel.get( 0, 0, 2 ) );
    2318     if ( uiCode == 0 ) break;
    2319     i++;
    2320   }
    2321 
    2322   riVal = i*iSign;
    2323 }
    2324 #endif
     1844inline Void copySaoOneLcuParam(SaoLcuParam* psDst,  SaoLcuParam* psSrc)
     1845{
     1846  Int i;
     1847  psDst->partIdx = psSrc->partIdx;
     1848  psDst->typeIdx    = psSrc->typeIdx;
     1849  if (psDst->typeIdx != -1)
     1850  {
     1851    if (psDst->typeIdx == SAO_BO)
     1852    {
     1853      psDst->bandPosition = psSrc->bandPosition ;
     1854    }
     1855    else
     1856    {
     1857      psDst->bandPosition = 0;
     1858    }
     1859    psDst->length  = psSrc->length;
     1860    for (i=0;i<psDst->length;i++)
     1861    {
     1862      psDst->offset[i] = psSrc->offset[i];
     1863    }
     1864  }
     1865  else
     1866  {
     1867    psDst->length  = 0;
     1868    for (i=0;i<SAO_BO_LEN;i++)
     1869    {
     1870      psDst->offset[i] = 0;
     1871    }
     1872  }
     1873}
     1874Void TDecSbac::parseSaoOffset(SaoLcuParam* psSaoLcuParam)
     1875{
     1876  UInt uiSymbol;
     1877  Int iSymbol;
     1878  static Int iTypeLength[MAX_NUM_SAO_TYPE] = {
     1879    SAO_EO_LEN,
     1880    SAO_EO_LEN,
     1881    SAO_EO_LEN,
     1882    SAO_EO_LEN,
     1883    SAO_BO_LEN
     1884  };
     1885
     1886  parseSaoTypeIdx(uiSymbol);
     1887  psSaoLcuParam->typeIdx = (Int)uiSymbol - 1;
     1888  if (uiSymbol)
     1889  {
     1890    psSaoLcuParam->length = iTypeLength[psSaoLcuParam->typeIdx];
     1891    if( psSaoLcuParam->typeIdx == SAO_BO )
     1892    {
     1893      // Parse Left Band Index
     1894      parseSaoUflc( uiSymbol );
     1895      psSaoLcuParam->bandPosition = uiSymbol;
     1896      for(Int i=0; i< psSaoLcuParam->length; i++)
     1897      {
     1898        parseSaoSvlc(iSymbol);
     1899        psSaoLcuParam->offset[i] = iSymbol;
     1900      }   
     1901    }
     1902    else if( psSaoLcuParam->typeIdx < 4 )
     1903    {
     1904      parseSaoUvlc(uiSymbol); psSaoLcuParam->offset[0] = uiSymbol;
     1905      parseSaoUvlc(uiSymbol); psSaoLcuParam->offset[1] = uiSymbol;
     1906      parseSaoUvlc(uiSymbol); psSaoLcuParam->offset[2] = -(Int)uiSymbol;
     1907      parseSaoUvlc(uiSymbol); psSaoLcuParam->offset[3] = -(Int)uiSymbol;
     1908    }
     1909  }
     1910  else
     1911  {
     1912    psSaoLcuParam->length = 0;
     1913  }
     1914}
     1915
     1916Void TDecSbac::parseSaoOneLcuInterleaving(Int rx, Int ry, SAOParam* pSaoParam, TComDataCU* pcCU, Int iCUAddrInSlice, Int iCUAddrUpInSlice, Bool bLFCrossSliceBoundaryFlag)
     1917{
     1918  Int iAddr = pcCU->getAddr();
     1919  UInt uiSymbol;
     1920  for (Int iCompIdx=0; iCompIdx<3; iCompIdx++)
     1921  {
     1922    pSaoParam->saoLcuParam[iCompIdx][iAddr].mergeUpFlag    = 0;
     1923    pSaoParam->saoLcuParam[iCompIdx][iAddr].mergeLeftFlag  = 0;
     1924    pSaoParam->saoLcuParam[iCompIdx][iAddr].bandPosition   = 0;
     1925    pSaoParam->saoLcuParam[iCompIdx][iAddr].typeIdx        = -1;
     1926    pSaoParam->saoLcuParam[iCompIdx][iAddr].offset[0]     = 0;
     1927    pSaoParam->saoLcuParam[iCompIdx][iAddr].offset[1]     = 0;
     1928    pSaoParam->saoLcuParam[iCompIdx][iAddr].offset[2]     = 0;
     1929    pSaoParam->saoLcuParam[iCompIdx][iAddr].offset[3]     = 0;
     1930
     1931    if (pSaoParam->bSaoFlag[iCompIdx])
     1932    {
     1933      if (rx>0 && iCUAddrInSlice!=0)
     1934      {
     1935        parseSaoMergeLeft(uiSymbol,iCompIdx); pSaoParam->saoLcuParam[iCompIdx][iAddr].mergeLeftFlag = (Int)uiSymbol;
     1936      }
     1937      else
     1938      {
     1939        pSaoParam->saoLcuParam[iCompIdx][iAddr].mergeLeftFlag = 0;
     1940      }
     1941
     1942      if (pSaoParam->saoLcuParam[iCompIdx][iAddr].mergeLeftFlag==0)
     1943      {
     1944        if ((ry > 0) && (iCUAddrUpInSlice>0||bLFCrossSliceBoundaryFlag))
     1945        {
     1946          parseSaoMergeUp(uiSymbol);  pSaoParam->saoLcuParam[iCompIdx][iAddr].mergeUpFlag = uiSymbol;
     1947        }
     1948        else
     1949        {
     1950          pSaoParam->saoLcuParam[iCompIdx][iAddr].mergeUpFlag = 0;
     1951        }
     1952        if (!pSaoParam->saoLcuParam[iCompIdx][iAddr].mergeUpFlag)
     1953        {
     1954          parseSaoOffset(&(pSaoParam->saoLcuParam[iCompIdx][iAddr]));
     1955        }
     1956        else
     1957        {
     1958          copySaoOneLcuParam(&pSaoParam->saoLcuParam[iCompIdx][iAddr], &pSaoParam->saoLcuParam[iCompIdx][iAddr-pSaoParam->numCuInWidth]);
     1959        }
     1960      }
     1961      else
     1962      {
     1963        copySaoOneLcuParam(&pSaoParam->saoLcuParam[iCompIdx][iAddr],  &pSaoParam->saoLcuParam[iCompIdx][iAddr-1]);
     1964      }
     1965    }
     1966    else
     1967    {
     1968      pSaoParam->saoLcuParam[iCompIdx][iAddr].typeIdx = -1;
     1969      pSaoParam->saoLcuParam[iCompIdx][iAddr].bandPosition = 0;
     1970    }
     1971  }
     1972}
     1973#endif
     1974
     1975/**
     1976 - Initialize our contexts from the nominated source.
     1977 .
     1978 \param pSrc Contexts to be copied.
     1979 */
     1980Void TDecSbac::xCopyContextsFrom( TDecSbac* pSrc )
     1981{
     1982  memcpy(m_contextModels, pSrc->m_contextModels, m_numContextModels*sizeof(m_contextModels[0]));
     1983}
     1984
     1985Void TDecSbac::xCopyFrom( TDecSbac* pSrc )
     1986{
     1987  m_pcTDecBinIf->copyState( pSrc->m_pcTDecBinIf );
     1988
     1989  m_uiLastQp           = pSrc->m_uiLastQp;
     1990  xCopyContextsFrom( pSrc );
     1991
     1992}
     1993
     1994Void TDecSbac::load ( TDecSbac* pScr )
     1995{
     1996  xCopyFrom(pScr);
     1997}
     1998
     1999Void TDecSbac::loadContexts ( TDecSbac* pScr )
     2000{
     2001  xCopyContextsFrom(pScr);
     2002}
     2003
     2004#if OL_FLUSH
     2005Void TDecSbac::decodeFlush ( )
     2006{
     2007  UInt uiBit;
     2008  m_pcTDecBinIf->decodeBinTrm(uiBit);
     2009  m_pcTDecBinIf->flush();
     2010
     2011}
     2012#endif
     2013
     2014#if HHI_DMM_WEDGE_INTRA || HHI_DMM_PRED_TEX
     2015Void TDecSbac::xReadExGolombLevel( UInt& ruiSymbol, ContextModel& rcSCModel  )
     2016{
     2017  UInt uiSymbol;
     2018  UInt uiCount = 0;
     2019  do
     2020  {
     2021    m_pcTDecBinIf->decodeBin( uiSymbol, rcSCModel );
     2022    uiCount++;
     2023  }
     2024  while( uiSymbol && ( uiCount != 13 ) );
     2025
     2026  ruiSymbol = uiCount - 1;
     2027
     2028  if( uiSymbol )
     2029  {
     2030    xReadEpExGolomb( uiSymbol, 0 );
     2031    ruiSymbol += uiSymbol + 1;
     2032  }
     2033
     2034  return;
     2035}
     2036#endif
     2037#if HHI_DMM_WEDGE_INTRA
     2038Void TDecSbac::xParseWedgeFullInfo( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth )
     2039{
     2040  Int iIntraIdx = pcCU->getIntraSizeIdx(uiAbsPartIdx);
     2041  Int iBits = g_aucWedgeFullBitsListIdx[iIntraIdx];
     2042
     2043  UInt uiSymbol, uiTabIdx = 0;
     2044  for ( Int i = 0; i < iBits; i++ )
     2045  {
     2046    m_pcTDecBinIf->decodeBin( uiSymbol, m_cDmmDataSCModel.get(0, 0, 0) );
     2047    uiTabIdx += ( uiSymbol && i == 0 ) ? 1 : 0;
     2048    uiTabIdx += ( uiSymbol && i == 1 ) ? 2 : 0;
     2049    uiTabIdx += ( uiSymbol && i == 2 ) ? 4 : 0;
     2050    uiTabIdx += ( uiSymbol && i == 3 ) ? 8 : 0;
     2051    uiTabIdx += ( uiSymbol && i == 4 ) ? 16 : 0;
     2052    uiTabIdx += ( uiSymbol && i == 5 ) ? 32 : 0;
     2053    uiTabIdx += ( uiSymbol && i == 6 ) ? 64 : 0;
     2054    uiTabIdx += ( uiSymbol && i == 7 ) ? 128 : 0;
     2055    uiTabIdx += ( uiSymbol && i == 8 ) ? 256 : 0;
     2056    uiTabIdx += ( uiSymbol && i == 9 ) ? 512 : 0;
     2057    uiTabIdx += ( uiSymbol && i == 10 ) ? 1024 : 0;
     2058    uiTabIdx += ( uiSymbol && i == 11 ) ? 2048 : 0;
     2059    uiTabIdx += ( uiSymbol && i == 12 ) ? 4096 : 0;
     2060  }
     2061
     2062  pcCU->setWedgeFullTabIdxSubParts( uiTabIdx, uiAbsPartIdx, uiDepth );
     2063}
     2064
     2065Void TDecSbac::xParseWedgeFullDeltaInfo( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth )
     2066{
     2067  Int iIntraIdx = pcCU->getIntraSizeIdx(uiAbsPartIdx);
     2068  Int iBits = g_aucWedgeFullBitsListIdx[iIntraIdx];
     2069
     2070  UInt uiSymbol, uiTabIdx = 0;
     2071  for ( Int i = 0; i < iBits; i++ )
     2072  {
     2073    m_pcTDecBinIf->decodeBin( uiSymbol, m_cDmmDataSCModel.get(0, 0, 0) );
     2074    uiTabIdx += ( uiSymbol && i == 0 ) ? 1 : 0;
     2075    uiTabIdx += ( uiSymbol && i == 1 ) ? 2 : 0;
     2076    uiTabIdx += ( uiSymbol && i == 2 ) ? 4 : 0;
     2077    uiTabIdx += ( uiSymbol && i == 3 ) ? 8 : 0;
     2078    uiTabIdx += ( uiSymbol && i == 4 ) ? 16 : 0;
     2079    uiTabIdx += ( uiSymbol && i == 5 ) ? 32 : 0;
     2080    uiTabIdx += ( uiSymbol && i == 6 ) ? 64 : 0;
     2081    uiTabIdx += ( uiSymbol && i == 7 ) ? 128 : 0;
     2082    uiTabIdx += ( uiSymbol && i == 8 ) ? 256 : 0;
     2083    uiTabIdx += ( uiSymbol && i == 9 ) ? 512 : 0;
     2084    uiTabIdx += ( uiSymbol && i == 10 ) ? 1024 : 0;
     2085    uiTabIdx += ( uiSymbol && i == 11 ) ? 2048 : 0;
     2086    uiTabIdx += ( uiSymbol && i == 12 ) ? 4096 : 0;
     2087  }
     2088
     2089  pcCU->setWedgeFullTabIdxSubParts( uiTabIdx, uiAbsPartIdx, uiDepth );
     2090
     2091  UInt uiDC1, uiDC2;
     2092  xReadExGolombLevel( uiDC1, m_cDmmDataSCModel.get(0, 0, 1) );
     2093  Int iDC1 = uiDC1;
     2094  if ( uiDC1 )
     2095  {
     2096    UInt uiSign;
     2097    m_pcTDecBinIf->decodeBinEP( uiSign );
     2098    if ( uiSign )
     2099    {
     2100      iDC1 = -iDC1;
     2101    }
     2102  }
     2103  xReadExGolombLevel( uiDC2, m_cDmmDataSCModel.get(0, 0, 1) );
     2104  Int iDC2 = uiDC2;
     2105  if ( uiDC2 )
     2106  {
     2107    UInt uiSign;
     2108    m_pcTDecBinIf->decodeBinEP( uiSign );
     2109    if ( uiSign )
     2110    {
     2111      iDC2 = -iDC2;
     2112    }
     2113  }
     2114
     2115  pcCU->setWedgeFullDeltaDC1SubParts( iDC1, uiAbsPartIdx, uiDepth );
     2116  pcCU->setWedgeFullDeltaDC2SubParts( iDC2, uiAbsPartIdx, uiDepth );
     2117}
     2118
     2119Void TDecSbac::xParseWedgePredDirInfo( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth )
     2120{
     2121  if( DMM_WEDGE_PREDDIR_DELTAEND_MAX > 0 )
     2122  {
     2123    UInt uiDeltaEnd = 0;
     2124    m_pcTDecBinIf->decodeBin( uiDeltaEnd, m_cDmmDataSCModel.get(0, 0, 2) );
     2125
     2126    Int iDeltaEnd;
     2127    if( uiDeltaEnd != 0 )
     2128    {
     2129      UInt uiAbsValMinus1;
     2130      UInt uiSymbol;
     2131      m_pcTDecBinIf->decodeBin( uiSymbol, m_cDmmDataSCModel.get(0, 0, 2) ); uiAbsValMinus1  = uiSymbol;
     2132      m_pcTDecBinIf->decodeBin( uiSymbol, m_cDmmDataSCModel.get(0, 0, 2) ); uiAbsValMinus1 |= uiSymbol << 1;
     2133      uiDeltaEnd = uiAbsValMinus1 + 1;
     2134
     2135      iDeltaEnd = uiDeltaEnd;
     2136      UInt uiSign;
     2137      m_pcTDecBinIf->decodeBinEP( uiSign );
     2138      if( uiSign )
     2139      {
     2140        iDeltaEnd = -iDeltaEnd;
     2141      }
     2142    }
     2143    else
     2144    {
     2145      iDeltaEnd = 0;
     2146    }
     2147    pcCU->setWedgePredDirDeltaEndSubParts( iDeltaEnd, uiAbsPartIdx, uiDepth );
     2148  }
     2149}
     2150
     2151Void TDecSbac::xParseWedgePredDirDeltaInfo( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth )
     2152{
     2153  if( DMM_WEDGE_PREDDIR_DELTAEND_MAX > 0 )
     2154  {
     2155    UInt uiDeltaEnd = 0;
     2156    m_pcTDecBinIf->decodeBin( uiDeltaEnd, m_cDmmDataSCModel.get(0, 0, 2) );
     2157
     2158    Int iDeltaEnd;
     2159    if( uiDeltaEnd != 0 )
     2160    {
     2161      UInt uiAbsValMinus1;
     2162      UInt uiSymbol;
     2163      m_pcTDecBinIf->decodeBin( uiSymbol, m_cDmmDataSCModel.get(0, 0, 2) ); uiAbsValMinus1  = uiSymbol;
     2164      m_pcTDecBinIf->decodeBin( uiSymbol, m_cDmmDataSCModel.get(0, 0, 2) ); uiAbsValMinus1 |= uiSymbol << 1;
     2165      uiDeltaEnd = uiAbsValMinus1 + 1;
     2166
     2167      iDeltaEnd = uiDeltaEnd;
     2168      UInt uiSign;
     2169      m_pcTDecBinIf->decodeBinEP( uiSign );
     2170      if( uiSign )
     2171      {
     2172        iDeltaEnd = -iDeltaEnd;
     2173      }
     2174    }
     2175    else
     2176    {
     2177      iDeltaEnd = 0;
     2178    }
     2179
     2180    pcCU->setWedgePredDirDeltaEndSubParts( iDeltaEnd, uiAbsPartIdx, uiDepth );
     2181  }
     2182
     2183  UInt uiDC1, uiDC2;
     2184  xReadExGolombLevel( uiDC1, m_cDmmDataSCModel.get(0, 0, 1) );
     2185  Int iDC1 = uiDC1;
     2186  if ( uiDC1 )
     2187  {
     2188    UInt uiSign;
     2189    m_pcTDecBinIf->decodeBinEP( uiSign );
     2190    if ( uiSign )
     2191    {
     2192      iDC1 = -iDC1;
     2193    }
     2194  }
     2195  xReadExGolombLevel( uiDC2, m_cDmmDataSCModel.get(0, 0, 1) );
     2196  Int iDC2 = uiDC2;
     2197  if ( uiDC2 )
     2198  {
     2199    UInt uiSign;
     2200    m_pcTDecBinIf->decodeBinEP( uiSign );
     2201    if ( uiSign )
     2202    {
     2203      iDC2 = -iDC2;
     2204    }
     2205  }
     2206
     2207  pcCU->setWedgePredDirDeltaDC1SubParts( iDC1, uiAbsPartIdx, uiDepth );
     2208  pcCU->setWedgePredDirDeltaDC2SubParts( iDC2, uiAbsPartIdx, uiDepth );
     2209}
     2210#endif
     2211#if HHI_DMM_PRED_TEX
     2212Void TDecSbac::xParseWedgePredTexDeltaInfo( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth )
     2213{
     2214  UInt uiDC1, uiDC2;
     2215  xReadExGolombLevel( uiDC1, m_cDmmDataSCModel.get(0, 0, 1) );
     2216  Int iDC1 = uiDC1;
     2217  if ( uiDC1 )
     2218  {
     2219    UInt uiSign;
     2220    m_pcTDecBinIf->decodeBinEP( uiSign );
     2221    if ( uiSign )
     2222    {
     2223      iDC1 = -iDC1;
     2224    }
     2225  }
     2226  xReadExGolombLevel( uiDC2, m_cDmmDataSCModel.get(0, 0, 1) );
     2227  Int iDC2 = uiDC2;
     2228  if ( uiDC2 )
     2229  {
     2230    UInt uiSign;
     2231    m_pcTDecBinIf->decodeBinEP( uiSign );
     2232    if ( uiSign )
     2233    {
     2234      iDC2 = -iDC2;
     2235    }
     2236  }
     2237
     2238  pcCU->setWedgePredTexDeltaDC1SubParts( iDC1, uiAbsPartIdx, uiDepth );
     2239  pcCU->setWedgePredTexDeltaDC2SubParts( iDC2, uiAbsPartIdx, uiDepth );
     2240}
     2241
     2242Void TDecSbac::xParseContourPredTexDeltaInfo( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth )
     2243{
     2244  UInt uiDC1, uiDC2;
     2245  xReadExGolombLevel( uiDC1, m_cDmmDataSCModel.get(0, 0, 1) );
     2246  Int iDC1 = uiDC1;
     2247  if ( uiDC1 )
     2248  {
     2249    UInt uiSign;
     2250    m_pcTDecBinIf->decodeBinEP( uiSign );
     2251    if ( uiSign )
     2252    {
     2253      iDC1 = -iDC1;
     2254    }
     2255  }
     2256  xReadExGolombLevel( uiDC2, m_cDmmDataSCModel.get(0, 0, 1) );
     2257  Int iDC2 = uiDC2;
     2258  if ( uiDC2 )
     2259  {
     2260    UInt uiSign;
     2261    m_pcTDecBinIf->decodeBinEP( uiSign );
     2262    if ( uiSign )
     2263    {
     2264      iDC2 = -iDC2;
     2265    }
     2266  }
     2267
     2268  pcCU->setContourPredTexDeltaDC1SubParts( iDC1, uiAbsPartIdx, uiDepth );
     2269  pcCU->setContourPredTexDeltaDC2SubParts( iDC2, uiAbsPartIdx, uiDepth );
     2270}
     2271#endif
     2272//! \}
Note: See TracChangeset for help on using the changeset viewer.