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

Last change on this file since 1417 was 382, checked in by zhang, 12 years ago

JCT3V-D0195 and Results for D0183/D0195

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