source: 3DVCSoftware/branches/HTM-6.2-dev0/source/Lib/TLibEncoder/TEncSbac.cpp @ 1417

Last change on this file since 1417 was 433, checked in by tech, 12 years ago

Merged HTM-6.2-dev3-RWTH-Fix Rev. 415

  • Property svn:eol-style set to native
File size: 94.7 KB
Line 
1/* The copyright in this software is being made available under the BSD
2 * License, included below. This software may be subject to other third party
3 * and contributor rights, including patent rights, and no such rights are
4 * granted under this license. 
5 *
6 * Copyright (c) 2010-2012, ITU/ISO/IEC
7 * All rights reserved.
8 *
9 * Redistribution and use in source and binary forms, with or without
10 * modification, are permitted provided that the following conditions are met:
11 *
12 *  * Redistributions of source code must retain the above copyright notice,
13 *    this list of conditions and the following disclaimer.
14 *  * Redistributions in binary form must reproduce the above copyright notice,
15 *    this list of conditions and the following disclaimer in the documentation
16 *    and/or other materials provided with the distribution.
17 *  * Neither the name of the ITU/ISO/IEC nor the names of its contributors may
18 *    be used to endorse or promote products derived from this software without
19 *    specific prior written permission.
20 *
21 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
22 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS
25 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
26 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
27 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
28 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
29 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
30 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
31 * THE POSSIBILITY OF SUCH DAMAGE.
32 */
33
34/** \file     TEncSbac.cpp
35    \brief    SBAC encoder class
36*/
37
38#include "TEncTop.h"
39#include "TEncSbac.h"
40
41#include <map>
42#include <algorithm>
43
44//! \ingroup TLibEncoder
45//! \{
46
47// ====================================================================================================================
48// Constructor / destructor / create / destroy
49// ====================================================================================================================
50
51TEncSbac::TEncSbac()
52// new structure here
53: m_pcBitIf                   ( NULL )
54, m_pcSlice                   ( NULL )
55, m_pcBinIf                   ( NULL )
56, m_bAlfCtrl                  ( false )
57, m_uiCoeffCost               ( 0 )
58, m_uiMaxAlfCtrlDepth         ( 0 )
59, m_numContextModels          ( 0 )
60, m_cCUSplitFlagSCModel       ( 1,             1,               NUM_SPLIT_FLAG_CTX            , m_contextModels + m_numContextModels, m_numContextModels )
61, 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
65, m_cCUMergeFlagExtSCModel    ( 1,             1,               NUM_MERGE_FLAG_EXT_CTX        , m_contextModels + m_numContextModels, m_numContextModels)
66, 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)
72#endif
73, m_cCUPartSizeSCModel        ( 1,             1,               NUM_PART_SIZE_CTX             , m_contextModels + m_numContextModels, m_numContextModels)
74, 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)
76, m_cCUIntraPredSCModel       ( 1,             1,               NUM_ADI_CTX                   , m_contextModels + m_numContextModels, m_numContextModels)
77, m_cCUChromaPredSCModel      ( 1,             1,               NUM_CHROMA_PRED_CTX           , m_contextModels + m_numContextModels, m_numContextModels)
78, m_cCUDeltaQpSCModel         ( 1,             1,               NUM_DELTA_QP_CTX              , m_contextModels + m_numContextModels, m_numContextModels)
79, m_cCUInterDirSCModel        ( 1,             1,               NUM_INTER_DIR_CTX             , m_contextModels + m_numContextModels, m_numContextModels)
80, m_cCURefPicSCModel          ( 1,             1,               NUM_REF_NO_CTX                , m_contextModels + m_numContextModels, m_numContextModels)
81, m_cCUMvdSCModel             ( 1,             1,               NUM_MV_RES_CTX                , m_contextModels + m_numContextModels, m_numContextModels)
82, m_cCUQtCbfSCModel           ( 1,             2,               NUM_QT_CBF_CTX                , m_contextModels + m_numContextModels, m_numContextModels)
83, m_cCUTransSubdivFlagSCModel ( 1,             1,               NUM_TRANS_SUBDIV_FLAG_CTX     , m_contextModels + m_numContextModels, m_numContextModels)
84, m_cCUQtRootCbfSCModel       ( 1,             1,               NUM_QT_ROOT_CBF_CTX           , m_contextModels + m_numContextModels, m_numContextModels)
85, m_cCUSigCoeffGroupSCModel   ( 1,             2,               NUM_SIG_CG_FLAG_CTX           , m_contextModels + m_numContextModels, m_numContextModels)
86, m_cCUSigSCModel             ( 1,             1,               NUM_SIG_FLAG_CTX              , m_contextModels + m_numContextModels, m_numContextModels)
87, m_cCuCtxLastX               ( 1,             2,               NUM_CTX_LAST_FLAG_XY          , m_contextModels + m_numContextModels, m_numContextModels)
88, m_cCuCtxLastY               ( 1,             2,               NUM_CTX_LAST_FLAG_XY          , m_contextModels + m_numContextModels, m_numContextModels)
89, m_cCUOneSCModel             ( 1,             1,               NUM_ONE_FLAG_CTX              , m_contextModels + m_numContextModels, m_numContextModels)
90, m_cCUAbsSCModel             ( 1,             1,               NUM_ABS_FLAG_CTX              , m_contextModels + m_numContextModels, m_numContextModels)
91, 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)
95, 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)
98, 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
137#endif
138{
139  assert( m_numContextModels <= MAX_NUM_CTX_MOD );
140  m_iSliceGranularity = 0;
141}
142
143TEncSbac::~TEncSbac()
144{
145}
146
147// ====================================================================================================================
148// Public member functions
149// ====================================================================================================================
150
151Void TEncSbac::resetEntropy           ()
152{
153  Int  iQp              = m_pcSlice->getSliceQp();
154  SliceType eSliceType  = m_pcSlice->getSliceType();
155 
156#if CABAC_INIT_FLAG
157  Int  encCABACTableIdx = m_pcSlice->getPPS()->getEncCABACTableIdx();
158  if (!m_pcSlice->isIntra() && (encCABACTableIdx==B_SLICE || encCABACTableIdx==P_SLICE) && m_pcSlice->getPPS()->getCabacInitPresentFlag())
159  {
160    eSliceType = (SliceType) encCABACTableIdx;
161  }
162#endif
163
164  m_cCUSplitFlagSCModel.initBuffer       ( eSliceType, iQp, (UChar*)INIT_SPLIT_FLAG );
165 
166  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 );
171  m_cCUMergeFlagExtSCModel.initBuffer    ( eSliceType, iQp, (UChar*)INIT_MERGE_FLAG_EXT);
172  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 );
178#endif
179  m_cCUPartSizeSCModel.initBuffer        ( eSliceType, iQp, (UChar*)INIT_PART_SIZE );
180  m_cCUAMPSCModel.initBuffer             ( eSliceType, iQp, (UChar*)INIT_CU_AMP_POS );
181  m_cCUPredModeSCModel.initBuffer        ( eSliceType, iQp, (UChar*)INIT_PRED_MODE );
182  m_cCUIntraPredSCModel.initBuffer       ( eSliceType, iQp, (UChar*)INIT_INTRA_PRED_MODE );
183  m_cCUChromaPredSCModel.initBuffer      ( eSliceType, iQp, (UChar*)INIT_CHROMA_PRED_MODE );
184  m_cCUInterDirSCModel.initBuffer        ( eSliceType, iQp, (UChar*)INIT_INTER_DIR );
185  m_cCUMvdSCModel.initBuffer             ( eSliceType, iQp, (UChar*)INIT_MVD );
186  m_cCURefPicSCModel.initBuffer          ( eSliceType, iQp, (UChar*)INIT_REF_PIC );
187  m_cCUDeltaQpSCModel.initBuffer         ( eSliceType, iQp, (UChar*)INIT_DQP );
188  m_cCUQtCbfSCModel.initBuffer           ( eSliceType, iQp, (UChar*)INIT_QT_CBF );
189  m_cCUQtRootCbfSCModel.initBuffer       ( eSliceType, iQp, (UChar*)INIT_QT_ROOT_CBF );
190  m_cCUSigCoeffGroupSCModel.initBuffer   ( eSliceType, iQp, (UChar*)INIT_SIG_CG_FLAG );
191  m_cCUSigSCModel.initBuffer             ( eSliceType, iQp, (UChar*)INIT_SIG_FLAG );
192  m_cCuCtxLastX.initBuffer               ( eSliceType, iQp, (UChar*)INIT_LAST );
193  m_cCuCtxLastY.initBuffer               ( eSliceType, iQp, (UChar*)INIT_LAST );
194  m_cCUOneSCModel.initBuffer             ( eSliceType, iQp, (UChar*)INIT_ONE_FLAG );
195  m_cCUAbsSCModel.initBuffer             ( eSliceType, iQp, (UChar*)INIT_ABS_FLAG );
196  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 );
200  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 );
203  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
240  // new structure
241  m_uiLastQp = iQp;
242 
243  m_pcBinIf->start();
244 
245  return;
246}
247
248#if CABAC_INIT_FLAG
249/** The function does the following:
250 * If current slice type is P/B then it determines the distance of initialisation type 1 and 2 from the current CABAC states and
251 * stores the index of the closest table.  This index is used for the next P/B slice when cabac_init_present_flag is true.
252 */
253Void TEncSbac::determineCabacInitIdx()
254{
255  Int  qp              = m_pcSlice->getSliceQp();
256
257  if (!m_pcSlice->isIntra())
258  {
259    SliceType aSliceTypeChoices[] = {B_SLICE, P_SLICE};
260
261    UInt bestCost             = MAX_UINT;
262    SliceType bestSliceType   = aSliceTypeChoices[0];
263    for (UInt idx=0; idx<2; idx++)
264    {
265      UInt curCost          = 0;
266      SliceType curSliceType  = aSliceTypeChoices[idx];
267
268      curCost  = m_cCUSplitFlagSCModel.calcCost       ( curSliceType, qp, (UChar*)INIT_SPLIT_FLAG );
269      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 );
274      curCost += m_cCUMergeFlagExtSCModel.calcCost    ( curSliceType, qp, (UChar*)INIT_MERGE_FLAG_EXT);
275      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);
278#endif
279      curCost += m_cCUPartSizeSCModel.calcCost        ( curSliceType, qp, (UChar*)INIT_PART_SIZE );
280      curCost += m_cCUAMPSCModel.calcCost             ( curSliceType, qp, (UChar*)INIT_CU_AMP_POS );
281      curCost += m_cCUPredModeSCModel.calcCost        ( curSliceType, qp, (UChar*)INIT_PRED_MODE );
282      curCost += m_cCUIntraPredSCModel.calcCost       ( curSliceType, qp, (UChar*)INIT_INTRA_PRED_MODE );
283      curCost += m_cCUChromaPredSCModel.calcCost      ( curSliceType, qp, (UChar*)INIT_CHROMA_PRED_MODE );
284      curCost += m_cCUInterDirSCModel.calcCost        ( curSliceType, qp, (UChar*)INIT_INTER_DIR );
285      curCost += m_cCUMvdSCModel.calcCost             ( curSliceType, qp, (UChar*)INIT_MVD );
286      curCost += m_cCURefPicSCModel.calcCost          ( curSliceType, qp, (UChar*)INIT_REF_PIC );
287      curCost += m_cCUDeltaQpSCModel.calcCost         ( curSliceType, qp, (UChar*)INIT_DQP );
288      curCost += m_cCUQtCbfSCModel.calcCost           ( curSliceType, qp, (UChar*)INIT_QT_CBF );
289      curCost += m_cCUQtRootCbfSCModel.calcCost       ( curSliceType, qp, (UChar*)INIT_QT_ROOT_CBF );
290      curCost += m_cCUSigCoeffGroupSCModel.calcCost   ( curSliceType, qp, (UChar*)INIT_SIG_CG_FLAG );
291      curCost += m_cCUSigSCModel.calcCost             ( curSliceType, qp, (UChar*)INIT_SIG_FLAG );
292      curCost += m_cCuCtxLastX.calcCost               ( curSliceType, qp, (UChar*)INIT_LAST );
293      curCost += m_cCuCtxLastY.calcCost               ( curSliceType, qp, (UChar*)INIT_LAST );
294      curCost += m_cCUOneSCModel.calcCost             ( curSliceType, qp, (UChar*)INIT_ONE_FLAG );
295      curCost += m_cCUAbsSCModel.calcCost             ( curSliceType, qp, (UChar*)INIT_ABS_FLAG );
296      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 );
300      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 );
303      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
313      if (curCost < bestCost)
314      {
315        bestSliceType = curSliceType;
316        bestCost      = curCost;
317      }
318    }
319    m_pcSlice->getPPS()->setEncCABACTableIdx( bestSliceType );
320  }
321  else
322  {
323    m_pcSlice->getPPS()->setEncCABACTableIdx( I_SLICE );
324  } 
325
326  #if CABAC_INIT_FLAG && FIX_POZNAN_CABAC_INIT_FLAG
327    m_pcSlice->getPPS()->setEncPrevPOC( m_pcSlice->getPOC() );
328  #endif
329}
330#endif
331
332
333/** The function does the followng: Write out terminate bit. Flush CABAC. Intialize CABAC states. Start CABAC.
334 */
335Void TEncSbac::updateContextTables( SliceType eSliceType, Int iQp, Bool bExecuteFinish )
336{
337  m_pcBinIf->encodeBinTrm(1);
338  if (bExecuteFinish) m_pcBinIf->finish();
339  m_cCUSplitFlagSCModel.initBuffer       ( eSliceType, iQp, (UChar*)INIT_SPLIT_FLAG );
340 
341  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 );
346  m_cCUMergeFlagExtSCModel.initBuffer    ( eSliceType, iQp, (UChar*)INIT_MERGE_FLAG_EXT);
347  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 );
353#endif
354  m_cCUPartSizeSCModel.initBuffer        ( eSliceType, iQp, (UChar*)INIT_PART_SIZE );
355  m_cCUAMPSCModel.initBuffer             ( eSliceType, iQp, (UChar*)INIT_CU_AMP_POS );
356  m_cCUPredModeSCModel.initBuffer        ( eSliceType, iQp, (UChar*)INIT_PRED_MODE );
357  m_cCUIntraPredSCModel.initBuffer       ( eSliceType, iQp, (UChar*)INIT_INTRA_PRED_MODE );
358  m_cCUChromaPredSCModel.initBuffer      ( eSliceType, iQp, (UChar*)INIT_CHROMA_PRED_MODE );
359  m_cCUInterDirSCModel.initBuffer        ( eSliceType, iQp, (UChar*)INIT_INTER_DIR );
360  m_cCUMvdSCModel.initBuffer             ( eSliceType, iQp, (UChar*)INIT_MVD );
361  m_cCURefPicSCModel.initBuffer          ( eSliceType, iQp, (UChar*)INIT_REF_PIC );
362  m_cCUDeltaQpSCModel.initBuffer         ( eSliceType, iQp, (UChar*)INIT_DQP );
363  m_cCUQtCbfSCModel.initBuffer           ( eSliceType, iQp, (UChar*)INIT_QT_CBF );
364  m_cCUQtRootCbfSCModel.initBuffer       ( eSliceType, iQp, (UChar*)INIT_QT_ROOT_CBF );
365  m_cCUSigCoeffGroupSCModel.initBuffer   ( eSliceType, iQp, (UChar*)INIT_SIG_CG_FLAG );
366  m_cCUSigSCModel.initBuffer             ( eSliceType, iQp, (UChar*)INIT_SIG_FLAG );
367  m_cCuCtxLastX.initBuffer               ( eSliceType, iQp, (UChar*)INIT_LAST );
368  m_cCuCtxLastY.initBuffer               ( eSliceType, iQp, (UChar*)INIT_LAST );
369  m_cCUOneSCModel.initBuffer             ( eSliceType, iQp, (UChar*)INIT_ONE_FLAG );
370  m_cCUAbsSCModel.initBuffer             ( eSliceType, iQp, (UChar*)INIT_ABS_FLAG );
371  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 );
375  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 );
378  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 
409  m_pcBinIf->start();
410}
411
412Void 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
420void TEncSbac::codeSEI(const SEI&)
421{
422  assert(0);
423}
424
425#if VIDYO_VPS_INTEGRATION|QC_MVHEVC_B0046
426Void TEncSbac::codeVPS( TComVPS* pcVPS )
427{
428  assert (0);
429  return;
430}
431#endif
432
433#if HHI_MPI || H3D_QTL
434Void TEncSbac::codeSPS( TComSPS* pcSPS, Bool bIsDepth )
435#else
436Void TEncSbac::codeSPS( TComSPS* pcSPS )
437#endif
438{
439  assert (0);
440  return;
441}
442
443Void TEncSbac::codePPS( TComPPS* pcPPS )
444{
445  assert (0);
446  return;
447}
448
449Void TEncSbac::codeSliceHeader( TComSlice* pcSlice )
450{
451  assert (0);
452  return;
453}
454
455Void TEncSbac::codeTilesWPPEntryPoint( TComSlice* pSlice )
456{
457  assert (0);
458  return;
459}
460
461Void TEncSbac::codeTerminatingBit( UInt uilsLast )
462{
463  m_pcBinIf->encodeBinTrm( uilsLast );
464}
465
466Void TEncSbac::codeSliceFinish()
467{
468  m_pcBinIf->finish();
469}
470
471Void TEncSbac::codeFlush()
472{
473  m_pcBinIf->flush();
474}
475
476Void TEncSbac::encodeStart()
477{
478  m_pcBinIf->start();
479}
480
481Void TEncSbac::xWriteUnarySymbol( UInt uiSymbol, ContextModel* pcSCModel, Int iOffset )
482{
483  m_pcBinIf->encodeBin( uiSymbol ? 1 : 0, pcSCModel[0] );
484 
485  if( 0 == uiSymbol)
486  {
487    return;
488  }
489 
490  while( uiSymbol-- )
491  {
492    m_pcBinIf->encodeBin( uiSymbol ? 1 : 0, pcSCModel[ iOffset ] );
493  }
494 
495  return;
496}
497
498Void TEncSbac::xWriteUnaryMaxSymbol( UInt uiSymbol, ContextModel* pcSCModel, Int iOffset, UInt uiMaxSymbol )
499{
500  if (uiMaxSymbol == 0)
501  {
502    return;
503  }
504 
505  m_pcBinIf->encodeBin( uiSymbol ? 1 : 0, pcSCModel[ 0 ] );
506 
507  if ( uiSymbol == 0 )
508  {
509    return;
510  }
511 
512  Bool bCodeLast = ( uiMaxSymbol > uiSymbol );
513 
514  while( --uiSymbol )
515  {
516    m_pcBinIf->encodeBin( 1, pcSCModel[ iOffset ] );
517  }
518  if( bCodeLast )
519  {
520    m_pcBinIf->encodeBin( 0, pcSCModel[ iOffset ] );
521  }
522 
523  return;
524}
525
526Void TEncSbac::xWriteEpExGolomb( UInt uiSymbol, UInt uiCount )
527{
528  UInt bins = 0;
529  Int numBins = 0;
530 
531  while( uiSymbol >= (UInt)(1<<uiCount) )
532  {
533    bins = 2 * bins + 1;
534    numBins++;
535    uiSymbol -= 1 << uiCount;
536    uiCount  ++;
537  }
538  bins = 2 * bins + 0;
539  numBins++;
540 
541  bins = (bins << uiCount) | uiSymbol;
542  numBins += uiCount;
543 
544  assert( numBins <= 32 );
545  m_pcBinIf->encodeBinsEP( bins, numBins );
546}
547
548/** Coding of coeff_abs_level_minus3
549 * \param uiSymbol value of coeff_abs_level_minus3
550 * \param ruiGoRiceParam reference to Rice parameter
551 * \returns Void
552 */
553Void 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;
568  }
569  else
570  {
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}
585
586// SBAC RD
587Void  TEncSbac::load ( TEncSbac* pSrc)
588{
589  this->xCopyFrom(pSrc);
590}
591
592Void  TEncSbac::loadIntraDirModeLuma( TEncSbac* pSrc)
593{
594  m_pcBinIf->copyState( pSrc->m_pcBinIf );
595 
596  this->m_cCUIntraPredSCModel      .copyFrom( &pSrc->m_cCUIntraPredSCModel       );
597}
598
599#if PKU_QC_DEPTH_INTRA_UNI_D0195
600Void TEncSbac::loadDepthMode( TEncSbac* pSrc)
601{
602  m_pcBinIf->copyState( pSrc->m_pcBinIf );
603
604  this->m_cDepthModeModel      .copyFrom( &pSrc->m_cDepthModeModel       );
605  this->m_cDmmDeltaFlagModel   .copyFrom( &pSrc->m_cDmmDeltaFlagModel       );
606}
607#endif
608Void  TEncSbac::store( TEncSbac* pDest)
609{
610  pDest->xCopyFrom( this );
611}
612
613
614Void TEncSbac::xCopyFrom( TEncSbac* pSrc )
615{
616  m_pcBinIf->copyState( pSrc->m_pcBinIf );
617 
618  this->m_uiCoeffCost = pSrc->m_uiCoeffCost;
619  this->m_uiLastQp    = pSrc->m_uiLastQp;
620 
621  memcpy( m_contextModels, pSrc->m_contextModels, m_numContextModels * sizeof( ContextModel ) );
622}
623
624#if H3D_IVMP
625Void TEncSbac::codeMVPIdx ( TComDataCU* pcCU, UInt uiAbsPartIdx, RefPicList eRefList, Int iNum )
626#else
627Void TEncSbac::codeMVPIdx ( TComDataCU* pcCU, UInt uiAbsPartIdx, RefPicList eRefList )
628#endif
629{
630  Int iSymbol = pcCU->getMVPIdx(eRefList, uiAbsPartIdx);
631#if H3D_IVMP
632#else
633  Int iNum = AMVP_MAX_NUM_CANDS;
634#endif
635
636  xWriteUnaryMaxSymbol(iSymbol, m_cMVPIdxSCModel.get(0), 1, iNum-1);
637}
638
639Void TEncSbac::codePartSize( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth )
640{
641  PartSize eSize         = pcCU->getPartitionSize( uiAbsPartIdx );
642
643#if H3D_QTL
644  TComSPS *sps           = pcCU->getPic()->getSlice(0)->getSPS();
645  TComPic *pcTexture     = pcCU->getSlice()->getTexturePic();
646  Bool bDepthMapDetect   = (pcTexture != NULL);
647  Bool bIntraSliceDetect = (pcCU->getSlice()->getSliceType() == I_SLICE);
648 
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())
651  {
652    TComDataCU *pcTextureCU = pcTexture->getCU(pcCU->getAddr());
653    UInt uiCUIdx            = (pcCU->getZorderIdxInCU() == 0) ? uiAbsPartIdx : pcCU->getZorderIdxInCU();
654    assert(pcTextureCU->getDepth(uiCUIdx) >= uiDepth);
655    if (pcTextureCU->getDepth(uiCUIdx) == uiDepth && pcTextureCU->getPartitionSize( uiCUIdx ) != SIZE_NxN)
656    {
657      assert( eSize == SIZE_2Nx2N );
658      return;
659    }
660  }
661#endif
662
663  if ( pcCU->isIntra( uiAbsPartIdx ) )
664  {
665    if( uiDepth == g_uiMaxCUDepth - g_uiAddCUDepth )
666    {
667      m_pcBinIf->encodeBin( eSize == SIZE_2Nx2N? 1 : 0, m_cCUPartSizeSCModel.get( 0, 0, 0 ) );
668    }
669    return;
670  }
671 
672  switch(eSize)
673  {
674  case SIZE_2Nx2N:
675    {
676      m_pcBinIf->encodeBin( 1, m_cCUPartSizeSCModel.get( 0, 0, 0) );
677      break;
678    }
679  case SIZE_2NxN:
680  case SIZE_2NxnU:
681  case SIZE_2NxnD:
682    {
683      m_pcBinIf->encodeBin( 0, m_cCUPartSizeSCModel.get( 0, 0, 0) );
684      m_pcBinIf->encodeBin( 1, m_cCUPartSizeSCModel.get( 0, 0, 1) );
685      if ( pcCU->getSlice()->getSPS()->getAMPAcc( uiDepth ) )
686      {
687        if (eSize == SIZE_2NxN)
688        {
689          m_pcBinIf->encodeBin(1, m_cCUAMPSCModel.get( 0, 0, 0 ));
690        }
691        else
692        {
693          m_pcBinIf->encodeBin(0, m_cCUAMPSCModel.get( 0, 0, 0 ));         
694          m_pcBinIf->encodeBinEP((eSize == SIZE_2NxnU? 0: 1));
695        }
696      }
697      break;
698    }
699  case SIZE_Nx2N:
700  case SIZE_nLx2N:
701  case SIZE_nRx2N:
702    {
703      m_pcBinIf->encodeBin( 0, m_cCUPartSizeSCModel.get( 0, 0, 0) );
704      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 ) )
706      {
707        m_pcBinIf->encodeBin( 1, m_cCUPartSizeSCModel.get( 0, 0, 2) );
708      }
709      if ( pcCU->getSlice()->getSPS()->getAMPAcc( uiDepth ) )
710      {
711        if (eSize == SIZE_Nx2N)
712        {
713          m_pcBinIf->encodeBin(1, m_cCUAMPSCModel.get( 0, 0, 0 ));
714        }
715        else
716        {
717          m_pcBinIf->encodeBin(0, m_cCUAMPSCModel.get( 0, 0, 0 ));
718          m_pcBinIf->encodeBinEP((eSize == SIZE_nLx2N? 0: 1));
719        }
720      }
721      break;
722    }
723  case SIZE_NxN:
724    {
725      if( uiDepth == g_uiMaxCUDepth - g_uiAddCUDepth && !( pcCU->getSlice()->getSPS()->getDisInter4x4() && pcCU->getWidth(uiAbsPartIdx) == 8 && pcCU->getHeight(uiAbsPartIdx) == 8 ) )
726      {
727        m_pcBinIf->encodeBin( 0, m_cCUPartSizeSCModel.get( 0, 0, 0) );
728        m_pcBinIf->encodeBin( 0, m_cCUPartSizeSCModel.get( 0, 0, 1) );
729        m_pcBinIf->encodeBin( 0, m_cCUPartSizeSCModel.get( 0, 0, 2) );
730      }
731      break;
732    }
733  default:
734    {
735      assert(0);
736    }
737  }
738}
739
740/** code prediction mode
741 * \param pcCU
742 * \param uiAbsPartIdx 
743 * \returns Void
744 */
745Void TEncSbac::codePredMode( TComDataCU* pcCU, UInt uiAbsPartIdx )
746{
747#if RWTH_SDC_DLT_B0036
748  if ( pcCU->getSlice()->isIntra() )
749  {
750    assert( pcCU->isIntra(uiAbsPartIdx) );
751    return;
752  }
753#endif
754 
755  // get context function is here
756  Int iPredMode = pcCU->getPredictionMode( uiAbsPartIdx );
757  m_pcBinIf->encodeBin( iPredMode == MODE_INTER ? 0 : 1, m_cCUPredModeSCModel.get( 0, 0, 0 ) );
758}
759
760Void 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
774Void 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);
781}
782
783/** code skip flag
784 * \param pcCU
785 * \param uiAbsPartIdx
786 * \returns Void
787 */
788Void TEncSbac::codeSkipFlag( TComDataCU* pcCU, UInt uiAbsPartIdx )
789{
790  // get context function is here
791  UInt uiSymbol = pcCU->isSkipped( uiAbsPartIdx ) ? 1 : 0;
792  UInt uiCtxSkip = pcCU->getCtxSkipFlag( uiAbsPartIdx ) ;
793  m_pcBinIf->encodeBin( uiSymbol, m_cCUSkipFlagSCModel.get( 0, 0, uiCtxSkip ) );
794  DTRACE_CABAC_VL( g_nSymbolCounter++ );
795  DTRACE_CABAC_T( "\tSkipFlag" );
796  DTRACE_CABAC_T( "\tuiCtxSkip: ");
797  DTRACE_CABAC_V( uiCtxSkip );
798  DTRACE_CABAC_T( "\tuiSymbol: ");
799  DTRACE_CABAC_V( uiSymbol );
800  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 */
809Void 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
824
825/** code merge flag
826 * \param pcCU
827 * \param uiAbsPartIdx
828 * \returns Void
829 */
830Void TEncSbac::codeMergeFlag( TComDataCU* pcCU, UInt uiAbsPartIdx )
831{
832  const UInt uiSymbol = pcCU->getMergeFlag( uiAbsPartIdx ) ? 1 : 0;
833  m_pcBinIf->encodeBin( uiSymbol, *m_cCUMergeFlagExtSCModel.get( 0 ) );
834
835  DTRACE_CABAC_VL( g_nSymbolCounter++ );
836  DTRACE_CABAC_T( "\tMergeFlag: " );
837  DTRACE_CABAC_V( uiSymbol );
838  DTRACE_CABAC_T( "\tAddress: " );
839  DTRACE_CABAC_V( pcCU->getAddr() );
840  DTRACE_CABAC_T( "\tuiAbsPartIdx: " );
841  DTRACE_CABAC_V( uiAbsPartIdx );
842  DTRACE_CABAC_T( "\n" );
843}
844
845/** code merge index
846 * \param pcCU
847 * \param uiAbsPartIdx
848 * \returns Void
849 */
850Void TEncSbac::codeMergeIndex( TComDataCU* pcCU, UInt uiAbsPartIdx )
851{
852  UInt uiNumCand = MRG_MAX_NUM_CANDS;
853  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
870  if ( uiNumCand > 1 )
871  {
872    for( UInt ui = 0; ui < uiNumCand - 1; ++ui )
873    {
874      const UInt uiSymbol = ui == uiUnaryIdx ? 0 : 1;
875      if ( ui==0 )
876      {
877        m_pcBinIf->encodeBin( uiSymbol, m_cCUMergeIdxExtSCModel.get( 0, 0, 0 ) );
878      }
879      else
880      {
881        m_pcBinIf->encodeBinEP( uiSymbol );
882      }
883      if( uiSymbol == 0 )
884      {
885        break;
886      }
887    }
888  }
889  DTRACE_CABAC_VL( g_nSymbolCounter++ );
890  DTRACE_CABAC_T( "\tparseMergeIndex()" );
891  DTRACE_CABAC_T( "\tuiMRGIdx= " );
892  DTRACE_CABAC_V( pcCU->getMergeIndex( uiAbsPartIdx ) );
893  DTRACE_CABAC_T( "\n" );
894}
895
896#if H3D_IVRP
897Void
898TEncSbac::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
906Void TEncSbac::codeARPW( TComDataCU* pcCU, UInt uiAbsPartIdx )
907{
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
923Void TEncSbac::codeSplitFlag   ( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth )
924{
925  if( uiDepth == g_uiMaxCUDepth - g_uiAddCUDepth )
926    return;
927 
928  UInt uiCtx           = pcCU->getCtxSplitFlag( uiAbsPartIdx, uiDepth );
929  UInt uiCurrSplitFlag = ( pcCU->getDepth( uiAbsPartIdx ) > uiDepth ) ? 1 : 0;
930 
931  assert( uiCtx < 3 );
932
933#if H3D_QTL
934  Bool bCodeSplitFlag    = true;
935
936  TComSPS *sps           = pcCU->getPic()->getSlice(0)->getSPS();
937  TComPic *pcTexture     = pcCU->getSlice()->getTexturePic();
938  Bool bDepthMapDetect   = (pcTexture != NULL);
939  Bool bIntraSliceDetect = (pcCU->getSlice()->getSliceType() == I_SLICE);
940
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())
943  {
944    TComDataCU *pcTextureCU = pcTexture->getCU(pcCU->getAddr());
945    UInt uiCUIdx            = (pcCU->getZorderIdxInCU() == 0) ? uiAbsPartIdx : pcCU->getZorderIdxInCU();
946    assert(pcTextureCU->getDepth(uiCUIdx) >= uiDepth);
947    bCodeSplitFlag          = (pcTextureCU->getDepth(uiCUIdx) > uiDepth);
948  }
949
950  if(!bCodeSplitFlag)
951  {
952    assert(uiCurrSplitFlag == 0);
953    return;
954  }
955#endif
956
957  m_pcBinIf->encodeBin( uiCurrSplitFlag, m_cCUSplitFlagSCModel.get( 0, 0, uiCtx ) );
958  DTRACE_CABAC_VL( g_nSymbolCounter++ )
959  DTRACE_CABAC_T( "\tSplitFlag\n" )
960  return;
961}
962
963Void TEncSbac::codeTransformSubdivFlag( UInt uiSymbol, UInt uiCtx )
964{
965  m_pcBinIf->encodeBin( uiSymbol, m_cCUTransSubdivFlagSCModel.get( 0, 0, uiCtx ) );
966  DTRACE_CABAC_VL( g_nSymbolCounter++ )
967  DTRACE_CABAC_T( "\tparseTransformSubdivFlag()" )
968  DTRACE_CABAC_T( "\tsymbol=" )
969  DTRACE_CABAC_V( uiSymbol )
970  DTRACE_CABAC_T( "\tctx=" )
971  DTRACE_CABAC_V( uiCtx )
972  DTRACE_CABAC_T( "\n" )
973}
974
975#if LGE_EDGE_INTRA_A0070
976Void 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
1049Void 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}
1089Void 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
1185Void 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      }
1278#endif
1279    }
1280    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
1361  return;
1362}
1363
1364Void TEncSbac::codeIntraDirChroma( TComDataCU* pcCU, UInt uiAbsPartIdx )
1365{
1366  UInt uiIntraDirChroma = pcCU->getChromaIntraDir( uiAbsPartIdx );
1367
1368  if( uiIntraDirChroma == DM_CHROMA_IDX ) 
1369  {
1370    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 ) );
1376  }
1377  else
1378  { 
1379    UInt uiAllowedChromaDir[ NUM_CHROMA_MODE ];
1380    pcCU->getAllowedChromaDir( uiAbsPartIdx, uiAllowedChromaDir );
1381
1382    for( Int i = 0; i < NUM_CHROMA_MODE - 2; i++ )
1383    {
1384      if( uiIntraDirChroma == uiAllowedChromaDir[i] )
1385      {
1386        uiIntraDirChroma = i;
1387        break;
1388      }
1389    }
1390    m_pcBinIf->encodeBin( 1, m_cCUChromaPredSCModel.get( 0, 0, 0 ) );
1391
1392    if (pcCU->getSlice()->getSPS()->getUseLMChroma())
1393    {
1394      m_pcBinIf->encodeBin( 1, m_cCUChromaPredSCModel.get( 0, 0, 1 ));
1395    }
1396    m_pcBinIf->encodeBinsEP( uiIntraDirChroma, 2 );
1397  }
1398  return;
1399}
1400
1401Void TEncSbac::codeInterDir( TComDataCU* pcCU, UInt uiAbsPartIdx )
1402{
1403  const UInt uiInterDir = pcCU->getInterDir( uiAbsPartIdx ) - 1;
1404  const UInt uiCtx      = pcCU->getCtxInterDir( uiAbsPartIdx );
1405  ContextModel *pCtx    = m_cCUInterDirSCModel.get( 0 );
1406  m_pcBinIf->encodeBin( uiInterDir == 2 ? 1 : 0, *( pCtx + uiCtx ) );
1407
1408  return;
1409}
1410
1411Void TEncSbac::codeRefFrmIdx( TComDataCU* pcCU, UInt uiAbsPartIdx, RefPicList eRefList )
1412{
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
1432  {
1433    Int iRefFrame = pcCU->getCUMvField( eRefList )->getRefIdx( uiAbsPartIdx );
1434    ContextModel *pCtx = m_cCURefPicSCModel.get( 0 );
1435    m_pcBinIf->encodeBin( ( iRefFrame == 0 ? 0 : 1 ), *pCtx );
1436   
1437    if( iRefFrame > 0 )
1438    {
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    }
1446#endif
1447  }
1448  return;
1449}
1450
1451Void TEncSbac::codeMvd( TComDataCU* pcCU, UInt uiAbsPartIdx, RefPicList eRefList )
1452{
1453  if(pcCU->getSlice()->getMvdL1ZeroFlag() && eRefList == REF_PIC_LIST_1 && pcCU->getInterDir(uiAbsPartIdx)==3)
1454  {
1455    return;
1456  }
1457
1458  const TComCUMvField* pcCUMvField = pcCU->getCUMvField( eRefList );
1459  const Int iHor = pcCUMvField->getMvd( uiAbsPartIdx ).getHor();
1460  const Int iVer = pcCUMvField->getMvd( uiAbsPartIdx ).getVer();
1461  ContextModel* pCtx = m_cCUMvdSCModel.get( 0 );
1462
1463  m_pcBinIf->encodeBin( iHor != 0 ? 1 : 0, *pCtx );
1464  m_pcBinIf->encodeBin( iVer != 0 ? 1 : 0, *pCtx );
1465
1466  const Bool bHorAbsGr0 = iHor != 0;
1467  const Bool bVerAbsGr0 = iVer != 0;
1468  const UInt uiHorAbs   = 0 > iHor ? -iHor : iHor;
1469  const UInt uiVerAbs   = 0 > iVer ? -iVer : iVer;
1470  pCtx++;
1471
1472  if( bHorAbsGr0 )
1473  {
1474    m_pcBinIf->encodeBin( uiHorAbs > 1 ? 1 : 0, *pCtx );
1475  }
1476
1477  if( bVerAbsGr0 )
1478  {
1479    m_pcBinIf->encodeBin( uiVerAbs > 1 ? 1 : 0, *pCtx );
1480  }
1481
1482  if( bHorAbsGr0 )
1483  {
1484    if( uiHorAbs > 1 )
1485    {
1486      xWriteEpExGolomb( uiHorAbs-2, 1 );
1487    }
1488
1489    m_pcBinIf->encodeBinEP( 0 > iHor ? 1 : 0 );
1490  }
1491
1492  if( bVerAbsGr0 )
1493  {
1494    if( uiVerAbs > 1 )
1495    {
1496      xWriteEpExGolomb( uiVerAbs-2, 1 );
1497    }
1498
1499    m_pcBinIf->encodeBinEP( 0 > iVer ? 1 : 0 );
1500  }
1501 
1502  return;
1503}
1504
1505Void TEncSbac::codeDeltaQP( TComDataCU* pcCU, UInt uiAbsPartIdx )
1506{
1507  Int iDQp  = pcCU->getQP( uiAbsPartIdx ) - pcCU->getRefQP( uiAbsPartIdx );
1508 
1509  Int qpBdOffsetY =  pcCU->getSlice()->getSPS()->getQpBDOffsetY();
1510  iDQp = (iDQp + 78 + qpBdOffsetY + (qpBdOffsetY/2)) % (52 + qpBdOffsetY) - 26 - (qpBdOffsetY/2);
1511
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   
1520    UInt uiSign = (iDQp > 0 ? 0 : 1);
1521
1522    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 
1532  return;
1533}
1534
1535Void TEncSbac::codeQtCbf( TComDataCU* pcCU, UInt uiAbsPartIdx, TextType eType, UInt uiTrDepth )
1536{
1537  UInt uiCbf = pcCU->getCbf     ( uiAbsPartIdx, eType, uiTrDepth );
1538  UInt uiCtx = pcCU->getCtxQtCbf( uiAbsPartIdx, eType, uiTrDepth );
1539  m_pcBinIf->encodeBin( uiCbf , m_cCUQtCbfSCModel.get( 0, eType ? TEXT_CHROMA : eType, uiCtx ) );
1540  DTRACE_CABAC_VL( g_nSymbolCounter++ )
1541  DTRACE_CABAC_T( "\tparseQtCbf()" )
1542  DTRACE_CABAC_T( "\tsymbol=" )
1543  DTRACE_CABAC_V( uiCbf )
1544  DTRACE_CABAC_T( "\tctx=" )
1545  DTRACE_CABAC_V( uiCtx )
1546  DTRACE_CABAC_T( "\tetype=" )
1547  DTRACE_CABAC_V( eType )
1548  DTRACE_CABAC_T( "\tuiAbsPartIdx=" )
1549  DTRACE_CABAC_V( uiAbsPartIdx )
1550  DTRACE_CABAC_T( "\n" )
1551}
1552
1553/** Code I_PCM information.
1554 * \param pcCU pointer to CU
1555 * \param uiAbsPartIdx CU index
1556 * \param numIPCM the number of succesive IPCM blocks with the same size
1557 * \param firstIPCMFlag
1558 * \returns Void
1559 */
1560Void TEncSbac::codeIPCMInfo( TComDataCU* pcCU, UInt uiAbsPartIdx, Int numIPCM, Bool firstIPCMFlag)
1561{
1562  UInt uiIPCM = (pcCU->getIPCMFlag(uiAbsPartIdx) == true)? 1 : 0;
1563
1564  Bool writePCMSampleFlag = pcCU->getIPCMFlag(uiAbsPartIdx);
1565
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
1577  if (writePCMSampleFlag)
1578  {
1579    UInt uiMinCoeffSize = pcCU->getPic()->getMinCUWidth()*pcCU->getPic()->getMinCUHeight();
1580    UInt uiLumaOffset   = uiMinCoeffSize*uiAbsPartIdx;
1581    UInt uiChromaOffset = uiLumaOffset>>2;
1582    Pel* piPCMSample;
1583    UInt uiWidth;
1584    UInt uiHeight;
1585    UInt uiSampleBits;
1586    UInt uiX, uiY;
1587
1588    piPCMSample = pcCU->getPCMSampleY() + uiLumaOffset;
1589    uiWidth = pcCU->getWidth(uiAbsPartIdx);
1590    uiHeight = pcCU->getHeight(uiAbsPartIdx);
1591    uiSampleBits = pcCU->getSlice()->getSPS()->getPCMBitDepthLuma();
1592
1593    for(uiY = 0; uiY < uiHeight; uiY++)
1594    {
1595      for(uiX = 0; uiX < uiWidth; uiX++)
1596      {
1597        UInt uiSample = piPCMSample[uiX];
1598
1599        m_pcBinIf->xWritePCMCode(uiSample, uiSampleBits);
1600      }
1601      piPCMSample += uiWidth;
1602    }
1603
1604    piPCMSample = pcCU->getPCMSampleCb() + uiChromaOffset;
1605    uiWidth = pcCU->getWidth(uiAbsPartIdx)/2;
1606    uiHeight = pcCU->getHeight(uiAbsPartIdx)/2;
1607    uiSampleBits = pcCU->getSlice()->getSPS()->getPCMBitDepthChroma();
1608
1609    for(uiY = 0; uiY < uiHeight; uiY++)
1610    {
1611      for(uiX = 0; uiX < uiWidth; uiX++)
1612      {
1613        UInt uiSample = piPCMSample[uiX];
1614
1615        m_pcBinIf->xWritePCMCode(uiSample, uiSampleBits);
1616      }
1617      piPCMSample += uiWidth;
1618    }
1619
1620    piPCMSample = pcCU->getPCMSampleCr() + uiChromaOffset;
1621    uiWidth = pcCU->getWidth(uiAbsPartIdx)/2;
1622    uiHeight = pcCU->getHeight(uiAbsPartIdx)/2;
1623    uiSampleBits = pcCU->getSlice()->getSPS()->getPCMBitDepthChroma();
1624
1625    for(uiY = 0; uiY < uiHeight; uiY++)
1626    {
1627      for(uiX = 0; uiX < uiWidth; uiX++)
1628      {
1629        UInt uiSample = piPCMSample[uiX];
1630
1631        m_pcBinIf->xWritePCMCode(uiSample, uiSampleBits);
1632      }
1633      piPCMSample += uiWidth;
1634    }
1635    numIPCM--;
1636    if(numIPCM == 0)
1637    {
1638      m_pcBinIf->resetBac();
1639    }
1640  }
1641}
1642
1643Void TEncSbac::codeQtRootCbf( TComDataCU* pcCU, UInt uiAbsPartIdx )
1644{
1645  UInt uiCbf = pcCU->getQtRootCbf( uiAbsPartIdx );
1646  UInt uiCtx = 0;
1647  m_pcBinIf->encodeBin( uiCbf , m_cCUQtRootCbfSCModel.get( 0, 0, uiCtx ) );
1648  DTRACE_CABAC_VL( g_nSymbolCounter++ )
1649  DTRACE_CABAC_T( "\tparseQtRootCbf()" )
1650  DTRACE_CABAC_T( "\tsymbol=" )
1651  DTRACE_CABAC_V( uiCbf )
1652  DTRACE_CABAC_T( "\tctx=" )
1653  DTRACE_CABAC_V( uiCtx )
1654  DTRACE_CABAC_T( "\tuiAbsPartIdx=" )
1655  DTRACE_CABAC_V( uiAbsPartIdx )
1656  DTRACE_CABAC_T( "\n" )
1657}
1658
1659/** Encode (X,Y) position of the last significant coefficient
1660 * \param uiPosX X component of last coefficient
1661 * \param uiPosY Y component of last coefficient
1662 * \param width  Block width
1663 * \param height Block height
1664 * \param eTType plane type / luminance or chrominance
1665 * \param uiScanIdx scan type (zig-zag, hor, ver)
1666 * This method encodes the X and Y component within a block of the last significant coefficient.
1667 */
1668Void TEncSbac::codeLastSignificantXY( UInt uiPosX, UInt uiPosY, Int width, Int height, TextType eTType, UInt uiScanIdx )
1669{ 
1670  // swap
1671  if( uiScanIdx == SCAN_VER )
1672  {
1673    swap( uiPosX, uiPosY );
1674  }
1675
1676  UInt uiCtxLast;
1677  ContextModel *pCtxX = m_cCuCtxLastX.get( 0, eTType );
1678  ContextModel *pCtxY = m_cCuCtxLastY.get( 0, eTType );
1679  UInt uiGroupIdxX    = g_uiGroupIdx[ uiPosX ];
1680  UInt uiGroupIdxY    = g_uiGroupIdx[ uiPosY ];
1681
1682  // posX
1683  Int widthCtx = eTType? 4: width;
1684  const UInt *puiCtxIdxX = g_uiLastCtx + ( g_aucConvertToBit[ widthCtx ] * ( g_aucConvertToBit[ widthCtx ] + 3 ) );
1685  for( uiCtxLast = 0; uiCtxLast < uiGroupIdxX; uiCtxLast++ )
1686  {
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    }
1695  }
1696  if( uiGroupIdxX < g_uiGroupIdx[ width - 1 ])
1697  {
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    }
1706  }
1707
1708  // posY
1709  Int heightCtx = eTType? 4: height;
1710  const UInt *puiCtxIdxY = g_uiLastCtx + ( g_aucConvertToBit[ heightCtx ] * ( g_aucConvertToBit[ heightCtx ] + 3 ) );
1711  for( uiCtxLast = 0; uiCtxLast < uiGroupIdxY; uiCtxLast++ )
1712  {
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    }
1721  }
1722  if( uiGroupIdxY < g_uiGroupIdx[ height - 1 ])
1723  {
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    }
1733  if ( uiGroupIdxX > 3 )
1734  {     
1735    UInt uiCount = ( uiGroupIdxX - 2 ) >> 1;
1736    uiPosX       = uiPosX - g_uiMinInGroup[ uiGroupIdxX ];
1737    for (Int i = uiCount - 1 ; i >= 0; i-- )
1738    {
1739      m_pcBinIf->encodeBinEP( ( uiPosX >> i ) & 1 );
1740    }
1741  }
1742  if ( uiGroupIdxY > 3 )
1743  {     
1744    UInt uiCount = ( uiGroupIdxY - 2 ) >> 1;
1745    uiPosY       = uiPosY - g_uiMinInGroup[ uiGroupIdxY ];
1746    for ( Int i = uiCount - 1 ; i >= 0; i-- )
1747    {
1748      m_pcBinIf->encodeBinEP( ( uiPosY >> i ) & 1 );
1749    }
1750  }
1751}
1752
1753Void TEncSbac::codeCoeffNxN( TComDataCU* pcCU, TCoeff* pcCoef, UInt uiAbsPartIdx, UInt uiWidth, UInt uiHeight, UInt uiDepth, TextType eTType )
1754{
1755  DTRACE_CABAC_VL( g_nSymbolCounter++ )
1756  DTRACE_CABAC_T( "\tparseCoeffNxN()\teType=" )
1757  DTRACE_CABAC_V( eTType )
1758  DTRACE_CABAC_T( "\twidth=" )
1759  DTRACE_CABAC_V( uiWidth )
1760  DTRACE_CABAC_T( "\theight=" )
1761  DTRACE_CABAC_V( uiHeight )
1762  DTRACE_CABAC_T( "\tdepth=" )
1763  DTRACE_CABAC_V( uiDepth )
1764  DTRACE_CABAC_T( "\tabspartidx=" )
1765  DTRACE_CABAC_V( uiAbsPartIdx )
1766  DTRACE_CABAC_T( "\ttoCU-X=" )
1767  DTRACE_CABAC_V( pcCU->getCUPelX() )
1768  DTRACE_CABAC_T( "\ttoCU-Y=" )
1769  DTRACE_CABAC_V( pcCU->getCUPelY() )
1770  DTRACE_CABAC_T( "\tCU-addr=" )
1771  DTRACE_CABAC_V(  pcCU->getAddr() )
1772  DTRACE_CABAC_T( "\tinCU-X=" )
1773  DTRACE_CABAC_V( g_auiRasterToPelX[ g_auiZscanToRaster[uiAbsPartIdx] ] )
1774  DTRACE_CABAC_T( "\tinCU-Y=" )
1775  DTRACE_CABAC_V( g_auiRasterToPelY[ g_auiZscanToRaster[uiAbsPartIdx] ] )
1776  DTRACE_CABAC_T( "\tpredmode=" )
1777  DTRACE_CABAC_V(  pcCU->getPredictionMode( uiAbsPartIdx ) )
1778  DTRACE_CABAC_T( "\n" )
1779
1780  if( uiWidth > m_pcSlice->getSPS()->getMaxTrSize() )
1781  {
1782    uiWidth  = m_pcSlice->getSPS()->getMaxTrSize();
1783    uiHeight = m_pcSlice->getSPS()->getMaxTrSize();
1784  }
1785 
1786  UInt uiNumSig = 0;
1787 
1788  // compute number of significant coefficients
1789  uiNumSig = TEncEntropy::countNonZeroCoeffs(pcCoef, uiWidth * uiHeight);
1790 
1791  if ( uiNumSig == 0 )
1792    return;
1793 
1794  eTType = eTType == TEXT_LUMA ? TEXT_LUMA : ( eTType == TEXT_NONE ? TEXT_NONE : TEXT_CHROMA );
1795 
1796  //----- encode significance map -----
1797  const UInt   uiLog2BlockSize   = g_aucConvertToBit[ uiWidth ] + 2;
1798  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))
1825  {
1826    beValid = false;
1827  }
1828  else 
1829  {
1830    beValid = pcCU->getSlice()->getPPS()->getSignHideFlag() > 0;
1831  }
1832#else
1833  Bool beValid = pcCU->getSlice()->getPPS()->getSignHideFlag() > 0;
1834#endif
1835
1836  // Find position of last coefficient
1837  Int scanPosLast = -1;
1838  Int posLast;
1839
1840  const UInt * scanCG;
1841  if (uiWidth == uiHeight)
1842  {
1843    scanCG = g_auiSigLastScan[ uiScanIdx ][ uiLog2BlockSize > 3 ? uiLog2BlockSize-2-1 : 0 ];
1844    if( uiLog2BlockSize == 3 )
1845    {
1846      scanCG = g_sigLastScan8x8[ uiScanIdx ];
1847    }
1848    else if( uiLog2BlockSize == 5 )
1849    {
1850      scanCG = g_sigLastScanCG32x32;
1851    }
1852  }
1853  else
1854  {
1855    scanCG = g_sigCGScanNSQT[ uiLog2BlockSize - 2 ];
1856  }
1857  UInt uiSigCoeffGroupFlag[ MLS_GRP_NUM ];
1858  static const UInt uiShift = MLS_CG_SIZE >> 1;
1859  const UInt uiNumBlkSide = uiWidth >> uiShift;
1860
1861    ::memset( uiSigCoeffGroupFlag, 0, sizeof(UInt) * MLS_GRP_NUM );
1862
1863    do
1864    {
1865      posLast = scan[ ++scanPosLast ];
1866
1867      // get L1 sig map
1868      UInt uiPosY    = posLast >> uiLog2BlockSize;
1869      UInt uiPosX    = posLast - ( uiPosY << uiLog2BlockSize );
1870      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      }
1882      if( pcCoef[ posLast ] )
1883      {
1884        uiSigCoeffGroupFlag[ uiBlkIdx ] = 1;
1885      }
1886
1887      uiNumSig -= ( pcCoef[ posLast ] != 0 );
1888    }
1889    while ( uiNumSig > 0 );
1890
1891  // Code position of last coefficient
1892  Int posLastY = posLast >> uiLog2BlockSize;
1893  Int posLastX = posLast - ( posLastY << uiLog2BlockSize );
1894  codeLastSignificantXY(posLastX, posLastY, uiWidth, uiHeight, eTType, uiScanIdx);
1895 
1896  //===== code significance flag =====
1897  ContextModel * const baseCoeffGroupCtx = m_cCUSigCoeffGroupSCModel.get( 0, eTType );
1898  ContextModel * const baseCtx = (eTType==TEXT_LUMA) ? m_cCUSigSCModel.get( 0, 0 ) : m_cCUSigSCModel.get( 0, 0 ) + NUM_SIG_FLAG_CTX_LUMA;
1899
1900
1901  const Int  iLastScanSet      = scanPosLast >> LOG2_SCAN_SET_SIZE;
1902  UInt uiNumOne                = 0;
1903  UInt uiGoRiceParam           = 0;
1904  Int  iScanPosSig             = scanPosLast;
1905
1906  for( Int iSubSet = iLastScanSet; iSubSet >= 0; iSubSet-- )
1907  {
1908    Int numNonZero = 0;
1909    Int  iSubPos     = iSubSet << LOG2_SCAN_SET_SIZE;
1910    uiGoRiceParam    = 0;
1911    Int absCoeff[16];
1912    UInt coeffSigns = 0;
1913
1914    Int lastNZPosInCG = -1, firstNZPosInCG = SCAN_SET_SIZE;
1915
1916    if( iScanPosSig == scanPosLast )
1917    {
1918      absCoeff[ 0 ] = abs( pcCoef[ posLast ] );
1919      coeffSigns    = ( pcCoef[ posLast ] < 0 );
1920      numNonZero    = 1;
1921      lastNZPosInCG  = iScanPosSig;
1922      firstNZPosInCG = iScanPosSig;
1923      iScanPosSig--;
1924    }
1925
1926      // encode significant_coeffgroup_flag
1927      Int iCGBlkPos = scanCG[ iSubSet ];
1928      Int iCGPosY   = iCGBlkPos / uiNumBlkSide;
1929      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      }
1935      if( iSubSet == iLastScanSet || iSubSet == 0)
1936      {
1937        uiSigCoeffGroupFlag[ iCGBlkPos ] = 1;
1938      }
1939      else
1940      {
1941          UInt uiSigCoeffGroup   = (uiSigCoeffGroupFlag[ iCGBlkPos ] != 0);
1942          UInt uiCtxSig  = TComTrQuant::getSigCoeffGroupCtxInc( uiSigCoeffGroupFlag, iCGPosX, iCGPosY, uiScanIdx, uiWidth, uiHeight );
1943          m_pcBinIf->encodeBin( uiSigCoeffGroup, baseCoeffGroupCtx[ uiCtxSig ] );
1944      }
1945     
1946      // encode significant_coeff_flag
1947      if( uiSigCoeffGroupFlag[ iCGBlkPos ] )
1948      {
1949        UInt uiBlkPos, uiPosY, uiPosX, uiSig, uiCtxSig;
1950        for( ; iScanPosSig >= iSubPos; iScanPosSig-- )
1951        {
1952          uiBlkPos  = scan[ iScanPosSig ]; 
1953          uiPosY    = uiBlkPos >> uiLog2BlockSize;
1954          uiPosX    = uiBlkPos - ( uiPosY << uiLog2BlockSize );
1955          uiSig     = (pcCoef[ uiBlkPos ] != 0);
1956          if( iScanPosSig > iSubPos || iSubSet == 0 || numNonZero )
1957          {
1958            uiCtxSig  = TComTrQuant::getSigCtxInc( pcCoef, uiPosX, uiPosY, blockType, uiWidth, uiHeight, eTType );
1959            m_pcBinIf->encodeBin( uiSig, baseCtx[ uiCtxSig ] );
1960          }
1961          if( uiSig )
1962          {
1963            absCoeff[ numNonZero ] = abs( pcCoef[ uiBlkPos ] );
1964            coeffSigns = 2 * coeffSigns + ( pcCoef[ uiBlkPos ] < 0 );
1965            numNonZero++;
1966            if( lastNZPosInCG == -1 )
1967            {
1968              lastNZPosInCG = iScanPosSig;
1969            }
1970            firstNZPosInCG = iScanPosSig;
1971          }
1972        }
1973      }
1974      else
1975      {
1976        iScanPosSig = iSubPos - 1;
1977      }
1978
1979    if( numNonZero > 0 )
1980    {
1981      Bool signHidden = ( lastNZPosInCG - firstNZPosInCG >= (Int)tsig );
1982
1983      UInt c1 = 1;
1984      UInt uiCtxSet = (iSubSet > 0 && eTType==TEXT_LUMA) ? 2 : 0;
1985     
1986      if( uiNumOne > 0 )
1987      {
1988        uiCtxSet++;
1989      }
1990     
1991      uiNumOne       >>= 1;
1992      ContextModel *baseCtxMod = ( eTType==TEXT_LUMA ) ? m_cCUOneSCModel.get( 0, 0 ) + 4 * uiCtxSet : m_cCUOneSCModel.get( 0, 0 ) + NUM_ONE_FLAG_CTX_LUMA + 4 * uiCtxSet;
1993     
1994      Int numC1Flag = min(numNonZero, C1FLAG_NUMBER);
1995      Int firstC2FlagIdx = -1;
1996      for( Int idx = 0; idx < numC1Flag; idx++ )
1997      {
1998        UInt uiSymbol = absCoeff[ idx ] > 1;
1999        m_pcBinIf->encodeBin( uiSymbol, baseCtxMod[c1] );
2000        if( uiSymbol )
2001        {
2002          c1 = 0;
2003
2004          if (firstC2FlagIdx == -1)
2005          {
2006            firstC2FlagIdx = idx;
2007          }
2008        }
2009        else if( (c1 < 3) && (c1 > 0) )
2010        {
2011          c1++;
2012        }
2013      }
2014     
2015      if (c1 == 0)
2016      {
2017
2018        baseCtxMod = ( eTType==TEXT_LUMA ) ? m_cCUAbsSCModel.get( 0, 0 ) + uiCtxSet : m_cCUAbsSCModel.get( 0, 0 ) + NUM_ABS_FLAG_CTX_LUMA + uiCtxSet;
2019        if ( firstC2FlagIdx != -1)
2020        {
2021          UInt symbol = absCoeff[ firstC2FlagIdx ] > 2;
2022          m_pcBinIf->encodeBin( symbol, baseCtxMod[0] );
2023        }
2024      }
2025     
2026      if( beValid && signHidden )
2027      {
2028        m_pcBinIf->encodeBinsEP( (coeffSigns >> 1), numNonZero-1 );
2029      }
2030      else
2031      {
2032        m_pcBinIf->encodeBinsEP( coeffSigns, numNonZero );
2033      }
2034     
2035      Int iFirstCoeff2 = 1;   
2036      if (c1 == 0 || numNonZero > C1FLAG_NUMBER)
2037      {
2038        for ( Int idx = 0; idx < numNonZero; idx++ )
2039        {
2040          UInt baseLevel  = (idx < C1FLAG_NUMBER)? (2 + iFirstCoeff2 ) : 1;
2041
2042          if( absCoeff[ idx ] >= baseLevel)
2043          {
2044            xWriteGoRiceExGolomb( absCoeff[ idx ] - baseLevel, uiGoRiceParam ); 
2045          }
2046          if(absCoeff[ idx ] >= 2) 
2047          {
2048            iFirstCoeff2 = 0;
2049            uiNumOne++;
2050          }
2051        }       
2052      }
2053    }
2054    else
2055    {
2056      uiNumOne >>= 1;
2057    }
2058  }
2059
2060  return;
2061}
2062
2063Void 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
2069Void TEncSbac::codeAlfCtrlFlag( UInt uiSymbol )
2070{
2071  m_pcBinIf->encodeBin( uiSymbol, m_cCUAlfCtrlFlagSCModel.get( 0, 0, 0) );
2072}
2073
2074Void 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
2093Void 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
2125Void TEncSbac::codeSAOSign( UInt code )
2126{
2127  m_pcBinIf->encodeBinEP( code );
2128}
2129
2130Void TEncSbac::codeSaoMaxUvlc    ( UInt code, UInt maxSymbol )
2131{
2132  if (maxSymbol == 0)
2133  {
2134    return;
2135  }
2136
2137  Int i;
2138  Bool bCodeLast = ( maxSymbol > code );
2139
2140  if ( code == 0 )
2141  {
2142    m_pcBinIf->encodeBinEP( 0 );
2143  }
2144  else
2145  {
2146    m_pcBinIf->encodeBinEP( 1 );
2147    for ( i=0; i<code-1; i++ )
2148    {
2149      m_pcBinIf->encodeBinEP( 1 );
2150    }
2151    if( bCodeLast )
2152    {
2153      m_pcBinIf->encodeBinEP( 0 );
2154    }
2155  }
2156}
2157
2158/** Code SAO EO class or BO band position
2159 * \param uiLength
2160 * \param uiCode
2161 */
2162Void TEncSbac::codeSaoUflc       ( UInt uiLength, UInt uiCode )
2163{
2164   m_pcBinIf->encodeBinsEP ( uiCode, uiLength );
2165}
2166/** Code SAO merge flags
2167 * \param uiCode
2168 * \param uiCompIdx
2169 */
2170Void TEncSbac::codeSaoMerge       ( UInt uiCode )
2171{
2172  if (uiCode == 0)
2173  {
2174    m_pcBinIf->encodeBin(0,  m_cSaoMergeSCModel.get( 0, 0, 0 ));
2175  }
2176  else
2177  {
2178    m_pcBinIf->encodeBin(1,  m_cSaoMergeSCModel.get( 0, 0, 0 ));
2179  }
2180}
2181/** Code SAO type index
2182 * \param uiCode
2183 */
2184Void TEncSbac::codeSaoTypeIdx       ( UInt uiCode)
2185{
2186  if (uiCode == 0)
2187  {
2188    m_pcBinIf->encodeBin( 0, m_cSaoTypeIdxSCModel.get( 0, 0, 0 ) );
2189  }
2190  else
2191  {
2192    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
2197Void 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
2203Void 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
2222Void 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 */
2256Void 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 */
2267Void 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 */
2281Void 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 */
2295Void 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
2313/*!
2314 ****************************************************************************
2315 * \brief
2316 *   estimate bit cost for CBP, significant map and significant coefficients
2317 ****************************************************************************
2318 */
2319Void TEncSbac::estBit( estBitsSbacStruct* pcEstBitsSbac, Int width, Int height, TextType eTType )
2320{
2321  estCBFBit( pcEstBitsSbac, 0, eTType );
2322
2323  estSignificantCoeffGroupMapBit( pcEstBitsSbac, 0, eTType );
2324 
2325  // encode significance map
2326  estSignificantMapBit( pcEstBitsSbac, width, height, eTType );
2327 
2328  // encode significant coefficients
2329  estSignificantCoefficientsBit( pcEstBitsSbac, 0, eTType );
2330}
2331
2332/*!
2333 ****************************************************************************
2334 * \brief
2335 *    estimate bit cost for each CBP bit
2336 ****************************************************************************
2337 */
2338Void TEncSbac::estCBFBit( estBitsSbacStruct* pcEstBitsSbac, UInt uiCTXIdx, TextType eTType )
2339{
2340  ContextModel *pCtx = m_cCUQtCbfSCModel.get( 0 );
2341
2342  for( UInt uiCtxInc = 0; uiCtxInc < 3*NUM_QT_CBF_CTX; uiCtxInc++ )
2343  {
2344    pcEstBitsSbac->blockCbpBits[ uiCtxInc ][ 0 ] = pCtx[ uiCtxInc ].getEntropyBits( 0 );
2345    pcEstBitsSbac->blockCbpBits[ uiCtxInc ][ 1 ] = pCtx[ uiCtxInc ].getEntropyBits( 1 );
2346  }
2347
2348  pCtx = m_cCUQtRootCbfSCModel.get( 0 );
2349 
2350  for( UInt uiCtxInc = 0; uiCtxInc < 4; uiCtxInc++ )
2351  {
2352    pcEstBitsSbac->blockRootCbpBits[ uiCtxInc ][ 0 ] = pCtx[ uiCtxInc ].getEntropyBits( 0 );
2353    pcEstBitsSbac->blockRootCbpBits[ uiCtxInc ][ 1 ] = pCtx[ uiCtxInc ].getEntropyBits( 1 );
2354  }
2355}
2356
2357
2358/*!
2359 ****************************************************************************
2360 * \brief
2361 *    estimate SAMBAC bit cost for significant coefficient group map
2362 ****************************************************************************
2363 */
2364Void TEncSbac::estSignificantCoeffGroupMapBit( estBitsSbacStruct* pcEstBitsSbac, UInt uiCTXIdx, TextType eTType )
2365{
2366  Int firstCtx = 0, numCtx = NUM_SIG_CG_FLAG_CTX;
2367
2368  for ( Int ctxIdx = firstCtx; ctxIdx < firstCtx + numCtx; ctxIdx++ )
2369  {
2370    for( UInt uiBin = 0; uiBin < 2; uiBin++ )
2371    {
2372      pcEstBitsSbac->significantCoeffGroupBits[ ctxIdx ][ uiBin ] = m_cCUSigCoeffGroupSCModel.get(  0, eTType, ctxIdx ).getEntropyBits( uiBin );
2373    }
2374  }
2375}
2376
2377
2378/*!
2379 ****************************************************************************
2380 * \brief
2381 *    estimate SAMBAC bit cost for significant coefficient map
2382 ****************************************************************************
2383 */
2384Void TEncSbac::estSignificantMapBit( estBitsSbacStruct* pcEstBitsSbac, Int width, Int height, TextType eTType )
2385{
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;   
2391  }
2392  else if (width == 8)
2393  {
2394    firstCtx = (eTType == TEXT_LUMA) ? 9 : 6;
2395    numCtx = 11;
2396  }
2397 
2398  if (eTType == TEXT_LUMA )
2399  {
2400    for ( Int ctxIdx = firstCtx; ctxIdx < firstCtx + numCtx; ctxIdx++ )
2401    {
2402      for( UInt uiBin = 0; uiBin < 2; uiBin++ )
2403      {
2404        pcEstBitsSbac->significantBits[ ctxIdx ][ uiBin ] = m_cCUSigSCModel.get(  0, 0, ctxIdx ).getEntropyBits( uiBin );
2405      }
2406    }
2407  }
2408  else
2409  {
2410    for ( Int ctxIdx = firstCtx; ctxIdx < firstCtx + numCtx; ctxIdx++ )
2411    {
2412      for( UInt uiBin = 0; uiBin < 2; uiBin++ )
2413      {
2414        pcEstBitsSbac->significantBits[ ctxIdx ][ uiBin ] = m_cCUSigSCModel.get(  0, 0, NUM_SIG_FLAG_CTX_LUMA + ctxIdx ).getEntropyBits( uiBin );
2415      }
2416    }
2417  }
2418  Int iBitsX = 0, iBitsY = 0;
2419  const UInt *puiCtxIdx;
2420  Int ctx;
2421  Int widthCtx = eTType? 4 : width;
2422  puiCtxIdx = g_uiLastCtx + (g_aucConvertToBit[ widthCtx ]*(g_aucConvertToBit[ widthCtx ]+3));
2423  ContextModel *pCtxX      = m_cCuCtxLastX.get( 0, eTType );
2424  for (ctx = 0; ctx < g_uiGroupIdx[ width - 1 ]; ctx++)
2425  {
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    }
2439  pcEstBitsSbac->lastXBits[ctx] = iBitsX;
2440
2441  Int heightCtx = eTType? 4 : height;
2442  puiCtxIdx = g_uiLastCtx + (g_aucConvertToBit[ heightCtx ]*(g_aucConvertToBit[ heightCtx ]+3));
2443  ContextModel *pCtxY      = m_cCuCtxLastY.get( 0, eTType );
2444  for (ctx = 0; ctx < g_uiGroupIdx[ height - 1 ]; ctx++)
2445  {
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    }
2459  pcEstBitsSbac->lastYBits[ctx] = iBitsY;
2460}
2461
2462/*!
2463 ****************************************************************************
2464 * \brief
2465 *    estimate bit cost of significant coefficient
2466 ****************************************************************************
2467 */
2468Void TEncSbac::estSignificantCoefficientsBit( estBitsSbacStruct* pcEstBitsSbac, UInt uiCTXIdx, TextType eTType )
2469{
2470  if (eTType==TEXT_LUMA)
2471  {
2472    ContextModel *ctxOne = m_cCUOneSCModel.get(0, 0);
2473    ContextModel *ctxAbs = m_cCUAbsSCModel.get(0, 0);
2474
2475    for (Int ctxIdx = 0; ctxIdx < NUM_ONE_FLAG_CTX_LUMA; ctxIdx++)
2476    {
2477      pcEstBitsSbac->m_greaterOneBits[ ctxIdx ][ 0 ] = ctxOne[ ctxIdx ].getEntropyBits( 0 );
2478      pcEstBitsSbac->m_greaterOneBits[ ctxIdx ][ 1 ] = ctxOne[ ctxIdx ].getEntropyBits( 1 );   
2479    }
2480
2481    for (Int ctxIdx = 0; ctxIdx < NUM_ABS_FLAG_CTX_LUMA; ctxIdx++)
2482    {
2483      pcEstBitsSbac->m_levelAbsBits[ ctxIdx ][ 0 ] = ctxAbs[ ctxIdx ].getEntropyBits( 0 );
2484      pcEstBitsSbac->m_levelAbsBits[ ctxIdx ][ 1 ] = ctxAbs[ ctxIdx ].getEntropyBits( 1 );   
2485    }
2486  }
2487  else
2488  {
2489    ContextModel *ctxOne = m_cCUOneSCModel.get(0, 0) + NUM_ONE_FLAG_CTX_LUMA;
2490    ContextModel *ctxAbs = m_cCUAbsSCModel.get(0, 0) + NUM_ABS_FLAG_CTX_LUMA;
2491
2492    for (Int ctxIdx = 0; ctxIdx < NUM_ONE_FLAG_CTX_CHROMA; ctxIdx++)
2493    {
2494      pcEstBitsSbac->m_greaterOneBits[ ctxIdx ][ 0 ] = ctxOne[ ctxIdx ].getEntropyBits( 0 );
2495      pcEstBitsSbac->m_greaterOneBits[ ctxIdx ][ 1 ] = ctxOne[ ctxIdx ].getEntropyBits( 1 );   
2496    }
2497
2498    for (Int ctxIdx = 0; ctxIdx < NUM_ABS_FLAG_CTX_CHROMA; ctxIdx++)
2499    {
2500      pcEstBitsSbac->m_levelAbsBits[ ctxIdx ][ 0 ] = ctxAbs[ ctxIdx ].getEntropyBits( 0 );
2501      pcEstBitsSbac->m_levelAbsBits[ ctxIdx ][ 1 ] = ctxAbs[ ctxIdx ].getEntropyBits( 1 );   
2502    }
2503  }
2504}
2505
2506/**
2507 - Initialize our context information from the nominated source.
2508 .
2509 \param pSrc From where to copy context information.
2510 */
2511Void TEncSbac::xCopyContextsFrom( TEncSbac* pSrc )
2512{ 
2513  memcpy(m_contextModels, pSrc->m_contextModels, m_numContextModels*sizeof(m_contextModels[0]));
2514}
2515
2516Void  TEncSbac::loadContexts ( TEncSbac* pScr)
2517{
2518  this->xCopyContextsFrom(pScr);
2519}
2520
2521#if HHI_DMM_WEDGE_INTRA || HHI_DMM_PRED_TEX || (LGE_EDGE_INTRA_A0070 && LGE_EDGE_INTRA_DELTA_DC)
2522Void 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
2552Void 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
2565Void 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
2594Void 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
2613Void 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
2650Void 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
2664Void 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
2686Void 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
2708Void 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
2743Void 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
2753Void 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;
2763  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  }
2837}
2838#endif
2839//! \}
Note: See TracBrowser for help on using the repository browser.