source: 3DVCSoftware/branches/HTM-DEV-0.3-dev2/source/Lib/TLibEncoder/TEncSbac.cpp @ 539

Last change on this file since 539 was 539, checked in by orange, 11 years ago

Integrated QTLPC and added new line mark at the end of TComWedgelet.cpp for MERL

  • Property svn:eol-style set to native
File size: 73.5 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-2013, ITU/ISO/IEC
7 * All rights reserved.
8 *
9 * Redistribution and use in source and binary forms, with or without
10 * modification, are permitted provided that the following conditions are met:
11 *
12 *  * Redistributions of source code must retain the above copyright notice,
13 *    this list of conditions and the following disclaimer.
14 *  * Redistributions in binary form must reproduce the above copyright notice,
15 *    this list of conditions and the following disclaimer in the documentation
16 *    and/or other materials provided with the distribution.
17 *  * Neither the name of the ITU/ISO/IEC nor the names of its contributors may
18 *    be used to endorse or promote products derived from this software without
19 *    specific prior written permission.
20 *
21 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
22 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS
25 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
26 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
27 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
28 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
29 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
30 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
31 * THE POSSIBILITY OF SUCH DAMAGE.
32 */
33
34/** \file     TEncSbac.cpp
35    \brief    SBAC encoder class
36*/
37
38#include "TEncTop.h"
39#include "TEncSbac.h"
40
41#include <map>
42#include <algorithm>
43
44//! \ingroup TLibEncoder
45//! \{
46
47// ====================================================================================================================
48// Constructor / destructor / create / destroy
49// ====================================================================================================================
50
51TEncSbac::TEncSbac()
52// new structure here
53: m_pcBitIf                   ( NULL )
54, m_pcSlice                   ( NULL )
55, m_pcBinIf                   ( NULL )
56, m_uiCoeffCost               ( 0 )
57, m_numContextModels          ( 0 )
58, m_cCUSplitFlagSCModel       ( 1,             1,               NUM_SPLIT_FLAG_CTX            , m_contextModels + m_numContextModels, m_numContextModels )
59, m_cCUSkipFlagSCModel        ( 1,             1,               NUM_SKIP_FLAG_CTX             , m_contextModels + m_numContextModels, m_numContextModels)
60, m_cCUMergeFlagExtSCModel    ( 1,             1,               NUM_MERGE_FLAG_EXT_CTX        , m_contextModels + m_numContextModels, m_numContextModels)
61, m_cCUMergeIdxExtSCModel     ( 1,             1,               NUM_MERGE_IDX_EXT_CTX         , m_contextModels + m_numContextModels, m_numContextModels)
62#if H_3D_ARP
63, m_cCUPUARPWSCModel          ( 1,             1,               NUM_ARPW_CTX                  , m_contextModels + m_numContextModels, m_numContextModels)
64#endif
65#if H_3D_IC
66, m_cCUICFlagSCModel          ( 1,             1,               NUM_IC_FLAG_CTX               , m_contextModels + m_numContextModels, m_numContextModels)
67#endif
68, m_cCUPartSizeSCModel        ( 1,             1,               NUM_PART_SIZE_CTX             , m_contextModels + m_numContextModels, m_numContextModels)
69, m_cCUPredModeSCModel        ( 1,             1,               NUM_PRED_MODE_CTX             , m_contextModels + m_numContextModels, m_numContextModels)
70, m_cCUIntraPredSCModel       ( 1,             1,               NUM_ADI_CTX                   , m_contextModels + m_numContextModels, m_numContextModels)
71, m_cCUChromaPredSCModel      ( 1,             1,               NUM_CHROMA_PRED_CTX           , m_contextModels + m_numContextModels, m_numContextModels)
72, m_cCUDeltaQpSCModel         ( 1,             1,               NUM_DELTA_QP_CTX              , m_contextModels + m_numContextModels, m_numContextModels)
73, m_cCUInterDirSCModel        ( 1,             1,               NUM_INTER_DIR_CTX             , m_contextModels + m_numContextModels, m_numContextModels)
74, m_cCURefPicSCModel          ( 1,             1,               NUM_REF_NO_CTX                , m_contextModels + m_numContextModels, m_numContextModels)
75, m_cCUMvdSCModel             ( 1,             1,               NUM_MV_RES_CTX                , m_contextModels + m_numContextModels, m_numContextModels)
76, m_cCUQtCbfSCModel           ( 1,             2,               NUM_QT_CBF_CTX                , m_contextModels + m_numContextModels, m_numContextModels)
77, m_cCUTransSubdivFlagSCModel ( 1,             1,               NUM_TRANS_SUBDIV_FLAG_CTX     , m_contextModels + m_numContextModels, m_numContextModels)
78, m_cCUQtRootCbfSCModel       ( 1,             1,               NUM_QT_ROOT_CBF_CTX           , m_contextModels + m_numContextModels, m_numContextModels)
79, m_cCUSigCoeffGroupSCModel   ( 1,             2,               NUM_SIG_CG_FLAG_CTX           , m_contextModels + m_numContextModels, m_numContextModels)
80, m_cCUSigSCModel             ( 1,             1,               NUM_SIG_FLAG_CTX              , m_contextModels + m_numContextModels, m_numContextModels)
81, m_cCuCtxLastX               ( 1,             2,               NUM_CTX_LAST_FLAG_XY          , m_contextModels + m_numContextModels, m_numContextModels)
82, m_cCuCtxLastY               ( 1,             2,               NUM_CTX_LAST_FLAG_XY          , m_contextModels + m_numContextModels, m_numContextModels)
83, m_cCUOneSCModel             ( 1,             1,               NUM_ONE_FLAG_CTX              , m_contextModels + m_numContextModels, m_numContextModels)
84, m_cCUAbsSCModel             ( 1,             1,               NUM_ABS_FLAG_CTX              , m_contextModels + m_numContextModels, m_numContextModels)
85, m_cMVPIdxSCModel            ( 1,             1,               NUM_MVP_IDX_CTX               , m_contextModels + m_numContextModels, m_numContextModels)
86, m_cCUAMPSCModel             ( 1,             1,               NUM_CU_AMP_CTX                , m_contextModels + m_numContextModels, m_numContextModels)
87, m_cSaoMergeSCModel          ( 1,             1,               NUM_SAO_MERGE_FLAG_CTX   , m_contextModels + m_numContextModels, m_numContextModels)
88, m_cSaoTypeIdxSCModel        ( 1,             1,               NUM_SAO_TYPE_IDX_CTX          , m_contextModels + m_numContextModels, m_numContextModels)
89, m_cTransformSkipSCModel     ( 1,             2,               NUM_TRANSFORMSKIP_FLAG_CTX    , m_contextModels + m_numContextModels, m_numContextModels)
90, m_CUTransquantBypassFlagSCModel( 1,          1,               NUM_CU_TRANSQUANT_BYPASS_FLAG_CTX, m_contextModels + m_numContextModels, m_numContextModels)
91#if H_3D_DIM
92, m_cDepthIntraModeSCModel    ( 1,             1,               NUM_DEPTH_INTRA_MODE_CTX      , m_contextModels + m_numContextModels, m_numContextModels)
93, m_cDdcFlagSCModel           ( 1,             1,               NUM_DDC_FLAG_CTX              , m_contextModels + m_numContextModels, m_numContextModels)
94, m_cDdcDataSCModel           ( 1,             1,               NUM_DDC_DATA_CTX              , m_contextModels + m_numContextModels, m_numContextModels)
95#if H_3D_DIM_DMM
96, m_cDmm1DataSCModel          ( 1,             1,               NUM_DMM1_DATA_CTX             , m_contextModels + m_numContextModels, m_numContextModels)
97, m_cDmm2DataSCModel          ( 1,             1,               NUM_DMM2_DATA_CTX             , m_contextModels + m_numContextModels, m_numContextModels)
98, m_cDmm3DataSCModel          ( 1,             1,               NUM_DMM3_DATA_CTX             , m_contextModels + m_numContextModels, m_numContextModels)
99#endif
100#if H_3D_DIM_RBC
101, m_cRbcDataSCModel           ( 1,             1,               NUM_RBC_DATA_CTX              , m_contextModels + m_numContextModels, m_numContextModels)
102#endif
103#if H_3D_DIM_SDC
104, m_cSDCResidualFlagSCModel   ( 1,             1,               SDC_NUM_RESIDUAL_FLAG_CTX     , m_contextModels + m_numContextModels, m_numContextModels)
105, m_cSDCResidualSCModel       ( 1,             1,               SDC_NUM_RESIDUAL_CTX          , m_contextModels + m_numContextModels, m_numContextModels)
106#endif
107#endif
108{
109  assert( m_numContextModels <= MAX_NUM_CTX_MOD );
110}
111
112TEncSbac::~TEncSbac()
113{
114}
115
116// ====================================================================================================================
117// Public member functions
118// ====================================================================================================================
119
120Void TEncSbac::resetEntropy           ()
121{
122  Int  iQp              = m_pcSlice->getSliceQp();
123  SliceType eSliceType  = m_pcSlice->getSliceType();
124 
125  Int  encCABACTableIdx = m_pcSlice->getPPS()->getEncCABACTableIdx();
126  if (!m_pcSlice->isIntra() && (encCABACTableIdx==B_SLICE || encCABACTableIdx==P_SLICE) && m_pcSlice->getPPS()->getCabacInitPresentFlag())
127  {
128    eSliceType = (SliceType) encCABACTableIdx;
129  }
130
131  m_cCUSplitFlagSCModel.initBuffer       ( eSliceType, iQp, (UChar*)INIT_SPLIT_FLAG );
132 
133  m_cCUSkipFlagSCModel.initBuffer        ( eSliceType, iQp, (UChar*)INIT_SKIP_FLAG );
134  m_cCUMergeFlagExtSCModel.initBuffer    ( eSliceType, iQp, (UChar*)INIT_MERGE_FLAG_EXT);
135  m_cCUMergeIdxExtSCModel.initBuffer     ( eSliceType, iQp, (UChar*)INIT_MERGE_IDX_EXT);
136#if H_3D_ARP
137  m_cCUPUARPWSCModel.initBuffer          ( eSliceType, iQp, (UChar*)INIT_ARPW );
138#endif
139#if H_3D_IC
140  m_cCUICFlagSCModel.initBuffer          ( eSliceType, iQp, (UChar*)INIT_IC_FLAG );
141#endif
142  m_cCUPartSizeSCModel.initBuffer        ( eSliceType, iQp, (UChar*)INIT_PART_SIZE );
143  m_cCUAMPSCModel.initBuffer             ( eSliceType, iQp, (UChar*)INIT_CU_AMP_POS );
144  m_cCUPredModeSCModel.initBuffer        ( eSliceType, iQp, (UChar*)INIT_PRED_MODE );
145  m_cCUIntraPredSCModel.initBuffer       ( eSliceType, iQp, (UChar*)INIT_INTRA_PRED_MODE );
146  m_cCUChromaPredSCModel.initBuffer      ( eSliceType, iQp, (UChar*)INIT_CHROMA_PRED_MODE );
147  m_cCUInterDirSCModel.initBuffer        ( eSliceType, iQp, (UChar*)INIT_INTER_DIR );
148  m_cCUMvdSCModel.initBuffer             ( eSliceType, iQp, (UChar*)INIT_MVD );
149  m_cCURefPicSCModel.initBuffer          ( eSliceType, iQp, (UChar*)INIT_REF_PIC );
150  m_cCUDeltaQpSCModel.initBuffer         ( eSliceType, iQp, (UChar*)INIT_DQP );
151  m_cCUQtCbfSCModel.initBuffer           ( eSliceType, iQp, (UChar*)INIT_QT_CBF );
152  m_cCUQtRootCbfSCModel.initBuffer       ( eSliceType, iQp, (UChar*)INIT_QT_ROOT_CBF );
153  m_cCUSigCoeffGroupSCModel.initBuffer   ( eSliceType, iQp, (UChar*)INIT_SIG_CG_FLAG );
154  m_cCUSigSCModel.initBuffer             ( eSliceType, iQp, (UChar*)INIT_SIG_FLAG );
155  m_cCuCtxLastX.initBuffer               ( eSliceType, iQp, (UChar*)INIT_LAST );
156  m_cCuCtxLastY.initBuffer               ( eSliceType, iQp, (UChar*)INIT_LAST );
157  m_cCUOneSCModel.initBuffer             ( eSliceType, iQp, (UChar*)INIT_ONE_FLAG );
158  m_cCUAbsSCModel.initBuffer             ( eSliceType, iQp, (UChar*)INIT_ABS_FLAG );
159  m_cMVPIdxSCModel.initBuffer            ( eSliceType, iQp, (UChar*)INIT_MVP_IDX );
160  m_cCUTransSubdivFlagSCModel.initBuffer ( eSliceType, iQp, (UChar*)INIT_TRANS_SUBDIV_FLAG );
161  m_cSaoMergeSCModel.initBuffer      ( eSliceType, iQp, (UChar*)INIT_SAO_MERGE_FLAG );
162  m_cSaoTypeIdxSCModel.initBuffer        ( eSliceType, iQp, (UChar*)INIT_SAO_TYPE_IDX );
163  m_cTransformSkipSCModel.initBuffer     ( eSliceType, iQp, (UChar*)INIT_TRANSFORMSKIP_FLAG );
164  m_CUTransquantBypassFlagSCModel.initBuffer( eSliceType, iQp, (UChar*)INIT_CU_TRANSQUANT_BYPASS_FLAG );
165
166#if H_3D_DIM
167  m_cDepthIntraModeSCModel.initBuffer    ( eSliceType, iQp, (UChar*)INIT_DEPTH_INTRA_MODE );
168  m_cDdcFlagSCModel.initBuffer           ( eSliceType, iQp, (UChar*)INIT_DDC_FLAG );
169  m_cDdcDataSCModel.initBuffer           ( eSliceType, iQp, (UChar*)INIT_DDC_DATA );
170#if H_3D_DIM_DMM
171  m_cDmm1DataSCModel.initBuffer          ( eSliceType, iQp, (UChar*)INIT_DMM1_DATA );
172  m_cDmm2DataSCModel.initBuffer          ( eSliceType, iQp, (UChar*)INIT_DMM2_DATA );
173  m_cDmm3DataSCModel.initBuffer          ( eSliceType, iQp, (UChar*)INIT_DMM3_DATA );
174#endif
175#if H_3D_DIM_RBC
176  m_cRbcDataSCModel.initBuffer           ( eSliceType, iQp, (UChar*)INIT_RBC_DATA );
177#endif
178#if H_3D_DIM_SDC
179  m_cSDCResidualFlagSCModel.initBuffer   ( eSliceType, iQp, (UChar*)INIT_SDC_RESIDUAL_FLAG );
180  m_cSDCResidualSCModel.initBuffer       ( eSliceType, iQp, (UChar*)INIT_SDC_RESIDUAL );
181#endif
182#endif
183  // new structure
184  m_uiLastQp = iQp;
185 
186  m_pcBinIf->start();
187 
188  return;
189}
190
191/** The function does the following:
192 * If current slice type is P/B then it determines the distance of initialisation type 1 and 2 from the current CABAC states and
193 * stores the index of the closest table.  This index is used for the next P/B slice when cabac_init_present_flag is true.
194 */
195Void TEncSbac::determineCabacInitIdx()
196{
197  Int  qp              = m_pcSlice->getSliceQp();
198
199  if (!m_pcSlice->isIntra())
200  {
201    SliceType aSliceTypeChoices[] = {B_SLICE, P_SLICE};
202
203    UInt bestCost             = MAX_UINT;
204    SliceType bestSliceType   = aSliceTypeChoices[0];
205    for (UInt idx=0; idx<2; idx++)
206    {
207      UInt curCost          = 0;
208      SliceType curSliceType  = aSliceTypeChoices[idx];
209
210      curCost  = m_cCUSplitFlagSCModel.calcCost       ( curSliceType, qp, (UChar*)INIT_SPLIT_FLAG );
211      curCost += m_cCUSkipFlagSCModel.calcCost        ( curSliceType, qp, (UChar*)INIT_SKIP_FLAG );
212      curCost += m_cCUMergeFlagExtSCModel.calcCost    ( curSliceType, qp, (UChar*)INIT_MERGE_FLAG_EXT);
213      curCost += m_cCUMergeIdxExtSCModel.calcCost     ( curSliceType, qp, (UChar*)INIT_MERGE_IDX_EXT);
214#if H_3D_ARP
215      curCost += m_cCUPUARPWSCModel.calcCost          ( curSliceType, qp, (UChar*)INIT_ARPW );
216#endif
217#if H_3D_IC
218      curCost += m_cCUICFlagSCModel.calcCost          ( curSliceType, qp, (UChar*)INIT_IC_FLAG );
219#endif
220      curCost += m_cCUPartSizeSCModel.calcCost        ( curSliceType, qp, (UChar*)INIT_PART_SIZE );
221      curCost += m_cCUAMPSCModel.calcCost             ( curSliceType, qp, (UChar*)INIT_CU_AMP_POS );
222      curCost += m_cCUPredModeSCModel.calcCost        ( curSliceType, qp, (UChar*)INIT_PRED_MODE );
223      curCost += m_cCUIntraPredSCModel.calcCost       ( curSliceType, qp, (UChar*)INIT_INTRA_PRED_MODE );
224      curCost += m_cCUChromaPredSCModel.calcCost      ( curSliceType, qp, (UChar*)INIT_CHROMA_PRED_MODE );
225      curCost += m_cCUInterDirSCModel.calcCost        ( curSliceType, qp, (UChar*)INIT_INTER_DIR );
226      curCost += m_cCUMvdSCModel.calcCost             ( curSliceType, qp, (UChar*)INIT_MVD );
227      curCost += m_cCURefPicSCModel.calcCost          ( curSliceType, qp, (UChar*)INIT_REF_PIC );
228      curCost += m_cCUDeltaQpSCModel.calcCost         ( curSliceType, qp, (UChar*)INIT_DQP );
229      curCost += m_cCUQtCbfSCModel.calcCost           ( curSliceType, qp, (UChar*)INIT_QT_CBF );
230      curCost += m_cCUQtRootCbfSCModel.calcCost       ( curSliceType, qp, (UChar*)INIT_QT_ROOT_CBF );
231      curCost += m_cCUSigCoeffGroupSCModel.calcCost   ( curSliceType, qp, (UChar*)INIT_SIG_CG_FLAG );
232      curCost += m_cCUSigSCModel.calcCost             ( curSliceType, qp, (UChar*)INIT_SIG_FLAG );
233      curCost += m_cCuCtxLastX.calcCost               ( curSliceType, qp, (UChar*)INIT_LAST );
234      curCost += m_cCuCtxLastY.calcCost               ( curSliceType, qp, (UChar*)INIT_LAST );
235      curCost += m_cCUOneSCModel.calcCost             ( curSliceType, qp, (UChar*)INIT_ONE_FLAG );
236      curCost += m_cCUAbsSCModel.calcCost             ( curSliceType, qp, (UChar*)INIT_ABS_FLAG );
237      curCost += m_cMVPIdxSCModel.calcCost            ( curSliceType, qp, (UChar*)INIT_MVP_IDX );
238      curCost += m_cCUTransSubdivFlagSCModel.calcCost ( curSliceType, qp, (UChar*)INIT_TRANS_SUBDIV_FLAG );
239      curCost += m_cSaoMergeSCModel.calcCost      ( curSliceType, qp, (UChar*)INIT_SAO_MERGE_FLAG );
240      curCost += m_cSaoTypeIdxSCModel.calcCost        ( curSliceType, qp, (UChar*)INIT_SAO_TYPE_IDX );
241      curCost += m_cTransformSkipSCModel.calcCost     ( curSliceType, qp, (UChar*)INIT_TRANSFORMSKIP_FLAG );
242      curCost += m_CUTransquantBypassFlagSCModel.calcCost( curSliceType, qp, (UChar*)INIT_CU_TRANSQUANT_BYPASS_FLAG );
243#if H_3D_DIM
244    if( m_pcSlice->getVpsDepthModesFlag() )
245    {
246      curCost += m_cDepthIntraModeSCModel.calcCost    ( curSliceType, qp, (UChar*)INIT_DEPTH_INTRA_MODE );
247      curCost += m_cDdcFlagSCModel.calcCost           ( curSliceType, qp, (UChar*)INIT_DDC_FLAG );
248      curCost += m_cDdcDataSCModel.calcCost           ( curSliceType, qp, (UChar*)INIT_DDC_DATA );
249#if H_3D_DIM_DMM
250      curCost += m_cDmm1DataSCModel.calcCost          ( curSliceType, qp, (UChar*)INIT_DMM1_DATA );
251      curCost += m_cDmm2DataSCModel.calcCost          ( curSliceType, qp, (UChar*)INIT_DMM2_DATA );
252      curCost += m_cDmm3DataSCModel.calcCost          ( curSliceType, qp, (UChar*)INIT_DMM3_DATA );
253#endif
254#if H_3D_DIM_RBC
255      curCost += m_cRbcDataSCModel.calcCost           ( curSliceType, qp, (UChar*)INIT_RBC_DATA );
256#endif
257    }
258#endif
259      if (curCost < bestCost)
260      {
261        bestSliceType = curSliceType;
262        bestCost      = curCost;
263      }
264    }
265    m_pcSlice->getPPS()->setEncCABACTableIdx( bestSliceType );
266  }
267  else
268  {
269    m_pcSlice->getPPS()->setEncCABACTableIdx( I_SLICE );
270  } 
271}
272
273
274/** The function does the followng: Write out terminate bit. Flush CABAC. Intialize CABAC states. Start CABAC.
275 */
276Void TEncSbac::updateContextTables( SliceType eSliceType, Int iQp, Bool bExecuteFinish )
277{
278  m_pcBinIf->encodeBinTrm(1);
279  if (bExecuteFinish) m_pcBinIf->finish();
280  m_cCUSplitFlagSCModel.initBuffer       ( eSliceType, iQp, (UChar*)INIT_SPLIT_FLAG );
281 
282  m_cCUSkipFlagSCModel.initBuffer        ( eSliceType, iQp, (UChar*)INIT_SKIP_FLAG );
283  m_cCUMergeFlagExtSCModel.initBuffer    ( eSliceType, iQp, (UChar*)INIT_MERGE_FLAG_EXT);
284  m_cCUMergeIdxExtSCModel.initBuffer     ( eSliceType, iQp, (UChar*)INIT_MERGE_IDX_EXT);
285#if H_3D_ARP
286  m_cCUPUARPWSCModel.initBuffer          ( eSliceType, iQp, (UChar*)INIT_ARPW );
287#endif
288#if H_3D_IC
289  m_cCUICFlagSCModel.initBuffer          ( eSliceType, iQp, (UChar*)INIT_IC_FLAG );
290#endif
291  m_cCUPartSizeSCModel.initBuffer        ( eSliceType, iQp, (UChar*)INIT_PART_SIZE );
292  m_cCUAMPSCModel.initBuffer             ( eSliceType, iQp, (UChar*)INIT_CU_AMP_POS );
293  m_cCUPredModeSCModel.initBuffer        ( eSliceType, iQp, (UChar*)INIT_PRED_MODE );
294  m_cCUIntraPredSCModel.initBuffer       ( eSliceType, iQp, (UChar*)INIT_INTRA_PRED_MODE );
295  m_cCUChromaPredSCModel.initBuffer      ( eSliceType, iQp, (UChar*)INIT_CHROMA_PRED_MODE );
296  m_cCUInterDirSCModel.initBuffer        ( eSliceType, iQp, (UChar*)INIT_INTER_DIR );
297  m_cCUMvdSCModel.initBuffer             ( eSliceType, iQp, (UChar*)INIT_MVD );
298  m_cCURefPicSCModel.initBuffer          ( eSliceType, iQp, (UChar*)INIT_REF_PIC );
299  m_cCUDeltaQpSCModel.initBuffer         ( eSliceType, iQp, (UChar*)INIT_DQP );
300  m_cCUQtCbfSCModel.initBuffer           ( eSliceType, iQp, (UChar*)INIT_QT_CBF );
301  m_cCUQtRootCbfSCModel.initBuffer       ( eSliceType, iQp, (UChar*)INIT_QT_ROOT_CBF );
302  m_cCUSigCoeffGroupSCModel.initBuffer   ( eSliceType, iQp, (UChar*)INIT_SIG_CG_FLAG );
303  m_cCUSigSCModel.initBuffer             ( eSliceType, iQp, (UChar*)INIT_SIG_FLAG );
304  m_cCuCtxLastX.initBuffer               ( eSliceType, iQp, (UChar*)INIT_LAST );
305  m_cCuCtxLastY.initBuffer               ( eSliceType, iQp, (UChar*)INIT_LAST );
306  m_cCUOneSCModel.initBuffer             ( eSliceType, iQp, (UChar*)INIT_ONE_FLAG );
307  m_cCUAbsSCModel.initBuffer             ( eSliceType, iQp, (UChar*)INIT_ABS_FLAG );
308  m_cMVPIdxSCModel.initBuffer            ( eSliceType, iQp, (UChar*)INIT_MVP_IDX );
309  m_cCUTransSubdivFlagSCModel.initBuffer ( eSliceType, iQp, (UChar*)INIT_TRANS_SUBDIV_FLAG );
310  m_cSaoMergeSCModel.initBuffer      ( eSliceType, iQp, (UChar*)INIT_SAO_MERGE_FLAG );
311  m_cSaoTypeIdxSCModel.initBuffer        ( eSliceType, iQp, (UChar*)INIT_SAO_TYPE_IDX );
312  m_cTransformSkipSCModel.initBuffer     ( eSliceType, iQp, (UChar*)INIT_TRANSFORMSKIP_FLAG );
313  m_CUTransquantBypassFlagSCModel.initBuffer( eSliceType, iQp, (UChar*)INIT_CU_TRANSQUANT_BYPASS_FLAG );
314
315#if H_3D_DIM
316  m_cDepthIntraModeSCModel.initBuffer    ( eSliceType, iQp, (UChar*)INIT_DEPTH_INTRA_MODE );
317  m_cDdcFlagSCModel.initBuffer           ( eSliceType, iQp, (UChar*)INIT_DDC_FLAG );
318  m_cDdcDataSCModel.initBuffer           ( eSliceType, iQp, (UChar*)INIT_DDC_DATA );
319#if H_3D_DIM_DMM
320  m_cDmm1DataSCModel.initBuffer          ( eSliceType, iQp, (UChar*)INIT_DMM1_DATA );
321  m_cDmm2DataSCModel.initBuffer          ( eSliceType, iQp, (UChar*)INIT_DMM2_DATA );
322  m_cDmm3DataSCModel.initBuffer          ( eSliceType, iQp, (UChar*)INIT_DMM3_DATA );
323#endif
324#if H_3D_DIM_RBC
325  m_cRbcDataSCModel.initBuffer           ( eSliceType, iQp, (UChar*)INIT_RBC_DATA );
326#endif
327#if H_3D_DIM_SDC
328  m_cSDCResidualFlagSCModel.initBuffer   ( eSliceType, iQp, (UChar*)INIT_SDC_RESIDUAL_FLAG );
329  m_cSDCResidualSCModel.initBuffer       ( eSliceType, iQp, (UChar*)INIT_SDC_RESIDUAL );
330#endif
331#endif
332  m_pcBinIf->start();
333}
334
335Void TEncSbac::codeVPS( TComVPS* pcVPS )
336{
337  assert (0);
338  return;
339}
340
341#if H_3D
342Void TEncSbac::codeSPS( TComSPS* pcSPS, Int viewIndex, Bool depthFlag )
343#else
344Void TEncSbac::codeSPS( TComSPS* pcSPS )
345#endif
346{
347  assert (0);
348  return;
349}
350
351Void TEncSbac::codePPS( TComPPS* pcPPS )
352{
353  assert (0);
354  return;
355}
356
357Void TEncSbac::codeSliceHeader( TComSlice* pcSlice )
358{
359  assert (0);
360  return;
361}
362
363Void TEncSbac::codeTilesWPPEntryPoint( TComSlice* pSlice )
364{
365  assert (0);
366  return;
367}
368
369Void TEncSbac::codeTerminatingBit( UInt uilsLast )
370{
371  m_pcBinIf->encodeBinTrm( uilsLast );
372}
373
374Void TEncSbac::codeSliceFinish()
375{
376  m_pcBinIf->finish();
377}
378
379Void TEncSbac::xWriteUnarySymbol( UInt uiSymbol, ContextModel* pcSCModel, Int iOffset )
380{
381  m_pcBinIf->encodeBin( uiSymbol ? 1 : 0, pcSCModel[0] );
382 
383  if( 0 == uiSymbol)
384  {
385    return;
386  }
387 
388  while( uiSymbol-- )
389  {
390    m_pcBinIf->encodeBin( uiSymbol ? 1 : 0, pcSCModel[ iOffset ] );
391  }
392 
393  return;
394}
395
396Void TEncSbac::xWriteUnaryMaxSymbol( UInt uiSymbol, ContextModel* pcSCModel, Int iOffset, UInt uiMaxSymbol )
397{
398  if (uiMaxSymbol == 0)
399  {
400    return;
401  }
402 
403  m_pcBinIf->encodeBin( uiSymbol ? 1 : 0, pcSCModel[ 0 ] );
404 
405  if ( uiSymbol == 0 )
406  {
407    return;
408  }
409 
410  Bool bCodeLast = ( uiMaxSymbol > uiSymbol );
411 
412  while( --uiSymbol )
413  {
414    m_pcBinIf->encodeBin( 1, pcSCModel[ iOffset ] );
415  }
416  if( bCodeLast )
417  {
418    m_pcBinIf->encodeBin( 0, pcSCModel[ iOffset ] );
419  }
420 
421  return;
422}
423
424Void TEncSbac::xWriteEpExGolomb( UInt uiSymbol, UInt uiCount )
425{
426  UInt bins = 0;
427  Int numBins = 0;
428 
429  while( uiSymbol >= (UInt)(1<<uiCount) )
430  {
431    bins = 2 * bins + 1;
432    numBins++;
433    uiSymbol -= 1 << uiCount;
434    uiCount  ++;
435  }
436  bins = 2 * bins + 0;
437  numBins++;
438 
439  bins = (bins << uiCount) | uiSymbol;
440  numBins += uiCount;
441 
442  assert( numBins <= 32 );
443  m_pcBinIf->encodeBinsEP( bins, numBins );
444}
445
446/** Coding of coeff_abs_level_minus3
447 * \param uiSymbol value of coeff_abs_level_minus3
448 * \param ruiGoRiceParam reference to Rice parameter
449 * \returns Void
450 */
451Void TEncSbac::xWriteCoefRemainExGolomb ( UInt symbol, UInt &rParam )
452{
453  Int codeNumber  = (Int)symbol;
454  UInt length;
455  if (codeNumber < (COEF_REMAIN_BIN_REDUCTION << rParam))
456  {
457    length = codeNumber>>rParam;
458    m_pcBinIf->encodeBinsEP( (1<<(length+1))-2 , length+1);
459    m_pcBinIf->encodeBinsEP((codeNumber%(1<<rParam)),rParam);
460  }
461  else
462  {
463    length = rParam;
464    codeNumber  = codeNumber - ( COEF_REMAIN_BIN_REDUCTION << rParam);
465    while (codeNumber >= (1<<length))
466    {
467      codeNumber -=  (1<<(length++));   
468    }
469    m_pcBinIf->encodeBinsEP((1<<(COEF_REMAIN_BIN_REDUCTION+length+1-rParam))-2,COEF_REMAIN_BIN_REDUCTION+length+1-rParam);
470    m_pcBinIf->encodeBinsEP(codeNumber,length);
471  }
472}
473
474#if H_3D_DIM
475Void TEncSbac::xWriteExGolombLevel( UInt uiSymbol, ContextModel& rcSCModel  )
476{
477  if( uiSymbol )
478  {
479    m_pcBinIf->encodeBin( 1, rcSCModel );
480    UInt uiCount = 0;
481    Bool bNoExGo = (uiSymbol < 13);
482
483    while( --uiSymbol && ++uiCount < 13 )
484    {
485      m_pcBinIf->encodeBin( 1, rcSCModel );
486    }
487    if( bNoExGo )
488    {
489      m_pcBinIf->encodeBin( 0, rcSCModel );
490    }
491    else
492    {
493      xWriteEpExGolomb( uiSymbol, 0 );
494    }
495  }
496  else
497  {
498    m_pcBinIf->encodeBin( 0, rcSCModel );
499  }
500
501  return;
502}
503
504Void TEncSbac::xCodeDimDeltaDC( Pel valDeltaDC, UInt dimType )
505{
506  xWriteExGolombLevel( UInt( abs( valDeltaDC ) ), m_cDdcDataSCModel.get(0, 0, (RBC_IDX == dimType) ? 1 : 0) );
507  if( valDeltaDC != 0 )
508  {
509    UInt uiSign = valDeltaDC > 0 ? 0 : 1;
510    m_pcBinIf->encodeBinEP( uiSign );
511  }
512}
513
514#if H_3D_DIM_DMM
515Void TEncSbac::xCodeDmm1WedgeIdx( UInt uiTabIdx, Int iNumBit )
516{
517  for ( Int i = 0; i < iNumBit; i++ )
518  {
519    m_pcBinIf->encodeBin( ( uiTabIdx >> i ) & 1, m_cDmm1DataSCModel.get(0, 0, 0) );
520  }
521}
522
523Void TEncSbac::xCodeDmm2Offset( Int iOffset )
524{
525  if( DMM2_DELTAEND_MAX > 0 )
526  {
527    m_pcBinIf->encodeBin( (iOffset != 0) , m_cDmm2DataSCModel.get(0, 0, 0) );
528    if( iOffset != 0 )
529    {
530      UInt uiAbsValMinus1 = abs(iOffset)-1;
531      m_pcBinIf->encodeBin( (uiAbsValMinus1 & 0x01),      m_cDmm2DataSCModel.get(0, 0, 0) );
532      m_pcBinIf->encodeBin( (uiAbsValMinus1 & 0x02) >> 1, m_cDmm2DataSCModel.get(0, 0, 0) );
533
534      UInt uiSign = (iOffset > 0) ? 0 : 1;
535      m_pcBinIf->encodeBinEP( uiSign );
536    }
537  }
538}
539
540Void TEncSbac::xCodeDmm3WedgeIdx( UInt uiIntraIdx, Int iNumBit )
541{
542  for( Int i = 0; i < iNumBit; i++ )
543  {
544    m_pcBinIf->encodeBin( ( uiIntraIdx >> i ) & 1, m_cDmm3DataSCModel.get(0, 0, 0) );
545  }
546}
547#endif
548#if H_3D_DIM_RBC
549Void TEncSbac::xCodeRbcEdge( TComDataCU* pcCU, UInt uiAbsPartIdx )
550{
551  UInt   uiDepth        = pcCU->getDepth( uiAbsPartIdx ) + (pcCU->getPartitionSize( uiAbsPartIdx ) == SIZE_NxN ? 1 : 0);
552  UChar* pucSymbolList  = pcCU->getEdgeCode     ( uiAbsPartIdx );
553  UChar  ucEdgeNumber   = pcCU->getEdgeNumber   ( uiAbsPartIdx );
554  Bool   bLeft          = pcCU->getEdgeLeftFirst( uiAbsPartIdx );
555  UChar  ucStart        = pcCU->getEdgeStartPos ( uiAbsPartIdx );
556  UInt   uiSymbol;
557
558  // 1. Top(0) or Left(1)
559  uiSymbol = (bLeft == false) ? 0 : 1;
560  m_pcBinIf->encodeBinEP( uiSymbol );
561
562  // 2. Start position (lowest bit first)
563  uiSymbol = ucStart;
564  for( UInt ui = 6; ui > uiDepth; ui-- ) // 64(0)->6, 32(1)->5, 16(2)->4, 8(3)->3, 4(4)->2
565  {
566    m_pcBinIf->encodeBinEP( uiSymbol & 0x1 );
567    uiSymbol >>= 1;
568  }
569
570  // 3. Number of edges
571  uiSymbol = ucEdgeNumber > 0 ? ucEdgeNumber - 1 : 0;
572  for( UInt ui = 7; ui > uiDepth; ui-- ) // 64(0)->7, 32(1)->6, 16(2)->5, 8(3)->4, 4(4)->3
573  {
574    m_pcBinIf->encodeBinEP( uiSymbol & 0x1 );
575    uiSymbol >>= 1;
576  }
577
578  if(uiSymbol != 0)
579  {
580    printf(" ucEdgeNumber %d at depth %d\n",ucEdgeNumber, uiDepth);
581    assert(false);
582  }
583
584  // 4. Edges
585  for( Int iPtr2 = 0; iPtr2 < ucEdgeNumber; iPtr2++ )
586  {
587    UInt uiReorderSymbol = pucSymbolList[iPtr2];
588    for( UInt ui = 0; ui < uiReorderSymbol; ui++ )
589    {
590      m_pcBinIf->encodeBin( 1, m_cRbcDataSCModel.get( 0, 0, 0 ) );
591    }
592
593    if( uiReorderSymbol != 6 )
594      m_pcBinIf->encodeBin( 0, m_cRbcDataSCModel.get( 0, 0, 0 ) );
595  }
596}
597#endif
598#if H_3D_DIM_SDC
599Void TEncSbac::xCodeSDCResidualData ( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiSegment )
600{
601  assert( pcCU->getSlice()->getIsDepth() );
602  assert( pcCU->getPartitionSize(uiAbsPartIdx) == SIZE_2Nx2N );
603  assert( pcCU->getSDCFlag(uiAbsPartIdx) );
604  assert( uiSegment < 2 );
605 
606  Pel segmentDCOffset = pcCU->getSDCSegmentDCOffset(uiSegment, uiAbsPartIdx);
607 
608  UInt uiResidual = segmentDCOffset == 0 ? 0 : 1;
609  UInt uiSign     = segmentDCOffset < 0 ? 1 : 0;
610  UInt uiAbsIdx   = abs(segmentDCOffset);
611
612#if H_3D_DIM_DLT
613  UInt uiMaxResidualBits = pcCU->getSlice()->getVPS()->getBitsPerDepthValue( pcCU->getSlice()->getLayerIdInVps() );
614#else
615  UInt uiMaxResidualBits = g_bitDepthY;
616#endif
617  assert( uiMaxResidualBits <= g_bitDepthY );
618 
619  // residual flag
620  m_pcBinIf->encodeBin( uiResidual, m_cSDCResidualFlagSCModel.get( 0, 0, 0 ) );
621 
622  if (uiResidual)
623  {
624    // encode sign bit of residual
625    m_pcBinIf->encodeBinEP( uiSign );
626   
627#if H_3D_DIM_DLT
628    UInt uiNumDepthValues = pcCU->getSlice()->getVPS()->getNumDepthValues( pcCU->getSlice()->getLayerIdInVps() );
629#else
630    UInt uiNumDepthValues = ((1 << g_bitDepthY)-1);
631#endif
632    assert(uiAbsIdx <= uiNumDepthValues);
633   
634    // encode residual magnitude
635    uiAbsIdx -= 1;
636    // prefix part
637    if ( uiAbsIdx == 0 )
638      m_pcBinIf->encodeBin( 0, m_cSDCResidualSCModel.get(0, 0, 0) );
639    else
640    {
641      UInt l = uiAbsIdx;
642      UInt k = 0;
643      UInt uiPrefixThreshold = ((uiNumDepthValues * 3) >> 2);
644      while ( l > 0 && k < uiPrefixThreshold )
645      {
646        m_pcBinIf->encodeBin( 1, m_cSDCResidualSCModel.get(0, 0, 0) );
647        l--;
648        k++;
649      }
650      if ( uiAbsIdx < uiPrefixThreshold )
651        m_pcBinIf->encodeBin( 0, m_cSDCResidualSCModel.get(0, 0, 0) );
652      // suffix part
653      else
654      {
655        uiAbsIdx -= uiPrefixThreshold;
656        UInt uiSuffixLength = numBitsForValue(uiNumDepthValues - uiPrefixThreshold);
657        UInt uiBitInfo = 0;
658        for ( Int i = 0; i < uiSuffixLength; i++)
659        {
660          uiBitInfo = ( uiAbsIdx & ( 1 << i ) ) >> i;
661          m_pcBinIf->encodeBinEP( uiBitInfo);
662        }
663      }
664    }
665   
666  }
667}
668#endif
669#endif
670
671// SBAC RD
672Void  TEncSbac::load ( TEncSbac* pSrc)
673{
674  this->xCopyFrom(pSrc);
675}
676
677Void  TEncSbac::loadIntraDirModeLuma( TEncSbac* pSrc)
678{
679  m_pcBinIf->copyState( pSrc->m_pcBinIf );
680 
681  this->m_cCUIntraPredSCModel      .copyFrom( &pSrc->m_cCUIntraPredSCModel       );
682}
683#if H_3D_DIM
684Void TEncSbac::loadIntraDepthMode( TEncSbac* pSrc)
685{
686  m_pcBinIf->copyState( pSrc->m_pcBinIf );
687
688  this->m_cDepthIntraModeSCModel .copyFrom( &pSrc->m_cDepthIntraModeSCModel );
689  this->m_cDdcFlagSCModel        .copyFrom( &pSrc->m_cDdcFlagSCModel );
690}
691#endif
692
693Void  TEncSbac::store( TEncSbac* pDest)
694{
695  pDest->xCopyFrom( this );
696}
697
698
699Void TEncSbac::xCopyFrom( TEncSbac* pSrc )
700{
701  m_pcBinIf->copyState( pSrc->m_pcBinIf );
702 
703  this->m_uiCoeffCost = pSrc->m_uiCoeffCost;
704  this->m_uiLastQp    = pSrc->m_uiLastQp;
705 
706  memcpy( m_contextModels, pSrc->m_contextModels, m_numContextModels * sizeof( ContextModel ) );
707}
708
709Void TEncSbac::codeMVPIdx ( TComDataCU* pcCU, UInt uiAbsPartIdx, RefPicList eRefList )
710{
711  Int iSymbol = pcCU->getMVPIdx(eRefList, uiAbsPartIdx);
712  Int iNum = AMVP_MAX_NUM_CANDS;
713
714  xWriteUnaryMaxSymbol(iSymbol, m_cMVPIdxSCModel.get(0), 1, iNum-1);
715#if H_MV_ENC_DEC_TRAC
716#if ENC_DEC_TRACE
717  if ( eRefList == REF_PIC_LIST_0 )
718  {
719    DTRACE_PU("mvp_l0_flag", iSymbol)
720  }
721  else
722  {
723    DTRACE_PU("mvp_l1_flag", iSymbol)
724  }
725#endif
726#endif
727}
728
729Void TEncSbac::codePartSize( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth )
730{
731  PartSize eSize         = pcCU->getPartitionSize( uiAbsPartIdx );
732
733#if H_3D_QTLPC
734  TComSPS *sps           = pcCU->getPic()->getSlice(0)->getSPS();
735  TComPic *pcTexture     = pcCU->getSlice()->getTexturePic();
736  Bool bDepthMapDetect   = (pcTexture != NULL);
737  Bool bIntraSliceDetect = (pcCU->getSlice()->getSliceType() == I_SLICE);
738 
739  Bool rapPic     = (pcCU->getSlice()->getNalUnitType() == NAL_UNIT_CODED_SLICE_IDR_W_RADL || pcCU->getSlice()->getNalUnitType() == NAL_UNIT_CODED_SLICE_IDR_N_LP || pcCU->getSlice()->getNalUnitType() == NAL_UNIT_CODED_SLICE_CRA);
740
741  if(bDepthMapDetect && !bIntraSliceDetect && !rapPic && pcCU->getPic()->getReduceBitsFlag() && sps->getUseQTL() && sps->getUsePC() )
742  {
743    TComDataCU *pcTextureCU = pcTexture->getCU(pcCU->getAddr());
744    UInt uiCUIdx            = (pcCU->getZorderIdxInCU() == 0) ? uiAbsPartIdx : pcCU->getZorderIdxInCU();
745    assert(pcTextureCU->getDepth(uiCUIdx) >= uiDepth);
746    if (pcTextureCU->getDepth(uiCUIdx) == uiDepth && pcTextureCU->getPartitionSize( uiCUIdx ) != SIZE_NxN)
747    {
748      assert( eSize == SIZE_2Nx2N );
749      return;
750    }
751  }
752#endif
753
754  if ( pcCU->isIntra( uiAbsPartIdx ) )
755  {
756    if( uiDepth == g_uiMaxCUDepth - g_uiAddCUDepth )
757    {
758      m_pcBinIf->encodeBin( eSize == SIZE_2Nx2N? 1 : 0, m_cCUPartSizeSCModel.get( 0, 0, 0 ) );
759#if H_MV_ENC_DEC_TRAC
760      DTRACE_CU("part_mode", eSize == SIZE_2Nx2N? 1 : 0)
761#endif       
762    }
763    return;
764  }
765 
766#if H_MV_ENC_DEC_TRAC         
767  DTRACE_CU("part_mode", eSize )
768#endif       
769  switch(eSize)
770  {
771    case SIZE_2Nx2N:
772    {
773      m_pcBinIf->encodeBin( 1, m_cCUPartSizeSCModel.get( 0, 0, 0) );
774      break;
775    }
776    case SIZE_2NxN:
777    case SIZE_2NxnU:
778    case SIZE_2NxnD:
779    {
780      m_pcBinIf->encodeBin( 0, m_cCUPartSizeSCModel.get( 0, 0, 0) );
781      m_pcBinIf->encodeBin( 1, m_cCUPartSizeSCModel.get( 0, 0, 1) );
782      if ( pcCU->getSlice()->getSPS()->getAMPAcc( uiDepth ) )
783      {
784        if (eSize == SIZE_2NxN)
785        {
786          m_pcBinIf->encodeBin(1, m_cCUAMPSCModel.get( 0, 0, 0 ));
787        }
788        else
789        {
790          m_pcBinIf->encodeBin(0, m_cCUAMPSCModel.get( 0, 0, 0 ));         
791          m_pcBinIf->encodeBinEP((eSize == SIZE_2NxnU? 0: 1));
792        }
793      }
794      break;
795    }
796    case SIZE_Nx2N:
797    case SIZE_nLx2N:
798    case SIZE_nRx2N:
799    {
800      m_pcBinIf->encodeBin( 0, m_cCUPartSizeSCModel.get( 0, 0, 0) );
801      m_pcBinIf->encodeBin( 0, m_cCUPartSizeSCModel.get( 0, 0, 1) );
802      if( uiDepth == g_uiMaxCUDepth - g_uiAddCUDepth && !( pcCU->getWidth(uiAbsPartIdx) == 8 && pcCU->getHeight(uiAbsPartIdx) == 8 ) )
803      {
804        m_pcBinIf->encodeBin( 1, m_cCUPartSizeSCModel.get( 0, 0, 2) );
805      }
806      if ( pcCU->getSlice()->getSPS()->getAMPAcc( uiDepth ) )
807      {
808        if (eSize == SIZE_Nx2N)
809        {
810          m_pcBinIf->encodeBin(1, m_cCUAMPSCModel.get( 0, 0, 0 ));
811        }
812        else
813        {
814          m_pcBinIf->encodeBin(0, m_cCUAMPSCModel.get( 0, 0, 0 ));
815          m_pcBinIf->encodeBinEP((eSize == SIZE_nLx2N? 0: 1));
816        }
817      }
818      break;
819    }
820    case SIZE_NxN:
821    {
822      if( uiDepth == g_uiMaxCUDepth - g_uiAddCUDepth && !( pcCU->getWidth(uiAbsPartIdx) == 8 && pcCU->getHeight(uiAbsPartIdx) == 8 ) )
823      {
824        m_pcBinIf->encodeBin( 0, m_cCUPartSizeSCModel.get( 0, 0, 0) );
825        m_pcBinIf->encodeBin( 0, m_cCUPartSizeSCModel.get( 0, 0, 1) );
826        m_pcBinIf->encodeBin( 0, m_cCUPartSizeSCModel.get( 0, 0, 2) );
827      }
828      break;
829    }
830    default:
831    {
832      assert(0);
833    }
834  }
835}
836
837/** code prediction mode
838 * \param pcCU
839 * \param uiAbsPartIdx 
840 * \returns Void
841 */
842Void TEncSbac::codePredMode( TComDataCU* pcCU, UInt uiAbsPartIdx )
843{
844#if H_3D_DIM_SDC
845  if ( pcCU->getSlice()->isIntra() )
846  {
847    assert( pcCU->isIntra(uiAbsPartIdx) );
848    return;
849  }
850#endif
851 
852  // get context function is here
853  Int iPredMode = pcCU->getPredictionMode( uiAbsPartIdx );
854  m_pcBinIf->encodeBin( iPredMode == MODE_INTER ? 0 : 1, m_cCUPredModeSCModel.get( 0, 0, 0 ) );
855#if H_MV_ENC_DEC_TRAC
856  DTRACE_CU("pred_mode_flag", iPredMode == MODE_INTER ? 0 : 1); 
857#endif
858}
859
860Void TEncSbac::codeCUTransquantBypassFlag( TComDataCU* pcCU, UInt uiAbsPartIdx )
861{
862  UInt uiSymbol = pcCU->getCUTransquantBypass(uiAbsPartIdx);
863  m_pcBinIf->encodeBin( uiSymbol, m_CUTransquantBypassFlagSCModel.get( 0, 0, 0 ) );
864#if H_MV_ENC_DEC_TRAC
865  DTRACE_CU("cu_transquant_bypass_flag", uiSymbol); 
866#endif
867}
868
869/** code skip flag
870 * \param pcCU
871 * \param uiAbsPartIdx
872 * \returns Void
873 */
874Void TEncSbac::codeSkipFlag( TComDataCU* pcCU, UInt uiAbsPartIdx )
875{
876  // get context function is here
877  UInt uiSymbol = pcCU->isSkipped( uiAbsPartIdx ) ? 1 : 0;
878  UInt uiCtxSkip = pcCU->getCtxSkipFlag( uiAbsPartIdx ) ;
879  m_pcBinIf->encodeBin( uiSymbol, m_cCUSkipFlagSCModel.get( 0, 0, uiCtxSkip ) );
880#if !H_MV_ENC_DEC_TRAC
881  DTRACE_CABAC_VL( g_nSymbolCounter++ );
882  DTRACE_CABAC_T( "\tSkipFlag" );
883  DTRACE_CABAC_T( "\tuiCtxSkip: ");
884  DTRACE_CABAC_V( uiCtxSkip );
885  DTRACE_CABAC_T( "\tuiSymbol: ");
886  DTRACE_CABAC_V( uiSymbol );
887  DTRACE_CABAC_T( "\n");
888#else
889  DTRACE_CU("cu_skip_flag", uiSymbol); 
890#endif
891}
892
893/** code merge flag
894 * \param pcCU
895 * \param uiAbsPartIdx
896 * \returns Void
897 */
898Void TEncSbac::codeMergeFlag( TComDataCU* pcCU, UInt uiAbsPartIdx )
899{
900  const UInt uiSymbol = pcCU->getMergeFlag( uiAbsPartIdx ) ? 1 : 0;
901  m_pcBinIf->encodeBin( uiSymbol, *m_cCUMergeFlagExtSCModel.get( 0 ) );
902
903#if H_MV_ENC_DEC_TRAC
904  DTRACE_PU("merge_flag", uiSymbol); 
905#else
906  DTRACE_CABAC_VL( g_nSymbolCounter++ );
907  DTRACE_CABAC_T( "\tMergeFlag: " );
908  DTRACE_CABAC_V( uiSymbol );
909  DTRACE_CABAC_T( "\tAddress: " );
910  DTRACE_CABAC_V( pcCU->getAddr() );
911  DTRACE_CABAC_T( "\tuiAbsPartIdx: " );
912  DTRACE_CABAC_V( uiAbsPartIdx );
913  DTRACE_CABAC_T( "\n" );
914#endif
915}
916
917/** code merge index
918 * \param pcCU
919 * \param uiAbsPartIdx
920 * \returns Void
921 */
922Void TEncSbac::codeMergeIndex( TComDataCU* pcCU, UInt uiAbsPartIdx )
923{
924  UInt uiUnaryIdx = pcCU->getMergeIndex( uiAbsPartIdx );
925  UInt uiNumCand = pcCU->getSlice()->getMaxNumMergeCand();
926  if ( uiNumCand > 1 )
927  {
928    for( UInt ui = 0; ui < uiNumCand - 1; ++ui )
929    {
930      const UInt uiSymbol = ui == uiUnaryIdx ? 0 : 1;
931      if ( ui==0 )
932      {
933        m_pcBinIf->encodeBin( uiSymbol, m_cCUMergeIdxExtSCModel.get( 0, 0, 0 ) );
934      }
935      else
936      {
937        m_pcBinIf->encodeBinEP( uiSymbol );
938      }
939      if( uiSymbol == 0 )
940      {
941        break;
942      }
943    }
944#if H_MV_ENC_DEC_TRAC
945    DTRACE_PU("merge_idx", uiUnaryIdx); 
946#endif
947  }
948#if !H_MV_ENC_DEC_TRAC
949  DTRACE_CABAC_VL( g_nSymbolCounter++ );
950  DTRACE_CABAC_T( "\tparseMergeIndex()" );
951  DTRACE_CABAC_T( "\tuiMRGIdx= " );
952  DTRACE_CABAC_V( pcCU->getMergeIndex( uiAbsPartIdx ) );
953  DTRACE_CABAC_T( "\n" );
954#endif
955}
956
957#if H_3D_ARP
958Void TEncSbac::codeARPW( TComDataCU* pcCU, UInt uiAbsPartIdx )
959{
960  Int  iW = (Int)pcCU->getARPW( uiAbsPartIdx );
961  Int  iMaxW = pcCU->getSlice()->getARPStepNum() - 1;
962  assert( iMaxW > 0);
963
964  Int nOffset = pcCU->getCTXARPWFlag(uiAbsPartIdx);
965  Int nBinNum = iW + ( iW != iMaxW );
966  m_pcBinIf->encodeBin( iW ? 1 : 0 , m_cCUPUARPWSCModel.get( 0, 0, 0 + nOffset ) );
967  if( nBinNum > 1 )
968  {
969     m_pcBinIf->encodeBin( ( iW == iMaxW ) ? 1 : 0, m_cCUPUARPWSCModel.get( 0, 0, 3 ) );
970  }
971#if H_MV_ENC_DEC_TRAC
972  DTRACE_CU("iv_res_pred_weight_idx", iW); 
973#endif
974}
975#endif
976
977#if H_3D_IC
978/** code Illumination Compensation flag
979 * \param pcCU
980 * \param uiAbsPartIdx
981 * \returns Void
982 */
983Void TEncSbac::codeICFlag( TComDataCU* pcCU, UInt uiAbsPartIdx )
984{
985  // get context function is here
986  UInt uiSymbol = pcCU->getICFlag( uiAbsPartIdx ) ? 1 : 0;
987  UInt uiCtxIC  = pcCU->getCtxICFlag( uiAbsPartIdx ) ;
988  m_pcBinIf->encodeBin( uiSymbol, m_cCUICFlagSCModel.get( 0, 0, uiCtxIC ) );
989#if !H_MV_ENC_DEC_TRAC
990  DTRACE_CABAC_VL( g_nSymbolCounter++ );
991  DTRACE_CABAC_T( "\tICFlag" );
992  DTRACE_CABAC_T( "\tuiCtxIC: ");
993  DTRACE_CABAC_V( uiCtxIC );
994  DTRACE_CABAC_T( "\tuiSymbol: ");
995  DTRACE_CABAC_V( uiSymbol );
996  DTRACE_CABAC_T( "\n");
997#else
998  DTRACE_CU("ic_flag", uiSymbol ); 
999#endif
1000}
1001#endif
1002
1003
1004Void TEncSbac::codeSplitFlag   ( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth )
1005{
1006  if( uiDepth == g_uiMaxCUDepth - g_uiAddCUDepth )
1007    return;
1008 
1009  UInt uiCtx           = pcCU->getCtxSplitFlag( uiAbsPartIdx, uiDepth );
1010  UInt uiCurrSplitFlag = ( pcCU->getDepth( uiAbsPartIdx ) > uiDepth ) ? 1 : 0;
1011 
1012  assert( uiCtx < 3 );
1013
1014#if H_3D_QTLPC
1015  Bool bCodeSplitFlag    = true;
1016
1017  TComSPS *sps           = pcCU->getPic()->getSlice(0)->getSPS();
1018  TComPic *pcTexture     = pcCU->getSlice()->getTexturePic();
1019  Bool bDepthMapDetect   = (pcTexture != NULL);
1020  Bool bIntraSliceDetect = (pcCU->getSlice()->getSliceType() == I_SLICE);
1021
1022  Bool rapPic     = (pcCU->getSlice()->getNalUnitType() == NAL_UNIT_CODED_SLICE_IDR_W_RADL || pcCU->getSlice()->getNalUnitType() == NAL_UNIT_CODED_SLICE_IDR_N_LP || pcCU->getSlice()->getNalUnitType() == NAL_UNIT_CODED_SLICE_CRA);
1023
1024  if(bDepthMapDetect && !bIntraSliceDetect && !rapPic && pcCU->getPic()->getReduceBitsFlag() && sps->getUseQTL() && sps->getUsePC())
1025  {
1026    TComDataCU *pcTextureCU = pcTexture->getCU(pcCU->getAddr());
1027    UInt uiCUIdx            = (pcCU->getZorderIdxInCU() == 0) ? uiAbsPartIdx : pcCU->getZorderIdxInCU();
1028    assert(pcTextureCU->getDepth(uiCUIdx) >= uiDepth);
1029    bCodeSplitFlag          = (pcTextureCU->getDepth(uiCUIdx) > uiDepth);
1030  }
1031
1032  if(!bCodeSplitFlag)
1033  {
1034    assert(uiCurrSplitFlag == 0);
1035    return;
1036  }
1037#endif
1038
1039  m_pcBinIf->encodeBin( uiCurrSplitFlag, m_cCUSplitFlagSCModel.get( 0, 0, uiCtx ) );
1040#if !H_MV_ENC_DEC_TRAC
1041  DTRACE_CABAC_VL( g_nSymbolCounter++ )
1042  DTRACE_CABAC_T( "\tSplitFlag\n" )
1043#else
1044  DTRACE_CU("split_cu_flag", uiCurrSplitFlag ); 
1045#endif
1046  return;
1047}
1048
1049Void TEncSbac::codeTransformSubdivFlag( UInt uiSymbol, UInt uiCtx )
1050{
1051  m_pcBinIf->encodeBin( uiSymbol, m_cCUTransSubdivFlagSCModel.get( 0, 0, uiCtx ) );
1052#if !H_MV_ENC_DEC_TRAC
1053  DTRACE_CABAC_VL( g_nSymbolCounter++ )
1054  DTRACE_CABAC_T( "\tparseTransformSubdivFlag()" )
1055  DTRACE_CABAC_T( "\tsymbol=" )
1056  DTRACE_CABAC_V( uiSymbol )
1057  DTRACE_CABAC_T( "\tctx=" )
1058  DTRACE_CABAC_V( uiCtx )
1059  DTRACE_CABAC_T( "\n" )
1060#endif
1061}
1062
1063Void TEncSbac::codeIntraDirLumaAng( TComDataCU* pcCU, UInt absPartIdx, Bool isMultiple)
1064{
1065  UInt dir[4],j;
1066  Int preds[4][3] = {{-1, -1, -1},{-1, -1, -1},{-1, -1, -1},{-1, -1, -1}};
1067  Int predNum[4], predIdx[4] ={ -1,-1,-1,-1};
1068  PartSize mode = pcCU->getPartitionSize( absPartIdx );
1069  UInt partNum = isMultiple?(mode==SIZE_NxN?4:1):1;
1070  UInt partOffset = ( pcCU->getPic()->getNumPartInCU() >> ( pcCU->getDepth(absPartIdx) << 1 ) ) >> 2;
1071  for (j=0;j<partNum;j++)
1072  {
1073    dir[j] = pcCU->getLumaIntraDir( absPartIdx+partOffset*j );
1074#if H_3D_DIM
1075    if( pcCU->getSlice()->getVpsDepthModesFlag() )
1076    {
1077      codeIntraDepth( pcCU, absPartIdx+partOffset*j );
1078    }
1079    if( pcCU->getLumaIntraDir( absPartIdx+partOffset*j ) < NUM_INTRA_MODE )
1080#if H_3D_DIM_SDC
1081      if( !pcCU->getSDCFlag( absPartIdx+partOffset*j ) )
1082#endif
1083    {
1084#endif
1085    predNum[j] = pcCU->getIntraDirLumaPredictor(absPartIdx+partOffset*j, preds[j]); 
1086    for(UInt i = 0; i < predNum[j]; i++)
1087    {
1088      if(dir[j] == preds[j][i])
1089      {
1090        predIdx[j] = i;
1091      }
1092    }
1093    m_pcBinIf->encodeBin((predIdx[j] != -1)? 1 : 0, m_cCUIntraPredSCModel.get( 0, 0, 0 ) );
1094#if H_MV_ENC_DEC_TRAC
1095    DTRACE_CU("prev_intra_luma_pred_flag", (predIdx[j] != -1)? 1 : 0); 
1096#endif
1097#if H_3D_DIM
1098    }
1099#endif
1100
1101  } 
1102  for (j=0;j<partNum;j++)
1103  {
1104#if H_3D_DIM
1105    if( pcCU->getLumaIntraDir( absPartIdx+partOffset*j ) < NUM_INTRA_MODE )
1106#if H_3D_DIM_SDC
1107      if( !pcCU->getSDCFlag( absPartIdx+partOffset*j ) )
1108#endif
1109    {
1110#endif
1111    if(predIdx[j] != -1)
1112    {
1113      m_pcBinIf->encodeBinEP( predIdx[j] ? 1 : 0 );
1114      if (predIdx[j])
1115      {
1116        m_pcBinIf->encodeBinEP( predIdx[j]-1 );
1117      }
1118#if H_MV_ENC_DEC_TRAC
1119      DTRACE_CU("mpm_idx", predIdx[j] ); 
1120#endif
1121    }
1122    else
1123    {
1124      if (preds[j][0] > preds[j][1])
1125      { 
1126        std::swap(preds[j][0], preds[j][1]); 
1127      }
1128      if (preds[j][0] > preds[j][2])
1129      {
1130        std::swap(preds[j][0], preds[j][2]);
1131      }
1132      if (preds[j][1] > preds[j][2])
1133      {
1134        std::swap(preds[j][1], preds[j][2]);
1135      }
1136      for(Int i = (predNum[j] - 1); i >= 0; i--)
1137      {
1138        dir[j] = dir[j] > preds[j][i] ? dir[j] - 1 : dir[j];
1139      }
1140      m_pcBinIf->encodeBinsEP( dir[j], 5 );
1141#if H_MV_ENC_DEC_TRAC
1142      DTRACE_CU("rem_intra_luma_pred_mode", dir[j] ); 
1143#endif
1144    }
1145#if H_3D_DIM
1146    }
1147#endif
1148  }
1149  return;
1150}
1151
1152Void TEncSbac::codeIntraDirChroma( TComDataCU* pcCU, UInt uiAbsPartIdx )
1153{
1154  UInt uiIntraDirChroma = pcCU->getChromaIntraDir( uiAbsPartIdx );
1155
1156  if( uiIntraDirChroma == DM_CHROMA_IDX ) 
1157  {
1158    m_pcBinIf->encodeBin( 0, m_cCUChromaPredSCModel.get( 0, 0, 0 ) );
1159#if H_MV_ENC_DEC_TRAC
1160    DTRACE_CU("intra_chroma_pred_mode", 0 ); 
1161#endif
1162  }
1163  else
1164  { 
1165    UInt uiAllowedChromaDir[ NUM_CHROMA_MODE ];
1166    pcCU->getAllowedChromaDir( uiAbsPartIdx, uiAllowedChromaDir );
1167
1168    for( Int i = 0; i < NUM_CHROMA_MODE - 1; i++ )
1169    {
1170      if( uiIntraDirChroma == uiAllowedChromaDir[i] )
1171      {
1172        uiIntraDirChroma = i;
1173        break;
1174      }
1175    }
1176    m_pcBinIf->encodeBin( 1, m_cCUChromaPredSCModel.get( 0, 0, 0 ) );
1177
1178    m_pcBinIf->encodeBinsEP( uiIntraDirChroma, 2 );
1179#if H_MV_ENC_DEC_TRAC
1180    DTRACE_CU("intra_chroma_pred_mode", uiIntraDirChroma ); 
1181#endif
1182
1183  }
1184  return;
1185}
1186
1187#if H_3D_DIM
1188Void TEncSbac::codeIntraDepth( TComDataCU* pcCU, UInt absPartIdx )
1189{
1190  codeIntraDepthMode( pcCU, absPartIdx );
1191
1192  UInt dir     = pcCU->getLumaIntraDir( absPartIdx );
1193  UInt dimType = getDimType( dir );
1194
1195  switch( dimType )
1196  {
1197#if H_3D_DIM_DMM
1198  case( DMM1_IDX ):
1199    {
1200      xCodeDmm1WedgeIdx( pcCU->getDmmWedgeTabIdx( dimType, absPartIdx ), g_dmm1TabIdxBits[pcCU->getIntraSizeIdx(absPartIdx)] );
1201    } break;
1202  case( DMM2_IDX ):
1203    {
1204      xCodeDmm2Offset( pcCU->getDmm2DeltaEnd( absPartIdx ) );
1205    } break;
1206  case( DMM3_IDX ):
1207    {
1208      xCodeDmm3WedgeIdx( pcCU->getDmm3IntraTabIdx( absPartIdx ), g_dmm3IntraTabIdxBits[pcCU->getIntraSizeIdx(absPartIdx)] );
1209    } break;
1210  case( DMM4_IDX ): break;
1211#endif
1212#if H_3D_DIM_RBC
1213  case( RBC_IDX ):
1214    {
1215      assert( pcCU->getWidth( absPartIdx ) < 64 );
1216      xCodeRbcEdge( pcCU, absPartIdx );
1217    } break;
1218#endif
1219  default: break;
1220  }
1221
1222#if H_3D_DIM_SDC
1223  if( pcCU->getSDCFlag( absPartIdx ) )
1224  {
1225    assert(pcCU->getPartitionSize(absPartIdx)==SIZE_2Nx2N);
1226    UInt uiNumSegments = ( dir == DC_IDX || dir == PLANAR_IDX )? 1 : 2;
1227    for(UInt uiSeg=0; uiSeg<uiNumSegments; uiSeg++)
1228    {
1229      xCodeSDCResidualData(pcCU, absPartIdx, uiSeg);
1230    }
1231  }
1232  else
1233  {
1234#endif
1235    if( dimType < DIM_NUM_TYPE )
1236    {
1237      UInt dimDeltaDC = isDimDeltaDC( dir );
1238      m_pcBinIf->encodeBin( dimDeltaDC, m_cDdcFlagSCModel.get(0, 0, (RBC_IDX == dimType) ? 1 : 0) );
1239      if( dimDeltaDC ) 
1240      {
1241        for( UInt segment = 0; segment < 2; segment++ )
1242        {
1243          xCodeDimDeltaDC( pcCU->getDimDeltaDC( dimType, segment, absPartIdx ), dimType );
1244        }
1245      }
1246    }
1247#if H_3D_DIM_SDC
1248  }
1249#endif
1250}
1251
1252Void TEncSbac::codeIntraDepthMode( TComDataCU* pcCU, UInt absPartIdx )
1253{
1254  UInt codeWordTable[3][9] =    {{0, 0, 0, 2, 0,6, 0, 0, 7},{0, 2, 3, 4, 5, 6, 14, 31, 30},{0, 2, 0, 0, 0, 0, 3, 0, 0}};
1255  UInt codeWordLenTable[3][9] = {{0, 1, 0, 2, 0,3, 0, 0, 3},{2, 3, 3, 3, 3, 3,  4,  5,  5},{1, 2, 0, 0, 0, 0, 2, 0, 0}};
1256  UInt dir = pcCU->getLumaIntraDir( absPartIdx );
1257  UInt puIdx = (pcCU->getWidth(absPartIdx) == 64) ? 2 : ( (pcCU->getPartitionSize(absPartIdx) == SIZE_NxN && pcCU->getWidth(absPartIdx) == 8) ? 0 : 1 );
1258  UInt codeIdx = 0;
1259
1260  if( dir < NUM_INTRA_MODE )
1261  { 
1262    codeIdx = 1; 
1263  }
1264  if( isDimMode( dir ) )
1265  {
1266    switch( getDimType( dir ) )
1267    {
1268    case DMM1_IDX: codeIdx = 3; break;
1269    case DMM4_IDX: codeIdx = 4; break;
1270    case DMM3_IDX: codeIdx = 5; break;
1271    case DMM2_IDX: codeIdx = 7; break;
1272    case  RBC_IDX: codeIdx = 8; break;
1273    default:                    break;
1274    }
1275  }
1276
1277#if H_3D_DIM_SDC
1278  if( pcCU->getSDCFlag( absPartIdx ) )
1279  {
1280    switch( dir )
1281    {
1282      case PLANAR_IDX:  codeIdx = 0; break;
1283      case DC_IDX:      codeIdx = 6; break;
1284      default:          codeIdx = 2; break;
1285    }
1286  }
1287#endif
1288  //mode coding
1289  for( UInt i = 0; i < codeWordLenTable[puIdx][codeIdx]; i++ )
1290  {
1291    UInt bit = codeWordTable[puIdx][codeIdx] & ( 1<<(codeWordLenTable[puIdx][codeIdx] - i - 1) );
1292    UInt ctxDepthMode = puIdx*3 + ( (i >= 2) ? 2 : i );
1293    m_pcBinIf->encodeBin( bit!=0 , m_cDepthIntraModeSCModel.get(0, 0, ctxDepthMode) );
1294  }
1295}
1296#endif
1297
1298
1299Void TEncSbac::codeInterDir( TComDataCU* pcCU, UInt uiAbsPartIdx )
1300{
1301  const UInt uiInterDir = pcCU->getInterDir( uiAbsPartIdx ) - 1;
1302  const UInt uiCtx      = pcCU->getCtxInterDir( uiAbsPartIdx );
1303  ContextModel *pCtx    = m_cCUInterDirSCModel.get( 0 );
1304  if (pcCU->getPartitionSize(uiAbsPartIdx) == SIZE_2Nx2N || pcCU->getHeight(uiAbsPartIdx) != 8 )
1305  {
1306    m_pcBinIf->encodeBin( uiInterDir == 2 ? 1 : 0, *( pCtx + uiCtx ) );
1307  }
1308  if (uiInterDir < 2)
1309  {
1310    m_pcBinIf->encodeBin( uiInterDir, *( pCtx + 4 ) );
1311  }
1312#if H_MV_ENC_DEC_TRAC
1313  DTRACE_PU("inter_pred_idc", uiInterDir ); 
1314#endif
1315
1316  return;
1317}
1318
1319Void TEncSbac::codeRefFrmIdx( TComDataCU* pcCU, UInt uiAbsPartIdx, RefPicList eRefList )
1320{
1321  {
1322    Int iRefFrame = pcCU->getCUMvField( eRefList )->getRefIdx( uiAbsPartIdx );
1323    ContextModel *pCtx = m_cCURefPicSCModel.get( 0 );
1324    m_pcBinIf->encodeBin( ( iRefFrame == 0 ? 0 : 1 ), *pCtx );
1325   
1326    if( iRefFrame > 0 )
1327    {
1328      UInt uiRefNum = pcCU->getSlice()->getNumRefIdx( eRefList ) - 2;
1329      pCtx++;
1330      iRefFrame--;
1331      for( UInt ui = 0; ui < uiRefNum; ++ui )
1332      {
1333        const UInt uiSymbol = ui == iRefFrame ? 0 : 1;
1334        if( ui == 0 )
1335        {
1336          m_pcBinIf->encodeBin( uiSymbol, *pCtx );       
1337        }
1338        else
1339        {
1340          m_pcBinIf->encodeBinEP( uiSymbol );
1341        }
1342        if( uiSymbol == 0 )
1343        {
1344          break;
1345        }
1346      }
1347    }
1348#if H_MV_ENC_DEC_TRAC
1349#if ENC_DEC_TRACE
1350    iRefFrame = pcCU->getCUMvField( eRefList )->getRefIdx( uiAbsPartIdx ); 
1351    if ( eRefList == REF_PIC_LIST_0 )
1352    {
1353      DTRACE_PU("ref_idx_l0", iRefFrame)
1354    }
1355    else
1356    {
1357      DTRACE_PU("ref_idx_l1", iRefFrame)
1358    }
1359#endif
1360#endif
1361  }
1362  return;
1363}
1364
1365Void TEncSbac::codeMvd( TComDataCU* pcCU, UInt uiAbsPartIdx, RefPicList eRefList )
1366{
1367  if(pcCU->getSlice()->getMvdL1ZeroFlag() && eRefList == REF_PIC_LIST_1 && pcCU->getInterDir(uiAbsPartIdx)==3)
1368  {
1369    return;
1370  }
1371
1372  const TComCUMvField* pcCUMvField = pcCU->getCUMvField( eRefList );
1373  const Int iHor = pcCUMvField->getMvd( uiAbsPartIdx ).getHor();
1374  const Int iVer = pcCUMvField->getMvd( uiAbsPartIdx ).getVer();
1375  ContextModel* pCtx = m_cCUMvdSCModel.get( 0 );
1376
1377  m_pcBinIf->encodeBin( iHor != 0 ? 1 : 0, *pCtx );
1378  m_pcBinIf->encodeBin( iVer != 0 ? 1 : 0, *pCtx );
1379
1380  const Bool bHorAbsGr0 = iHor != 0;
1381  const Bool bVerAbsGr0 = iVer != 0;
1382  const UInt uiHorAbs   = 0 > iHor ? -iHor : iHor;
1383  const UInt uiVerAbs   = 0 > iVer ? -iVer : iVer;
1384  pCtx++;
1385
1386  if( bHorAbsGr0 )
1387  {
1388    m_pcBinIf->encodeBin( uiHorAbs > 1 ? 1 : 0, *pCtx );
1389  }
1390
1391  if( bVerAbsGr0 )
1392  {
1393    m_pcBinIf->encodeBin( uiVerAbs > 1 ? 1 : 0, *pCtx );
1394  }
1395
1396  if( bHorAbsGr0 )
1397  {
1398    if( uiHorAbs > 1 )
1399    {
1400      xWriteEpExGolomb( uiHorAbs-2, 1 );
1401    }
1402
1403    m_pcBinIf->encodeBinEP( 0 > iHor ? 1 : 0 );
1404  }
1405
1406  if( bVerAbsGr0 )
1407  {
1408    if( uiVerAbs > 1 )
1409    {
1410      xWriteEpExGolomb( uiVerAbs-2, 1 );
1411    }
1412
1413    m_pcBinIf->encodeBinEP( 0 > iVer ? 1 : 0 );
1414  }
1415 
1416  return;
1417}
1418
1419Void TEncSbac::codeDeltaQP( TComDataCU* pcCU, UInt uiAbsPartIdx )
1420{
1421  Int iDQp  = pcCU->getQP( uiAbsPartIdx ) - pcCU->getRefQP( uiAbsPartIdx );
1422 
1423  Int qpBdOffsetY =  pcCU->getSlice()->getSPS()->getQpBDOffsetY();
1424  iDQp = (iDQp + 78 + qpBdOffsetY + (qpBdOffsetY/2)) % (52 + qpBdOffsetY) - 26 - (qpBdOffsetY/2);
1425
1426  UInt uiAbsDQp = (UInt)((iDQp > 0)? iDQp  : (-iDQp));
1427  UInt TUValue = min((Int)uiAbsDQp, CU_DQP_TU_CMAX);
1428  xWriteUnaryMaxSymbol( TUValue, &m_cCUDeltaQpSCModel.get( 0, 0, 0 ), 1, CU_DQP_TU_CMAX);
1429  if( uiAbsDQp >= CU_DQP_TU_CMAX )
1430  {
1431    xWriteEpExGolomb( uiAbsDQp - CU_DQP_TU_CMAX, CU_DQP_EG_k );
1432  }
1433
1434  if ( uiAbsDQp > 0)
1435  {
1436    UInt uiSign = (iDQp > 0 ? 0 : 1);
1437    m_pcBinIf->encodeBinEP(uiSign);
1438  }
1439
1440  return;
1441}
1442
1443Void TEncSbac::codeQtCbf( TComDataCU* pcCU, UInt uiAbsPartIdx, TextType eType, UInt uiTrDepth )
1444{
1445  UInt uiCbf = pcCU->getCbf     ( uiAbsPartIdx, eType, uiTrDepth );
1446  UInt uiCtx = pcCU->getCtxQtCbf( eType, uiTrDepth );
1447  m_pcBinIf->encodeBin( uiCbf , m_cCUQtCbfSCModel.get( 0, eType ? TEXT_CHROMA : eType, uiCtx ) );
1448#if !H_MV_ENC_DEC_TRAC
1449  DTRACE_CABAC_VL( g_nSymbolCounter++ )
1450  DTRACE_CABAC_T( "\tparseQtCbf()" )
1451  DTRACE_CABAC_T( "\tsymbol=" )
1452  DTRACE_CABAC_V( uiCbf )
1453  DTRACE_CABAC_T( "\tctx=" )
1454  DTRACE_CABAC_V( uiCtx )
1455  DTRACE_CABAC_T( "\tetype=" )
1456  DTRACE_CABAC_V( eType )
1457  DTRACE_CABAC_T( "\tuiAbsPartIdx=" )
1458  DTRACE_CABAC_V( uiAbsPartIdx )
1459  DTRACE_CABAC_T( "\n" )
1460#endif
1461}
1462
1463void TEncSbac::codeTransformSkipFlags (TComDataCU* pcCU, UInt uiAbsPartIdx, UInt width, UInt height, TextType eTType )
1464{
1465  if (pcCU->getCUTransquantBypass(uiAbsPartIdx))
1466  {
1467    return;
1468  }
1469  if(width != 4 || height != 4)
1470  {
1471    return;
1472  }
1473
1474  UInt useTransformSkip = pcCU->getTransformSkip( uiAbsPartIdx,eTType);
1475  m_pcBinIf->encodeBin( useTransformSkip, m_cTransformSkipSCModel.get( 0, eTType? TEXT_CHROMA: TEXT_LUMA, 0 ) );
1476#if !H_MV_ENC_DEC_TRAC
1477  DTRACE_CABAC_VL( g_nSymbolCounter++ )
1478  DTRACE_CABAC_T("\tparseTransformSkip()");
1479  DTRACE_CABAC_T( "\tsymbol=" )
1480  DTRACE_CABAC_V( useTransformSkip )
1481  DTRACE_CABAC_T( "\tAddr=" )
1482  DTRACE_CABAC_V( pcCU->getAddr() )
1483  DTRACE_CABAC_T( "\tetype=" )
1484  DTRACE_CABAC_V( eTType )
1485  DTRACE_CABAC_T( "\tuiAbsPartIdx=" )
1486  DTRACE_CABAC_V( uiAbsPartIdx )
1487  DTRACE_CABAC_T( "\n" )
1488#endif
1489}
1490
1491/** Code I_PCM information.
1492 * \param pcCU pointer to CU
1493 * \param uiAbsPartIdx CU index
1494 * \returns Void
1495 */
1496Void TEncSbac::codeIPCMInfo( TComDataCU* pcCU, UInt uiAbsPartIdx )
1497{
1498  UInt uiIPCM = (pcCU->getIPCMFlag(uiAbsPartIdx) == true)? 1 : 0;
1499
1500  Bool writePCMSampleFlag = pcCU->getIPCMFlag(uiAbsPartIdx);
1501
1502  m_pcBinIf->encodeBinTrm (uiIPCM);
1503#if H_MV_ENC_DEC_TRAC         
1504  DTRACE_CU("pcm_flag", uiIPCM)
1505#endif
1506  if (writePCMSampleFlag)
1507  {
1508    m_pcBinIf->encodePCMAlignBits();
1509
1510    UInt uiMinCoeffSize = pcCU->getPic()->getMinCUWidth()*pcCU->getPic()->getMinCUHeight();
1511    UInt uiLumaOffset   = uiMinCoeffSize*uiAbsPartIdx;
1512    UInt uiChromaOffset = uiLumaOffset>>2;
1513    Pel* piPCMSample;
1514    UInt uiWidth;
1515    UInt uiHeight;
1516    UInt uiSampleBits;
1517    UInt uiX, uiY;
1518
1519    piPCMSample = pcCU->getPCMSampleY() + uiLumaOffset;
1520    uiWidth = pcCU->getWidth(uiAbsPartIdx);
1521    uiHeight = pcCU->getHeight(uiAbsPartIdx);
1522    uiSampleBits = pcCU->getSlice()->getSPS()->getPCMBitDepthLuma();
1523
1524    for(uiY = 0; uiY < uiHeight; uiY++)
1525    {
1526      for(uiX = 0; uiX < uiWidth; uiX++)
1527      {
1528        UInt uiSample = piPCMSample[uiX];
1529
1530        m_pcBinIf->xWritePCMCode(uiSample, uiSampleBits);
1531      }
1532      piPCMSample += uiWidth;
1533    }
1534
1535    piPCMSample = pcCU->getPCMSampleCb() + uiChromaOffset;
1536    uiWidth = pcCU->getWidth(uiAbsPartIdx)/2;
1537    uiHeight = pcCU->getHeight(uiAbsPartIdx)/2;
1538    uiSampleBits = pcCU->getSlice()->getSPS()->getPCMBitDepthChroma();
1539
1540    for(uiY = 0; uiY < uiHeight; uiY++)
1541    {
1542      for(uiX = 0; uiX < uiWidth; uiX++)
1543      {
1544        UInt uiSample = piPCMSample[uiX];
1545
1546        m_pcBinIf->xWritePCMCode(uiSample, uiSampleBits);
1547      }
1548      piPCMSample += uiWidth;
1549    }
1550
1551    piPCMSample = pcCU->getPCMSampleCr() + uiChromaOffset;
1552    uiWidth = pcCU->getWidth(uiAbsPartIdx)/2;
1553    uiHeight = pcCU->getHeight(uiAbsPartIdx)/2;
1554    uiSampleBits = pcCU->getSlice()->getSPS()->getPCMBitDepthChroma();
1555
1556    for(uiY = 0; uiY < uiHeight; uiY++)
1557    {
1558      for(uiX = 0; uiX < uiWidth; uiX++)
1559      {
1560        UInt uiSample = piPCMSample[uiX];
1561
1562        m_pcBinIf->xWritePCMCode(uiSample, uiSampleBits);
1563      }
1564      piPCMSample += uiWidth;
1565    }
1566    m_pcBinIf->resetBac();
1567  }
1568}
1569
1570Void TEncSbac::codeQtRootCbf( TComDataCU* pcCU, UInt uiAbsPartIdx )
1571{
1572  UInt uiCbf = pcCU->getQtRootCbf( uiAbsPartIdx );
1573  UInt uiCtx = 0;
1574  m_pcBinIf->encodeBin( uiCbf , m_cCUQtRootCbfSCModel.get( 0, 0, uiCtx ) );
1575#if !H_MV_ENC_DEC_TRAC
1576  DTRACE_CABAC_VL( g_nSymbolCounter++ )
1577  DTRACE_CABAC_T( "\tparseQtRootCbf()" )
1578  DTRACE_CABAC_T( "\tsymbol=" )
1579  DTRACE_CABAC_V( uiCbf )
1580  DTRACE_CABAC_T( "\tctx=" )
1581  DTRACE_CABAC_V( uiCtx )
1582  DTRACE_CABAC_T( "\tuiAbsPartIdx=" )
1583  DTRACE_CABAC_V( uiAbsPartIdx )
1584  DTRACE_CABAC_T( "\n" )
1585#else
1586  DTRACE_CU( "rqt_root_cbf", uiCbf )
1587#endif
1588}
1589
1590Void TEncSbac::codeQtCbfZero( TComDataCU* pcCU, TextType eType, UInt uiTrDepth )
1591{
1592  // this function is only used to estimate the bits when cbf is 0
1593  // and will never be called when writing the bistream. do not need to write log
1594  UInt uiCbf = 0;
1595  UInt uiCtx = pcCU->getCtxQtCbf( eType, uiTrDepth );
1596  m_pcBinIf->encodeBin( uiCbf , m_cCUQtCbfSCModel.get( 0, eType ? TEXT_CHROMA : eType, uiCtx ) );
1597}
1598
1599Void TEncSbac::codeQtRootCbfZero( TComDataCU* pcCU )
1600{
1601  // this function is only used to estimate the bits when cbf is 0
1602  // and will never be called when writing the bistream. do not need to write log
1603  UInt uiCbf = 0;
1604  UInt uiCtx = 0;
1605  m_pcBinIf->encodeBin( uiCbf , m_cCUQtRootCbfSCModel.get( 0, 0, uiCtx ) );
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
1632  Int blkSizeOffsetX, blkSizeOffsetY, shiftX, shiftY;
1633  blkSizeOffsetX = eTType ? 0: (g_aucConvertToBit[ width ] *3 + ((g_aucConvertToBit[ width ] +1)>>2));
1634  blkSizeOffsetY = eTType ? 0: (g_aucConvertToBit[ height ]*3 + ((g_aucConvertToBit[ height ]+1)>>2));
1635  shiftX= eTType ? g_aucConvertToBit[ width  ] :((g_aucConvertToBit[ width  ]+3)>>2);
1636  shiftY= eTType ? g_aucConvertToBit[ height ] :((g_aucConvertToBit[ height ]+3)>>2);
1637  // posX
1638  for( uiCtxLast = 0; uiCtxLast < uiGroupIdxX; uiCtxLast++ )
1639  {
1640      m_pcBinIf->encodeBin( 1, *( pCtxX + blkSizeOffsetX + (uiCtxLast >>shiftX) ) );
1641  }
1642  if( uiGroupIdxX < g_uiGroupIdx[ width - 1 ])
1643  {
1644      m_pcBinIf->encodeBin( 0, *( pCtxX + blkSizeOffsetX + (uiCtxLast >>shiftX) ) );
1645  }
1646
1647  // posY
1648  for( uiCtxLast = 0; uiCtxLast < uiGroupIdxY; uiCtxLast++ )
1649  {
1650    m_pcBinIf->encodeBin( 1, *( pCtxY + blkSizeOffsetY + (uiCtxLast >>shiftY) ) );
1651  }
1652  if( uiGroupIdxY < g_uiGroupIdx[ height - 1 ])
1653  {
1654    m_pcBinIf->encodeBin( 0, *( pCtxY + blkSizeOffsetY + (uiCtxLast >>shiftY) ) );
1655  }
1656  if ( uiGroupIdxX > 3 )
1657  {     
1658    UInt uiCount = ( uiGroupIdxX - 2 ) >> 1;
1659    uiPosX       = uiPosX - g_uiMinInGroup[ uiGroupIdxX ];
1660    for (Int i = uiCount - 1 ; i >= 0; i-- )
1661    {
1662      m_pcBinIf->encodeBinEP( ( uiPosX >> i ) & 1 );
1663    }
1664  }
1665  if ( uiGroupIdxY > 3 )
1666  {     
1667    UInt uiCount = ( uiGroupIdxY - 2 ) >> 1;
1668    uiPosY       = uiPosY - g_uiMinInGroup[ uiGroupIdxY ];
1669    for ( Int i = uiCount - 1 ; i >= 0; i-- )
1670    {
1671      m_pcBinIf->encodeBinEP( ( uiPosY >> i ) & 1 );
1672    }
1673  }
1674}
1675
1676Void TEncSbac::codeCoeffNxN( TComDataCU* pcCU, TCoeff* pcCoef, UInt uiAbsPartIdx, UInt uiWidth, UInt uiHeight, UInt uiDepth, TextType eTType )
1677{
1678#if !H_MV_ENC_DEC_TRAC
1679  DTRACE_CABAC_VL( g_nSymbolCounter++ )
1680  DTRACE_CABAC_T( "\tparseCoeffNxN()\teType=" )
1681  DTRACE_CABAC_V( eTType )
1682  DTRACE_CABAC_T( "\twidth=" )
1683  DTRACE_CABAC_V( uiWidth )
1684  DTRACE_CABAC_T( "\theight=" )
1685  DTRACE_CABAC_V( uiHeight )
1686  DTRACE_CABAC_T( "\tdepth=" )
1687  DTRACE_CABAC_V( uiDepth )
1688  DTRACE_CABAC_T( "\tabspartidx=" )
1689  DTRACE_CABAC_V( uiAbsPartIdx )
1690  DTRACE_CABAC_T( "\ttoCU-X=" )
1691  DTRACE_CABAC_V( pcCU->getCUPelX() )
1692  DTRACE_CABAC_T( "\ttoCU-Y=" )
1693  DTRACE_CABAC_V( pcCU->getCUPelY() )
1694  DTRACE_CABAC_T( "\tCU-addr=" )
1695  DTRACE_CABAC_V(  pcCU->getAddr() )
1696  DTRACE_CABAC_T( "\tinCU-X=" )
1697  DTRACE_CABAC_V( g_auiRasterToPelX[ g_auiZscanToRaster[uiAbsPartIdx] ] )
1698  DTRACE_CABAC_T( "\tinCU-Y=" )
1699  DTRACE_CABAC_V( g_auiRasterToPelY[ g_auiZscanToRaster[uiAbsPartIdx] ] )
1700  DTRACE_CABAC_T( "\tpredmode=" )
1701  DTRACE_CABAC_V(  pcCU->getPredictionMode( uiAbsPartIdx ) )
1702  DTRACE_CABAC_T( "\n" )
1703#endif
1704  if( uiWidth > m_pcSlice->getSPS()->getMaxTrSize() )
1705  {
1706    uiWidth  = m_pcSlice->getSPS()->getMaxTrSize();
1707    uiHeight = m_pcSlice->getSPS()->getMaxTrSize();
1708  }
1709 
1710  UInt uiNumSig = 0;
1711 
1712  // compute number of significant coefficients
1713  uiNumSig = TEncEntropy::countNonZeroCoeffs(pcCoef, uiWidth * uiHeight);
1714 
1715  if ( uiNumSig == 0 )
1716    return;
1717  if(pcCU->getSlice()->getPPS()->getUseTransformSkip())
1718  {
1719    codeTransformSkipFlags( pcCU,uiAbsPartIdx, uiWidth, uiHeight, eTType );
1720  }
1721  eTType = eTType == TEXT_LUMA ? TEXT_LUMA : ( eTType == TEXT_NONE ? TEXT_NONE : TEXT_CHROMA );
1722 
1723  //----- encode significance map -----
1724  const UInt   uiLog2BlockSize = g_aucConvertToBit[ uiWidth ] + 2;
1725  UInt uiScanIdx = pcCU->getCoefScanIdx(uiAbsPartIdx, uiWidth, eTType==TEXT_LUMA, pcCU->isIntra(uiAbsPartIdx));
1726  const UInt *scan = g_auiSigLastScan[ uiScanIdx ][ uiLog2BlockSize - 1 ];
1727 
1728  Bool beValid;
1729  if (pcCU->getCUTransquantBypass(uiAbsPartIdx))
1730  {
1731    beValid = false;
1732  }
1733  else 
1734  {
1735    beValid = pcCU->getSlice()->getPPS()->getSignHideFlag() > 0;
1736  }
1737
1738  // Find position of last coefficient
1739  Int scanPosLast = -1;
1740  Int posLast;
1741
1742  const UInt * scanCG;
1743  {
1744    scanCG = g_auiSigLastScan[ uiScanIdx ][ uiLog2BlockSize > 3 ? uiLog2BlockSize-2-1 : 0 ];
1745    if( uiLog2BlockSize == 3 )
1746    {
1747      scanCG = g_sigLastScan8x8[ uiScanIdx ];
1748    }
1749    else if( uiLog2BlockSize == 5 )
1750    {
1751      scanCG = g_sigLastScanCG32x32;
1752    }
1753  }
1754  UInt uiSigCoeffGroupFlag[ MLS_GRP_NUM ];
1755  static const UInt uiShift = MLS_CG_SIZE >> 1;
1756  const UInt uiNumBlkSide = uiWidth >> uiShift;
1757
1758    ::memset( uiSigCoeffGroupFlag, 0, sizeof(UInt) * MLS_GRP_NUM );
1759
1760    do
1761    {
1762      posLast = scan[ ++scanPosLast ];
1763
1764      // get L1 sig map
1765      UInt uiPosY    = posLast >> uiLog2BlockSize;
1766      UInt uiPosX    = posLast - ( uiPosY << uiLog2BlockSize );
1767      UInt uiBlkIdx  = uiNumBlkSide * (uiPosY >> uiShift) + (uiPosX >> uiShift);
1768      if( pcCoef[ posLast ] )
1769      {
1770        uiSigCoeffGroupFlag[ uiBlkIdx ] = 1;
1771      }
1772
1773      uiNumSig -= ( pcCoef[ posLast ] != 0 );
1774    }
1775    while ( uiNumSig > 0 );
1776
1777  // Code position of last coefficient
1778  Int posLastY = posLast >> uiLog2BlockSize;
1779  Int posLastX = posLast - ( posLastY << uiLog2BlockSize );
1780  codeLastSignificantXY(posLastX, posLastY, uiWidth, uiHeight, eTType, uiScanIdx);
1781 
1782  //===== code significance flag =====
1783  ContextModel * const baseCoeffGroupCtx = m_cCUSigCoeffGroupSCModel.get( 0, eTType );
1784  ContextModel * const baseCtx = (eTType==TEXT_LUMA) ? m_cCUSigSCModel.get( 0, 0 ) : m_cCUSigSCModel.get( 0, 0 ) + NUM_SIG_FLAG_CTX_LUMA;
1785
1786
1787  const Int  iLastScanSet      = scanPosLast >> LOG2_SCAN_SET_SIZE;
1788  UInt c1 = 1;
1789  UInt uiGoRiceParam           = 0;
1790  Int  iScanPosSig             = scanPosLast;
1791
1792  for( Int iSubSet = iLastScanSet; iSubSet >= 0; iSubSet-- )
1793  {
1794    Int numNonZero = 0;
1795    Int  iSubPos     = iSubSet << LOG2_SCAN_SET_SIZE;
1796    uiGoRiceParam    = 0;
1797    Int absCoeff[16];
1798    UInt coeffSigns = 0;
1799
1800    Int lastNZPosInCG = -1, firstNZPosInCG = SCAN_SET_SIZE;
1801
1802    if( iScanPosSig == scanPosLast )
1803    {
1804      absCoeff[ 0 ] = abs( pcCoef[ posLast ] );
1805      coeffSigns    = ( pcCoef[ posLast ] < 0 );
1806      numNonZero    = 1;
1807      lastNZPosInCG  = iScanPosSig;
1808      firstNZPosInCG = iScanPosSig;
1809      iScanPosSig--;
1810    }
1811
1812      // encode significant_coeffgroup_flag
1813      Int iCGBlkPos = scanCG[ iSubSet ];
1814      Int iCGPosY   = iCGBlkPos / uiNumBlkSide;
1815      Int iCGPosX   = iCGBlkPos - (iCGPosY * uiNumBlkSide);
1816      if( iSubSet == iLastScanSet || iSubSet == 0)
1817      {
1818        uiSigCoeffGroupFlag[ iCGBlkPos ] = 1;
1819      }
1820      else
1821      {
1822          UInt uiSigCoeffGroup   = (uiSigCoeffGroupFlag[ iCGBlkPos ] != 0);
1823          UInt uiCtxSig  = TComTrQuant::getSigCoeffGroupCtxInc( uiSigCoeffGroupFlag, iCGPosX, iCGPosY, uiWidth, uiHeight );
1824          m_pcBinIf->encodeBin( uiSigCoeffGroup, baseCoeffGroupCtx[ uiCtxSig ] );
1825      }
1826     
1827      // encode significant_coeff_flag
1828      if( uiSigCoeffGroupFlag[ iCGBlkPos ] )
1829      {
1830        Int patternSigCtx = TComTrQuant::calcPatternSigCtx( uiSigCoeffGroupFlag, iCGPosX, iCGPosY, uiWidth, uiHeight );
1831        UInt uiBlkPos, uiPosY, uiPosX, uiSig, uiCtxSig;
1832        for( ; iScanPosSig >= iSubPos; iScanPosSig-- )
1833        {
1834          uiBlkPos  = scan[ iScanPosSig ]; 
1835          uiPosY    = uiBlkPos >> uiLog2BlockSize;
1836          uiPosX    = uiBlkPos - ( uiPosY << uiLog2BlockSize );
1837          uiSig     = (pcCoef[ uiBlkPos ] != 0);
1838          if( iScanPosSig > iSubPos || iSubSet == 0 || numNonZero )
1839          {
1840            uiCtxSig  = TComTrQuant::getSigCtxInc( patternSigCtx, uiScanIdx, uiPosX, uiPosY, uiLog2BlockSize, eTType );
1841            m_pcBinIf->encodeBin( uiSig, baseCtx[ uiCtxSig ] );
1842          }
1843          if( uiSig )
1844          {
1845            absCoeff[ numNonZero ] = abs( pcCoef[ uiBlkPos ] );
1846            coeffSigns = 2 * coeffSigns + ( pcCoef[ uiBlkPos ] < 0 );
1847            numNonZero++;
1848            if( lastNZPosInCG == -1 )
1849            {
1850              lastNZPosInCG = iScanPosSig;
1851            }
1852            firstNZPosInCG = iScanPosSig;
1853          }
1854        }
1855      }
1856      else
1857      {
1858        iScanPosSig = iSubPos - 1;
1859      }
1860
1861    if( numNonZero > 0 )
1862    {
1863      Bool signHidden = ( lastNZPosInCG - firstNZPosInCG >= SBH_THRESHOLD );
1864      UInt uiCtxSet = (iSubSet > 0 && eTType==TEXT_LUMA) ? 2 : 0;
1865     
1866      if( c1 == 0 )
1867      {
1868        uiCtxSet++;
1869      }
1870      c1 = 1;
1871      ContextModel *baseCtxMod = ( eTType==TEXT_LUMA ) ? m_cCUOneSCModel.get( 0, 0 ) + 4 * uiCtxSet : m_cCUOneSCModel.get( 0, 0 ) + NUM_ONE_FLAG_CTX_LUMA + 4 * uiCtxSet;
1872     
1873      Int numC1Flag = min(numNonZero, C1FLAG_NUMBER);
1874      Int firstC2FlagIdx = -1;
1875      for( Int idx = 0; idx < numC1Flag; idx++ )
1876      {
1877        UInt uiSymbol = absCoeff[ idx ] > 1;
1878        m_pcBinIf->encodeBin( uiSymbol, baseCtxMod[c1] );
1879        if( uiSymbol )
1880        {
1881          c1 = 0;
1882
1883          if (firstC2FlagIdx == -1)
1884          {
1885            firstC2FlagIdx = idx;
1886          }
1887        }
1888        else if( (c1 < 3) && (c1 > 0) )
1889        {
1890          c1++;
1891        }
1892      }
1893     
1894      if (c1 == 0)
1895      {
1896
1897        baseCtxMod = ( eTType==TEXT_LUMA ) ? m_cCUAbsSCModel.get( 0, 0 ) + uiCtxSet : m_cCUAbsSCModel.get( 0, 0 ) + NUM_ABS_FLAG_CTX_LUMA + uiCtxSet;
1898        if ( firstC2FlagIdx != -1)
1899        {
1900          UInt symbol = absCoeff[ firstC2FlagIdx ] > 2;
1901          m_pcBinIf->encodeBin( symbol, baseCtxMod[0] );
1902        }
1903      }
1904     
1905      if( beValid && signHidden )
1906      {
1907        m_pcBinIf->encodeBinsEP( (coeffSigns >> 1), numNonZero-1 );
1908      }
1909      else
1910      {
1911        m_pcBinIf->encodeBinsEP( coeffSigns, numNonZero );
1912      }
1913     
1914      Int iFirstCoeff2 = 1;   
1915      if (c1 == 0 || numNonZero > C1FLAG_NUMBER)
1916      {
1917        for ( Int idx = 0; idx < numNonZero; idx++ )
1918        {
1919          UInt baseLevel  = (idx < C1FLAG_NUMBER)? (2 + iFirstCoeff2 ) : 1;
1920
1921          if( absCoeff[ idx ] >= baseLevel)
1922          {
1923            xWriteCoefRemainExGolomb( absCoeff[ idx ] - baseLevel, uiGoRiceParam );
1924            if(absCoeff[idx] > 3*(1<<uiGoRiceParam))
1925            {
1926               uiGoRiceParam = min<UInt>(uiGoRiceParam+ 1, 4);
1927            }
1928          }
1929          if(absCoeff[ idx ] >= 2) 
1930          {
1931            iFirstCoeff2 = 0;
1932          }
1933        }       
1934      }
1935    }
1936  }
1937
1938  return;
1939}
1940
1941/** code SAO offset sign
1942 * \param code sign value
1943 */
1944Void TEncSbac::codeSAOSign( UInt code )
1945{
1946  m_pcBinIf->encodeBinEP( code );
1947}
1948
1949Void TEncSbac::codeSaoMaxUvlc    ( UInt code, UInt maxSymbol )
1950{
1951  if (maxSymbol == 0)
1952  {
1953    return;
1954  }
1955
1956  Int i;
1957  Bool bCodeLast = ( maxSymbol > code );
1958
1959  if ( code == 0 )
1960  {
1961    m_pcBinIf->encodeBinEP( 0 );
1962  }
1963  else
1964  {
1965    m_pcBinIf->encodeBinEP( 1 );
1966    for ( i=0; i<code-1; i++ )
1967    {
1968      m_pcBinIf->encodeBinEP( 1 );
1969    }
1970    if( bCodeLast )
1971    {
1972      m_pcBinIf->encodeBinEP( 0 );
1973    }
1974  }
1975}
1976
1977
1978/** Code SAO EO class or BO band position
1979 * \param uiLength
1980 * \param uiCode
1981 */
1982Void TEncSbac::codeSaoUflc       ( UInt uiLength, UInt uiCode )
1983{
1984   m_pcBinIf->encodeBinsEP ( uiCode, uiLength );
1985}
1986/** Code SAO merge flags
1987 * \param uiCode
1988 * \param uiCompIdx
1989 */
1990Void TEncSbac::codeSaoMerge       ( UInt uiCode )
1991{
1992  if (uiCode == 0)
1993  {
1994    m_pcBinIf->encodeBin(0,  m_cSaoMergeSCModel.get( 0, 0, 0 ));
1995  }
1996  else
1997  {
1998    m_pcBinIf->encodeBin(1,  m_cSaoMergeSCModel.get( 0, 0, 0 ));
1999  }
2000}
2001/** Code SAO type index
2002 * \param uiCode
2003 */
2004Void TEncSbac::codeSaoTypeIdx       ( UInt uiCode)
2005{
2006  if (uiCode == 0)
2007  {
2008    m_pcBinIf->encodeBin( 0, m_cSaoTypeIdxSCModel.get( 0, 0, 0 ) );
2009  }
2010  else
2011  {
2012    m_pcBinIf->encodeBin( 1, m_cSaoTypeIdxSCModel.get( 0, 0, 0 ) );
2013    m_pcBinIf->encodeBinEP( uiCode <= 4 ? 1 : 0 );
2014  }
2015}
2016/*!
2017 ****************************************************************************
2018 * \brief
2019 *   estimate bit cost for CBP, significant map and significant coefficients
2020 ****************************************************************************
2021 */
2022Void TEncSbac::estBit( estBitsSbacStruct* pcEstBitsSbac, Int width, Int height, TextType eTType )
2023{
2024  estCBFBit( pcEstBitsSbac );
2025
2026  estSignificantCoeffGroupMapBit( pcEstBitsSbac, eTType );
2027 
2028  // encode significance map
2029  estSignificantMapBit( pcEstBitsSbac, width, height, eTType );
2030 
2031  // encode significant coefficients
2032  estSignificantCoefficientsBit( pcEstBitsSbac, eTType );
2033}
2034
2035/*!
2036 ****************************************************************************
2037 * \brief
2038 *    estimate bit cost for each CBP bit
2039 ****************************************************************************
2040 */
2041Void TEncSbac::estCBFBit( estBitsSbacStruct* pcEstBitsSbac )
2042{
2043  ContextModel *pCtx = m_cCUQtCbfSCModel.get( 0 );
2044
2045  for( UInt uiCtxInc = 0; uiCtxInc < 3*NUM_QT_CBF_CTX; uiCtxInc++ )
2046  {
2047    pcEstBitsSbac->blockCbpBits[ uiCtxInc ][ 0 ] = pCtx[ uiCtxInc ].getEntropyBits( 0 );
2048    pcEstBitsSbac->blockCbpBits[ uiCtxInc ][ 1 ] = pCtx[ uiCtxInc ].getEntropyBits( 1 );
2049  }
2050
2051  pCtx = m_cCUQtRootCbfSCModel.get( 0 );
2052 
2053  for( UInt uiCtxInc = 0; uiCtxInc < 4; uiCtxInc++ )
2054  {
2055    pcEstBitsSbac->blockRootCbpBits[ uiCtxInc ][ 0 ] = pCtx[ uiCtxInc ].getEntropyBits( 0 );
2056    pcEstBitsSbac->blockRootCbpBits[ uiCtxInc ][ 1 ] = pCtx[ uiCtxInc ].getEntropyBits( 1 );
2057  }
2058}
2059
2060
2061/*!
2062 ****************************************************************************
2063 * \brief
2064 *    estimate SAMBAC bit cost for significant coefficient group map
2065 ****************************************************************************
2066 */
2067Void TEncSbac::estSignificantCoeffGroupMapBit( estBitsSbacStruct* pcEstBitsSbac, TextType eTType )
2068{
2069  Int firstCtx = 0, numCtx = NUM_SIG_CG_FLAG_CTX;
2070
2071  for ( Int ctxIdx = firstCtx; ctxIdx < firstCtx + numCtx; ctxIdx++ )
2072  {
2073    for( UInt uiBin = 0; uiBin < 2; uiBin++ )
2074    {
2075      pcEstBitsSbac->significantCoeffGroupBits[ ctxIdx ][ uiBin ] = m_cCUSigCoeffGroupSCModel.get(  0, eTType, ctxIdx ).getEntropyBits( uiBin );
2076    }
2077  }
2078}
2079
2080
2081/*!
2082 ****************************************************************************
2083 * \brief
2084 *    estimate SAMBAC bit cost for significant coefficient map
2085 ****************************************************************************
2086 */
2087Void TEncSbac::estSignificantMapBit( estBitsSbacStruct* pcEstBitsSbac, Int width, Int height, TextType eTType )
2088{
2089  Int firstCtx = 1, numCtx = 8;
2090  if (max(width, height) >= 16)
2091  {
2092    firstCtx = (eTType == TEXT_LUMA) ? 21 : 12;
2093    numCtx = (eTType == TEXT_LUMA) ? 6 : 3;
2094  }
2095  else if (width == 8)
2096  {
2097    firstCtx = 9;
2098    numCtx = (eTType == TEXT_LUMA) ? 12 : 3;
2099  }
2100 
2101  if (eTType == TEXT_LUMA )
2102  {
2103    for( UInt bin = 0; bin < 2; bin++ )
2104    {
2105      pcEstBitsSbac->significantBits[ 0 ][ bin ] = m_cCUSigSCModel.get(  0, 0, 0 ).getEntropyBits( bin );
2106    }
2107
2108    for ( Int ctxIdx = firstCtx; ctxIdx < firstCtx + numCtx; ctxIdx++ )
2109    {
2110      for( UInt uiBin = 0; uiBin < 2; uiBin++ )
2111      {
2112        pcEstBitsSbac->significantBits[ ctxIdx ][ uiBin ] = m_cCUSigSCModel.get(  0, 0, ctxIdx ).getEntropyBits( uiBin );
2113      }
2114    }
2115  }
2116  else
2117  {
2118    for( UInt bin = 0; bin < 2; bin++ )
2119    {
2120      pcEstBitsSbac->significantBits[ 0 ][ bin ] = m_cCUSigSCModel.get(  0, 0, NUM_SIG_FLAG_CTX_LUMA + 0 ).getEntropyBits( bin );
2121    }
2122    for ( Int ctxIdx = firstCtx; ctxIdx < firstCtx + numCtx; ctxIdx++ )
2123    {
2124      for( UInt uiBin = 0; uiBin < 2; uiBin++ )
2125      {
2126        pcEstBitsSbac->significantBits[ ctxIdx ][ uiBin ] = m_cCUSigSCModel.get(  0, 0, NUM_SIG_FLAG_CTX_LUMA + ctxIdx ).getEntropyBits( uiBin );
2127      }
2128    }
2129  }
2130  Int iBitsX = 0, iBitsY = 0;
2131  Int blkSizeOffsetX, blkSizeOffsetY, shiftX, shiftY;
2132
2133  blkSizeOffsetX = eTType ? 0: (g_aucConvertToBit[ width ] *3 + ((g_aucConvertToBit[ width ] +1)>>2));
2134  blkSizeOffsetY = eTType ? 0: (g_aucConvertToBit[ height ]*3 + ((g_aucConvertToBit[ height ]+1)>>2));
2135  shiftX = eTType ? g_aucConvertToBit[ width  ] :((g_aucConvertToBit[ width  ]+3)>>2);
2136  shiftY = eTType ? g_aucConvertToBit[ height ] :((g_aucConvertToBit[ height ]+3)>>2);
2137
2138  Int ctx;
2139  ContextModel *pCtxX      = m_cCuCtxLastX.get( 0, eTType );
2140  for (ctx = 0; ctx < g_uiGroupIdx[ width - 1 ]; ctx++)
2141  {
2142    Int ctxOffset = blkSizeOffsetX + (ctx >>shiftX);
2143    pcEstBitsSbac->lastXBits[ ctx ] = iBitsX + pCtxX[ ctxOffset ].getEntropyBits( 0 );
2144    iBitsX += pCtxX[ ctxOffset ].getEntropyBits( 1 );
2145  }
2146  pcEstBitsSbac->lastXBits[ctx] = iBitsX;
2147  ContextModel *pCtxY      = m_cCuCtxLastY.get( 0, eTType );
2148  for (ctx = 0; ctx < g_uiGroupIdx[ height - 1 ]; ctx++)
2149  {
2150    Int ctxOffset = blkSizeOffsetY + (ctx >>shiftY);
2151    pcEstBitsSbac->lastYBits[ ctx ] = iBitsY + pCtxY[ ctxOffset ].getEntropyBits( 0 );
2152    iBitsY += pCtxY[ ctxOffset ].getEntropyBits( 1 );
2153  }
2154  pcEstBitsSbac->lastYBits[ctx] = iBitsY;
2155}
2156
2157/*!
2158 ****************************************************************************
2159 * \brief
2160 *    estimate bit cost of significant coefficient
2161 ****************************************************************************
2162 */
2163Void TEncSbac::estSignificantCoefficientsBit( estBitsSbacStruct* pcEstBitsSbac, TextType eTType )
2164{
2165  if (eTType==TEXT_LUMA)
2166  {
2167    ContextModel *ctxOne = m_cCUOneSCModel.get(0, 0);
2168    ContextModel *ctxAbs = m_cCUAbsSCModel.get(0, 0);
2169
2170    for (Int ctxIdx = 0; ctxIdx < NUM_ONE_FLAG_CTX_LUMA; ctxIdx++)
2171    {
2172      pcEstBitsSbac->m_greaterOneBits[ ctxIdx ][ 0 ] = ctxOne[ ctxIdx ].getEntropyBits( 0 );
2173      pcEstBitsSbac->m_greaterOneBits[ ctxIdx ][ 1 ] = ctxOne[ ctxIdx ].getEntropyBits( 1 );   
2174    }
2175
2176    for (Int ctxIdx = 0; ctxIdx < NUM_ABS_FLAG_CTX_LUMA; ctxIdx++)
2177    {
2178      pcEstBitsSbac->m_levelAbsBits[ ctxIdx ][ 0 ] = ctxAbs[ ctxIdx ].getEntropyBits( 0 );
2179      pcEstBitsSbac->m_levelAbsBits[ ctxIdx ][ 1 ] = ctxAbs[ ctxIdx ].getEntropyBits( 1 );   
2180    }
2181  }
2182  else
2183  {
2184    ContextModel *ctxOne = m_cCUOneSCModel.get(0, 0) + NUM_ONE_FLAG_CTX_LUMA;
2185    ContextModel *ctxAbs = m_cCUAbsSCModel.get(0, 0) + NUM_ABS_FLAG_CTX_LUMA;
2186
2187    for (Int ctxIdx = 0; ctxIdx < NUM_ONE_FLAG_CTX_CHROMA; ctxIdx++)
2188    {
2189      pcEstBitsSbac->m_greaterOneBits[ ctxIdx ][ 0 ] = ctxOne[ ctxIdx ].getEntropyBits( 0 );
2190      pcEstBitsSbac->m_greaterOneBits[ ctxIdx ][ 1 ] = ctxOne[ ctxIdx ].getEntropyBits( 1 );   
2191    }
2192
2193    for (Int ctxIdx = 0; ctxIdx < NUM_ABS_FLAG_CTX_CHROMA; ctxIdx++)
2194    {
2195      pcEstBitsSbac->m_levelAbsBits[ ctxIdx ][ 0 ] = ctxAbs[ ctxIdx ].getEntropyBits( 0 );
2196      pcEstBitsSbac->m_levelAbsBits[ ctxIdx ][ 1 ] = ctxAbs[ ctxIdx ].getEntropyBits( 1 );   
2197    }
2198  }
2199}
2200
2201/**
2202 - Initialize our context information from the nominated source.
2203 .
2204 \param pSrc From where to copy context information.
2205 */
2206Void TEncSbac::xCopyContextsFrom( TEncSbac* pSrc )
2207{ 
2208  memcpy(m_contextModels, pSrc->m_contextModels, m_numContextModels*sizeof(m_contextModels[0]));
2209}
2210
2211Void  TEncSbac::loadContexts ( TEncSbac* pScr)
2212{
2213  this->xCopyContextsFrom(pScr);
2214}
2215//! \}
Note: See TracBrowser for help on using the repository browser.