Changeset 608 in 3DVCSoftware for trunk/source/Lib/TLibEncoder/TEncSbac.cpp


Ignore:
Timestamp:
1 Sep 2013, 22:47:26 (11 years ago)
Author:
tech
Message:

Merged DEV-2.0-dev0@604.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/source/Lib/TLibEncoder/TEncSbac.cpp

    r443 r608  
    44 * granted under this license. 
    55 *
    6  * Copyright (c) 2010-2012, ITU/ISO/IEC
     6 * Copyright (c) 2010-2013, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
     
    5454, m_pcSlice                   ( NULL )
    5555, m_pcBinIf                   ( NULL )
    56 , m_bAlfCtrl                  ( false )
    5756, m_uiCoeffCost               ( 0 )
    58 , m_uiMaxAlfCtrlDepth         ( 0 )
    5957, m_numContextModels          ( 0 )
    6058, m_cCUSplitFlagSCModel       ( 1,             1,               NUM_SPLIT_FLAG_CTX            , m_contextModels + m_numContextModels, m_numContextModels )
    6159, m_cCUSkipFlagSCModel        ( 1,             1,               NUM_SKIP_FLAG_CTX             , m_contextModels + m_numContextModels, m_numContextModels)
    62 #if LGE_ILLUCOMP_B0045
    63 , m_cCUICFlagSCModel          ( 1,             1,               NUM_IC_FLAG_CTX               , m_contextModels + m_numContextModels, m_numContextModels)
    64 #endif
    6560, m_cCUMergeFlagExtSCModel    ( 1,             1,               NUM_MERGE_FLAG_EXT_CTX        , m_contextModels + m_numContextModels, m_numContextModels)
    6661, m_cCUMergeIdxExtSCModel     ( 1,             1,               NUM_MERGE_IDX_EXT_CTX         , m_contextModels + m_numContextModels, m_numContextModels)
    67 #if H3D_IVRP
    68 , m_cResPredFlagSCModel       ( 1,             1,               NUM_RES_PRED_FLAG_CTX         , m_contextModels + m_numContextModels, m_numContextModels)
    69 #endif
    70 #if QC_ARP_D0177
    71 , m_cCUPUARPW                 ( 1,             1,               NUM_ARPW_CTX                 , m_contextModels + m_numContextModels, m_numContextModels)
     62#if H_3D_ARP
     63, m_cCUPUARPWSCModel          ( 1,             1,               NUM_ARPW_CTX                  , m_contextModels + m_numContextModels, m_numContextModels)
     64#endif
     65#if H_3D_IC
     66, m_cCUICFlagSCModel          ( 1,             1,               NUM_IC_FLAG_CTX               , m_contextModels + m_numContextModels, m_numContextModels)
    7267#endif
    7368, m_cCUPartSizeSCModel        ( 1,             1,               NUM_PART_SIZE_CTX             , m_contextModels + m_numContextModels, m_numContextModels)
    7469, m_cCUPredModeSCModel        ( 1,             1,               NUM_PRED_MODE_CTX             , m_contextModels + m_numContextModels, m_numContextModels)
    75 , m_cCUAlfCtrlFlagSCModel     ( 1,             1,               NUM_ALF_CTRL_FLAG_CTX         , m_contextModels + m_numContextModels, m_numContextModels)
    7670, m_cCUIntraPredSCModel       ( 1,             1,               NUM_ADI_CTX                   , m_contextModels + m_numContextModels, m_numContextModels)
    7771, m_cCUChromaPredSCModel      ( 1,             1,               NUM_CHROMA_PRED_CTX           , m_contextModels + m_numContextModels, m_numContextModels)
     
    9084, m_cCUAbsSCModel             ( 1,             1,               NUM_ABS_FLAG_CTX              , m_contextModels + m_numContextModels, m_numContextModels)
    9185, m_cMVPIdxSCModel            ( 1,             1,               NUM_MVP_IDX_CTX               , m_contextModels + m_numContextModels, m_numContextModels)
    92 , m_cALFFlagSCModel           ( 1,             1,               NUM_ALF_FLAG_CTX              , m_contextModels + m_numContextModels, m_numContextModels)
    93 , m_cALFUvlcSCModel           ( 1,             1,               NUM_ALF_UVLC_CTX              , m_contextModels + m_numContextModels, m_numContextModels)
    94 , m_cALFSvlcSCModel           ( 1,             1,               NUM_ALF_SVLC_CTX              , m_contextModels + m_numContextModels, m_numContextModels)
    9586, m_cCUAMPSCModel             ( 1,             1,               NUM_CU_AMP_CTX                , m_contextModels + m_numContextModels, m_numContextModels)
    96 #if LGE_SAO_MIGRATION_D0091
    97 , m_cSaoMergeSCModel          ( 1,             1,               NUM_SAO_MERGE_FLAG_CTX        , m_contextModels + m_numContextModels, m_numContextModels)
     87, m_cSaoMergeSCModel          ( 1,             1,               NUM_SAO_MERGE_FLAG_CTX   , m_contextModels + m_numContextModels, m_numContextModels)
    9888, m_cSaoTypeIdxSCModel        ( 1,             1,               NUM_SAO_TYPE_IDX_CTX          , m_contextModels + m_numContextModels, m_numContextModels)
    99 #else
    100 , m_cSaoFlagSCModel           ( 1,             1,               NUM_SAO_FLAG_CTX              , m_contextModels + m_numContextModels, m_numContextModels)
    101 , m_cSaoUvlcSCModel           ( 1,             1,               NUM_SAO_UVLC_CTX              , m_contextModels + m_numContextModels, m_numContextModels)
    102 , m_cSaoSvlcSCModel           ( 1,             1,               NUM_SAO_SVLC_CTX              , m_contextModels + m_numContextModels, m_numContextModels)
    103 , m_cSaoMergeLeftSCModel      ( 1,             1,               NUM_SAO_MERGE_LEFT_FLAG_CTX   , m_contextModels + m_numContextModels, m_numContextModels)
    104 , m_cSaoMergeUpSCModel        ( 1,             1,               NUM_SAO_MERGE_UP_FLAG_CTX     , m_contextModels + m_numContextModels, m_numContextModels)
    105 , m_cSaoTypeIdxSCModel        ( 1,             1,               NUM_SAO_TYPE_IDX_CTX          , m_contextModels + m_numContextModels, m_numContextModels)
    106 #endif
    107 #if HHI_DMM_WEDGE_INTRA || HHI_DMM_PRED_TEX
    108 #if !PKU_QC_DEPTH_INTRA_UNI_D0195
    109 , m_cDmmFlagSCModel           ( 1,             1,               NUM_DMM_FLAG_CTX              , m_contextModels + m_numContextModels, m_numContextModels)
    110 , m_cDmmModeSCModel           ( 1,             1,               NUM_DMM_MODE_CTX              , m_contextModels + m_numContextModels, m_numContextModels)
    111 #endif
    112 , m_cDmmDataSCModel           ( 1,             1,               NUM_DMM_DATA_CTX              , m_contextModels + m_numContextModels, m_numContextModels)
    113 #endif
    114 #if LGE_EDGE_INTRA_A0070
    115 , m_cEdgeIntraSCModel         ( 1,             1,               NUM_EDGE_INTRA_CTX            , m_contextModels + m_numContextModels, m_numContextModels)
    116 #if LGE_EDGE_INTRA_DELTA_DC
    117 , m_cEdgeIntraDeltaDCSCModel  ( 1,             1,               NUM_EDGE_INTRA_DELTA_DC_CTX   , m_contextModels + m_numContextModels, m_numContextModels)
    118 #endif
    119 #endif
    120 #if RWTH_SDC_DLT_B0036
    121 #if !PKU_QC_DEPTH_INTRA_UNI_D0195
    122 , m_cSDCFlagSCModel             ( 1,             1,                 SDC_NUM_FLAG_CTX           , m_contextModels + m_numContextModels, m_numContextModels)
    123 #else
    124 , m_cDepthModeModel             ( 1,             1,                 DEPTH_MODE_NUM_FLAG_CTX           , m_contextModels + m_numContextModels, m_numContextModels)
    125 , m_cDmmDeltaFlagModel             ( 1,             1,                 DMM_DELTA_NUM_FLAG_CTX           , m_contextModels + m_numContextModels, m_numContextModels)
    126 #endif
    127 #if RWTH_SDC_CTX_SIMPL_D0032
    128 , m_cSDCResidualFlagSCModel     ( 1,             1,  SDC_NUM_RESIDUAL_FLAG_CTX  , m_contextModels + m_numContextModels, m_numContextModels)
    129 , m_cSDCResidualSCModel         ( 1,             1,  SDC_NUM_RESIDUAL_CTX       , m_contextModels + m_numContextModels, m_numContextModels)
    130 , m_cSDCPredModeSCModel             ( 1,             3,                 SDC_NUM_PRED_MODE_CTX     , m_contextModels + m_numContextModels, m_numContextModels)
    131 #else
    132 , m_cSDCResidualFlagSCModel     ( 1,             2,  SDC_NUM_RESIDUAL_FLAG_CTX  , m_contextModels + m_numContextModels, m_numContextModels)
    133 , m_cSDCResidualSignFlagSCModel ( 1,             2,  SDC_NUM_SIGN_FLAG_CTX      , m_contextModels + m_numContextModels, m_numContextModels)
    134 , m_cSDCResidualSCModel         ( 1,             2,  SDC_NUM_RESIDUAL_CTX       , m_contextModels + m_numContextModels, m_numContextModels)
    135 , m_cSDCPredModeSCModel             ( 1,             3,                 SDC_NUM_PRED_MODE_CTX     , m_contextModels + m_numContextModels, m_numContextModels)
    136 #endif
     89, m_cTransformSkipSCModel     ( 1,             2,               NUM_TRANSFORMSKIP_FLAG_CTX    , m_contextModels + m_numContextModels, m_numContextModels)
     90, m_CUTransquantBypassFlagSCModel( 1,          1,               NUM_CU_TRANSQUANT_BYPASS_FLAG_CTX, m_contextModels + m_numContextModels, m_numContextModels)
     91#if H_3D_DIM
     92, m_cDepthIntraModeSCModel    ( 1,             1,               NUM_DEPTH_INTRA_MODE_CTX      , m_contextModels + m_numContextModels, m_numContextModels)
     93, m_cDdcFlagSCModel           ( 1,             1,               NUM_DDC_FLAG_CTX              , m_contextModels + m_numContextModels, m_numContextModels)
     94, m_cDdcDataSCModel           ( 1,             1,               NUM_DDC_DATA_CTX              , m_contextModels + m_numContextModels, m_numContextModels)
     95#if H_3D_DIM_DMM
     96, m_cDmm1DataSCModel          ( 1,             1,               NUM_DMM1_DATA_CTX             , m_contextModels + m_numContextModels, m_numContextModels)
     97#if !SEC_DMM2_E0146
     98, m_cDmm2DataSCModel          ( 1,             1,               NUM_DMM2_DATA_CTX             , m_contextModels + m_numContextModels, m_numContextModels)
     99#endif
     100, m_cDmm3DataSCModel          ( 1,             1,               NUM_DMM3_DATA_CTX             , m_contextModels + m_numContextModels, m_numContextModels)
     101#endif
     102#if H_3D_DIM_RBC
     103, m_cRbcDataSCModel           ( 1,             1,               NUM_RBC_DATA_CTX              , m_contextModels + m_numContextModels, m_numContextModels)
     104#endif
     105#if H_3D_DIM_SDC
     106, m_cSDCResidualFlagSCModel   ( 1,             1,               SDC_NUM_RESIDUAL_FLAG_CTX     , m_contextModels + m_numContextModels, m_numContextModels)
     107, m_cSDCResidualSCModel       ( 1,             1,               SDC_NUM_RESIDUAL_CTX          , m_contextModels + m_numContextModels, m_numContextModels)
     108#endif
     109#endif
     110#if LGE_INTER_SDC_E0156
     111, m_cInterSDCFlagSCModel             ( 1,             1,  NUM_INTER_SDC_FLAG_CTX           , m_contextModels + m_numContextModels, m_numContextModels)
     112, m_cInterSDCResidualSCModel         ( 1,             1,  NUM_INTER_SDC_RESIDUAL_CTX       , m_contextModels + m_numContextModels, m_numContextModels)
     113, m_cInterSDCResidualSignFlagSCModel ( 1,             1,  NUM_INTER_SDC_SIGN_FLAG_CTX      , m_contextModels + m_numContextModels, m_numContextModels)
    137114#endif
    138115{
    139116  assert( m_numContextModels <= MAX_NUM_CTX_MOD );
    140   m_iSliceGranularity = 0;
    141117}
    142118
     
    154130  SliceType eSliceType  = m_pcSlice->getSliceType();
    155131 
    156 #if CABAC_INIT_FLAG
    157132  Int  encCABACTableIdx = m_pcSlice->getPPS()->getEncCABACTableIdx();
    158133  if (!m_pcSlice->isIntra() && (encCABACTableIdx==B_SLICE || encCABACTableIdx==P_SLICE) && m_pcSlice->getPPS()->getCabacInitPresentFlag())
     
    160135    eSliceType = (SliceType) encCABACTableIdx;
    161136  }
    162 #endif
    163137
    164138  m_cCUSplitFlagSCModel.initBuffer       ( eSliceType, iQp, (UChar*)INIT_SPLIT_FLAG );
    165139 
    166140  m_cCUSkipFlagSCModel.initBuffer        ( eSliceType, iQp, (UChar*)INIT_SKIP_FLAG );
    167 #if LGE_ILLUCOMP_B0045
    168   m_cCUICFlagSCModel.initBuffer          ( eSliceType, iQp, (UChar*)INIT_IC_FLAG );
    169 #endif
    170   m_cCUAlfCtrlFlagSCModel.initBuffer     ( eSliceType, iQp, (UChar*)INIT_ALF_CTRL_FLAG );
    171141  m_cCUMergeFlagExtSCModel.initBuffer    ( eSliceType, iQp, (UChar*)INIT_MERGE_FLAG_EXT);
    172142  m_cCUMergeIdxExtSCModel.initBuffer     ( eSliceType, iQp, (UChar*)INIT_MERGE_IDX_EXT);
    173 #if H3D_IVRP
    174   m_cResPredFlagSCModel.initBuffer       ( eSliceType, iQp, (UChar*)INIT_RES_PRED_FLAG );
    175 #endif
    176 #if QC_ARP_D0177
    177   m_cCUPUARPW.initBuffer                 ( eSliceType, iQp, (UChar*)INIT_ARPW );
     143#if H_3D_ARP
     144  m_cCUPUARPWSCModel.initBuffer          ( eSliceType, iQp, (UChar*)INIT_ARPW );
     145#endif
     146#if H_3D_IC
     147  m_cCUICFlagSCModel.initBuffer          ( eSliceType, iQp, (UChar*)INIT_IC_FLAG );
    178148#endif
    179149  m_cCUPartSizeSCModel.initBuffer        ( eSliceType, iQp, (UChar*)INIT_PART_SIZE );
     
    195165  m_cCUAbsSCModel.initBuffer             ( eSliceType, iQp, (UChar*)INIT_ABS_FLAG );
    196166  m_cMVPIdxSCModel.initBuffer            ( eSliceType, iQp, (UChar*)INIT_MVP_IDX );
    197   m_cALFFlagSCModel.initBuffer           ( eSliceType, iQp, (UChar*)INIT_ALF_FLAG );
    198   m_cALFUvlcSCModel.initBuffer           ( eSliceType, iQp, (UChar*)INIT_ALF_UVLC );
    199   m_cALFSvlcSCModel.initBuffer           ( eSliceType, iQp, (UChar*)INIT_ALF_SVLC );
    200167  m_cCUTransSubdivFlagSCModel.initBuffer ( eSliceType, iQp, (UChar*)INIT_TRANS_SUBDIV_FLAG );
    201 #if LGE_SAO_MIGRATION_D0091
    202   m_cSaoMergeSCModel.initBuffer          ( eSliceType, iQp, (UChar*)INIT_SAO_MERGE_FLAG );
     168  m_cSaoMergeSCModel.initBuffer      ( eSliceType, iQp, (UChar*)INIT_SAO_MERGE_FLAG );
    203169  m_cSaoTypeIdxSCModel.initBuffer        ( eSliceType, iQp, (UChar*)INIT_SAO_TYPE_IDX );
    204 #else
    205   m_cSaoFlagSCModel.initBuffer           ( eSliceType, iQp, (UChar*)INIT_SAO_FLAG );
    206   m_cSaoUvlcSCModel.initBuffer           ( eSliceType, iQp, (UChar*)INIT_SAO_UVLC );
    207   m_cSaoSvlcSCModel.initBuffer           ( eSliceType, iQp, (UChar*)INIT_SAO_SVLC );
    208   m_cSaoMergeLeftSCModel.initBuffer      ( eSliceType, iQp, (UChar*)INIT_SAO_MERGE_LEFT_FLAG );
    209   m_cSaoMergeUpSCModel.initBuffer        ( eSliceType, iQp, (UChar*)INIT_SAO_MERGE_UP_FLAG );
    210   m_cSaoTypeIdxSCModel.initBuffer        ( eSliceType, iQp, (UChar*)INIT_SAO_TYPE_IDX );
    211 #endif
    212 #if HHI_DMM_WEDGE_INTRA || HHI_DMM_PRED_TEX
    213 #if !PKU_QC_DEPTH_INTRA_UNI_D0195
    214   m_cDmmFlagSCModel.initBuffer           ( eSliceType, iQp, (UChar*)INIT_DMM_FLAG );
    215   m_cDmmModeSCModel.initBuffer           ( eSliceType, iQp, (UChar*)INIT_DMM_MODE );
    216 #endif
    217   m_cDmmDataSCModel.initBuffer           ( eSliceType, iQp, (UChar*)INIT_DMM_DATA );
    218 #endif
    219 #if LGE_EDGE_INTRA_A0070
    220   m_cEdgeIntraSCModel.initBuffer         ( eSliceType, iQp, (UChar*)INIT_EDGE_INTRA );
    221 #if LGE_EDGE_INTRA_DELTA_DC
    222   m_cEdgeIntraDeltaDCSCModel.initBuffer  ( eSliceType, iQp, (UChar*)INIT_EDGE_INTRA_DELTA_DC );
    223 #endif
    224 #endif
    225 #if RWTH_SDC_DLT_B0036
    226 #if !PKU_QC_DEPTH_INTRA_UNI_D0195
    227   m_cSDCFlagSCModel.initBuffer              ( eSliceType, iQp, (UChar*)INIT_SDC_FLAG );
    228 #else
    229   m_cDepthModeModel.initBuffer              ( eSliceType, iQp, (UChar*)INIT_DEPTHMODE_FLAG );
    230   m_cDmmDeltaFlagModel.initBuffer           ( eSliceType, iQp, (UChar*)INIT_DMMDELTA_FLAG );
    231 #endif
    232   m_cSDCResidualFlagSCModel.initBuffer      ( eSliceType, iQp, (UChar*)INIT_SDC_RESIDUAL_FLAG );
    233   m_cSDCResidualSCModel.initBuffer          ( eSliceType, iQp, (UChar*)INIT_SDC_RESIDUAL );
    234 #if !RWTH_SDC_CTX_SIMPL_D0032
    235   m_cSDCResidualSignFlagSCModel.initBuffer  ( eSliceType, iQp, (UChar*)INIT_SDC_SIGN_FLAG );
    236 #endif
    237   m_cSDCPredModeSCModel.initBuffer              ( eSliceType, iQp, (UChar*)INIT_SDC_PRED_MODE );
    238 #endif
    239 
     170  m_cTransformSkipSCModel.initBuffer     ( eSliceType, iQp, (UChar*)INIT_TRANSFORMSKIP_FLAG );
     171  m_CUTransquantBypassFlagSCModel.initBuffer( eSliceType, iQp, (UChar*)INIT_CU_TRANSQUANT_BYPASS_FLAG );
     172
     173#if H_3D_DIM
     174  m_cDepthIntraModeSCModel.initBuffer    ( eSliceType, iQp, (UChar*)INIT_DEPTH_INTRA_MODE );
     175  m_cDdcFlagSCModel.initBuffer           ( eSliceType, iQp, (UChar*)INIT_DDC_FLAG );
     176  m_cDdcDataSCModel.initBuffer           ( eSliceType, iQp, (UChar*)INIT_DDC_DATA );
     177#if H_3D_DIM_DMM
     178  m_cDmm1DataSCModel.initBuffer          ( eSliceType, iQp, (UChar*)INIT_DMM1_DATA );
     179#if !SEC_DMM2_E0146
     180  m_cDmm2DataSCModel.initBuffer          ( eSliceType, iQp, (UChar*)INIT_DMM2_DATA );
     181#endif
     182  m_cDmm3DataSCModel.initBuffer          ( eSliceType, iQp, (UChar*)INIT_DMM3_DATA );
     183#endif
     184#if H_3D_DIM_RBC
     185  m_cRbcDataSCModel.initBuffer           ( eSliceType, iQp, (UChar*)INIT_RBC_DATA );
     186#endif
     187#if H_3D_DIM_SDC
     188  m_cSDCResidualFlagSCModel.initBuffer   ( eSliceType, iQp, (UChar*)INIT_SDC_RESIDUAL_FLAG );
     189  m_cSDCResidualSCModel.initBuffer       ( eSliceType, iQp, (UChar*)INIT_SDC_RESIDUAL );
     190#endif
     191#endif
     192#if LGE_INTER_SDC_E0156
     193  m_cInterSDCFlagSCModel.initBuffer         ( eSliceType, iQp, (UChar*)INIT_INTER_SDC_FLAG );
     194  m_cInterSDCResidualSCModel.initBuffer     ( eSliceType, iQp, (UChar*)INIT_INTER_SDC_RESIDUAL );
     195  m_cInterSDCResidualSignFlagSCModel.initBuffer ( eSliceType, iQp, (UChar*)INIT_INTER_SDC_SIGN_FLAG );
     196#endif
    240197  // new structure
    241198  m_uiLastQp = iQp;
     
    246203}
    247204
    248 #if CABAC_INIT_FLAG
    249205/** The function does the following:
    250206 * If current slice type is P/B then it determines the distance of initialisation type 1 and 2 from the current CABAC states and
     
    268224      curCost  = m_cCUSplitFlagSCModel.calcCost       ( curSliceType, qp, (UChar*)INIT_SPLIT_FLAG );
    269225      curCost += m_cCUSkipFlagSCModel.calcCost        ( curSliceType, qp, (UChar*)INIT_SKIP_FLAG );
    270 #if LGE_ILLUCOMP_B0045
    271       curCost += m_cCUICFlagSCModel.calcCost          ( curSliceType, qp, (UChar*)INIT_IC_FLAG );
    272 #endif
    273       curCost += m_cCUAlfCtrlFlagSCModel.calcCost     ( curSliceType, qp, (UChar*)INIT_ALF_CTRL_FLAG );
    274226      curCost += m_cCUMergeFlagExtSCModel.calcCost    ( curSliceType, qp, (UChar*)INIT_MERGE_FLAG_EXT);
    275227      curCost += m_cCUMergeIdxExtSCModel.calcCost     ( curSliceType, qp, (UChar*)INIT_MERGE_IDX_EXT);
    276 #if H3D_IVRP
    277       curCost += m_cResPredFlagSCModel.calcCost       ( curSliceType, qp, (UChar*)INIT_RES_PRED_FLAG);
     228#if H_3D_ARP
     229      curCost += m_cCUPUARPWSCModel.calcCost          ( curSliceType, qp, (UChar*)INIT_ARPW );
     230#endif
     231#if H_3D_IC
     232      curCost += m_cCUICFlagSCModel.calcCost          ( curSliceType, qp, (UChar*)INIT_IC_FLAG );
     233#endif
     234#if LGE_INTER_SDC_E0156
     235      curCost += m_cInterSDCFlagSCModel.calcCost      ( curSliceType, qp, (UChar*)INIT_INTER_SDC_FLAG );
     236      curCost += m_cInterSDCResidualSCModel.calcCost  ( curSliceType, qp, (UChar*)INIT_INTER_SDC_RESIDUAL );
     237      curCost += m_cInterSDCResidualSignFlagSCModel.calcCost( curSliceType, qp, (UChar*)INIT_INTER_SDC_SIGN_FLAG );
    278238#endif
    279239      curCost += m_cCUPartSizeSCModel.calcCost        ( curSliceType, qp, (UChar*)INIT_PART_SIZE );
     
    295255      curCost += m_cCUAbsSCModel.calcCost             ( curSliceType, qp, (UChar*)INIT_ABS_FLAG );
    296256      curCost += m_cMVPIdxSCModel.calcCost            ( curSliceType, qp, (UChar*)INIT_MVP_IDX );
    297       curCost += m_cALFFlagSCModel.calcCost           ( curSliceType, qp, (UChar*)INIT_ALF_FLAG );
    298       curCost += m_cALFUvlcSCModel.calcCost           ( curSliceType, qp, (UChar*)INIT_ALF_UVLC );
    299       curCost += m_cALFSvlcSCModel.calcCost           ( curSliceType, qp, (UChar*)INIT_ALF_SVLC );
    300257      curCost += m_cCUTransSubdivFlagSCModel.calcCost ( curSliceType, qp, (UChar*)INIT_TRANS_SUBDIV_FLAG );
    301 #if LGE_SAO_MIGRATION_D0091
    302       curCost += m_cSaoMergeSCModel.calcCost          ( curSliceType, qp, (UChar*)INIT_SAO_MERGE_FLAG );
     258      curCost += m_cSaoMergeSCModel.calcCost      ( curSliceType, qp, (UChar*)INIT_SAO_MERGE_FLAG );
    303259      curCost += m_cSaoTypeIdxSCModel.calcCost        ( curSliceType, qp, (UChar*)INIT_SAO_TYPE_IDX );
    304 #else
    305       curCost += m_cSaoFlagSCModel.calcCost           ( curSliceType, qp, (UChar*)INIT_SAO_FLAG );
    306       curCost += m_cSaoUvlcSCModel.calcCost           ( curSliceType, qp, (UChar*)INIT_SAO_UVLC );
    307       curCost += m_cSaoSvlcSCModel.calcCost           ( curSliceType, qp, (UChar*)INIT_SAO_SVLC );
    308       curCost += m_cSaoMergeLeftSCModel.calcCost      ( curSliceType, qp, (UChar*)INIT_SAO_MERGE_LEFT_FLAG );
    309       curCost += m_cSaoMergeUpSCModel.calcCost        ( curSliceType, qp, (UChar*)INIT_SAO_MERGE_UP_FLAG );
    310       curCost += m_cSaoTypeIdxSCModel.calcCost        ( curSliceType, qp, (UChar*)INIT_SAO_TYPE_IDX );
    311 #endif
    312 
     260      curCost += m_cTransformSkipSCModel.calcCost     ( curSliceType, qp, (UChar*)INIT_TRANSFORMSKIP_FLAG );
     261      curCost += m_CUTransquantBypassFlagSCModel.calcCost( curSliceType, qp, (UChar*)INIT_CU_TRANSQUANT_BYPASS_FLAG );
     262#if H_3D_DIM
     263    if( m_pcSlice->getVpsDepthModesFlag() )
     264    {
     265      curCost += m_cDepthIntraModeSCModel.calcCost    ( curSliceType, qp, (UChar*)INIT_DEPTH_INTRA_MODE );
     266      curCost += m_cDdcFlagSCModel.calcCost           ( curSliceType, qp, (UChar*)INIT_DDC_FLAG );
     267      curCost += m_cDdcDataSCModel.calcCost           ( curSliceType, qp, (UChar*)INIT_DDC_DATA );
     268#if H_3D_DIM_DMM
     269      curCost += m_cDmm1DataSCModel.calcCost          ( curSliceType, qp, (UChar*)INIT_DMM1_DATA );
     270#if !SEC_DMM2_E0146
     271      curCost += m_cDmm2DataSCModel.calcCost          ( curSliceType, qp, (UChar*)INIT_DMM2_DATA );
     272#endif
     273      curCost += m_cDmm3DataSCModel.calcCost          ( curSliceType, qp, (UChar*)INIT_DMM3_DATA );
     274#endif
     275#if H_3D_DIM_RBC
     276      curCost += m_cRbcDataSCModel.calcCost           ( curSliceType, qp, (UChar*)INIT_RBC_DATA );
     277#endif
     278    }
     279#endif
    313280      if (curCost < bestCost)
    314281      {
     
    323290    m_pcSlice->getPPS()->setEncCABACTableIdx( I_SLICE );
    324291  } 
    325 
    326   #if CABAC_INIT_FLAG && FIX_POZNAN_CABAC_INIT_FLAG
    327     m_pcSlice->getPPS()->setEncPrevPOC( m_pcSlice->getPOC() );
    328   #endif
    329 }
    330 #endif
     292}
    331293
    332294
     
    340302 
    341303  m_cCUSkipFlagSCModel.initBuffer        ( eSliceType, iQp, (UChar*)INIT_SKIP_FLAG );
    342 #if LGE_ILLUCOMP_B0045
    343   m_cCUICFlagSCModel.initBuffer          ( eSliceType, iQp, (UChar*)INIT_IC_FLAG );
    344 #endif
    345   m_cCUAlfCtrlFlagSCModel.initBuffer     ( eSliceType, iQp, (UChar*)INIT_ALF_CTRL_FLAG );
    346304  m_cCUMergeFlagExtSCModel.initBuffer    ( eSliceType, iQp, (UChar*)INIT_MERGE_FLAG_EXT);
    347305  m_cCUMergeIdxExtSCModel.initBuffer     ( eSliceType, iQp, (UChar*)INIT_MERGE_IDX_EXT);
    348 #if H3D_IVRP
    349   m_cResPredFlagSCModel.initBuffer       ( eSliceType, iQp, (UChar*)INIT_RES_PRED_FLAG );
    350 #endif
    351 #if QC_ARP_D0177
    352   m_cCUPUARPW.initBuffer                 ( eSliceType, iQp, (UChar*)INIT_ARPW );
     306#if H_3D_ARP
     307  m_cCUPUARPWSCModel.initBuffer          ( eSliceType, iQp, (UChar*)INIT_ARPW );
     308#endif
     309#if H_3D_IC
     310  m_cCUICFlagSCModel.initBuffer          ( eSliceType, iQp, (UChar*)INIT_IC_FLAG );
    353311#endif
    354312  m_cCUPartSizeSCModel.initBuffer        ( eSliceType, iQp, (UChar*)INIT_PART_SIZE );
     
    370328  m_cCUAbsSCModel.initBuffer             ( eSliceType, iQp, (UChar*)INIT_ABS_FLAG );
    371329  m_cMVPIdxSCModel.initBuffer            ( eSliceType, iQp, (UChar*)INIT_MVP_IDX );
    372   m_cALFFlagSCModel.initBuffer           ( eSliceType, iQp, (UChar*)INIT_ALF_FLAG );
    373   m_cALFUvlcSCModel.initBuffer           ( eSliceType, iQp, (UChar*)INIT_ALF_UVLC );
    374   m_cALFSvlcSCModel.initBuffer           ( eSliceType, iQp, (UChar*)INIT_ALF_SVLC );
    375330  m_cCUTransSubdivFlagSCModel.initBuffer ( eSliceType, iQp, (UChar*)INIT_TRANS_SUBDIV_FLAG );
    376 #if LGE_SAO_MIGRATION_D0091
    377   m_cSaoMergeSCModel.initBuffer          ( eSliceType, iQp, (UChar*)INIT_SAO_MERGE_FLAG );
     331  m_cSaoMergeSCModel.initBuffer      ( eSliceType, iQp, (UChar*)INIT_SAO_MERGE_FLAG );
    378332  m_cSaoTypeIdxSCModel.initBuffer        ( eSliceType, iQp, (UChar*)INIT_SAO_TYPE_IDX );
    379 #else
    380   m_cSaoFlagSCModel.initBuffer           ( eSliceType, iQp, (UChar*)INIT_SAO_FLAG );
    381   m_cSaoUvlcSCModel.initBuffer           ( eSliceType, iQp, (UChar*)INIT_SAO_UVLC );
    382   m_cSaoSvlcSCModel.initBuffer           ( eSliceType, iQp, (UChar*)INIT_SAO_SVLC );
    383   m_cSaoMergeLeftSCModel.initBuffer      ( eSliceType, iQp, (UChar*)INIT_SAO_MERGE_LEFT_FLAG );
    384   m_cSaoMergeUpSCModel.initBuffer        ( eSliceType, iQp, (UChar*)INIT_SAO_MERGE_UP_FLAG );
    385   m_cSaoTypeIdxSCModel.initBuffer        ( eSliceType, iQp, (UChar*)INIT_SAO_TYPE_IDX );
    386 #endif
    387 #if HHI_DMM_WEDGE_INTRA || HHI_DMM_PRED_TEX
    388 #if !PKU_QC_DEPTH_INTRA_UNI_D0195
    389   m_cDmmFlagSCModel.initBuffer           ( eSliceType, iQp, (UChar*)INIT_DMM_FLAG );
    390   m_cDmmModeSCModel.initBuffer           ( eSliceType, iQp, (UChar*)INIT_DMM_MODE );
    391 #endif
    392   m_cDmmDataSCModel.initBuffer           ( eSliceType, iQp, (UChar*)INIT_DMM_DATA );
    393 #endif
    394 #if RWTH_SDC_DLT_B0036
    395 #if !PKU_QC_DEPTH_INTRA_UNI_D0195
    396   m_cSDCFlagSCModel.initBuffer              ( eSliceType, iQp, (UChar*)INIT_SDC_FLAG );
    397 #else
    398   m_cDepthModeModel.initBuffer              ( eSliceType, iQp, (UChar*)INIT_DEPTHMODE_FLAG );
    399   m_cDmmDeltaFlagModel.initBuffer           ( eSliceType, iQp, (UChar*)INIT_DMMDELTA_FLAG );
    400 #endif
    401   m_cSDCResidualFlagSCModel.initBuffer      ( eSliceType, iQp, (UChar*)INIT_SDC_RESIDUAL_FLAG );
    402   m_cSDCResidualSCModel.initBuffer          ( eSliceType, iQp, (UChar*)INIT_SDC_RESIDUAL );
    403 #if !RWTH_SDC_CTX_SIMPL_D0032
    404   m_cSDCResidualSignFlagSCModel.initBuffer  ( eSliceType, iQp, (UChar*)INIT_SDC_SIGN_FLAG );
    405 #endif
    406   m_cSDCPredModeSCModel.initBuffer              ( eSliceType, iQp, (UChar*)INIT_SDC_PRED_MODE );
    407 #endif
    408  
     333  m_cTransformSkipSCModel.initBuffer     ( eSliceType, iQp, (UChar*)INIT_TRANSFORMSKIP_FLAG );
     334  m_CUTransquantBypassFlagSCModel.initBuffer( eSliceType, iQp, (UChar*)INIT_CU_TRANSQUANT_BYPASS_FLAG );
     335
     336#if H_3D_DIM
     337  m_cDepthIntraModeSCModel.initBuffer    ( eSliceType, iQp, (UChar*)INIT_DEPTH_INTRA_MODE );
     338  m_cDdcFlagSCModel.initBuffer           ( eSliceType, iQp, (UChar*)INIT_DDC_FLAG );
     339  m_cDdcDataSCModel.initBuffer           ( eSliceType, iQp, (UChar*)INIT_DDC_DATA );
     340#if H_3D_DIM_DMM
     341  m_cDmm1DataSCModel.initBuffer          ( eSliceType, iQp, (UChar*)INIT_DMM1_DATA );
     342#if !SEC_DMM2_E0146
     343  m_cDmm2DataSCModel.initBuffer          ( eSliceType, iQp, (UChar*)INIT_DMM2_DATA );
     344#endif
     345  m_cDmm3DataSCModel.initBuffer          ( eSliceType, iQp, (UChar*)INIT_DMM3_DATA );
     346#endif
     347#if H_3D_DIM_RBC
     348  m_cRbcDataSCModel.initBuffer           ( eSliceType, iQp, (UChar*)INIT_RBC_DATA );
     349#endif
     350#if H_3D_DIM_SDC
     351  m_cSDCResidualFlagSCModel.initBuffer   ( eSliceType, iQp, (UChar*)INIT_SDC_RESIDUAL_FLAG );
     352  m_cSDCResidualSCModel.initBuffer       ( eSliceType, iQp, (UChar*)INIT_SDC_RESIDUAL );
     353#endif
     354#endif
     355#if LGE_INTER_SDC_E0156
     356  m_cInterSDCFlagSCModel.initBuffer         ( eSliceType, iQp, (UChar*)INIT_INTER_SDC_FLAG );
     357  m_cInterSDCResidualSCModel.initBuffer     ( eSliceType, iQp, (UChar*)INIT_INTER_SDC_RESIDUAL );
     358  m_cInterSDCResidualSignFlagSCModel.initBuffer ( eSliceType, iQp, (UChar*)INIT_INTER_SDC_SIGN_FLAG );
     359#endif
    409360  m_pcBinIf->start();
    410361}
    411362
    412 Void TEncSbac::writeTileMarker( UInt uiTileIdx, UInt uiBitsUsed )
    413 {
    414   for (Int iShift=uiBitsUsed-1; iShift>=0; iShift--)
    415   {
    416     m_pcBinIf->encodeBinEP ( (uiTileIdx & (1 << iShift)) >> iShift );
    417   }
    418 }
    419 
    420 void TEncSbac::codeSEI(const SEI&)
    421 {
    422   assert(0);
    423 }
    424 
    425 #if VIDYO_VPS_INTEGRATION|QC_MVHEVC_B0046
    426363Void TEncSbac::codeVPS( TComVPS* pcVPS )
    427364{
     
    429366  return;
    430367}
    431 #endif
    432 
    433 #if HHI_MPI || H3D_QTL
    434 Void TEncSbac::codeSPS( TComSPS* pcSPS, Bool bIsDepth )
     368
     369#if H_3D
     370Void TEncSbac::codeSPS( TComSPS* pcSPS, Int viewIndex, Bool depthFlag )
    435371#else
    436372Void TEncSbac::codeSPS( TComSPS* pcSPS )
     
    467403{
    468404  m_pcBinIf->finish();
    469 }
    470 
    471 Void TEncSbac::codeFlush()
    472 {
    473   m_pcBinIf->flush();
    474 }
    475 
    476 Void TEncSbac::encodeStart()
    477 {
    478   m_pcBinIf->start();
    479405}
    480406
     
    551477 * \returns Void
    552478 */
    553 Void TEncSbac::xWriteGoRiceExGolomb( UInt uiSymbol, UInt &ruiGoRiceParam )
    554 {
    555   UInt uiMaxVlc     = g_auiGoRiceRange[ ruiGoRiceParam ];
    556   Bool bExGolomb    = ( uiSymbol > uiMaxVlc );
    557   UInt uiCodeWord   = min<UInt>( uiSymbol, ( uiMaxVlc + 1 ) );
    558   UInt uiQuotient   = uiCodeWord >> ruiGoRiceParam;
    559   UInt uiMaxPreLen  = g_auiGoRicePrefixLen[ ruiGoRiceParam ];
    560  
    561   UInt binValues;
    562   Int numBins;
    563  
    564   if ( uiQuotient >= uiMaxPreLen )
    565   {
    566     numBins = uiMaxPreLen;
    567     binValues = ( 1 << numBins ) - 1;
     479Void TEncSbac::xWriteCoefRemainExGolomb ( UInt symbol, UInt &rParam )
     480{
     481  Int codeNumber  = (Int)symbol;
     482  UInt length;
     483  if (codeNumber < (COEF_REMAIN_BIN_REDUCTION << rParam))
     484  {
     485    length = codeNumber>>rParam;
     486    m_pcBinIf->encodeBinsEP( (1<<(length+1))-2 , length+1);
     487    m_pcBinIf->encodeBinsEP((codeNumber%(1<<rParam)),rParam);
    568488  }
    569489  else
    570490  {
    571     numBins = uiQuotient + 1;
    572     binValues = ( 1 << numBins ) - 2;
    573   }
    574  
    575   m_pcBinIf->encodeBinsEP( ( binValues << ruiGoRiceParam ) + uiCodeWord - ( uiQuotient << ruiGoRiceParam ), numBins + ruiGoRiceParam );
    576  
    577   ruiGoRiceParam = g_aauiGoRiceUpdate[ ruiGoRiceParam ][ min<UInt>( uiSymbol, 23 ) ];
    578  
    579   if( bExGolomb )
    580   {
    581     uiSymbol -= uiMaxVlc + 1;
    582     xWriteEpExGolomb( uiSymbol, 0 );
    583   }
    584 }
     491    length = rParam;
     492    codeNumber  = codeNumber - ( COEF_REMAIN_BIN_REDUCTION << rParam);
     493    while (codeNumber >= (1<<length))
     494    {
     495      codeNumber -=  (1<<(length++));   
     496    }
     497    m_pcBinIf->encodeBinsEP((1<<(COEF_REMAIN_BIN_REDUCTION+length+1-rParam))-2,COEF_REMAIN_BIN_REDUCTION+length+1-rParam);
     498    m_pcBinIf->encodeBinsEP(codeNumber,length);
     499  }
     500}
     501
     502#if H_3D_DIM
     503Void TEncSbac::xWriteExGolombLevel( UInt uiSymbol, ContextModel& rcSCModel  )
     504{
     505  if( uiSymbol )
     506  {
     507    m_pcBinIf->encodeBin( 1, rcSCModel );
     508    UInt uiCount = 0;
     509    Bool bNoExGo = (uiSymbol < 13);
     510
     511    while( --uiSymbol && ++uiCount < 13 )
     512    {
     513      m_pcBinIf->encodeBin( 1, rcSCModel );
     514    }
     515    if( bNoExGo )
     516    {
     517      m_pcBinIf->encodeBin( 0, rcSCModel );
     518    }
     519    else
     520    {
     521      xWriteEpExGolomb( uiSymbol, 0 );
     522    }
     523  }
     524  else
     525  {
     526    m_pcBinIf->encodeBin( 0, rcSCModel );
     527  }
     528
     529  return;
     530}
     531
     532Void TEncSbac::xCodeDimDeltaDC( Pel valDeltaDC, UInt dimType )
     533{
     534  xWriteExGolombLevel( UInt( abs( valDeltaDC ) ), m_cDdcDataSCModel.get(0, 0, (RBC_IDX == dimType) ? 1 : 0) );
     535  if( valDeltaDC != 0 )
     536  {
     537    UInt uiSign = valDeltaDC > 0 ? 0 : 1;
     538    m_pcBinIf->encodeBinEP( uiSign );
     539  }
     540}
     541
     542#if H_3D_DIM_DMM
     543Void TEncSbac::xCodeDmm1WedgeIdx( UInt uiTabIdx, Int iNumBit )
     544{
     545  for ( Int i = 0; i < iNumBit; i++ )
     546  {
     547    m_pcBinIf->encodeBin( ( uiTabIdx >> i ) & 1, m_cDmm1DataSCModel.get(0, 0, 0) );
     548  }
     549}
     550
     551#if !SEC_DMM2_E0146
     552Void TEncSbac::xCodeDmm2Offset( Int iOffset )
     553{
     554  if( DMM2_DELTAEND_MAX > 0 )
     555  {
     556    m_pcBinIf->encodeBin( (iOffset != 0) , m_cDmm2DataSCModel.get(0, 0, 0) );
     557    if( iOffset != 0 )
     558    {
     559      UInt uiAbsValMinus1 = abs(iOffset)-1;
     560      m_pcBinIf->encodeBin( (uiAbsValMinus1 & 0x01),      m_cDmm2DataSCModel.get(0, 0, 0) );
     561      m_pcBinIf->encodeBin( (uiAbsValMinus1 & 0x02) >> 1, m_cDmm2DataSCModel.get(0, 0, 0) );
     562
     563      UInt uiSign = (iOffset > 0) ? 0 : 1;
     564      m_pcBinIf->encodeBinEP( uiSign );
     565    }
     566  }
     567}
     568#endif
     569
     570Void TEncSbac::xCodeDmm3WedgeIdx( UInt uiIntraIdx, Int iNumBit )
     571{
     572  for( Int i = 0; i < iNumBit; i++ )
     573  {
     574    m_pcBinIf->encodeBin( ( uiIntraIdx >> i ) & 1, m_cDmm3DataSCModel.get(0, 0, 0) );
     575  }
     576}
     577#endif
     578#if H_3D_DIM_RBC
     579Void TEncSbac::xCodeRbcEdge( TComDataCU* pcCU, UInt uiAbsPartIdx )
     580{
     581  UInt   uiDepth        = pcCU->getDepth( uiAbsPartIdx ) + (pcCU->getPartitionSize( uiAbsPartIdx ) == SIZE_NxN ? 1 : 0);
     582  UChar* pucSymbolList  = pcCU->getEdgeCode     ( uiAbsPartIdx );
     583  UChar  ucEdgeNumber   = pcCU->getEdgeNumber   ( uiAbsPartIdx );
     584  Bool   bLeft          = pcCU->getEdgeLeftFirst( uiAbsPartIdx );
     585  UChar  ucStart        = pcCU->getEdgeStartPos ( uiAbsPartIdx );
     586  UInt   uiSymbol;
     587
     588  // 1. Top(0) or Left(1)
     589  uiSymbol = (bLeft == false) ? 0 : 1;
     590  m_pcBinIf->encodeBinEP( uiSymbol );
     591
     592  // 2. Start position (lowest bit first)
     593  uiSymbol = ucStart;
     594  for( UInt ui = 6; ui > uiDepth; ui-- ) // 64(0)->6, 32(1)->5, 16(2)->4, 8(3)->3, 4(4)->2
     595  {
     596    m_pcBinIf->encodeBinEP( uiSymbol & 0x1 );
     597    uiSymbol >>= 1;
     598  }
     599
     600  // 3. Number of edges
     601  uiSymbol = ucEdgeNumber > 0 ? ucEdgeNumber - 1 : 0;
     602  for( UInt ui = 7; ui > uiDepth; ui-- ) // 64(0)->7, 32(1)->6, 16(2)->5, 8(3)->4, 4(4)->3
     603  {
     604    m_pcBinIf->encodeBinEP( uiSymbol & 0x1 );
     605    uiSymbol >>= 1;
     606  }
     607
     608  if(uiSymbol != 0)
     609  {
     610    printf(" ucEdgeNumber %d at depth %d\n",ucEdgeNumber, uiDepth);
     611    assert(false);
     612  }
     613
     614  // 4. Edges
     615  for( Int iPtr2 = 0; iPtr2 < ucEdgeNumber; iPtr2++ )
     616  {
     617    UInt uiReorderSymbol = pucSymbolList[iPtr2];
     618    for( UInt ui = 0; ui < uiReorderSymbol; ui++ )
     619    {
     620      m_pcBinIf->encodeBin( 1, m_cRbcDataSCModel.get( 0, 0, 0 ) );
     621    }
     622
     623    if( uiReorderSymbol != 6 )
     624      m_pcBinIf->encodeBin( 0, m_cRbcDataSCModel.get( 0, 0, 0 ) );
     625  }
     626}
     627#endif
     628#if H_3D_DIM_SDC
     629Void TEncSbac::xCodeSDCResidualData ( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiSegment )
     630{
     631  assert( pcCU->getSlice()->getIsDepth() );
     632  assert( pcCU->getPartitionSize(uiAbsPartIdx) == SIZE_2Nx2N );
     633  assert( pcCU->getSDCFlag(uiAbsPartIdx) );
     634  assert( uiSegment < 2 );
     635 
     636  Pel segmentDCOffset = pcCU->getSDCSegmentDCOffset(uiSegment, uiAbsPartIdx);
     637 
     638  UInt uiResidual = segmentDCOffset == 0 ? 0 : 1;
     639  UInt uiSign     = segmentDCOffset < 0 ? 1 : 0;
     640  UInt uiAbsIdx   = abs(segmentDCOffset);
     641
     642#if H_3D_DIM_DLT
     643  UInt uiMaxResidualBits = pcCU->getSlice()->getVPS()->getBitsPerDepthValue( pcCU->getSlice()->getLayerIdInVps() );
     644#else
     645  UInt uiMaxResidualBits = g_bitDepthY;
     646#endif
     647  assert( uiMaxResidualBits <= g_bitDepthY );
     648 
     649  // residual flag
     650  m_pcBinIf->encodeBin( uiResidual, m_cSDCResidualFlagSCModel.get( 0, 0, 0 ) );
     651 
     652  if (uiResidual)
     653  {
     654    // encode sign bit of residual
     655    m_pcBinIf->encodeBinEP( uiSign );
     656   
     657#if H_3D_DIM_DLT
     658    UInt uiNumDepthValues = pcCU->getSlice()->getVPS()->getNumDepthValues( pcCU->getSlice()->getLayerIdInVps() );
     659#else
     660    UInt uiNumDepthValues = ((1 << g_bitDepthY)-1);
     661#endif
     662    assert(uiAbsIdx <= uiNumDepthValues);
     663   
     664    // encode residual magnitude
     665    uiAbsIdx -= 1;
     666    // prefix part
     667    if ( uiAbsIdx == 0 )
     668      m_pcBinIf->encodeBin( 0, m_cSDCResidualSCModel.get(0, 0, 0) );
     669    else
     670    {
     671      UInt l = uiAbsIdx;
     672      UInt k = 0;
     673      UInt uiPrefixThreshold = ((uiNumDepthValues * 3) >> 2);
     674      while ( l > 0 && k < uiPrefixThreshold )
     675      {
     676        m_pcBinIf->encodeBin( 1, m_cSDCResidualSCModel.get(0, 0, 0) );
     677        l--;
     678        k++;
     679      }
     680      if ( uiAbsIdx < uiPrefixThreshold )
     681        m_pcBinIf->encodeBin( 0, m_cSDCResidualSCModel.get(0, 0, 0) );
     682      // suffix part
     683      else
     684      {
     685        uiAbsIdx -= uiPrefixThreshold;
     686        UInt uiSuffixLength = numBitsForValue(uiNumDepthValues - uiPrefixThreshold);
     687        UInt uiBitInfo = 0;
     688        for ( Int i = 0; i < uiSuffixLength; i++)
     689        {
     690          uiBitInfo = ( uiAbsIdx & ( 1 << i ) ) >> i;
     691          m_pcBinIf->encodeBinEP( uiBitInfo);
     692        }
     693      }
     694    }
     695   
     696  }
     697}
     698#endif
     699#endif
    585700
    586701// SBAC RD
     
    596711  this->m_cCUIntraPredSCModel      .copyFrom( &pSrc->m_cCUIntraPredSCModel       );
    597712}
    598 
    599 #if PKU_QC_DEPTH_INTRA_UNI_D0195
    600 Void TEncSbac::loadDepthMode( TEncSbac* pSrc)
     713#if H_3D_DIM
     714Void TEncSbac::loadIntraDepthMode( TEncSbac* pSrc)
    601715{
    602716  m_pcBinIf->copyState( pSrc->m_pcBinIf );
    603717
    604   this->m_cDepthModeModel      .copyFrom( &pSrc->m_cDepthModeModel       );
    605   this->m_cDmmDeltaFlagModel   .copyFrom( &pSrc->m_cDmmDeltaFlagModel       );
    606 }
    607 #endif
     718  this->m_cDepthIntraModeSCModel .copyFrom( &pSrc->m_cDepthIntraModeSCModel );
     719  this->m_cDdcFlagSCModel        .copyFrom( &pSrc->m_cDdcFlagSCModel );
     720}
     721#endif
     722
    608723Void  TEncSbac::store( TEncSbac* pDest)
    609724{
     
    622737}
    623738
    624 #if H3D_IVMP
    625 Void TEncSbac::codeMVPIdx ( TComDataCU* pcCU, UInt uiAbsPartIdx, RefPicList eRefList, Int iNum )
    626 #else
    627739Void TEncSbac::codeMVPIdx ( TComDataCU* pcCU, UInt uiAbsPartIdx, RefPicList eRefList )
    628 #endif
    629740{
    630741  Int iSymbol = pcCU->getMVPIdx(eRefList, uiAbsPartIdx);
    631 #if H3D_IVMP
    632 #else
    633742  Int iNum = AMVP_MAX_NUM_CANDS;
    634 #endif
    635743
    636744  xWriteUnaryMaxSymbol(iSymbol, m_cMVPIdxSCModel.get(0), 1, iNum-1);
     745#if H_MV_ENC_DEC_TRAC
     746#if ENC_DEC_TRACE
     747  if ( eRefList == REF_PIC_LIST_0 )
     748  {
     749    DTRACE_PU("mvp_l0_flag", iSymbol)
     750  }
     751  else
     752  {
     753    DTRACE_PU("mvp_l1_flag", iSymbol)
     754  }
     755#endif
     756#endif
    637757}
    638758
     
    640760{
    641761  PartSize eSize         = pcCU->getPartitionSize( uiAbsPartIdx );
    642 
    643 #if H3D_QTL
     762#if H_3D_QTLPC
    644763  TComSPS *sps           = pcCU->getPic()->getSlice(0)->getSPS();
    645764  TComPic *pcTexture     = pcCU->getSlice()->getTexturePic();
     
    647766  Bool bIntraSliceDetect = (pcCU->getSlice()->getSliceType() == I_SLICE);
    648767 
    649   Bool rapPic     = (pcCU->getSlice()->getNalUnitType() == NAL_UNIT_CODED_SLICE_IDR || pcCU->getSlice()->getNalUnitType() == NAL_UNIT_CODED_SLICE_CRA);
    650   if(bDepthMapDetect && !bIntraSliceDetect && !rapPic && sps->getUseQTLPC() && pcCU->getPic()->getReduceBitsFlag())
     768  Bool rapPic     = (pcCU->getSlice()->getNalUnitType() == NAL_UNIT_CODED_SLICE_IDR_W_RADL || pcCU->getSlice()->getNalUnitType() == NAL_UNIT_CODED_SLICE_IDR_N_LP || pcCU->getSlice()->getNalUnitType() == NAL_UNIT_CODED_SLICE_CRA);
     769
     770  if(bDepthMapDetect && !bIntraSliceDetect && !rapPic && pcCU->getPic()->getReduceBitsFlag() && sps->getUseQTL() && sps->getUsePC() )
    651771  {
    652772    TComDataCU *pcTextureCU = pcTexture->getCU(pcCU->getAddr());
     
    660780  }
    661781#endif
    662 
    663782  if ( pcCU->isIntra( uiAbsPartIdx ) )
    664783  {
     
    666785    {
    667786      m_pcBinIf->encodeBin( eSize == SIZE_2Nx2N? 1 : 0, m_cCUPartSizeSCModel.get( 0, 0, 0 ) );
     787#if H_MV_ENC_DEC_TRAC
     788      DTRACE_CU("part_mode", eSize == SIZE_2Nx2N? 1 : 0)
     789#endif       
    668790    }
    669791    return;
    670792  }
    671793 
     794#if H_MV_ENC_DEC_TRAC         
     795  DTRACE_CU("part_mode", eSize )
     796#endif       
    672797  switch(eSize)
    673798  {
    674   case SIZE_2Nx2N:
     799    case SIZE_2Nx2N:
    675800    {
    676801      m_pcBinIf->encodeBin( 1, m_cCUPartSizeSCModel.get( 0, 0, 0) );
    677802      break;
    678803    }
    679   case SIZE_2NxN:
    680   case SIZE_2NxnU:
    681   case SIZE_2NxnD:
     804    case SIZE_2NxN:
     805    case SIZE_2NxnU:
     806    case SIZE_2NxnD:
    682807    {
    683808      m_pcBinIf->encodeBin( 0, m_cCUPartSizeSCModel.get( 0, 0, 0) );
     
    697822      break;
    698823    }
    699   case SIZE_Nx2N:
    700   case SIZE_nLx2N:
    701   case SIZE_nRx2N:
     824    case SIZE_Nx2N:
     825    case SIZE_nLx2N:
     826    case SIZE_nRx2N:
    702827    {
    703828      m_pcBinIf->encodeBin( 0, m_cCUPartSizeSCModel.get( 0, 0, 0) );
    704829      m_pcBinIf->encodeBin( 0, m_cCUPartSizeSCModel.get( 0, 0, 1) );
    705       if( uiDepth == g_uiMaxCUDepth - g_uiAddCUDepth && !( pcCU->getSlice()->getSPS()->getDisInter4x4() && pcCU->getWidth(uiAbsPartIdx) == 8 && pcCU->getHeight(uiAbsPartIdx) == 8 ) )
     830      if( uiDepth == g_uiMaxCUDepth - g_uiAddCUDepth && !( pcCU->getWidth(uiAbsPartIdx) == 8 && pcCU->getHeight(uiAbsPartIdx) == 8 ) )
    706831      {
    707832        m_pcBinIf->encodeBin( 1, m_cCUPartSizeSCModel.get( 0, 0, 2) );
     
    721846      break;
    722847    }
    723   case SIZE_NxN:
    724     {
    725       if( uiDepth == g_uiMaxCUDepth - g_uiAddCUDepth && !( pcCU->getSlice()->getSPS()->getDisInter4x4() && pcCU->getWidth(uiAbsPartIdx) == 8 && pcCU->getHeight(uiAbsPartIdx) == 8 ) )
     848    case SIZE_NxN:
     849    {
     850      if( uiDepth == g_uiMaxCUDepth - g_uiAddCUDepth && !( pcCU->getWidth(uiAbsPartIdx) == 8 && pcCU->getHeight(uiAbsPartIdx) == 8 ) )
    726851      {
    727852        m_pcBinIf->encodeBin( 0, m_cCUPartSizeSCModel.get( 0, 0, 0) );
     
    731856      break;
    732857    }
    733   default:
     858    default:
    734859    {
    735860      assert(0);
     
    745870Void TEncSbac::codePredMode( TComDataCU* pcCU, UInt uiAbsPartIdx )
    746871{
    747 #if RWTH_SDC_DLT_B0036
     872#if H_3D_DIM_SDC
    748873  if ( pcCU->getSlice()->isIntra() )
    749874  {
     
    756881  Int iPredMode = pcCU->getPredictionMode( uiAbsPartIdx );
    757882  m_pcBinIf->encodeBin( iPredMode == MODE_INTER ? 0 : 1, m_cCUPredModeSCModel.get( 0, 0, 0 ) );
    758 }
    759 
    760 Void TEncSbac::codeAlfCtrlFlag( TComDataCU* pcCU, UInt uiAbsPartIdx )
    761 {
    762   if (!m_bAlfCtrl)
    763     return;
    764  
    765   if( pcCU->getDepth(uiAbsPartIdx) > m_uiMaxAlfCtrlDepth && !pcCU->isFirstAbsZorderIdxInDepth(uiAbsPartIdx, m_uiMaxAlfCtrlDepth))
    766   {
    767     return;
    768   }
    769  
    770   const UInt uiSymbol = pcCU->getAlfCtrlFlag( uiAbsPartIdx ) ? 1 : 0;
    771   m_pcBinIf->encodeBin( uiSymbol, *m_cCUAlfCtrlFlagSCModel.get( 0 ) );
    772 }
    773 
    774 Void TEncSbac::codeAlfCtrlDepth()
    775 {
    776   if (!m_bAlfCtrl)
    777     return;
    778  
    779   UInt uiDepth = m_uiMaxAlfCtrlDepth;
    780   xWriteUnaryMaxSymbol(uiDepth, m_cALFUvlcSCModel.get(0), 1, g_uiMaxCUDepth-1);
     883#if H_MV_ENC_DEC_TRAC
     884  DTRACE_CU("pred_mode_flag", iPredMode == MODE_INTER ? 0 : 1);
     885#endif
     886}
     887
     888Void TEncSbac::codeCUTransquantBypassFlag( TComDataCU* pcCU, UInt uiAbsPartIdx )
     889{
     890  UInt uiSymbol = pcCU->getCUTransquantBypass(uiAbsPartIdx);
     891  m_pcBinIf->encodeBin( uiSymbol, m_CUTransquantBypassFlagSCModel.get( 0, 0, 0 ) );
     892#if H_MV_ENC_DEC_TRAC
     893  DTRACE_CU("cu_transquant_bypass_flag", uiSymbol);
     894#endif
    781895}
    782896
     
    792906  UInt uiCtxSkip = pcCU->getCtxSkipFlag( uiAbsPartIdx ) ;
    793907  m_pcBinIf->encodeBin( uiSymbol, m_cCUSkipFlagSCModel.get( 0, 0, uiCtxSkip ) );
     908#if !H_MV_ENC_DEC_TRAC
    794909  DTRACE_CABAC_VL( g_nSymbolCounter++ );
    795910  DTRACE_CABAC_T( "\tSkipFlag" );
     
    799914  DTRACE_CABAC_V( uiSymbol );
    800915  DTRACE_CABAC_T( "\n");
    801 }
    802 
    803 #if LGE_ILLUCOMP_B0045
    804 /** code Illumination Compensation flag
    805  * \param pcCU
    806  * \param uiAbsPartIdx
    807  * \returns Void
    808  */
    809 Void TEncSbac::codeICFlag( TComDataCU* pcCU, UInt uiAbsPartIdx )
    810 {
    811   // get context function is here
    812   UInt uiSymbol = pcCU->getICFlag( uiAbsPartIdx ) ? 1 : 0;
    813   UInt uiCtxIC  = pcCU->getCtxICFlag( uiAbsPartIdx ) ;
    814   m_pcBinIf->encodeBin( uiSymbol, m_cCUICFlagSCModel.get( 0, 0, uiCtxIC ) );
    815   DTRACE_CABAC_VL( g_nSymbolCounter++ );
    816   DTRACE_CABAC_T( "\tICFlag" );
    817   DTRACE_CABAC_T( "\tuiCtxIC: ");
    818   DTRACE_CABAC_V( uiCtxIC );
    819   DTRACE_CABAC_T( "\tuiSymbol: ");
    820   DTRACE_CABAC_V( uiSymbol );
    821   DTRACE_CABAC_T( "\n");
    822 }
    823 #endif
     916#else
     917  DTRACE_CU("cu_skip_flag", uiSymbol);
     918#endif
     919}
    824920
    825921/** code merge flag
     
    833929  m_pcBinIf->encodeBin( uiSymbol, *m_cCUMergeFlagExtSCModel.get( 0 ) );
    834930
     931#if H_MV_ENC_DEC_TRAC
     932  DTRACE_PU("merge_flag", uiSymbol);
     933#else
    835934  DTRACE_CABAC_VL( g_nSymbolCounter++ );
    836935  DTRACE_CABAC_T( "\tMergeFlag: " );
     
    841940  DTRACE_CABAC_V( uiAbsPartIdx );
    842941  DTRACE_CABAC_T( "\n" );
     942#endif
    843943}
    844944
     
    850950Void TEncSbac::codeMergeIndex( TComDataCU* pcCU, UInt uiAbsPartIdx )
    851951{
    852   UInt uiNumCand = MRG_MAX_NUM_CANDS;
    853952  UInt uiUnaryIdx = pcCU->getMergeIndex( uiAbsPartIdx );
    854   uiNumCand = pcCU->getSlice()->getMaxNumMergeCand();
    855 #if HHI_MPI
    856   const Bool bMVIAvailable = pcCU->getSlice()->getSPS()->getUseMVI() && pcCU->getSlice()->getSliceType() != I_SLICE;
    857   if( bMVIAvailable )
    858   {
    859     const Bool bUseMVI = pcCU->getTextureModeDepth( uiAbsPartIdx ) != -1;
    860     if( bUseMVI )
    861     {
    862       uiUnaryIdx = (UInt)HHI_MPI_MERGE_POS;
    863     }
    864     else if( (Int)uiUnaryIdx >= (Int)HHI_MPI_MERGE_POS )
    865     {
    866       uiUnaryIdx++;
    867     }
    868   }
    869 #endif
     953  UInt uiNumCand = pcCU->getSlice()->getMaxNumMergeCand();
    870954  if ( uiNumCand > 1 )
    871955  {
     
    886970      }
    887971    }
    888   }
     972#if H_MV_ENC_DEC_TRAC
     973    DTRACE_PU("merge_idx", uiUnaryIdx);
     974#endif
     975  }
     976#if !H_MV_ENC_DEC_TRAC
    889977  DTRACE_CABAC_VL( g_nSymbolCounter++ );
    890978  DTRACE_CABAC_T( "\tparseMergeIndex()" );
     
    892980  DTRACE_CABAC_V( pcCU->getMergeIndex( uiAbsPartIdx ) );
    893981  DTRACE_CABAC_T( "\n" );
    894 }
    895 
    896 #if H3D_IVRP
    897 Void
    898 TEncSbac::codeResPredFlag( TComDataCU* pcCU, UInt uiAbsPartIdx )
    899 {
    900   UInt  uiCtx     = pcCU->getCtxResPredFlag( uiAbsPartIdx );
    901   UInt  uiSymbol  = ( pcCU->getResPredFlag( uiAbsPartIdx ) ? 1 : 0 );
    902   m_pcBinIf->encodeBin( uiSymbol, m_cResPredFlagSCModel.get( 0, 0, uiCtx ) );
    903 }
    904 #endif
    905 #if QC_ARP_D0177
     982#endif
     983}
     984
     985#if H_3D_ARP
    906986Void TEncSbac::codeARPW( TComDataCU* pcCU, UInt uiAbsPartIdx )
    907987{
    908   Int nW = pcCU->getARPW( uiAbsPartIdx );
    909   Int nMaxW = pcCU->getSlice()->getARPStepNum() - 1;
    910   assert( 0 <= nW && nW <= nMaxW );
    911   assert(nMaxW > 0);
    912   if( nMaxW > 0 )
    913   {
    914     Int nOffset = pcCU->getCTXARPWFlag(uiAbsPartIdx);
    915     assert( 0 <= nOffset && nOffset <= 2 );
    916     Int nBinNum = nW + ( nW != nMaxW );
    917     m_pcBinIf->encodeBin( nW != 0 , m_cCUPUARPW.get( 0, 0, 0 + nOffset ) );
    918     if( nBinNum > 1 )
    919        m_pcBinIf->encodeBin( nW == nMaxW , m_cCUPUARPW.get( 0, 0, 3 ) );
    920   }
    921 }
    922 #endif
     988  Int  iW = (Int)pcCU->getARPW( uiAbsPartIdx );
     989  Int  iMaxW = pcCU->getSlice()->getARPStepNum() - 1;
     990  assert( iMaxW > 0);
     991
     992  Int nOffset = pcCU->getCTXARPWFlag(uiAbsPartIdx);
     993  Int nBinNum = iW + ( iW != iMaxW );
     994  m_pcBinIf->encodeBin( iW ? 1 : 0 , m_cCUPUARPWSCModel.get( 0, 0, 0 + nOffset ) );
     995  if( nBinNum > 1 )
     996  {
     997     m_pcBinIf->encodeBin( ( iW == iMaxW ) ? 1 : 0, m_cCUPUARPWSCModel.get( 0, 0, 3 ) );
     998  }
     999#if H_MV_ENC_DEC_TRAC
     1000  DTRACE_CU("iv_res_pred_weight_idx", iW);
     1001#endif
     1002}
     1003#endif
     1004
     1005#if H_3D_IC
     1006/** code Illumination Compensation flag
     1007 * \param pcCU
     1008 * \param uiAbsPartIdx
     1009 * \returns Void
     1010 */
     1011Void TEncSbac::codeICFlag( TComDataCU* pcCU, UInt uiAbsPartIdx )
     1012{
     1013  // get context function is here
     1014  UInt uiSymbol = pcCU->getICFlag( uiAbsPartIdx ) ? 1 : 0;
     1015  UInt uiCtxIC  = pcCU->getCtxICFlag( uiAbsPartIdx ) ;
     1016  m_pcBinIf->encodeBin( uiSymbol, m_cCUICFlagSCModel.get( 0, 0, uiCtxIC ) );
     1017#if !H_MV_ENC_DEC_TRAC
     1018  DTRACE_CABAC_VL( g_nSymbolCounter++ );
     1019  DTRACE_CABAC_T( "\tICFlag" );
     1020  DTRACE_CABAC_T( "\tuiCtxIC: ");
     1021  DTRACE_CABAC_V( uiCtxIC );
     1022  DTRACE_CABAC_T( "\tuiSymbol: ");
     1023  DTRACE_CABAC_V( uiSymbol );
     1024  DTRACE_CABAC_T( "\n");
     1025#else
     1026  DTRACE_CU("ic_flag", uiSymbol );
     1027#endif
     1028}
     1029#endif
     1030
     1031
    9231032Void TEncSbac::codeSplitFlag   ( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth )
    9241033{
     
    9301039 
    9311040  assert( uiCtx < 3 );
    932 
    933 #if H3D_QTL
     1041#if H_3D_QTLPC
    9341042  Bool bCodeSplitFlag    = true;
    9351043
     
    9391047  Bool bIntraSliceDetect = (pcCU->getSlice()->getSliceType() == I_SLICE);
    9401048
    941   Bool rapPic     = (pcCU->getSlice()->getNalUnitType() == NAL_UNIT_CODED_SLICE_IDR || pcCU->getSlice()->getNalUnitType() == NAL_UNIT_CODED_SLICE_CRA);
    942   if(bDepthMapDetect && !bIntraSliceDetect && !rapPic && sps->getUseQTLPC() && pcCU->getPic()->getReduceBitsFlag())
     1049  Bool rapPic     = (pcCU->getSlice()->getNalUnitType() == NAL_UNIT_CODED_SLICE_IDR_W_RADL || pcCU->getSlice()->getNalUnitType() == NAL_UNIT_CODED_SLICE_IDR_N_LP || pcCU->getSlice()->getNalUnitType() == NAL_UNIT_CODED_SLICE_CRA);
     1050
     1051  if(bDepthMapDetect && !bIntraSliceDetect && !rapPic && pcCU->getPic()->getReduceBitsFlag() && sps->getUseQTL() && sps->getUsePC())
    9431052  {
    9441053    TComDataCU *pcTextureCU = pcTexture->getCU(pcCU->getAddr());
     
    9541063  }
    9551064#endif
    956 
    9571065  m_pcBinIf->encodeBin( uiCurrSplitFlag, m_cCUSplitFlagSCModel.get( 0, 0, uiCtx ) );
     1066#if !H_MV_ENC_DEC_TRAC
    9581067  DTRACE_CABAC_VL( g_nSymbolCounter++ )
    9591068  DTRACE_CABAC_T( "\tSplitFlag\n" )
     1069#else
     1070  DTRACE_CU("split_cu_flag", uiCurrSplitFlag );
     1071#endif
    9601072  return;
    9611073}
     
    9641076{
    9651077  m_pcBinIf->encodeBin( uiSymbol, m_cCUTransSubdivFlagSCModel.get( 0, 0, uiCtx ) );
     1078#if !H_MV_ENC_DEC_TRAC
    9661079  DTRACE_CABAC_VL( g_nSymbolCounter++ )
    9671080  DTRACE_CABAC_T( "\tparseTransformSubdivFlag()" )
     
    9711084  DTRACE_CABAC_V( uiCtx )
    9721085  DTRACE_CABAC_T( "\n" )
    973 }
    974 
    975 #if LGE_EDGE_INTRA_A0070
    976 Void TEncSbac::xCodeEdgeIntraInfo( TComDataCU* pcCU, UInt uiPartIdx )
    977 {
    978   UInt   uiDepth        = pcCU->getDepth( uiPartIdx ) + (pcCU->getPartitionSize( uiPartIdx ) == SIZE_NxN ? 1 : 0);
    979   UInt   uiCtxEdgeIntra = pcCU->getCtxEdgeIntra( uiPartIdx );
    980   UChar* pucSymbolList  = pcCU->getEdgeCode( uiPartIdx );
    981   UChar  ucEdgeNumber   = pcCU->getEdgeNumber( uiPartIdx );
    982   Bool   bLeft          = pcCU->getEdgeLeftFirst( uiPartIdx );
    983   UChar  ucStart        = pcCU->getEdgeStartPos( uiPartIdx );
    984   UInt   uiSymbol;
    985 
    986   // 1. Top(0) or Left(1)
    987   uiSymbol = (bLeft == false) ? 0 : 1;
    988   m_pcBinIf->encodeBinEP( uiSymbol );
    989 
    990   // 2. Start position (lowest bit first)
    991   uiSymbol = ucStart;
    992   for( UInt ui = 6; ui > uiDepth; ui-- ) // 64(0)->6, 32(1)->5, 16(2)->4, 8(3)->3, 4(4)->2
    993   {
    994     m_pcBinIf->encodeBinEP( uiSymbol & 0x1 );
    995     uiSymbol >>= 1;
    996   }
    997 
    998   // 3. Number of edges
    999   uiSymbol = ucEdgeNumber > 0 ? ucEdgeNumber - 1 : 0;
    1000   for( UInt ui = 7; ui > uiDepth; ui-- ) // 64(0)->7, 32(1)->6, 16(2)->5, 8(3)->4, 4(4)->3
    1001   {
    1002     m_pcBinIf->encodeBinEP( uiSymbol & 0x1 );
    1003     uiSymbol >>= 1;
    1004   }
    1005 
    1006   if(uiSymbol != 0)
    1007   {
    1008     printf(" ucEdgeNumber %d at depth %d\n",ucEdgeNumber, uiDepth);
    1009     assert(false);
    1010   }
    1011 
    1012   // 4. Edges
    1013   for( Int iPtr2 = 0; iPtr2 < ucEdgeNumber; iPtr2++ )
    1014   {
    1015     UInt uiReorderSymbol = pucSymbolList[iPtr2];
    1016 
    1017     //printf ("Ptr = %d, Symbol = %d\n", iPtr2, uiSymbol);
    1018 
    1019     // Left-friendly direction (Top start)
    1020     // 0 (   0deg) => 0
    1021     // 1 (  45deg) => 10
    1022     // 2 ( -45deg) => 110
    1023     // 3 (  90deg) => 1110
    1024     // 4 ( -90deg) => 11110
    1025     // 5 ( 135deg) => 111110
    1026     // 6 (-135deg) => 111111
    1027     // Right-friendly direction (Left start)
    1028     // 0 (   0deg) => 0
    1029     // 2 ( -45deg) => 10
    1030     // 1 (  45deg) => 110
    1031     // 4 ( -90deg) => 1110
    1032     // 3 (  90deg) => 11110
    1033     // 6 (-135deg) => 111110
    1034     // 5 ( 135deg) => 111111
    1035 
    1036     // refer to a paper "An efficient chain code with Huffman coding"
    1037 
    1038     for( UInt ui = 0; ui < uiReorderSymbol; ui++ )
    1039     {
    1040       m_pcBinIf->encodeBin( 1, m_cEdgeIntraSCModel.get( 0, 0, uiCtxEdgeIntra ) );
    1041     }
    1042 
    1043     if( uiReorderSymbol != 6 )
    1044       m_pcBinIf->encodeBin( 0, m_cEdgeIntraSCModel.get( 0, 0, uiCtxEdgeIntra ) );
    1045   }
    1046 }
    1047 #endif
    1048 #if PKU_QC_DEPTH_INTRA_UNI_D0195
    1049 Void TEncSbac::codeDepthIntraMode( TComDataCU* pcCU, UInt uiAbsPartIdx )
    1050 {
    1051   UInt uiCodeWordTable[3][9] =    {{0, 0, 0, 2, 0,6, 0, 0, 7},{0, 2, 3, 4, 5, 6, 14, 31, 30},{0, 2, 0, 0, 0, 0, 3, 0, 0}};
    1052   UInt uiCodeWordLenTable[3][9] = {{0, 1, 0, 2, 0,3, 0, 0, 3},{2, 3, 3, 3, 3, 3,  4,  5,  5},{1, 2, 0, 0, 0, 0, 2, 0, 0}};
    1053   UInt uiDir = pcCU->getLumaIntraDir(uiAbsPartIdx);
    1054   Bool bSdcFlag = pcCU->getSDCFlag(uiAbsPartIdx);
    1055   UInt uiPuIdx = ( pcCU->getWidth(uiAbsPartIdx) == 64 )? 2 : ( ( pcCU->getPartitionSize(uiAbsPartIdx) == SIZE_NxN && pcCU->getWidth(uiAbsPartIdx) == 8 ) ? 0 : 1 );
    1056   UInt uiCodeIdx = 0;
    1057   if ( bSdcFlag )
    1058   {
    1059     switch(uiDir)
    1060     {
    1061       case PLANAR_IDX: uiCodeIdx = 0; break;
    1062       case DC_IDX:     uiCodeIdx = 6; break;
    1063       default:         uiCodeIdx = 2;
    1064     }
    1065   }
    1066   else if ( uiDir>=EDGE_INTRA_IDX )
    1067   {
    1068     uiCodeIdx = 8;
    1069   }
    1070   else if ( uiDir<NUM_INTRA_MODE ) 
    1071   {
    1072     uiCodeIdx = 1;
    1073   }
    1074   else
    1075   {
    1076     if (uiDir== DMM_WEDGE_FULL_IDX     || uiDir==DMM_WEDGE_FULL_D_IDX     )     {uiCodeIdx = 3;}
    1077     if (uiDir== DMM_CONTOUR_PREDTEX_IDX|| uiDir==DMM_CONTOUR_PREDTEX_D_IDX)     {uiCodeIdx = 4;}
    1078     if (uiDir== DMM_WEDGE_PREDTEX_IDX  || uiDir==DMM_WEDGE_PREDTEX_D_IDX  )     {uiCodeIdx = 5;}
    1079     if (uiDir== DMM_WEDGE_PREDDIR_IDX  || uiDir==DMM_WEDGE_PREDDIR_D_IDX  )     {uiCodeIdx = 7;}
    1080   }
    1081   //mode coding
    1082   for (UInt i=0; i<uiCodeWordLenTable[uiPuIdx][uiCodeIdx]; i++)
    1083   {
    1084     UInt uiBit = uiCodeWordTable[uiPuIdx][uiCodeIdx] & ( 1<<(uiCodeWordLenTable[uiPuIdx][uiCodeIdx]-i-1) );
    1085     UInt uiCtxDepthMode = uiPuIdx*3 + ( i >= 2? 2 : i );
    1086     m_pcBinIf->encodeBin( uiBit!=0 , m_cDepthModeModel.get(0, 0, uiCtxDepthMode) );
    1087   }
    1088 }
    1089 Void TEncSbac::codeDepthModelingTable( TComDataCU* pcCU, UInt uiAbsPartIdx, Bool bSdcRD)
    1090 {
    1091   UInt uiDir = pcCU->getLumaIntraDir( uiAbsPartIdx );
    1092   Bool bSdcFlag =  pcCU->getSDCFlag(uiAbsPartIdx);
    1093   Bool bDmmFlag = (uiDir >= NUM_INTRA_MODE && uiDir < EDGE_INTRA_IDX &&(!bSdcFlag))? 1:0;
    1094 
    1095   codeDepthIntraMode(pcCU,uiAbsPartIdx);
    1096  
    1097   if (uiDir >= NUM_INTRA_MODE && uiDir < EDGE_INTRA_IDX )//DMM modes or SDC DMM1
    1098   {
    1099     assert(pcCU->getWidth(uiAbsPartIdx)<64);
    1100     assert(pcCU->getWidth(uiAbsPartIdx)<64);
    1101     if( uiDir == DMM_WEDGE_FULL_IDX || uiDir == DMM_WEDGE_FULL_D_IDX)             { xCodeWedgeFullInfo     ( pcCU, uiAbsPartIdx ); }
    1102     else if( uiDir == DMM_WEDGE_PREDTEX_IDX || uiDir == DMM_WEDGE_PREDTEX_D_IDX ) { xCodeWedgePredTexInfo  ( pcCU, uiAbsPartIdx ); }
    1103     else if( uiDir == DMM_WEDGE_PREDDIR_IDX || uiDir == DMM_WEDGE_PREDDIR_D_IDX)  { xCodeWedgePredDirInfo  ( pcCU, uiAbsPartIdx ); }
    1104   }
    1105   else if(uiDir >= EDGE_INTRA_IDX)//CCM mode
    1106   {
    1107     assert(pcCU->getWidth(uiAbsPartIdx)<64);
    1108     xCodeEdgeIntraInfo( pcCU, uiAbsPartIdx );
    1109   }
    1110 
    1111   if (bDmmFlag)
    1112   {
    1113     m_pcBinIf->encodeBin( (uiDir&1) , m_cDmmDeltaFlagModel.get(0, 0, 0) );
    1114     if (uiDir&1)
    1115     {
    1116       Int iDeltaDC1 = 0,iDeltaDC2 = 0;
    1117       if ( uiDir == DMM_WEDGE_FULL_D_IDX )
    1118       {
    1119         iDeltaDC1 = pcCU->getWedgeFullDeltaDC1( uiAbsPartIdx );
    1120         iDeltaDC2 = pcCU->getWedgeFullDeltaDC2( uiAbsPartIdx );
    1121       }
    1122       else if ( uiDir == DMM_WEDGE_PREDTEX_D_IDX )
    1123       {
    1124         iDeltaDC1 = pcCU->getWedgePredTexDeltaDC1( uiAbsPartIdx );
    1125         iDeltaDC2 = pcCU->getWedgePredTexDeltaDC2( uiAbsPartIdx );
    1126       }
    1127       else if ( uiDir == DMM_WEDGE_PREDDIR_D_IDX )
    1128       {
    1129         iDeltaDC1 = pcCU->getWedgePredDirDeltaDC1( uiAbsPartIdx );
    1130         iDeltaDC2 = pcCU->getWedgePredDirDeltaDC2( uiAbsPartIdx );
    1131       }
    1132       else if ( uiDir == DMM_CONTOUR_PREDTEX_D_IDX )
    1133       {
    1134         iDeltaDC1 = pcCU->getContourPredTexDeltaDC1( uiAbsPartIdx );
    1135         iDeltaDC2 = pcCU->getContourPredTexDeltaDC2( uiAbsPartIdx );
    1136 
    1137       }
    1138 
    1139       for ( Int i = 0; i < 2; i++ )
    1140       {
    1141         Int iDeltaDC = (i==0)? iDeltaDC1 : iDeltaDC2;
    1142         xWriteExGolombLevel( UInt( abs( iDeltaDC ) ), m_cDmmDataSCModel.get(0, 0, 1) );
    1143         if ( iDeltaDC != 0 )
    1144         {
    1145           UInt uiSign = iDeltaDC > 0 ? 0 : 1;
    1146           m_pcBinIf->encodeBinEP( uiSign );
    1147         }
    1148       }
    1149     }
    1150   }
    1151   else if (uiDir>=EDGE_INTRA_IDX)
    1152   {
    1153     m_pcBinIf->encodeBin( (uiDir == EDGE_INTRA_DELTA_IDX), m_cEdgeIntraDeltaDCSCModel.get(0, 0, 0) );
    1154     if( uiDir == EDGE_INTRA_DELTA_IDX )
    1155     {
    1156       Int iDeltaDC0 = pcCU->getEdgeDeltaDC0( uiAbsPartIdx );
    1157       Int iDeltaDC1 = pcCU->getEdgeDeltaDC1( uiAbsPartIdx );
    1158 
    1159       for ( Int i = 0; i < 2; i++ )
    1160       {
    1161         Int iDeltaDC = (i==0)? iDeltaDC0 : iDeltaDC1;
    1162         xWriteExGolombLevel( UInt( abs( iDeltaDC ) ), m_cEdgeIntraDeltaDCSCModel.get(0, 0, 1) );
    1163         if ( iDeltaDC != 0 )
    1164         {
    1165           UInt uiSign = iDeltaDC > 0 ? 0 : 1;
    1166           m_pcBinIf->encodeBinEP( uiSign );
    1167         }
    1168       }
    1169     }
    1170   }
    1171   if (pcCU->getSDCFlag(uiAbsPartIdx))//SDC mode
    1172   {
    1173     assert(pcCU->getPartitionSize(uiAbsPartIdx)==SIZE_2Nx2N);
    1174     UInt uiNumSegments = ( uiDir == DC_IDX || uiDir == PLANAR_IDX )? 1 : 2;
    1175     if(!bSdcRD)
    1176     {
    1177       for (int uiSeg=0; uiSeg<uiNumSegments; uiSeg++)
    1178       {
    1179         codeSDCResidualData(pcCU, uiAbsPartIdx, uiSeg);
    1180       }
    1181     }
    1182   }
    1183 }
    1184 #endif
    1185 Void TEncSbac::codeIntraDirLumaAng( TComDataCU* pcCU, UInt uiAbsPartIdx
    1186 #if PKU_QC_DEPTH_INTRA_UNI_D0195
    1187                                    , Bool bSdcRD
    1188 #endif
    1189                                    )
    1190 {
    1191   UInt uiDir         = pcCU->getLumaIntraDir( uiAbsPartIdx );
    1192 
    1193 #if !PKU_QC_DEPTH_INTRA_UNI_D0195
    1194 #if HHI_DMM_WEDGE_INTRA || HHI_DMM_PRED_TEX
    1195   if( pcCU->getSlice()->getSPS()->getUseDMM() && pcCU->getWidth( uiAbsPartIdx ) <= DMM_WEDGEMODEL_MAX_SIZE )
    1196   {
    1197 #if LGE_EDGE_INTRA_A0070
    1198     m_pcBinIf->encodeBin( uiDir >= NUM_INTRA_MODE && uiDir < EDGE_INTRA_IDX, m_cDmmFlagSCModel.get(0, 0, 0) );
    1199 #else
    1200     m_pcBinIf->encodeBin( uiDir >= NUM_INTRA_MODE, m_cDmmFlagSCModel.get(0, 0, 0) );
    1201 #endif
    1202   }
    1203 #if LGE_EDGE_INTRA_A0070
    1204   if( uiDir >= NUM_INTRA_MODE && uiDir < EDGE_INTRA_IDX )
    1205 #else
    1206   if( uiDir >= NUM_INTRA_MODE )
    1207 #endif
    1208   {
    1209     assert( pcCU->getWidth( uiAbsPartIdx ) <= DMM_WEDGEMODEL_MAX_SIZE );
    1210     UInt uiDMMode = uiDir - NUM_INTRA_MODE;
    1211 
    1212 #if HHI_DMM_WEDGE_INTRA && HHI_DMM_PRED_TEX
    1213     m_pcBinIf->encodeBin( (uiDMMode & 0x01),      m_cDmmModeSCModel.get(0, 0, 0) );
    1214     m_pcBinIf->encodeBin( (uiDMMode & 0x02) >> 1, m_cDmmModeSCModel.get(0, 0, 0) );
    1215 
    1216     if( pcCU->getPartitionSize( uiAbsPartIdx ) != SIZE_NxN && pcCU->getWidth( uiAbsPartIdx ) > 4 )
    1217     {
    1218       m_pcBinIf->encodeBin( (uiDMMode & 0x04) >> 2, m_cDmmModeSCModel.get(0, 0, 0) );
    1219     }
    1220 #else
    1221     m_pcBinIf->encodeBin( (uiDMMode & 0x01),      m_cDmmModeSCModel.get(0, 0, 0) );
    1222 
    1223     if( pcCU->getPartitionSize( uiAbsPartIdx ) != SIZE_NxN && pcCU->getWidth( uiAbsPartIdx ) > 4 )
    1224     {
    1225       m_pcBinIf->encodeBin( (uiDMMode & 0x02) >> 1, m_cDmmModeSCModel.get(0, 0, 0) );
    1226     }
    1227 #endif
    1228 #if HHI_DMM_WEDGE_INTRA
    1229     if( uiDir == DMM_WEDGE_FULL_IDX )          { xCodeWedgeFullInfo          ( pcCU, uiAbsPartIdx ); }
    1230     if( uiDir == DMM_WEDGE_FULL_D_IDX )        { xCodeWedgeFullDeltaInfo     ( pcCU, uiAbsPartIdx ); }
    1231     if( uiDir == DMM_WEDGE_PREDDIR_IDX )       { xCodeWedgePredDirInfo       ( pcCU, uiAbsPartIdx ); }
    1232     if( uiDir == DMM_WEDGE_PREDDIR_D_IDX )     { xCodeWedgePredDirDeltaInfo  ( pcCU, uiAbsPartIdx ); }
    1233 #endif
    1234 #if HHI_DMM_PRED_TEX
    1235 
    1236 #if FLEX_CODING_ORDER_M23723
    1237     if ( !pcCU->getSlice()->getSPS()->getUseDMM34() )
    1238     {
    1239       assert( uiDir != DMM_WEDGE_PREDTEX_D_IDX );
    1240       assert( uiDir != DMM_CONTOUR_PREDTEX_D_IDX );
    1241     }
    1242 #endif
    1243 
    1244     if( uiDir == DMM_WEDGE_PREDTEX_D_IDX )     { xCodeWedgePredTexDeltaInfo  ( pcCU, uiAbsPartIdx ); }
    1245 #if LGE_DMM3_SIMP_C0044
    1246     if( uiDir == DMM_WEDGE_PREDTEX_IDX )       { xCodeWedgePredTexInfo       ( pcCU, uiAbsPartIdx ); }
    1247 #endif
    1248     if( uiDir == DMM_CONTOUR_PREDTEX_D_IDX )   { xCodeContourPredTexDeltaInfo( pcCU, uiAbsPartIdx ); }
    1249 #endif
    1250   }
    1251   else
    1252 #if LGE_EDGE_INTRA_A0070
    1253     if ( uiDir >= EDGE_INTRA_IDX)
    1254     {
    1255       m_pcBinIf->encodeBin( 0, m_cCUIntraPredSCModel.get( 0, 0, 0 ) );
    1256       m_pcBinIf->encodeBinsEP( 63, 6 );
    1257       xCodeEdgeIntraInfo( pcCU, uiAbsPartIdx );
    1258 #if LGE_EDGE_INTRA_DELTA_DC
    1259       m_pcBinIf->encodeBin( (uiDir == EDGE_INTRA_DELTA_IDX), m_cEdgeIntraDeltaDCSCModel.get(0, 0, 0) );
    1260       if( uiDir == EDGE_INTRA_DELTA_IDX )
    1261       {
    1262         Int iDeltaDC0 = pcCU->getEdgeDeltaDC0( uiAbsPartIdx );
    1263         Int iDeltaDC1 = pcCU->getEdgeDeltaDC1( uiAbsPartIdx );
    1264 
    1265         xWriteExGolombLevel( UInt( abs( iDeltaDC0 ) ), m_cEdgeIntraDeltaDCSCModel.get(0, 0, 1) );
    1266         if ( iDeltaDC0 != 0 )
    1267         {
    1268           UInt uiSign = iDeltaDC0 > 0 ? 0 : 1;
    1269           m_pcBinIf->encodeBinEP( uiSign );
    1270         }
    1271         xWriteExGolombLevel( UInt( abs( iDeltaDC1 ) ), m_cEdgeIntraDeltaDCSCModel.get(0, 0, 1) );
    1272         if ( iDeltaDC1 != 0 )
    1273         {
    1274           UInt uiSign = iDeltaDC1 > 0 ? 0 : 1;
    1275           m_pcBinIf->encodeBinEP( uiSign );
    1276         }
    1277       }
     1086#endif
     1087}
     1088
     1089Void TEncSbac::codeIntraDirLumaAng( TComDataCU* pcCU, UInt absPartIdx, Bool isMultiple)
     1090{
     1091  UInt dir[4],j;
     1092  Int preds[4][3] = {{-1, -1, -1},{-1, -1, -1},{-1, -1, -1},{-1, -1, -1}};
     1093  Int predNum[4], predIdx[4] ={ -1,-1,-1,-1};
     1094  PartSize mode = pcCU->getPartitionSize( absPartIdx );
     1095  UInt partNum = isMultiple?(mode==SIZE_NxN?4:1):1;
     1096  UInt partOffset = ( pcCU->getPic()->getNumPartInCU() >> ( pcCU->getDepth(absPartIdx) << 1 ) ) >> 2;
     1097  for (j=0;j<partNum;j++)
     1098  {
     1099    dir[j] = pcCU->getLumaIntraDir( absPartIdx+partOffset*j );
     1100#if H_3D_DIM
     1101    if( pcCU->getSlice()->getVpsDepthModesFlag() )
     1102    {
     1103      codeIntraDepth( pcCU, absPartIdx+partOffset*j );
     1104    }
     1105    if( pcCU->getLumaIntraDir( absPartIdx+partOffset*j ) < NUM_INTRA_MODE )
     1106#if H_3D_DIM_SDC
     1107      if( !pcCU->getSDCFlag( absPartIdx+partOffset*j ) )
     1108#endif
     1109    {
     1110#endif
     1111    predNum[j] = pcCU->getIntraDirLumaPredictor(absPartIdx+partOffset*j, preds[j]); 
     1112    for(UInt i = 0; i < predNum[j]; i++)
     1113    {
     1114      if(dir[j] == preds[j][i])
     1115      {
     1116        predIdx[j] = i;
     1117      }
     1118    }
     1119    m_pcBinIf->encodeBin((predIdx[j] != -1)? 1 : 0, m_cCUIntraPredSCModel.get( 0, 0, 0 ) );
     1120#if H_MV_ENC_DEC_TRAC
     1121    DTRACE_CU("prev_intra_luma_pred_flag", (predIdx[j] != -1)? 1 : 0);
     1122#endif
     1123#if H_3D_DIM
     1124    }
     1125#endif
     1126
     1127  } 
     1128  for (j=0;j<partNum;j++)
     1129  {
     1130#if H_3D_DIM
     1131    if( pcCU->getLumaIntraDir( absPartIdx+partOffset*j ) < NUM_INTRA_MODE )
     1132#if H_3D_DIM_SDC
     1133      if( !pcCU->getSDCFlag( absPartIdx+partOffset*j ) )
     1134#endif
     1135    {
     1136#endif
     1137    if(predIdx[j] != -1)
     1138    {
     1139      m_pcBinIf->encodeBinEP( predIdx[j] ? 1 : 0 );
     1140      if (predIdx[j])
     1141      {
     1142        m_pcBinIf->encodeBinEP( predIdx[j]-1 );
     1143      }
     1144#if H_MV_ENC_DEC_TRAC
     1145      DTRACE_CU("mpm_idx", predIdx[j] );
    12781146#endif
    12791147    }
    12801148    else
    1281 #endif // LGE_EDGE_INTRA
    1282   {
    1283 #endif
    1284 #if LGE_EDGE_INTRA_A0070
    1285   Bool bCodeEdgeIntra = false;
    1286   if( pcCU->getSlice()->getSPS()->isDepth() )
    1287   {
    1288     UInt uiPUWidth = pcCU->getWidth( uiAbsPartIdx ) >> (pcCU->getPartitionSize( uiAbsPartIdx ) == SIZE_NxN ? 1 : 0);
    1289     if( uiPUWidth <= LGE_EDGE_INTRA_MAX_SIZE && uiPUWidth >= LGE_EDGE_INTRA_MIN_SIZE )
    1290       bCodeEdgeIntra = true;
    1291   }
    1292 #endif
    1293 #else
    1294   if (pcCU->getSlice()->getSPS()->isDepth())
    1295   {
    1296     codeDepthModelingTable(pcCU, uiAbsPartIdx, bSdcRD);
    1297   }
    1298   if (pcCU->getLumaIntraDir(uiAbsPartIdx)<NUM_INTRA_MODE && !pcCU->getSDCFlag(uiAbsPartIdx))
    1299   {
    1300 #endif
    1301   Int uiPreds[3] = {-1, -1, -1};
    1302   Int uiPredNum = pcCU->getIntraDirLumaPredictor(uiAbsPartIdx, uiPreds); 
    1303 
    1304   Int uiPredIdx = -1;
    1305 
    1306   for(UInt i = 0; i < uiPredNum; i++)
    1307   {
    1308     if(uiDir == uiPreds[i])
    1309     {
    1310       uiPredIdx = i;
    1311     }
    1312   }
    1313  
    1314   if(uiPredIdx != -1)
    1315   {
    1316     m_pcBinIf->encodeBin( 1, m_cCUIntraPredSCModel.get( 0, 0, 0 ) );
    1317     m_pcBinIf->encodeBinEP( uiPredIdx ? 1 : 0 );
    1318     if (uiPredIdx)
    1319     {
    1320       m_pcBinIf->encodeBinEP( uiPredIdx-1 );
    1321     }
    1322   }
    1323   else
    1324   {
    1325     m_pcBinIf->encodeBin( 0, m_cCUIntraPredSCModel.get( 0, 0, 0 ) );
    1326  
    1327     if (uiPreds[0] > uiPreds[1])
    1328     {
    1329       std::swap(uiPreds[0], uiPreds[1]);
    1330     }
    1331     if (uiPreds[0] > uiPreds[2])
    1332     {
    1333       std::swap(uiPreds[0], uiPreds[2]);
    1334     }
    1335     if (uiPreds[1] > uiPreds[2])
    1336     {
    1337       std::swap(uiPreds[1], uiPreds[2]);
    1338     }
    1339 
    1340     for(Int i = (uiPredNum - 1); i >= 0; i--)
    1341     {
    1342       uiDir = uiDir > uiPreds[i] ? uiDir - 1 : uiDir;
    1343     }
    1344 
    1345     m_pcBinIf->encodeBinsEP( uiDir, 5 );
    1346 #if !PKU_QC_DEPTH_INTRA_UNI_D0195
    1347 #if LGE_EDGE_INTRA_A0070
    1348   if (bCodeEdgeIntra)
    1349     if (uiDir == 31) m_pcBinIf->encodeBinsEP(0,1);
    1350 #endif
    1351 #endif
    1352    }
    1353 #if PKU_QC_DEPTH_INTRA_UNI_D0195
    1354    }
    1355 #else
    1356 #if HHI_DMM_WEDGE_INTRA || HHI_DMM_PRED_TEX
    1357   }
    1358 #endif
    1359 #endif
    1360 
     1149    {
     1150      if (preds[j][0] > preds[j][1])
     1151      {
     1152        std::swap(preds[j][0], preds[j][1]);
     1153      }
     1154      if (preds[j][0] > preds[j][2])
     1155      {
     1156        std::swap(preds[j][0], preds[j][2]);
     1157      }
     1158      if (preds[j][1] > preds[j][2])
     1159      {
     1160        std::swap(preds[j][1], preds[j][2]);
     1161      }
     1162      for(Int i = (predNum[j] - 1); i >= 0; i--)
     1163      {
     1164        dir[j] = dir[j] > preds[j][i] ? dir[j] - 1 : dir[j];
     1165      }
     1166      m_pcBinIf->encodeBinsEP( dir[j], 5 );
     1167#if H_MV_ENC_DEC_TRAC
     1168      DTRACE_CU("rem_intra_luma_pred_mode", dir[j] );
     1169#endif
     1170    }
     1171#if H_3D_DIM
     1172    }
     1173#endif
     1174  }
    13611175  return;
    13621176}
     
    13691183  {
    13701184    m_pcBinIf->encodeBin( 0, m_cCUChromaPredSCModel.get( 0, 0, 0 ) );
    1371   }
    1372   else if( uiIntraDirChroma == LM_CHROMA_IDX )
    1373   {
    1374     m_pcBinIf->encodeBin( 1, m_cCUChromaPredSCModel.get( 0, 0, 0 ) );
    1375     m_pcBinIf->encodeBin( 0, m_cCUChromaPredSCModel.get( 0, 0, 1 ) );
     1185#if H_MV_ENC_DEC_TRAC
     1186    DTRACE_CU("intra_chroma_pred_mode", 0 );
     1187#endif
    13761188  }
    13771189  else
     
    13801192    pcCU->getAllowedChromaDir( uiAbsPartIdx, uiAllowedChromaDir );
    13811193
    1382     for( Int i = 0; i < NUM_CHROMA_MODE - 2; i++ )
     1194    for( Int i = 0; i < NUM_CHROMA_MODE - 1; i++ )
    13831195    {
    13841196      if( uiIntraDirChroma == uiAllowedChromaDir[i] )
     
    13901202    m_pcBinIf->encodeBin( 1, m_cCUChromaPredSCModel.get( 0, 0, 0 ) );
    13911203
    1392     if (pcCU->getSlice()->getSPS()->getUseLMChroma())
    1393     {
    1394       m_pcBinIf->encodeBin( 1, m_cCUChromaPredSCModel.get( 0, 0, 1 ));
    1395     }
    13961204    m_pcBinIf->encodeBinsEP( uiIntraDirChroma, 2 );
     1205#if H_MV_ENC_DEC_TRAC
     1206    DTRACE_CU("intra_chroma_pred_mode", uiIntraDirChroma );
     1207#endif
     1208
    13971209  }
    13981210  return;
    13991211}
     1212
     1213#if H_3D_DIM
     1214Void TEncSbac::codeIntraDepth( TComDataCU* pcCU, UInt absPartIdx )
     1215{
     1216  codeIntraDepthMode( pcCU, absPartIdx );
     1217
     1218  UInt dir     = pcCU->getLumaIntraDir( absPartIdx );
     1219  UInt dimType = getDimType( dir );
     1220
     1221  switch( dimType )
     1222  {
     1223#if H_3D_DIM_DMM
     1224  case( DMM1_IDX ):
     1225    {
     1226      xCodeDmm1WedgeIdx( pcCU->getDmmWedgeTabIdx( dimType, absPartIdx ), g_dmm1TabIdxBits[pcCU->getIntraSizeIdx(absPartIdx)] );
     1227    } break;
     1228#if !SEC_DMM2_E0146
     1229  case( DMM2_IDX ):
     1230    {
     1231      xCodeDmm2Offset( pcCU->getDmm2DeltaEnd( absPartIdx ) );
     1232    } break;
     1233#endif
     1234  case( DMM3_IDX ):
     1235    {
     1236      xCodeDmm3WedgeIdx( pcCU->getDmm3IntraTabIdx( absPartIdx ), g_dmm3IntraTabIdxBits[pcCU->getIntraSizeIdx(absPartIdx)] );
     1237    } break;
     1238  case( DMM4_IDX ): break;
     1239#endif
     1240#if H_3D_DIM_RBC
     1241  case( RBC_IDX ):
     1242    {
     1243      assert( pcCU->getWidth( absPartIdx ) < 64 );
     1244      xCodeRbcEdge( pcCU, absPartIdx );
     1245    } break;
     1246#endif
     1247  default: break;
     1248  }
     1249
     1250#if H_3D_DIM_SDC
     1251  if( pcCU->getSDCFlag( absPartIdx ) )
     1252  {
     1253    assert(pcCU->getPartitionSize(absPartIdx)==SIZE_2Nx2N);
     1254    UInt uiNumSegments = ( dir == DC_IDX || dir == PLANAR_IDX )? 1 : 2;
     1255    for(UInt uiSeg=0; uiSeg<uiNumSegments; uiSeg++)
     1256    {
     1257      xCodeSDCResidualData(pcCU, absPartIdx, uiSeg);
     1258    }
     1259  }
     1260  else
     1261  {
     1262#endif
     1263    if( dimType < DIM_NUM_TYPE )
     1264    {
     1265      UInt dimDeltaDC = isDimDeltaDC( dir );
     1266      m_pcBinIf->encodeBin( dimDeltaDC, m_cDdcFlagSCModel.get(0, 0, (RBC_IDX == dimType) ? 1 : 0) );
     1267      if( dimDeltaDC )
     1268      {
     1269        for( UInt segment = 0; segment < 2; segment++ )
     1270        {
     1271          xCodeDimDeltaDC( pcCU->getDimDeltaDC( dimType, segment, absPartIdx ), dimType );
     1272        }
     1273      }
     1274    }
     1275#if H_3D_DIM_SDC
     1276  }
     1277#endif
     1278}
     1279
     1280Void TEncSbac::codeIntraDepthMode( TComDataCU* pcCU, UInt absPartIdx )
     1281{
     1282#if ZJU_DEPTH_INTRA_MODE_E0204
     1283    UInt codeWordTable[3][7] =    {{0, 0, 0, 2, 0,6, 7},{0, 0, 2, 7, 3, 6, 2},{0, 1, 0, 0, 0, 0, 0}};
     1284    UInt codeWordLenTable[3][7] = {{0, 1, 0, 2, 0,3, 3},{1, 1, 2, 3, 2, 3, 2},{1, 1, 0, 0, 0, 0, 0}};
     1285#else
     1286#if LGE_SDC_REMOVE_DC_E0158
     1287#if SEC_DMM2_E0146
     1288  UInt codeWordTable[3][7] =    {{0, 0, 0, 2, 0,6, 7},{0, 2, 3, 4, 5, 6, 7},{0, 1, 0, 0, 0, 0, 0}};
     1289  UInt codeWordLenTable[3][7] = {{0, 1, 0, 2, 0,3, 3},{2, 3, 3, 3, 3, 3, 3},{1, 1, 0, 0, 0, 0, 0}};
     1290#else
     1291  UInt codeWordTable[3][8] =    { { 0, 0, 0, 2, 0, 6, 0, 7 }, { 0, 2, 3, 4, 5, 6, 15, 14 }, { 0, 1, 0, 0, 0, 0, 0, 0 } };
     1292  UInt codeWordLenTable[3][8] = { { 0, 1, 0, 2, 0, 3, 0, 3 }, { 2, 3, 3, 3, 3, 3,  4,  4 }, { 1, 1, 0, 0, 0, 0, 0, 0 } };
     1293#endif
     1294#else
     1295#if SEC_DMM2_E0146
     1296  UInt codeWordTable[3][8] =    {{0, 0, 0, 2, 0,6, 0, 7},{0, 2, 3, 4, 5, 6, 14, 15},{0, 2, 0, 0, 0, 0, 3, 0}};
     1297  UInt codeWordLenTable[3][8] = {{0, 1, 0, 2, 0,3, 0, 3},{2, 3, 3, 3, 3, 3,  4,  4},{1, 2, 0, 0, 0, 0, 2, 0}};
     1298#else
     1299  UInt codeWordTable[3][9] =    {{0, 0, 0, 2, 0,6, 0, 0, 7},{0, 2, 3, 4, 5, 6, 14, 31, 30},{0, 2, 0, 0, 0, 0, 3, 0, 0}};
     1300  UInt codeWordLenTable[3][9] = {{0, 1, 0, 2, 0,3, 0, 0, 3},{2, 3, 3, 3, 3, 3,  4,  5,  5},{1, 2, 0, 0, 0, 0, 2, 0, 0}};
     1301#endif
     1302#endif
     1303#endif
     1304  UInt dir = pcCU->getLumaIntraDir( absPartIdx );
     1305  UInt puIdx = (pcCU->getWidth(absPartIdx) == 64) ? 2 : ( (pcCU->getPartitionSize(absPartIdx) == SIZE_NxN && pcCU->getWidth(absPartIdx) == 8) ? 0 : 1 );
     1306  UInt codeIdx = 0;
     1307
     1308  if( dir < NUM_INTRA_MODE )
     1309  {
     1310    codeIdx = 1;
     1311  }
     1312  if( isDimMode( dir ) )
     1313  {
     1314    switch( getDimType( dir ) )
     1315    {
     1316    case DMM1_IDX: codeIdx = 3; break;
     1317    case DMM4_IDX: codeIdx = 4; break;
     1318    case DMM3_IDX: codeIdx = 5; break;
     1319#if LGE_SDC_REMOVE_DC_E0158
     1320#if SEC_DMM2_E0146
     1321    case  RBC_IDX: codeIdx = 6; break;
     1322#else
     1323    case DMM2_IDX: codeIdx = 6; break;
     1324    case  RBC_IDX: codeIdx = 7; break;
     1325#endif
     1326#else
     1327#if SEC_DMM2_E0146
     1328    case  RBC_IDX: codeIdx = 7; break;
     1329#else
     1330    case DMM2_IDX: codeIdx = 7; break;
     1331    case  RBC_IDX: codeIdx = 8; break;
     1332#endif
     1333#endif
     1334    default:                    break;
     1335    }
     1336  }
     1337
     1338#if H_3D_DIM_SDC
     1339  if( pcCU->getSDCFlag( absPartIdx ) )
     1340  {
     1341    switch( dir )
     1342    {
     1343      case PLANAR_IDX:  codeIdx = 0; break;
     1344#if !LGE_SDC_REMOVE_DC_E0158
     1345      case DC_IDX:      codeIdx = 6; break;
     1346#endif
     1347      default:          codeIdx = 2; break;
     1348    }
     1349  }
     1350#endif
     1351#if ZJU_DEPTH_INTRA_MODE_E0204
     1352  if( puIdx==1 )
     1353  {
     1354      if( codeIdx==1 || codeIdx==2 || codeIdx==4 )
     1355      {
     1356          m_pcBinIf->encodeBinEP( 0 );
     1357      }
     1358      else
     1359      {
     1360          m_pcBinIf->encodeBinEP( 1 );
     1361      }
     1362  }
     1363#endif
     1364  //mode coding
     1365  for( UInt i = 0; i < codeWordLenTable[puIdx][codeIdx]; i++ )
     1366  {
     1367    UInt bit = codeWordTable[puIdx][codeIdx] & ( 1<<(codeWordLenTable[puIdx][codeIdx] - i - 1) );
     1368    UInt ctxDepthMode = puIdx*3 + ( (i >= 2) ? 2 : i );
     1369    m_pcBinIf->encodeBin( bit!=0 , m_cDepthIntraModeSCModel.get(0, 0, ctxDepthMode) );
     1370  }
     1371}
     1372#endif
     1373
    14001374
    14011375Void TEncSbac::codeInterDir( TComDataCU* pcCU, UInt uiAbsPartIdx )
     
    14041378  const UInt uiCtx      = pcCU->getCtxInterDir( uiAbsPartIdx );
    14051379  ContextModel *pCtx    = m_cCUInterDirSCModel.get( 0 );
    1406   m_pcBinIf->encodeBin( uiInterDir == 2 ? 1 : 0, *( pCtx + uiCtx ) );
     1380  if (pcCU->getPartitionSize(uiAbsPartIdx) == SIZE_2Nx2N || pcCU->getHeight(uiAbsPartIdx) != 8 )
     1381  {
     1382    m_pcBinIf->encodeBin( uiInterDir == 2 ? 1 : 0, *( pCtx + uiCtx ) );
     1383  }
     1384  if (uiInterDir < 2)
     1385  {
     1386    m_pcBinIf->encodeBin( uiInterDir, *( pCtx + 4 ) );
     1387  }
     1388#if H_MV_ENC_DEC_TRAC
     1389  DTRACE_PU("inter_pred_idc", uiInterDir );
     1390#endif
    14071391
    14081392  return;
     
    14111395Void TEncSbac::codeRefFrmIdx( TComDataCU* pcCU, UInt uiAbsPartIdx, RefPicList eRefList )
    14121396{
    1413   if ( pcCU->getSlice()->getNumRefIdx(REF_PIC_LIST_C) > 0 && pcCU->getInterDir( uiAbsPartIdx ) != 3)
    1414   {
    1415     Int iRefFrame = pcCU->getSlice()->getRefIdxOfLC(eRefList, pcCU->getCUMvField( eRefList )->getRefIdx( uiAbsPartIdx ));
    1416 
    1417     ContextModel *pCtx = m_cCURefPicSCModel.get( 0 );
    1418     m_pcBinIf->encodeBin( ( iRefFrame == 0 ? 0 : 1 ), *pCtx );
    1419 
    1420     if( iRefFrame > 0 )
    1421     {
    1422       xWriteUnaryMaxSymbol( iRefFrame - 1, pCtx + 1, 1, pcCU->getSlice()->getNumRefIdx( REF_PIC_LIST_C )-2 );
    1423     }
    1424 #if MERL_VSP_C0152
    1425     else if (iRefFrame < 0) // NOT_VALID
    1426     {
    1427       assert(0);
    1428     }
    1429 #endif
    1430   }
    1431   else
    14321397  {
    14331398    Int iRefFrame = pcCU->getCUMvField( eRefList )->getRefIdx( uiAbsPartIdx );
     
    14371402    if( iRefFrame > 0 )
    14381403    {
    1439       xWriteUnaryMaxSymbol( iRefFrame - 1, pCtx + 1, 1, pcCU->getSlice()->getNumRefIdx( eRefList )-2 );
    1440     }
    1441 #if MERL_VSP_C0152
    1442     else if (iRefFrame < 0) // NOT_VALID
    1443     {
    1444       assert(0);
    1445     }
     1404      UInt uiRefNum = pcCU->getSlice()->getNumRefIdx( eRefList ) - 2;
     1405      pCtx++;
     1406      iRefFrame--;
     1407      for( UInt ui = 0; ui < uiRefNum; ++ui )
     1408      {
     1409        const UInt uiSymbol = ui == iRefFrame ? 0 : 1;
     1410        if( ui == 0 )
     1411        {
     1412          m_pcBinIf->encodeBin( uiSymbol, *pCtx );       
     1413        }
     1414        else
     1415        {
     1416          m_pcBinIf->encodeBinEP( uiSymbol );
     1417        }
     1418        if( uiSymbol == 0 )
     1419        {
     1420          break;
     1421        }
     1422      }
     1423    }
     1424#if H_MV_ENC_DEC_TRAC
     1425#if ENC_DEC_TRACE
     1426    iRefFrame = pcCU->getCUMvField( eRefList )->getRefIdx( uiAbsPartIdx );
     1427    if ( eRefList == REF_PIC_LIST_0 )
     1428    {
     1429      DTRACE_PU("ref_idx_l0", iRefFrame)
     1430    }
     1431    else
     1432    {
     1433      DTRACE_PU("ref_idx_l1", iRefFrame)
     1434    }
     1435#endif
    14461436#endif
    14471437  }
     
    15101500  iDQp = (iDQp + 78 + qpBdOffsetY + (qpBdOffsetY/2)) % (52 + qpBdOffsetY) - 26 - (qpBdOffsetY/2);
    15111501
    1512   if ( iDQp == 0 )
    1513   {
    1514     m_pcBinIf->encodeBin( 0, m_cCUDeltaQpSCModel.get( 0, 0, 0 ) );
    1515   }
    1516   else
    1517   {
    1518     m_pcBinIf->encodeBin( 1, m_cCUDeltaQpSCModel.get( 0, 0, 0 ) );
    1519    
     1502  UInt uiAbsDQp = (UInt)((iDQp > 0)? iDQp  : (-iDQp));
     1503  UInt TUValue = min((Int)uiAbsDQp, CU_DQP_TU_CMAX);
     1504  xWriteUnaryMaxSymbol( TUValue, &m_cCUDeltaQpSCModel.get( 0, 0, 0 ), 1, CU_DQP_TU_CMAX);
     1505  if( uiAbsDQp >= CU_DQP_TU_CMAX )
     1506  {
     1507    xWriteEpExGolomb( uiAbsDQp - CU_DQP_TU_CMAX, CU_DQP_EG_k );
     1508  }
     1509
     1510  if ( uiAbsDQp > 0)
     1511  {
    15201512    UInt uiSign = (iDQp > 0 ? 0 : 1);
    1521 
    15221513    m_pcBinIf->encodeBinEP(uiSign);
    1523 
    1524     assert(iDQp >= -(26+(qpBdOffsetY/2)));
    1525     assert(iDQp <=  (25+(qpBdOffsetY/2)));
    1526 
    1527     UInt uiMaxAbsDQpMinus1 = 24 + (qpBdOffsetY/2) + (uiSign);
    1528     UInt uiAbsDQpMinus1 = (UInt)((iDQp > 0)? iDQp  : (-iDQp)) - 1;
    1529     xWriteUnaryMaxSymbol( uiAbsDQpMinus1, &m_cCUDeltaQpSCModel.get( 0, 0, 1 ), 1, uiMaxAbsDQpMinus1);
    1530   }
    1531  
     1514  }
     1515
    15321516  return;
    15331517}
     
    15361520{
    15371521  UInt uiCbf = pcCU->getCbf     ( uiAbsPartIdx, eType, uiTrDepth );
    1538   UInt uiCtx = pcCU->getCtxQtCbf( uiAbsPartIdx, eType, uiTrDepth );
     1522  UInt uiCtx = pcCU->getCtxQtCbf( eType, uiTrDepth );
    15391523  m_pcBinIf->encodeBin( uiCbf , m_cCUQtCbfSCModel.get( 0, eType ? TEXT_CHROMA : eType, uiCtx ) );
     1524#if !H_MV_ENC_DEC_TRAC
    15401525  DTRACE_CABAC_VL( g_nSymbolCounter++ )
    15411526  DTRACE_CABAC_T( "\tparseQtCbf()" )
     
    15491534  DTRACE_CABAC_V( uiAbsPartIdx )
    15501535  DTRACE_CABAC_T( "\n" )
    1551 }
    1552 
    1553 /** Code I_PCM information.
     1536#endif
     1537}
     1538
     1539void TEncSbac::codeTransformSkipFlags (TComDataCU* pcCU, UInt uiAbsPartIdx, UInt width, UInt height, TextType eTType )
     1540{
     1541  if (pcCU->getCUTransquantBypass(uiAbsPartIdx))
     1542  {
     1543    return;
     1544  }
     1545  if(width != 4 || height != 4)
     1546  {
     1547    return;
     1548  }
     1549
     1550  UInt useTransformSkip = pcCU->getTransformSkip( uiAbsPartIdx,eTType);
     1551  m_pcBinIf->encodeBin( useTransformSkip, m_cTransformSkipSCModel.get( 0, eTType? TEXT_CHROMA: TEXT_LUMA, 0 ) );
     1552#if !H_MV_ENC_DEC_TRAC
     1553  DTRACE_CABAC_VL( g_nSymbolCounter++ )
     1554  DTRACE_CABAC_T("\tparseTransformSkip()");
     1555  DTRACE_CABAC_T( "\tsymbol=" )
     1556  DTRACE_CABAC_V( useTransformSkip )
     1557  DTRACE_CABAC_T( "\tAddr=" )
     1558  DTRACE_CABAC_V( pcCU->getAddr() )
     1559  DTRACE_CABAC_T( "\tetype=" )
     1560  DTRACE_CABAC_V( eTType )
     1561  DTRACE_CABAC_T( "\tuiAbsPartIdx=" )
     1562  DTRACE_CABAC_V( uiAbsPartIdx )
     1563  DTRACE_CABAC_T( "\n" )
     1564#endif
     1565}
     1566
     1567/** Code I_PCM information.
    15541568 * \param pcCU pointer to CU
    15551569 * \param uiAbsPartIdx CU index
    1556  * \param numIPCM the number of succesive IPCM blocks with the same size
    1557  * \param firstIPCMFlag
    15581570 * \returns Void
    15591571 */
    1560 Void TEncSbac::codeIPCMInfo( TComDataCU* pcCU, UInt uiAbsPartIdx, Int numIPCM, Bool firstIPCMFlag)
     1572Void TEncSbac::codeIPCMInfo( TComDataCU* pcCU, UInt uiAbsPartIdx )
    15611573{
    15621574  UInt uiIPCM = (pcCU->getIPCMFlag(uiAbsPartIdx) == true)? 1 : 0;
     
    15641576  Bool writePCMSampleFlag = pcCU->getIPCMFlag(uiAbsPartIdx);
    15651577
    1566   if( uiIPCM == 0 || firstIPCMFlag)
    1567   {
    1568     m_pcBinIf->encodeBinTrm (uiIPCM);
    1569 
    1570     if ( firstIPCMFlag )
    1571     {
    1572       m_pcBinIf->encodeNumSubseqIPCM( numIPCM - 1 );
    1573       m_pcBinIf->encodePCMAlignBits();
    1574     }
    1575   }
    1576 
     1578  m_pcBinIf->encodeBinTrm (uiIPCM);
     1579#if H_MV_ENC_DEC_TRAC         
     1580  DTRACE_CU("pcm_flag", uiIPCM)
     1581#endif
    15771582  if (writePCMSampleFlag)
    15781583  {
     1584    m_pcBinIf->encodePCMAlignBits();
     1585
    15791586    UInt uiMinCoeffSize = pcCU->getPic()->getMinCUWidth()*pcCU->getPic()->getMinCUHeight();
    15801587    UInt uiLumaOffset   = uiMinCoeffSize*uiAbsPartIdx;
     
    16331640      piPCMSample += uiWidth;
    16341641    }
    1635     numIPCM--;
    1636     if(numIPCM == 0)
    1637     {
    1638       m_pcBinIf->resetBac();
    1639     }
     1642    m_pcBinIf->resetBac();
    16401643  }
    16411644}
     
    16461649  UInt uiCtx = 0;
    16471650  m_pcBinIf->encodeBin( uiCbf , m_cCUQtRootCbfSCModel.get( 0, 0, uiCtx ) );
     1651#if !H_MV_ENC_DEC_TRAC
    16481652  DTRACE_CABAC_VL( g_nSymbolCounter++ )
    16491653  DTRACE_CABAC_T( "\tparseQtRootCbf()" )
     
    16551659  DTRACE_CABAC_V( uiAbsPartIdx )
    16561660  DTRACE_CABAC_T( "\n" )
     1661#else
     1662  DTRACE_CU( "rqt_root_cbf", uiCbf )
     1663#endif
     1664}
     1665
     1666Void TEncSbac::codeQtCbfZero( TComDataCU* pcCU, TextType eType, UInt uiTrDepth )
     1667{
     1668  // this function is only used to estimate the bits when cbf is 0
     1669  // and will never be called when writing the bistream. do not need to write log
     1670  UInt uiCbf = 0;
     1671  UInt uiCtx = pcCU->getCtxQtCbf( eType, uiTrDepth );
     1672  m_pcBinIf->encodeBin( uiCbf , m_cCUQtCbfSCModel.get( 0, eType ? TEXT_CHROMA : eType, uiCtx ) );
     1673}
     1674
     1675Void TEncSbac::codeQtRootCbfZero( TComDataCU* pcCU )
     1676{
     1677  // this function is only used to estimate the bits when cbf is 0
     1678  // and will never be called when writing the bistream. do not need to write log
     1679  UInt uiCbf = 0;
     1680  UInt uiCtx = 0;
     1681  m_pcBinIf->encodeBin( uiCbf , m_cCUQtRootCbfSCModel.get( 0, 0, uiCtx ) );
    16571682}
    16581683
     
    16801705  UInt uiGroupIdxY    = g_uiGroupIdx[ uiPosY ];
    16811706
     1707
     1708  Int blkSizeOffsetX, blkSizeOffsetY, shiftX, shiftY;
     1709  blkSizeOffsetX = eTType ? 0: (g_aucConvertToBit[ width ] *3 + ((g_aucConvertToBit[ width ] +1)>>2));
     1710  blkSizeOffsetY = eTType ? 0: (g_aucConvertToBit[ height ]*3 + ((g_aucConvertToBit[ height ]+1)>>2));
     1711  shiftX= eTType ? g_aucConvertToBit[ width  ] :((g_aucConvertToBit[ width  ]+3)>>2);
     1712  shiftY= eTType ? g_aucConvertToBit[ height ] :((g_aucConvertToBit[ height ]+3)>>2);
    16821713  // posX
    1683   Int widthCtx = eTType? 4: width;
    1684   const UInt *puiCtxIdxX = g_uiLastCtx + ( g_aucConvertToBit[ widthCtx ] * ( g_aucConvertToBit[ widthCtx ] + 3 ) );
    16851714  for( uiCtxLast = 0; uiCtxLast < uiGroupIdxX; uiCtxLast++ )
    16861715  {
    1687     if (eTType)
    1688     {
    1689       m_pcBinIf->encodeBin( 1, *( pCtxX + (uiCtxLast>>g_aucConvertToBit[ width ]) ) );
    1690     }
    1691     else
    1692     {
    1693       m_pcBinIf->encodeBin( 1, *( pCtxX + puiCtxIdxX[ uiCtxLast ] ) );
    1694     }
     1716      m_pcBinIf->encodeBin( 1, *( pCtxX + blkSizeOffsetX + (uiCtxLast >>shiftX) ) );
    16951717  }
    16961718  if( uiGroupIdxX < g_uiGroupIdx[ width - 1 ])
    16971719  {
    1698     if ( eTType )
    1699     {
    1700       m_pcBinIf->encodeBin( 0, *( pCtxX + (uiCtxLast>>g_aucConvertToBit[ width ]) ) );
    1701     }
    1702     else
    1703     {
    1704       m_pcBinIf->encodeBin( 0, *( pCtxX + puiCtxIdxX[ uiCtxLast ] ) );
    1705     }
     1720      m_pcBinIf->encodeBin( 0, *( pCtxX + blkSizeOffsetX + (uiCtxLast >>shiftX) ) );
    17061721  }
    17071722
    17081723  // posY
    1709   Int heightCtx = eTType? 4: height;
    1710   const UInt *puiCtxIdxY = g_uiLastCtx + ( g_aucConvertToBit[ heightCtx ] * ( g_aucConvertToBit[ heightCtx ] + 3 ) );
    17111724  for( uiCtxLast = 0; uiCtxLast < uiGroupIdxY; uiCtxLast++ )
    17121725  {
    1713     if (eTType)
    1714     {
    1715       m_pcBinIf->encodeBin( 1, *( pCtxY + (uiCtxLast>>g_aucConvertToBit[ height ])));
    1716     }
    1717     else
    1718     {
    1719       m_pcBinIf->encodeBin( 1, *( pCtxY + puiCtxIdxY[ uiCtxLast ] ) );
    1720     }
     1726    m_pcBinIf->encodeBin( 1, *( pCtxY + blkSizeOffsetY + (uiCtxLast >>shiftY) ) );
    17211727  }
    17221728  if( uiGroupIdxY < g_uiGroupIdx[ height - 1 ])
    17231729  {
    1724     if (eTType)
    1725     {
    1726       m_pcBinIf->encodeBin( 0, *( pCtxY + (uiCtxLast>>g_aucConvertToBit[ height ]) ) );
    1727     }
    1728     else
    1729     {
    1730       m_pcBinIf->encodeBin( 0, *( pCtxY + puiCtxIdxY[ uiCtxLast ] ) );
    1731     }
    1732     }
     1730    m_pcBinIf->encodeBin( 0, *( pCtxY + blkSizeOffsetY + (uiCtxLast >>shiftY) ) );
     1731  }
    17331732  if ( uiGroupIdxX > 3 )
    17341733  {     
     
    17531752Void TEncSbac::codeCoeffNxN( TComDataCU* pcCU, TCoeff* pcCoef, UInt uiAbsPartIdx, UInt uiWidth, UInt uiHeight, UInt uiDepth, TextType eTType )
    17541753{
     1754#if !H_MV_ENC_DEC_TRAC
    17551755  DTRACE_CABAC_VL( g_nSymbolCounter++ )
    17561756  DTRACE_CABAC_T( "\tparseCoeffNxN()\teType=" )
     
    17771777  DTRACE_CABAC_V(  pcCU->getPredictionMode( uiAbsPartIdx ) )
    17781778  DTRACE_CABAC_T( "\n" )
    1779 
     1779#endif
    17801780  if( uiWidth > m_pcSlice->getSPS()->getMaxTrSize() )
    17811781  {
     
    17911791  if ( uiNumSig == 0 )
    17921792    return;
    1793  
     1793  if(pcCU->getSlice()->getPPS()->getUseTransformSkip())
     1794  {
     1795    codeTransformSkipFlags( pcCU,uiAbsPartIdx, uiWidth, uiHeight, eTType );
     1796  }
    17941797  eTType = eTType == TEXT_LUMA ? TEXT_LUMA : ( eTType == TEXT_NONE ? TEXT_NONE : TEXT_CHROMA );
    17951798 
    17961799  //----- encode significance map -----
    1797   const UInt   uiLog2BlockSize   = g_aucConvertToBit[ uiWidth ] + 2;
     1800  const UInt   uiLog2BlockSize = g_aucConvertToBit[ uiWidth ] + 2;
    17981801  UInt uiScanIdx = pcCU->getCoefScanIdx(uiAbsPartIdx, uiWidth, eTType==TEXT_LUMA, pcCU->isIntra(uiAbsPartIdx));
    1799   if (uiScanIdx == SCAN_ZIGZAG)
    1800   {
    1801     // Map zigzag to diagonal scan
    1802     uiScanIdx = SCAN_DIAG;
    1803   }
    1804   Int blockType = uiLog2BlockSize;
    1805   if (uiWidth != uiHeight)
    1806   {
    1807     uiScanIdx = SCAN_DIAG;
    1808     blockType = 4;
    1809   }
    1810  
    1811   const UInt * scan;
    1812   if (uiWidth == uiHeight)
    1813   {
    1814     scan = g_auiSigLastScan[ uiScanIdx ][ uiLog2BlockSize - 1 ];
    1815   }
    1816   else
    1817   {
    1818     scan = g_sigScanNSQT[ uiLog2BlockSize - 2 ];
    1819   }
    1820  
    1821   UInt const tsig = pcCU->getSlice()->getPPS()->getTSIG();
    1822 #if LOSSLESS_CODING
    1823   Bool beValid;
    1824   if (pcCU->isLosslessCoded(uiAbsPartIdx))
     1802  const UInt *scan = g_auiSigLastScan[ uiScanIdx ][ uiLog2BlockSize - 1 ];
     1803 
     1804  Bool beValid;
     1805  if (pcCU->getCUTransquantBypass(uiAbsPartIdx))
    18251806  {
    18261807    beValid = false;
     
    18301811    beValid = pcCU->getSlice()->getPPS()->getSignHideFlag() > 0;
    18311812  }
    1832 #else
    1833   Bool beValid = pcCU->getSlice()->getPPS()->getSignHideFlag() > 0;
    1834 #endif
    18351813
    18361814  // Find position of last coefficient
     
    18391817
    18401818  const UInt * scanCG;
    1841   if (uiWidth == uiHeight)
    18421819  {
    18431820    scanCG = g_auiSigLastScan[ uiScanIdx ][ uiLog2BlockSize > 3 ? uiLog2BlockSize-2-1 : 0 ];
     
    18501827      scanCG = g_sigLastScanCG32x32;
    18511828    }
    1852   }
    1853   else
    1854   {
    1855     scanCG = g_sigCGScanNSQT[ uiLog2BlockSize - 2 ];
    18561829  }
    18571830  UInt uiSigCoeffGroupFlag[ MLS_GRP_NUM ];
     
    18691842      UInt uiPosX    = posLast - ( uiPosY << uiLog2BlockSize );
    18701843      UInt uiBlkIdx  = uiNumBlkSide * (uiPosY >> uiShift) + (uiPosX >> uiShift);
    1871       if( uiWidth == 8 && uiHeight == 8 && (uiScanIdx == SCAN_HOR || uiScanIdx == SCAN_VER) )
    1872       {
    1873         if( uiScanIdx == SCAN_HOR )
    1874         {
    1875           uiBlkIdx = uiPosY >> 1;
    1876         }
    1877         else if( uiScanIdx == SCAN_VER )
    1878         {
    1879           uiBlkIdx = uiPosX >> 1;
    1880         }
    1881       }
    18821844      if( pcCoef[ posLast ] )
    18831845      {
     
    19001862
    19011863  const Int  iLastScanSet      = scanPosLast >> LOG2_SCAN_SET_SIZE;
    1902   UInt uiNumOne                = 0;
     1864  UInt c1 = 1;
    19031865  UInt uiGoRiceParam           = 0;
    19041866  Int  iScanPosSig             = scanPosLast;
     
    19281890      Int iCGPosY   = iCGBlkPos / uiNumBlkSide;
    19291891      Int iCGPosX   = iCGBlkPos - (iCGPosY * uiNumBlkSide);
    1930       if( uiWidth == 8 && uiHeight == 8 && (uiScanIdx == SCAN_HOR || uiScanIdx == SCAN_VER) )
    1931       {
    1932         iCGPosY = (uiScanIdx == SCAN_HOR ? iCGBlkPos : 0);
    1933         iCGPosX = (uiScanIdx == SCAN_VER ? iCGBlkPos : 0);
    1934       }
    19351892      if( iSubSet == iLastScanSet || iSubSet == 0)
    19361893      {
     
    19401897      {
    19411898          UInt uiSigCoeffGroup   = (uiSigCoeffGroupFlag[ iCGBlkPos ] != 0);
    1942           UInt uiCtxSig  = TComTrQuant::getSigCoeffGroupCtxInc( uiSigCoeffGroupFlag, iCGPosX, iCGPosY, uiScanIdx, uiWidth, uiHeight );
     1899          UInt uiCtxSig  = TComTrQuant::getSigCoeffGroupCtxInc( uiSigCoeffGroupFlag, iCGPosX, iCGPosY, uiWidth, uiHeight );
    19431900          m_pcBinIf->encodeBin( uiSigCoeffGroup, baseCoeffGroupCtx[ uiCtxSig ] );
    19441901      }
     
    19471904      if( uiSigCoeffGroupFlag[ iCGBlkPos ] )
    19481905      {
     1906        Int patternSigCtx = TComTrQuant::calcPatternSigCtx( uiSigCoeffGroupFlag, iCGPosX, iCGPosY, uiWidth, uiHeight );
    19491907        UInt uiBlkPos, uiPosY, uiPosX, uiSig, uiCtxSig;
    19501908        for( ; iScanPosSig >= iSubPos; iScanPosSig-- )
     
    19561914          if( iScanPosSig > iSubPos || iSubSet == 0 || numNonZero )
    19571915          {
    1958             uiCtxSig  = TComTrQuant::getSigCtxInc( pcCoef, uiPosX, uiPosY, blockType, uiWidth, uiHeight, eTType );
     1916            uiCtxSig  = TComTrQuant::getSigCtxInc( patternSigCtx, uiScanIdx, uiPosX, uiPosY, uiLog2BlockSize, eTType );
    19591917            m_pcBinIf->encodeBin( uiSig, baseCtx[ uiCtxSig ] );
    19601918          }
     
    19791937    if( numNonZero > 0 )
    19801938    {
    1981       Bool signHidden = ( lastNZPosInCG - firstNZPosInCG >= (Int)tsig );
    1982 
    1983       UInt c1 = 1;
     1939      Bool signHidden = ( lastNZPosInCG - firstNZPosInCG >= SBH_THRESHOLD );
    19841940      UInt uiCtxSet = (iSubSet > 0 && eTType==TEXT_LUMA) ? 2 : 0;
    19851941     
    1986       if( uiNumOne > 0 )
     1942      if( c1 == 0 )
    19871943      {
    19881944        uiCtxSet++;
    19891945      }
    1990      
    1991       uiNumOne       >>= 1;
     1946      c1 = 1;
    19921947      ContextModel *baseCtxMod = ( eTType==TEXT_LUMA ) ? m_cCUOneSCModel.get( 0, 0 ) + 4 * uiCtxSet : m_cCUOneSCModel.get( 0, 0 ) + NUM_ONE_FLAG_CTX_LUMA + 4 * uiCtxSet;
    19931948     
     
    20421997          if( absCoeff[ idx ] >= baseLevel)
    20431998          {
    2044             xWriteGoRiceExGolomb( absCoeff[ idx ] - baseLevel, uiGoRiceParam );
     1999            xWriteCoefRemainExGolomb( absCoeff[ idx ] - baseLevel, uiGoRiceParam );
     2000            if(absCoeff[idx] > 3*(1<<uiGoRiceParam))
     2001            {
     2002               uiGoRiceParam = min<UInt>(uiGoRiceParam+ 1, 4);
     2003            }
    20452004          }
    20462005          if(absCoeff[ idx ] >= 2) 
    20472006          {
    20482007            iFirstCoeff2 = 0;
    2049             uiNumOne++;
    20502008          }
    20512009        }       
    20522010      }
    20532011    }
    2054     else
    2055     {
    2056       uiNumOne >>= 1;
    2057     }
    20582012  }
    20592013
     
    20612015}
    20622016
    2063 Void TEncSbac::codeAlfFlag       ( UInt uiCode )
    2064 {
    2065   UInt uiSymbol = ( ( uiCode == 0 ) ? 0 : 1 );
    2066   m_pcBinIf->encodeBin( uiSymbol, m_cALFFlagSCModel.get( 0, 0, 0 ) );
    2067 }
    2068 
    2069 Void TEncSbac::codeAlfCtrlFlag( UInt uiSymbol )
    2070 {
    2071   m_pcBinIf->encodeBin( uiSymbol, m_cCUAlfCtrlFlagSCModel.get( 0, 0, 0) );
    2072 }
    2073 
    2074 Void TEncSbac::codeAlfUvlc       ( UInt uiCode )
    2075 {
    2076   Int i;
    2077  
    2078   if ( uiCode == 0 )
    2079   {
    2080     m_pcBinIf->encodeBin( 0, m_cALFUvlcSCModel.get( 0, 0, 0 ) );
    2081   }
    2082   else
    2083   {
    2084     m_pcBinIf->encodeBin( 1, m_cALFUvlcSCModel.get( 0, 0, 0 ) );
    2085     for ( i=0; i<uiCode-1; i++ )
    2086     {
    2087       m_pcBinIf->encodeBin( 1, m_cALFUvlcSCModel.get( 0, 0, 1 ) );
    2088     }
    2089     m_pcBinIf->encodeBin( 0, m_cALFUvlcSCModel.get( 0, 0, 1 ) );
    2090   }
    2091 }
    2092 
    2093 Void TEncSbac::codeAlfSvlc       ( Int iCode )
    2094 {
    2095   Int i;
    2096  
    2097   if ( iCode == 0 )
    2098   {
    2099     m_pcBinIf->encodeBin( 0, m_cALFSvlcSCModel.get( 0, 0, 0 ) );
    2100   }
    2101   else
    2102   {
    2103     m_pcBinIf->encodeBin( 1, m_cALFSvlcSCModel.get( 0, 0, 0 ) );
    2104    
    2105     // write sign
    2106     if ( iCode > 0 )
    2107     {
    2108       m_pcBinIf->encodeBin( 0, m_cALFSvlcSCModel.get( 0, 0, 1 ) );
    2109     }
    2110     else
    2111     {
    2112       m_pcBinIf->encodeBin( 1, m_cALFSvlcSCModel.get( 0, 0, 1 ) );
    2113       iCode = -iCode;
    2114     }
    2115    
    2116     // write magnitude
    2117     for ( i=0; i<iCode-1; i++ )
    2118     {
    2119       m_pcBinIf->encodeBin( 1, m_cALFSvlcSCModel.get( 0, 0, 2 ) );
    2120     }
    2121     m_pcBinIf->encodeBin( 0, m_cALFSvlcSCModel.get( 0, 0, 2 ) );
    2122   }
    2123 }
    2124 #if LGE_SAO_MIGRATION_D0091
     2017/** code SAO offset sign
     2018 * \param code sign value
     2019 */
    21252020Void TEncSbac::codeSAOSign( UInt code )
    21262021{
     
    21552050  }
    21562051}
     2052
    21572053
    21582054/** Code SAO EO class or BO band position
     
    21912087  {
    21922088    m_pcBinIf->encodeBin( 1, m_cSaoTypeIdxSCModel.get( 0, 0, 0 ) );
    2193     m_pcBinIf->encodeBinEP( uiCode <= 4 ? 1 : 0 ); //determine edge or band
    2194   }
    2195 }
    2196 #else
    2197 Void TEncSbac::codeSaoFlag       ( UInt uiCode )
    2198 {
    2199   UInt uiSymbol = ( ( uiCode == 0 ) ? 0 : 1 );
    2200   m_pcBinIf->encodeBin( uiSymbol, m_cSaoFlagSCModel.get( 0, 0, 0 ) );
    2201 }
    2202 
    2203 Void TEncSbac::codeSaoUvlc       ( UInt uiCode )
    2204 {
    2205   Int i;
    2206 
    2207   if ( uiCode == 0 )
    2208   {
    2209     m_pcBinIf->encodeBin( 0, m_cSaoUvlcSCModel.get( 0, 0, 0 ) );
    2210   }
    2211   else
    2212   {
    2213     m_pcBinIf->encodeBin( 1, m_cSaoUvlcSCModel.get( 0, 0, 0 ) );
    2214     for ( i=0; i<uiCode-1; i++ )
    2215     {
    2216       m_pcBinIf->encodeBin( 1, m_cSaoUvlcSCModel.get( 0, 0, 1 ) );
    2217     }
    2218     m_pcBinIf->encodeBin( 0, m_cSaoUvlcSCModel.get( 0, 0, 1 ) );
    2219   }
    2220 }
    2221 
    2222 Void TEncSbac::codeSaoSvlc       ( Int iCode )
    2223 {
    2224   Int i;
    2225 
    2226   if ( iCode == 0 )
    2227   {
    2228     m_pcBinIf->encodeBin( 0, m_cSaoSvlcSCModel.get( 0, 0, 0 ) );
    2229   }
    2230   else
    2231   {
    2232     m_pcBinIf->encodeBin( 1, m_cSaoSvlcSCModel.get( 0, 0, 0 ) );
    2233 
    2234     // write sign
    2235     if ( iCode > 0 )
    2236     {
    2237       m_pcBinIf->encodeBin( 0, m_cSaoSvlcSCModel.get( 0, 0, 1 ) );
    2238     }
    2239     else
    2240     {
    2241       m_pcBinIf->encodeBin( 1, m_cSaoSvlcSCModel.get( 0, 0, 1 ) );
    2242       iCode = -iCode;
    2243     }
    2244 
    2245     // write magnitude
    2246     for ( i=0; i<iCode-1; i++ )
    2247     {
    2248       m_pcBinIf->encodeBin( 1, m_cSaoSvlcSCModel.get( 0, 0, 2 ) );
    2249     }
    2250     m_pcBinIf->encodeBin( 0, m_cSaoSvlcSCModel.get( 0, 0, 2 ) );
    2251   }
    2252 }
    2253 /** Code SAO band position
    2254  * \param uiCode
    2255  */
    2256 Void TEncSbac::codeSaoUflc       ( UInt uiCode )
    2257 {
    2258   for (Int i=0;i<5;i++)
    2259   {
    2260     m_pcBinIf->encodeBinEP ( (uiCode>>i) &0x01 );
    2261   }
    2262 }
    2263 /** Code SAO merge left flag
    2264  * \param uiCode
    2265  * \param uiCompIdx
    2266  */
    2267 Void TEncSbac::codeSaoMergeLeft       ( UInt uiCode, UInt uiCompIdx )
    2268 {
    2269   if (uiCode == 0)
    2270   {
    2271     m_pcBinIf->encodeBin(0,  m_cSaoMergeLeftSCModel.get( 0, 0, uiCompIdx ));
    2272   }
    2273   else
    2274   {
    2275     m_pcBinIf->encodeBin(1,  m_cSaoMergeLeftSCModel.get( 0, 0, uiCompIdx ));
    2276   }
    2277 }
    2278 /** Code SAO merge up flag
    2279  * \param uiCode
    2280  */
    2281 Void TEncSbac::codeSaoMergeUp       ( UInt uiCode)
    2282 {
    2283   if (uiCode == 0)
    2284   {
    2285     m_pcBinIf->encodeBin(0,  m_cSaoMergeUpSCModel.get( 0, 0, 0 ));
    2286   }
    2287   else
    2288   {
    2289     m_pcBinIf->encodeBin(1,  m_cSaoMergeUpSCModel.get( 0, 0, 0 ));
    2290   }
    2291 }
    2292 /** Code SAO type index
    2293  * \param uiCode
    2294  */
    2295 Void TEncSbac::codeSaoTypeIdx       ( UInt uiCode)
    2296 {
    2297   Int i;
    2298   if ( uiCode == 0 )
    2299   {
    2300     m_pcBinIf->encodeBin( 0, m_cSaoTypeIdxSCModel.get( 0, 0, 0 ) );
    2301   }
    2302   else
    2303   {
    2304     m_pcBinIf->encodeBin( 1, m_cSaoTypeIdxSCModel.get( 0, 0, 0 ) );
    2305     for ( i=0; i<uiCode-1; i++ )
    2306     {
    2307       m_pcBinIf->encodeBin( 1, m_cSaoTypeIdxSCModel.get( 0, 0, 1 ) );
    2308     }
    2309     m_pcBinIf->encodeBin( 0, m_cSaoTypeIdxSCModel.get( 0, 0, 1 ) );
    2310   }
    2311 }
    2312 #endif
     2089    m_pcBinIf->encodeBinEP( uiCode <= 4 ? 1 : 0 );
     2090  }
     2091}
    23132092/*!
    23142093 ****************************************************************************
     
    23192098Void TEncSbac::estBit( estBitsSbacStruct* pcEstBitsSbac, Int width, Int height, TextType eTType )
    23202099{
    2321   estCBFBit( pcEstBitsSbac, 0, eTType );
    2322 
    2323   estSignificantCoeffGroupMapBit( pcEstBitsSbac, 0, eTType );
     2100  estCBFBit( pcEstBitsSbac );
     2101
     2102  estSignificantCoeffGroupMapBit( pcEstBitsSbac, eTType );
    23242103 
    23252104  // encode significance map
     
    23272106 
    23282107  // encode significant coefficients
    2329   estSignificantCoefficientsBit( pcEstBitsSbac, 0, eTType );
     2108  estSignificantCoefficientsBit( pcEstBitsSbac, eTType );
    23302109}
    23312110
     
    23362115 ****************************************************************************
    23372116 */
    2338 Void TEncSbac::estCBFBit( estBitsSbacStruct* pcEstBitsSbac, UInt uiCTXIdx, TextType eTType )
     2117Void TEncSbac::estCBFBit( estBitsSbacStruct* pcEstBitsSbac )
    23392118{
    23402119  ContextModel *pCtx = m_cCUQtCbfSCModel.get( 0 );
     
    23622141 ****************************************************************************
    23632142 */
    2364 Void TEncSbac::estSignificantCoeffGroupMapBit( estBitsSbacStruct* pcEstBitsSbac, UInt uiCTXIdx, TextType eTType )
     2143Void TEncSbac::estSignificantCoeffGroupMapBit( estBitsSbacStruct* pcEstBitsSbac, TextType eTType )
    23652144{
    23662145  Int firstCtx = 0, numCtx = NUM_SIG_CG_FLAG_CTX;
     
    23842163Void TEncSbac::estSignificantMapBit( estBitsSbacStruct* pcEstBitsSbac, Int width, Int height, TextType eTType )
    23852164{
    2386   Int firstCtx = 0, numCtx = (eTType == TEXT_LUMA) ? 9 : 6;
    2387   if (std::max(width, height) >= 16)
    2388   {
    2389     firstCtx = (eTType == TEXT_LUMA) ? 20 : 17;
    2390     numCtx = (eTType == TEXT_LUMA) ? 7 : 4;   
     2165  Int firstCtx = 1, numCtx = 8;
     2166  if (max(width, height) >= 16)
     2167  {
     2168    firstCtx = (eTType == TEXT_LUMA) ? 21 : 12;
     2169    numCtx = (eTType == TEXT_LUMA) ? 6 : 3;
    23912170  }
    23922171  else if (width == 8)
    23932172  {
    2394     firstCtx = (eTType == TEXT_LUMA) ? 9 : 6;
    2395     numCtx = 11;
     2173    firstCtx = 9;
     2174    numCtx = (eTType == TEXT_LUMA) ? 12 : 3;
    23962175  }
    23972176 
    23982177  if (eTType == TEXT_LUMA )
    23992178  {
     2179    for( UInt bin = 0; bin < 2; bin++ )
     2180    {
     2181      pcEstBitsSbac->significantBits[ 0 ][ bin ] = m_cCUSigSCModel.get(  0, 0, 0 ).getEntropyBits( bin );
     2182    }
     2183
    24002184    for ( Int ctxIdx = firstCtx; ctxIdx < firstCtx + numCtx; ctxIdx++ )
    24012185    {
     
    24082192  else
    24092193  {
     2194    for( UInt bin = 0; bin < 2; bin++ )
     2195    {
     2196      pcEstBitsSbac->significantBits[ 0 ][ bin ] = m_cCUSigSCModel.get(  0, 0, NUM_SIG_FLAG_CTX_LUMA + 0 ).getEntropyBits( bin );
     2197    }
    24102198    for ( Int ctxIdx = firstCtx; ctxIdx < firstCtx + numCtx; ctxIdx++ )
    24112199    {
     
    24172205  }
    24182206  Int iBitsX = 0, iBitsY = 0;
    2419   const UInt *puiCtxIdx;
     2207  Int blkSizeOffsetX, blkSizeOffsetY, shiftX, shiftY;
     2208
     2209  blkSizeOffsetX = eTType ? 0: (g_aucConvertToBit[ width ] *3 + ((g_aucConvertToBit[ width ] +1)>>2));
     2210  blkSizeOffsetY = eTType ? 0: (g_aucConvertToBit[ height ]*3 + ((g_aucConvertToBit[ height ]+1)>>2));
     2211  shiftX = eTType ? g_aucConvertToBit[ width  ] :((g_aucConvertToBit[ width  ]+3)>>2);
     2212  shiftY = eTType ? g_aucConvertToBit[ height ] :((g_aucConvertToBit[ height ]+3)>>2);
     2213
    24202214  Int ctx;
    2421   Int widthCtx = eTType? 4 : width;
    2422   puiCtxIdx = g_uiLastCtx + (g_aucConvertToBit[ widthCtx ]*(g_aucConvertToBit[ widthCtx ]+3));
    24232215  ContextModel *pCtxX      = m_cCuCtxLastX.get( 0, eTType );
    24242216  for (ctx = 0; ctx < g_uiGroupIdx[ width - 1 ]; ctx++)
    24252217  {
    2426     Int ctxOffset = puiCtxIdx[ ctx ];
    2427     if (eTType)
    2428     {
    2429       Int ctxOffsetC =  ctx>>g_aucConvertToBit[ width ];
    2430       pcEstBitsSbac->lastXBits[ ctx ] = iBitsX + pCtxX[ ctxOffsetC ].getEntropyBits( 0 );
    2431       iBitsX += pCtxX[ ctxOffsetC].getEntropyBits( 1 );
    2432     }
    2433     else
    2434     {
    2435       pcEstBitsSbac->lastXBits[ ctx ] = iBitsX + pCtxX[ ctxOffset ].getEntropyBits( 0 );
    2436       iBitsX += pCtxX[ ctxOffset ].getEntropyBits( 1 );
    2437     }
    2438     }
     2218    Int ctxOffset = blkSizeOffsetX + (ctx >>shiftX);
     2219    pcEstBitsSbac->lastXBits[ ctx ] = iBitsX + pCtxX[ ctxOffset ].getEntropyBits( 0 );
     2220    iBitsX += pCtxX[ ctxOffset ].getEntropyBits( 1 );
     2221  }
    24392222  pcEstBitsSbac->lastXBits[ctx] = iBitsX;
    2440 
    2441   Int heightCtx = eTType? 4 : height;
    2442   puiCtxIdx = g_uiLastCtx + (g_aucConvertToBit[ heightCtx ]*(g_aucConvertToBit[ heightCtx ]+3));
    24432223  ContextModel *pCtxY      = m_cCuCtxLastY.get( 0, eTType );
    24442224  for (ctx = 0; ctx < g_uiGroupIdx[ height - 1 ]; ctx++)
    24452225  {
    2446     Int ctxOffset = puiCtxIdx[ ctx ];
    2447     if (eTType)
    2448     {
    2449       Int ctxOffsetC =  ctx>>g_aucConvertToBit[ height ];
    2450       pcEstBitsSbac->lastYBits[ ctx ] = iBitsY + pCtxY[ ctxOffsetC ].getEntropyBits( 0 );
    2451       iBitsY += pCtxY[ctxOffsetC].getEntropyBits( 1 );
    2452     }
    2453     else
    2454     {
    2455       pcEstBitsSbac->lastYBits[ ctx ] = iBitsY + pCtxY[ ctxOffset ].getEntropyBits( 0 );
    2456       iBitsY += pCtxY[ ctxOffset ].getEntropyBits( 1 );
    2457     }
    2458     }
     2226    Int ctxOffset = blkSizeOffsetY + (ctx >>shiftY);
     2227    pcEstBitsSbac->lastYBits[ ctx ] = iBitsY + pCtxY[ ctxOffset ].getEntropyBits( 0 );
     2228    iBitsY += pCtxY[ ctxOffset ].getEntropyBits( 1 );
     2229  }
    24592230  pcEstBitsSbac->lastYBits[ctx] = iBitsY;
    24602231}
     
    24662237 ****************************************************************************
    24672238 */
    2468 Void TEncSbac::estSignificantCoefficientsBit( estBitsSbacStruct* pcEstBitsSbac, UInt uiCTXIdx, TextType eTType )
     2239Void TEncSbac::estSignificantCoefficientsBit( estBitsSbacStruct* pcEstBitsSbac, TextType eTType )
    24692240{
    24702241  if (eTType==TEXT_LUMA)
     
    25192290}
    25202291
    2521 #if HHI_DMM_WEDGE_INTRA || HHI_DMM_PRED_TEX || (LGE_EDGE_INTRA_A0070 && LGE_EDGE_INTRA_DELTA_DC)
    2522 Void TEncSbac::xWriteExGolombLevel( UInt uiSymbol, ContextModel& rcSCModel  )
    2523 {
    2524   if( uiSymbol )
    2525   {
    2526     m_pcBinIf->encodeBin( 1, rcSCModel );
    2527     UInt uiCount = 0;
    2528     Bool bNoExGo = (uiSymbol < 13);
    2529 
    2530     while( --uiSymbol && ++uiCount < 13 )
    2531     {
    2532       m_pcBinIf->encodeBin( 1, rcSCModel );
    2533     }
    2534     if( bNoExGo )
    2535     {
    2536       m_pcBinIf->encodeBin( 0, rcSCModel );
    2537     }
    2538     else
    2539     {
    2540       xWriteEpExGolomb( uiSymbol, 0 );
    2541     }
    2542   }
    2543   else
    2544   {
    2545     m_pcBinIf->encodeBin( 0, rcSCModel );
    2546   }
    2547 
    2548   return;
    2549 }
    2550 #endif
    2551 #if HHI_DMM_WEDGE_INTRA
    2552 Void TEncSbac::xCodeWedgeFullInfo( TComDataCU* pcCU, UInt uiAbsPartIdx )
    2553 {
    2554   Int iIntraIdx = pcCU->getIntraSizeIdx(uiAbsPartIdx);
    2555   Int iBits = g_aucWedgeFullBitsListIdx[iIntraIdx];
    2556 
    2557   UInt uiTabIdx = pcCU->getWedgeFullTabIdx( uiAbsPartIdx );
    2558 
    2559   for ( Int i = 0; i < iBits; i++ )
    2560   {
    2561     m_pcBinIf->encodeBin( ( uiTabIdx >> i ) & 1, m_cDmmDataSCModel.get(0, 0, 0) );
    2562   }
    2563 }
    2564 
    2565 Void TEncSbac::xCodeWedgeFullDeltaInfo( TComDataCU* pcCU, UInt uiAbsPartIdx )
    2566 {
    2567   Int iIntraIdx = pcCU->getIntraSizeIdx(uiAbsPartIdx);
    2568   Int iBits = g_aucWedgeFullBitsListIdx[iIntraIdx];
    2569 
    2570   UInt uiTabIdx = pcCU->getWedgeFullTabIdx( uiAbsPartIdx );
    2571 
    2572   for ( Int i = 0; i < iBits; i++ )
    2573   {
    2574     m_pcBinIf->encodeBin( ( uiTabIdx >> i ) & 1, m_cDmmDataSCModel.get(0, 0, 0) );
    2575   }
    2576 
    2577   Int iDeltaDC1 = pcCU->getWedgeFullDeltaDC1( uiAbsPartIdx );
    2578   Int iDeltaDC2 = pcCU->getWedgeFullDeltaDC2( uiAbsPartIdx );
    2579 
    2580   xWriteExGolombLevel( UInt( abs( iDeltaDC1 ) ), m_cDmmDataSCModel.get(0, 0, 1) );
    2581   if ( iDeltaDC1 != 0 )
    2582   {
    2583     UInt uiSign = iDeltaDC1 > 0 ? 0 : 1;
    2584     m_pcBinIf->encodeBinEP( uiSign );
    2585   }
    2586   xWriteExGolombLevel( UInt( abs( iDeltaDC2 ) ), m_cDmmDataSCModel.get(0, 0, 1) );
    2587   if ( iDeltaDC2 != 0 )
    2588   {
    2589     UInt uiSign = iDeltaDC2 > 0 ? 0 : 1;
    2590     m_pcBinIf->encodeBinEP( uiSign );
    2591   }
    2592 }
    2593 
    2594 Void TEncSbac::xCodeWedgePredDirInfo( TComDataCU* pcCU, UInt uiAbsPartIdx )
    2595 {
    2596   if( DMM_WEDGE_PREDDIR_DELTAEND_MAX > 0 )
    2597   {
    2598     Int iDeltaEnd = pcCU->getWedgePredDirDeltaEnd( uiAbsPartIdx );
    2599     m_pcBinIf->encodeBin( (iDeltaEnd!=0), m_cDmmDataSCModel.get(0, 0, 2) );
    2600 
    2601     if( iDeltaEnd != 0 )
    2602     {
    2603       UInt uiAbsValMinus1 = abs(iDeltaEnd)-1;
    2604       m_pcBinIf->encodeBin( (uiAbsValMinus1 & 0x01),      m_cDmmDataSCModel.get(0, 0, 2) );
    2605       m_pcBinIf->encodeBin( (uiAbsValMinus1 & 0x02) >> 1, m_cDmmDataSCModel.get(0, 0, 2) );
    2606 
    2607       UInt uiSign = iDeltaEnd > 0 ? 0 : 1;
    2608       m_pcBinIf->encodeBinEP( uiSign );
    2609     }
    2610   }
    2611 }
    2612 
    2613 Void TEncSbac::xCodeWedgePredDirDeltaInfo( TComDataCU* pcCU, UInt uiAbsPartIdx )
    2614 {
    2615   if( DMM_WEDGE_PREDDIR_DELTAEND_MAX > 0 )
    2616   {
    2617     Int iDeltaEnd = pcCU->getWedgePredDirDeltaEnd( uiAbsPartIdx );
    2618     m_pcBinIf->encodeBin( (iDeltaEnd!=0), m_cDmmDataSCModel.get(0, 0, 2) );
    2619 
    2620     if( iDeltaEnd != 0 )
    2621     {
    2622       UInt uiAbsValMinus1 = abs(iDeltaEnd)-1;
    2623       m_pcBinIf->encodeBin( (uiAbsValMinus1 & 0x01),      m_cDmmDataSCModel.get(0, 0, 2) );
    2624       m_pcBinIf->encodeBin( (uiAbsValMinus1 & 0x02) >> 1, m_cDmmDataSCModel.get(0, 0, 2) );
    2625 
    2626       UInt uiSign = iDeltaEnd > 0 ? 0 : 1;
    2627       m_pcBinIf->encodeBinEP( uiSign );
    2628     }
    2629   }
    2630 
    2631   Int iDeltaDC1 = pcCU->getWedgePredDirDeltaDC1( uiAbsPartIdx );
    2632   Int iDeltaDC2 = pcCU->getWedgePredDirDeltaDC2( uiAbsPartIdx );
    2633 
    2634   xWriteExGolombLevel( UInt( abs( iDeltaDC1 ) ), m_cDmmDataSCModel.get(0, 0, 1) );
    2635   if ( iDeltaDC1 != 0 )
    2636   {
    2637     UInt uiSign = iDeltaDC1 > 0 ? 0 : 1;
    2638     m_pcBinIf->encodeBinEP( uiSign );
    2639   }
    2640   xWriteExGolombLevel( UInt( abs( iDeltaDC2 ) ), m_cDmmDataSCModel.get(0, 0, 1) );
    2641   if ( iDeltaDC2 != 0 )
    2642   {
    2643     UInt uiSign = iDeltaDC2 > 0 ? 0 : 1;
    2644     m_pcBinIf->encodeBinEP( uiSign );
    2645   }
    2646 }
    2647 #endif
    2648 #if HHI_DMM_PRED_TEX
    2649 #if LGE_DMM3_SIMP_C0044
    2650 Void TEncSbac::xCodeWedgePredTexInfo( TComDataCU* pcCU, UInt uiAbsPartIdx )
    2651 {
    2652   Int iIntraIdx = pcCU->getIntraSizeIdx(uiAbsPartIdx);
    2653   Int iBits = g_aucWedgeTexPredBitsListIdx[iIntraIdx];
    2654 
    2655   UInt uiTabIdx = pcCU->getWedgePredTexIntraTabIdx( uiAbsPartIdx );
    2656 
    2657   for ( Int i = 0; i < iBits; i++ )
    2658   {
    2659     m_pcBinIf->encodeBin( ( uiTabIdx >> i ) & 1, m_cDmmDataSCModel.get(0, 0, 3) );
    2660   }
    2661 }
    2662 #endif
    2663 
    2664 Void TEncSbac::xCodeWedgePredTexDeltaInfo( TComDataCU* pcCU, UInt uiAbsPartIdx )
    2665 {
    2666 #if LGE_DMM3_SIMP_C0044
    2667   xCodeWedgePredTexInfo( pcCU, uiAbsPartIdx );
    2668 #endif
    2669   Int iDeltaDC1 = pcCU->getWedgePredTexDeltaDC1( uiAbsPartIdx );
    2670   Int iDeltaDC2 = pcCU->getWedgePredTexDeltaDC2( uiAbsPartIdx );
    2671 
    2672   xWriteExGolombLevel( UInt( abs( iDeltaDC1 ) ), m_cDmmDataSCModel.get(0, 0, 1) );
    2673   if ( iDeltaDC1 != 0 )
    2674   {
    2675     UInt uiSign = iDeltaDC1 > 0 ? 0 : 1;
    2676     m_pcBinIf->encodeBinEP( uiSign );
    2677   }
    2678   xWriteExGolombLevel( UInt( abs( iDeltaDC2 ) ), m_cDmmDataSCModel.get(0, 0, 1) );
    2679   if ( iDeltaDC2 != 0 )
    2680   {
    2681     UInt uiSign = iDeltaDC2 > 0 ? 0 : 1;
    2682     m_pcBinIf->encodeBinEP( uiSign );
    2683   }
    2684 }
    2685 
    2686 Void TEncSbac::xCodeContourPredTexDeltaInfo( TComDataCU* pcCU, UInt uiAbsPartIdx )
    2687 {
    2688   Int iDeltaDC1 = pcCU->getContourPredTexDeltaDC1( uiAbsPartIdx );
    2689   Int iDeltaDC2 = pcCU->getContourPredTexDeltaDC2( uiAbsPartIdx );
    2690 
    2691   xWriteExGolombLevel( UInt( abs( iDeltaDC1 ) ), m_cDmmDataSCModel.get(0, 0, 1) );
    2692   if ( iDeltaDC1 != 0 )
    2693   {
    2694     UInt uiSign = iDeltaDC1 > 0 ? 0 : 1;
    2695     m_pcBinIf->encodeBinEP( uiSign );
    2696   }
    2697   xWriteExGolombLevel( UInt( abs( iDeltaDC2 ) ), m_cDmmDataSCModel.get(0, 0, 1) );
    2698   if ( iDeltaDC2 != 0 )
    2699   {
    2700     UInt uiSign = iDeltaDC2 > 0 ? 0 : 1;
    2701     m_pcBinIf->encodeBinEP( uiSign );
    2702   }
    2703 }
    2704 #endif
    2705 
    2706 #if RWTH_SDC_DLT_B0036
    2707 #if !PKU_QC_DEPTH_INTRA_UNI_D0195
    2708 Void TEncSbac::codeSDCPredMode( TComDataCU* pcCU, UInt uiAbsPartIdx )
    2709 {
    2710   assert( pcCU->getSlice()->getSPS()->isDepth() );
    2711   assert( pcCU->getPartitionSize(uiAbsPartIdx) == SIZE_2Nx2N );
    2712   assert( pcCU->getSDCFlag(uiAbsPartIdx) );
    2713  
    2714   UInt uiPredMode     = pcCU->getLumaIntraDir(uiAbsPartIdx);
    2715   UInt uiCtx          = 0;
    2716  
    2717   UInt uiMPModeIdx    = 0;
    2718  
    2719   for(Int i=0; i<RWTH_SDC_NUM_PRED_MODES-1; i++)
    2720   {
    2721     UInt uiBit = (uiPredMode == g_auiSDCPredModes[uiMPModeIdx]) ? 1 : 0;
    2722 #if INTEL_SDC64_D0193
    2723     if( !(pcCU->getWidth(uiAbsPartIdx) == 64 && i == 1))
    2724 #endif
    2725     m_pcBinIf->encodeBin( uiBit, m_cSDCPredModeSCModel.get( 0, i, uiCtx ) );
    2726    
    2727     // if mode is most probable mode, we are done here
    2728     if ( uiBit == 1 )
    2729       break;
    2730    
    2731     // else: get next most probable pred mode
    2732     uiMPModeIdx = (uiMPModeIdx+1)%RWTH_SDC_NUM_PRED_MODES;
    2733   }
    2734  
    2735 #if HHI_DMM_WEDGE_INTRA
    2736   if( uiPredMode == DMM_WEDGE_FULL_IDX )          { xCodeWedgeFullInfo          ( pcCU, uiAbsPartIdx ); }
    2737   if( uiPredMode == DMM_WEDGE_PREDDIR_IDX )       { xCodeWedgePredDirInfo       ( pcCU, uiAbsPartIdx ); }
    2738 #endif
    2739  
    2740   AOF(uiPredMode == g_auiSDCPredModes[uiMPModeIdx]);
    2741 }
    2742 
    2743 Void TEncSbac::codeSDCFlag( TComDataCU* pcCU, UInt uiAbsPartIdx )
    2744 {
    2745   // get context function is here
    2746   UInt uiSymbol = pcCU->getSDCFlag( uiAbsPartIdx ) ? 1 : 0;
    2747   UInt uiCtxSDCFlag = pcCU->getCtxSDCFlag( uiAbsPartIdx );
    2748   m_pcBinIf->encodeBin( uiSymbol, m_cSDCFlagSCModel.get( 0, 0, uiCtxSDCFlag ) );
    2749  
    2750 }
    2751 #endif
    2752 
    2753 Void TEncSbac::codeSDCResidualData ( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiSegment )
    2754 {
    2755   assert( pcCU->getSlice()->getSPS()->isDepth() );
    2756   assert( pcCU->getPartitionSize(uiAbsPartIdx) == SIZE_2Nx2N );
    2757   assert( pcCU->getSDCFlag(uiAbsPartIdx) );
    2758   assert( uiSegment < 2 );
    2759  
    2760   Pel segmentDCOffset = pcCU->getSDCSegmentDCOffset(uiSegment, uiAbsPartIdx);
    2761  
    2762   UInt uiResidual = segmentDCOffset == 0 ? 0 : 1;
     2292#if LGE_INTER_SDC_E0156
     2293Void TEncSbac::codeInterSDCFlag( TComDataCU* pcCU, UInt uiAbsPartIdx )
     2294{
     2295  UInt uiSymbol = pcCU->getInterSDCFlag( uiAbsPartIdx ) ? 1 : 0;
     2296  UInt uiCtxInterSDCFlag = pcCU->getCtxInterSDCFlag( uiAbsPartIdx );
     2297
     2298  m_pcBinIf->encodeBin( uiSymbol, m_cInterSDCFlagSCModel.get( 0, 0, uiCtxInterSDCFlag ) );
     2299}
     2300
     2301Void TEncSbac::codeInterSDCResidualData ( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiSegment )
     2302{
     2303  Pel segmentDCOffset = pcCU->getInterSDCSegmentDCOffset( uiSegment, uiAbsPartIdx );
     2304
    27632305  UInt uiSign     = segmentDCOffset < 0 ? 1 : 0;
    2764   UInt uiAbsIdx   = abs(segmentDCOffset);
    2765 #if !LGE_CONCATENATE_D0141
    2766   UInt uiBit = 0;
    2767 #endif
    2768  
    2769   UInt uiMaxResidualBits  = pcCU->getSlice()->getSPS()->getBitsPerDepthValue();
    2770   assert( uiMaxResidualBits <= g_uiBitDepth );
    2771  
    2772   // residual flag
    2773 #if RWTH_SDC_CTX_SIMPL_D0032
    2774   m_pcBinIf->encodeBin( uiResidual, m_cSDCResidualFlagSCModel.get( 0, 0, 0 ) );
    2775 #else
    2776   m_pcBinIf->encodeBin( uiResidual, m_cSDCResidualFlagSCModel.get( 0, uiSegment, 0 ) ); //TODO depthmap: more sophisticated context selection
    2777 #endif
    2778  
    2779   if (uiResidual)
    2780   {
    2781     // encode sign bit of residual
    2782 #if RWTH_SDC_CTX_SIMPL_D0032
    2783     m_pcBinIf->encodeBinEP( uiSign );
    2784 #else
    2785     m_pcBinIf->encodeBin( uiSign, m_cSDCResidualSignFlagSCModel.get( 0, uiSegment, 0 ) ); //TODO depthmap: more sophisticated context selection
    2786 #endif
    2787        
    2788     UInt uiNumDepthValues = pcCU->getSlice()->getSPS()->getNumDepthValues();
    2789     assert(uiAbsIdx < uiNumDepthValues);
    2790    
    2791     // encode residual magnitude
    2792     uiAbsIdx -= 1;
    2793 #if LGE_CONCATENATE_D0141
    2794     //prefix part
    2795     if ( uiAbsIdx == 0 )
    2796         m_pcBinIf->encodeBin( 0, m_cSDCResidualSCModel.get(0, 0, 0) );
    2797     else
    2798     {
    2799         UInt l = uiAbsIdx;
    2800         UInt k = 0;
    2801         UInt uiPrefixThreshold = ((uiNumDepthValues * 3) >> 2);
    2802         while ( l > 0 && k < uiPrefixThreshold )
    2803         {
    2804             m_pcBinIf->encodeBin( 1, m_cSDCResidualSCModel.get(0, 0, 0) );
    2805             l--;
    2806             k++;
    2807         }
    2808         if ( uiAbsIdx < uiPrefixThreshold )
    2809             m_pcBinIf->encodeBin( 0, m_cSDCResidualSCModel.get(0, 0, 0) );
    2810         //suffix part
    2811         else
    2812         {
    2813             uiAbsIdx -= uiPrefixThreshold;
    2814             UInt uiSuffixLength = ( (UInt)ceil( Log2(uiNumDepthValues - uiPrefixThreshold) ) );
    2815             UInt uiBitInfo = 0;
    2816             for ( Int i = 0; i < uiSuffixLength; i++)
    2817             {
    2818                 uiBitInfo = ( uiAbsIdx & ( 1 << i ) ) >> i;
    2819                 m_pcBinIf->encodeBinEP( uiBitInfo);
    2820             }
    2821         }
    2822     }
    2823 #else
    2824     for (Int i=0; i<uiMaxResidualBits; i++)
    2825     {
    2826       uiBit = (uiAbsIdx & (1<<i))>>i;
    2827      
    2828 #if RWTH_SDC_CTX_SIMPL_D0032
    2829       m_pcBinIf->encodeBin( uiBit, m_cSDCResidualSCModel.get( 0, 0, i ) );
    2830 #else
    2831       m_pcBinIf->encodeBin( uiBit, m_cSDCResidualSCModel.get( 0, uiSegment, i ) ); //TODO depthmap: more sophisticated context selection
    2832 #endif
    2833     }
    2834 #endif
    2835    
    2836   }
     2306  UInt uiAbsIdx   = abs( segmentDCOffset );
     2307
     2308  assert( uiAbsIdx > 0 );
     2309  uiAbsIdx--;
     2310  xWriteExGolombLevel( uiAbsIdx, m_cInterSDCResidualSCModel.get( 0, 0, 0 ) );
     2311  m_pcBinIf->encodeBin( uiSign, m_cInterSDCResidualSignFlagSCModel.get( 0, 0, 0 ) );
    28372312}
    28382313#endif
Note: See TracChangeset for help on using the changeset viewer.