source: 3DVCSoftware/trunk/source/Lib/TLibEncoder/TEncSbac.cpp @ 296

Last change on this file since 296 was 296, checked in by tech, 11 years ago

Reintegrated branch 5.1-dev0 rev. 295.

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