source: 3DVCSoftware/branches/0.3-poznan-univ/source/Lib/TLibEncoder/TEncSbac.cpp @ 48

Last change on this file since 48 was 48, checked in by poznan-univ, 13 years ago

some bug fix on high level syntax
fixed some compiler warning issues under windows and linux

  • Property svn:eol-style set to native
File size: 76.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-2011, 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 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
35
36/** \file     TEncSbac.cpp
37    \brief    SBAC encoder class
38*/
39
40#include "TEncTop.h"
41#include "TEncSbac.h"
42
43#include <map>
44
45extern UChar  stateMappingTable[113];
46extern Int entropyBits[128];
47
48// ====================================================================================================================
49// Constructor / destructor / create / destroy
50// ====================================================================================================================
51
52TEncSbac::TEncSbac()
53// new structure here
54: m_pcBitIf                   ( NULL )
55, m_pcSlice                   ( NULL )
56, m_pcBinIf                   ( NULL )
57, m_bAlfCtrl                  ( false )
58, m_uiCoeffCost               ( 0 )
59, m_uiMaxAlfCtrlDepth         ( 0 )
60, m_cCUSplitFlagSCModel       ( 1,             1,               NUM_SPLIT_FLAG_CTX            )
61, m_cCUSkipFlagSCModel        ( 1,             1,               NUM_SKIP_FLAG_CTX             )
62, m_cCUMergeFlagExtSCModel    ( 1,             1,               NUM_MERGE_FLAG_EXT_CTX        )
63, m_cCUMergeIdxExtSCModel     ( 1,             1,               NUM_MERGE_IDX_EXT_CTX         )
64, m_cCUMVMergeIdxExtSCModel   ( 1,             1,               NUM_MV_MERGE_IDX_EXT_CTX      )
65, m_cResPredFlagSCModel       ( 1,             1,               NUM_RES_PRED_FLAG_CTX         )
66, m_cCUPartSizeSCModel        ( 1,             1,               NUM_PART_SIZE_CTX             )
67, m_cCUPredModeSCModel        ( 1,             1,               NUM_PRED_MODE_CTX             )
68, m_cCUAlfCtrlFlagSCModel     ( 1,             1,               NUM_ALF_CTRL_FLAG_CTX         )
69, m_cCUIntraPredSCModel       ( 1,             1,               NUM_ADI_CTX                   )
70#if ADD_PLANAR_MODE
71, m_cPlanarFlagSCModel        ( 1,             1,               NUM_PLANARFLAG_CTX            )
72#endif
73, m_cCUChromaPredSCModel      ( 1,             1,               NUM_CHROMA_PRED_CTX           )
74, m_cCUDeltaQpSCModel         ( 1,             1,               NUM_DELTA_QP_CTX              )
75, m_cCUInterDirSCModel        ( 1,             1,               NUM_INTER_DIR_CTX             )
76, m_cCURefPicSCModel          ( 1,             1,               NUM_REF_NO_CTX                )
77, m_cCUMvdSCModel             ( 1,             2,               NUM_MV_RES_CTX                )
78, m_cCUQtCbfSCModel           ( 1,             3,               NUM_QT_CBF_CTX                )
79, m_cCUTransSubdivFlagSCModel ( 1,             1,               NUM_TRANS_SUBDIV_FLAG_CTX     )
80, m_cCUQtRootCbfSCModel       ( 1,             1,               NUM_QT_ROOT_CBF_CTX           )
81#if SIMPLE_CONTEXT_SIG
82, m_cCUSigSCModel             ( 4,             2,               NUM_SIG_FLAG_CTX              )
83#else
84, m_cCUSigSCModel             ( MAX_CU_DEPTH,  2,               NUM_SIG_FLAG_CTX              )
85#endif
86#if PCP_SIGMAP_SIMPLE_LAST
87, m_cCuCtxLastX               ( 1,             2,               NUM_CTX_LAST_FLAG_XY          )
88, m_cCuCtxLastY               ( 1,             2,               NUM_CTX_LAST_FLAG_XY          )
89#else
90, m_cCULastSCModel            ( MAX_CU_DEPTH,  2,               NUM_LAST_FLAG_CTX             )
91#endif
92, m_cCUOneSCModel             ( 1,             2,               NUM_ONE_FLAG_CTX              )
93, m_cCUAbsSCModel             ( 1,             2,               NUM_ABS_FLAG_CTX              )
94, m_cMVPIdxSCModel            ( 1,             1,               NUM_MVP_IDX_CTX               )
95, m_cALFFlagSCModel           ( 1,             1,               NUM_ALF_FLAG_CTX              )
96, m_cALFUvlcSCModel           ( 1,             1,               NUM_ALF_UVLC_CTX              )
97, m_cALFSvlcSCModel           ( 1,             1,               NUM_ALF_SVLC_CTX              )
98#if MTK_SAO
99, m_cAOFlagSCModel            ( 1,             1,               NUM_AO_FLAG_CTX              )
100, m_cAOUvlcSCModel            ( 1,             1,               NUM_AO_UVLC_CTX              )
101, m_cAOSvlcSCModel            ( 1,             1,               NUM_AO_SVLC_CTX              )
102#endif
103, m_cViewIdxSCModel           ( 1,             1,               NUM_VIEW_IDX_CTX              )
104#if HHI_DMM_WEDGE_INTRA || HHI_DMM_PRED_TEX
105, m_cIntraDMMSCModel          ( 1,             1,               NUM_DMM_CTX                   )
106, m_cIntraWedgeSCModel        ( 1,             1,               NUM_WEDGE_CTX                 )
107#endif
108{
109
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  m_cCUSplitFlagSCModel.initBuffer       ( eSliceType, iQp, (Short*)INIT_SPLIT_FLAG );
126 
127  m_cCUSkipFlagSCModel.initBuffer        ( eSliceType, iQp, (Short*)INIT_SKIP_FLAG );
128  m_cCUAlfCtrlFlagSCModel.initBuffer     ( eSliceType, iQp, (Short*)INIT_ALF_CTRL_FLAG );
129  m_cCUMergeFlagExtSCModel.initBuffer    ( eSliceType, iQp, (Short*)INIT_MERGE_FLAG_EXT);
130  m_cCUMergeIdxExtSCModel.initBuffer     ( eSliceType, iQp, (Short*)INIT_MERGE_IDX_EXT);
131  m_cCUMVMergeIdxExtSCModel.initBuffer   ( eSliceType, iQp, (Short*)INIT_MV_MERGE_IDX_EXT );
132  m_cResPredFlagSCModel.initBuffer       ( eSliceType, iQp, (Short*)INIT_RES_PRED_FLAG );
133  m_cCUPartSizeSCModel.initBuffer        ( eSliceType, iQp, (Short*)INIT_PART_SIZE );
134  m_cCUPredModeSCModel.initBuffer        ( eSliceType, iQp, (Short*)INIT_PRED_MODE );
135  m_cCUIntraPredSCModel.initBuffer       ( eSliceType, iQp, (Short*)INIT_INTRA_PRED_MODE );
136#if ADD_PLANAR_MODE
137  m_cPlanarFlagSCModel.initBuffer        ( eSliceType, iQp, (Short*)INIT_PLANARFLAG );
138#endif
139  m_cCUChromaPredSCModel.initBuffer      ( eSliceType, iQp, (Short*)INIT_CHROMA_PRED_MODE );
140  m_cCUInterDirSCModel.initBuffer        ( eSliceType, iQp, (Short*)INIT_INTER_DIR );
141  m_cCUMvdSCModel.initBuffer             ( eSliceType, iQp, (Short*)INIT_MVD );
142  m_cCURefPicSCModel.initBuffer          ( eSliceType, iQp, (Short*)INIT_REF_PIC );
143  m_cCUDeltaQpSCModel.initBuffer         ( eSliceType, iQp, (Short*)INIT_DQP );
144  m_cCUQtCbfSCModel.initBuffer           ( eSliceType, iQp, (Short*)INIT_QT_CBF );
145  m_cCUQtRootCbfSCModel.initBuffer       ( eSliceType, iQp, (Short*)INIT_QT_ROOT_CBF );
146  m_cCUSigSCModel.initBuffer             ( eSliceType, iQp, (Short*)INIT_SIG_FLAG );
147#if PCP_SIGMAP_SIMPLE_LAST
148  m_cCuCtxLastX.initBuffer               ( eSliceType, iQp, (Short*)INIT_LAST_X );
149  m_cCuCtxLastY.initBuffer               ( eSliceType, iQp, (Short*)INIT_LAST_Y );
150#else
151  m_cCULastSCModel.initBuffer            ( eSliceType, iQp, (Short*)INIT_LAST_FLAG );
152#endif
153  m_cCUOneSCModel.initBuffer             ( eSliceType, iQp, (Short*)INIT_ONE_FLAG );
154  m_cCUAbsSCModel.initBuffer             ( eSliceType, iQp, (Short*)INIT_ABS_FLAG );
155  m_cMVPIdxSCModel.initBuffer            ( eSliceType, iQp, (Short*)INIT_MVP_IDX );
156  m_cALFFlagSCModel.initBuffer           ( eSliceType, iQp, (Short*)INIT_ALF_FLAG );
157  m_cALFUvlcSCModel.initBuffer           ( eSliceType, iQp, (Short*)INIT_ALF_UVLC );
158  m_cALFSvlcSCModel.initBuffer           ( eSliceType, iQp, (Short*)INIT_ALF_SVLC );
159  m_cCUTransSubdivFlagSCModel.initBuffer ( eSliceType, iQp, (Short*)INIT_TRANS_SUBDIV_FLAG );
160#if MTK_SAO
161  m_cAOFlagSCModel.initBuffer           ( eSliceType, iQp, (Short*)INIT_AO_FLAG );
162  m_cAOUvlcSCModel.initBuffer           ( eSliceType, iQp, (Short*)INIT_AO_UVLC );
163  m_cAOSvlcSCModel.initBuffer           ( eSliceType, iQp, (Short*)INIT_AO_SVLC );
164#endif
165  m_cViewIdxSCModel.initBuffer           ( eSliceType, iQp, (Short*)INIT_VIEW_IDX );
166#if HHI_DMM_WEDGE_INTRA || HHI_DMM_PRED_TEX
167  m_cIntraDMMSCModel.initBuffer          ( eSliceType, iQp, (Short*)INIT_INTRA_DMM );
168  m_cIntraWedgeSCModel.initBuffer        ( eSliceType, iQp, (Short*)INIT_INTRA_WEDGELET );
169#endif
170
171  // new structure
172  m_uiLastQp = iQp;
173 
174  m_pcBinIf->start();
175 
176  return;
177}
178
179#if BITSTREAM_EXTRACTION
180Void TEncSbac::codeNALUnitHeader( NalUnitType eNalUnitType, NalRefIdc eNalRefIdc, UInt TemporalId, UInt uiLayerId )
181#else
182Void TEncSbac::codeNALUnitHeader( NalUnitType eNalUnitType, NalRefIdc eNalRefIdc, UInt TemporalId, Bool bOutputFlag )
183#endif
184{
185  assert (0);
186  return;
187}
188
189void TEncSbac::codeSEI(const SEI&)
190{
191  assert(0);
192}
193
194Void TEncSbac::codeSPS( TComSPS* pcSPS )
195{
196  assert (0);
197  return;
198}
199
200Void TEncSbac::codePPS( TComPPS* pcPPS )
201{
202  assert (0);
203  return;
204}
205
206Void TEncSbac::codeSliceHeader( TComSlice* pcSlice )
207{
208  assert (0);
209  return;
210}
211
212Void TEncSbac::codeTerminatingBit( UInt uilsLast )
213{
214  m_pcBinIf->encodeBinTrm( uilsLast );
215}
216
217Void TEncSbac::codeSliceFinish()
218{
219  m_pcBinIf->finish();
220}
221
222
223
224Void TEncSbac::xWriteUnarySymbol( UInt uiSymbol, ContextModel* pcSCModel, Int iOffset )
225{
226  m_pcBinIf->encodeBin( uiSymbol ? 1 : 0, pcSCModel[0] );
227 
228  if( 0 == uiSymbol)
229  {
230    return;
231  }
232 
233  while( uiSymbol-- )
234  {
235    m_pcBinIf->encodeBin( uiSymbol ? 1 : 0, pcSCModel[ iOffset ] );
236  }
237 
238  return;
239}
240
241Void TEncSbac::xWriteUnaryMaxSymbol( UInt uiSymbol, ContextModel* pcSCModel, Int iOffset, UInt uiMaxSymbol )
242{
243  if (uiMaxSymbol == 0)
244  {
245    return;
246  }
247 
248  m_pcBinIf->encodeBin( uiSymbol ? 1 : 0, pcSCModel[ 0 ] );
249 
250  if ( uiSymbol == 0 )
251  {
252    return;
253  }
254 
255  Bool bCodeLast = ( uiMaxSymbol > uiSymbol );
256 
257  while( --uiSymbol )
258  {
259    m_pcBinIf->encodeBin( 1, pcSCModel[ iOffset ] );
260  }
261  if( bCodeLast )
262  {
263    m_pcBinIf->encodeBin( 0, pcSCModel[ iOffset ] );
264  }
265 
266  return;
267}
268
269Void TEncSbac::xWriteEpExGolomb( UInt uiSymbol, UInt uiCount )
270{
271  while( uiSymbol >= (UInt)(1<<uiCount) )
272  {
273    m_pcBinIf->encodeBinEP( 1 );
274    uiSymbol -= 1<<uiCount;
275    uiCount  ++;
276  }
277  m_pcBinIf->encodeBinEP( 0 );
278  while( uiCount-- )
279  {
280    m_pcBinIf->encodeBinEP( (uiSymbol>>uiCount) & 1 );
281  }
282 
283  return;
284}
285
286#if E253
287/** Coding of coeff_abs_level_minus3
288 * \param uiSymbol value of coeff_abs_level_minus3
289 * \param ruiGoRiceParam reference to Rice parameter
290 * \returns Void
291 */
292Void TEncSbac::xWriteGoRiceExGolomb( UInt uiSymbol, UInt &ruiGoRiceParam )
293{
294  UInt uiCount      = 0;
295  UInt uiMaxVlc     = g_auiGoRiceRange[ ruiGoRiceParam ];
296  Bool bExGolomb    = ( uiSymbol > uiMaxVlc );
297  UInt uiCodeWord   = min<UInt>( uiSymbol, ( uiMaxVlc + 1 ) );
298  UInt uiQuotient   = uiCodeWord >> ruiGoRiceParam;
299  UInt uiUnaryPart  = uiQuotient;
300  UInt uiRemainder  = 1;
301  UInt uiMaxPreLen  = g_auiGoRicePrefixLen[ ruiGoRiceParam ];
302
303  if( uiUnaryPart )
304  {
305    m_pcBinIf->encodeBinEP( 1 );
306    uiCount++;
307
308    while( --uiUnaryPart && uiCount < uiMaxPreLen )
309    {
310      m_pcBinIf->encodeBinEP( 1 );
311      uiCount++;
312    }
313
314    if( uiCount < uiMaxPreLen )
315    {
316      m_pcBinIf->encodeBinEP( uiUnaryPart ? 1 : 0 );
317    }
318  }
319  else
320  {
321    m_pcBinIf->encodeBinEP( 0 );
322  }
323
324  for( UInt ui = 0; ui < ruiGoRiceParam; ui++ )
325  {
326    m_pcBinIf->encodeBinEP( ( uiRemainder & uiCodeWord ) ? 1 : 0 );
327    uiRemainder = uiRemainder << 1;
328  }
329
330  ruiGoRiceParam = g_aauiGoRiceUpdate[ ruiGoRiceParam ][ min<UInt>( uiSymbol, 15 ) ];
331
332  if( bExGolomb )
333  {
334    uiSymbol -= uiMaxVlc + 1;
335    xWriteEpExGolomb( uiSymbol, 0 );
336  }
337
338  return;
339}
340#if HHI_DMM_WEDGE_INTRA || HHI_DMM_PRED_TEX
341Void TEncSbac::xWriteExGolombLevel( UInt uiSymbol, ContextModel& rcSCModel  )
342{
343  if( uiSymbol )
344  {
345    m_pcBinIf->encodeBin( 1, rcSCModel );
346    UInt uiCount = 0;
347    Bool bNoExGo = (uiSymbol < 13);
348
349    while( --uiSymbol && ++uiCount < 13 )
350    {
351      m_pcBinIf->encodeBin( 1, rcSCModel );
352    }
353    if( bNoExGo )
354    {
355      m_pcBinIf->encodeBin( 0, rcSCModel );
356    }
357    else
358    {
359      xWriteEpExGolomb( uiSymbol, 0 );
360    }
361  }
362  else
363  {
364    m_pcBinIf->encodeBin( 0, rcSCModel );
365  }
366
367  return;
368}
369#endif
370#else
371Void TEncSbac::xWriteExGolombLevel( UInt uiSymbol, ContextModel& rcSCModel  )
372{
373  if( uiSymbol )
374  {
375    m_pcBinIf->encodeBin( 1, rcSCModel );
376    UInt uiCount = 0;
377    Bool bNoExGo = (uiSymbol < 13);
378   
379    while( --uiSymbol && ++uiCount < 13 )
380    {
381      m_pcBinIf->encodeBin( 1, rcSCModel );
382    }
383    if( bNoExGo )
384    {
385      m_pcBinIf->encodeBin( 0, rcSCModel );
386    }
387    else
388    {
389      xWriteEpExGolomb( uiSymbol, 0 );
390    }
391  }
392  else
393  {
394    m_pcBinIf->encodeBin( 0, rcSCModel );
395  }
396 
397  return;
398}
399#endif
400
401// SBAC RD
402Void  TEncSbac::load ( TEncSbac* pScr)
403{
404  this->xCopyFrom(pScr);
405}
406
407Void  TEncSbac::store( TEncSbac* pDest)
408{
409  pDest->xCopyFrom( this );
410}
411
412
413Void TEncSbac::xCopyFrom( TEncSbac* pSrc )
414{
415  m_pcBinIf->copyState( pSrc->m_pcBinIf );
416 
417  this->m_uiCoeffCost = pSrc->m_uiCoeffCost;
418  this->m_uiLastQp    = pSrc->m_uiLastQp;
419 
420  this->m_cCUSplitFlagSCModel      .copyFrom( &pSrc->m_cCUSplitFlagSCModel       );
421  this->m_cCUSkipFlagSCModel       .copyFrom( &pSrc->m_cCUSkipFlagSCModel        );
422  this->m_cCUMergeFlagExtSCModel  .copyFrom( &pSrc->m_cCUMergeFlagExtSCModel);
423  this->m_cCUMergeIdxExtSCModel   .copyFrom( &pSrc->m_cCUMergeIdxExtSCModel);
424  this->m_cCUMVMergeIdxExtSCModel .copyFrom( &pSrc->m_cCUMVMergeIdxExtSCModel );
425  this->m_cResPredFlagSCModel     .copyFrom( &pSrc->m_cResPredFlagSCModel        );
426  this->m_cCUPartSizeSCModel       .copyFrom( &pSrc->m_cCUPartSizeSCModel        );
427  this->m_cCUPredModeSCModel       .copyFrom( &pSrc->m_cCUPredModeSCModel        );
428  this->m_cCUIntraPredSCModel      .copyFrom( &pSrc->m_cCUIntraPredSCModel       );
429#if ADD_PLANAR_MODE
430  this->m_cPlanarFlagSCModel       .copyFrom( &pSrc->m_cPlanarFlagSCModel        );
431#endif
432  this->m_cCUChromaPredSCModel     .copyFrom( &pSrc->m_cCUChromaPredSCModel      );
433  this->m_cCUDeltaQpSCModel        .copyFrom( &pSrc->m_cCUDeltaQpSCModel         );
434  this->m_cCUInterDirSCModel       .copyFrom( &pSrc->m_cCUInterDirSCModel        );
435  this->m_cCURefPicSCModel         .copyFrom( &pSrc->m_cCURefPicSCModel          );
436  this->m_cCUMvdSCModel            .copyFrom( &pSrc->m_cCUMvdSCModel             );
437  this->m_cCUQtCbfSCModel          .copyFrom( &pSrc->m_cCUQtCbfSCModel           );
438  this->m_cCUTransSubdivFlagSCModel.copyFrom( &pSrc->m_cCUTransSubdivFlagSCModel );
439  this->m_cCUQtRootCbfSCModel      .copyFrom( &pSrc->m_cCUQtRootCbfSCModel       );
440  this->m_cCUSigSCModel            .copyFrom( &pSrc->m_cCUSigSCModel             );
441#if PCP_SIGMAP_SIMPLE_LAST
442  this->m_cCuCtxLastX              .copyFrom( &pSrc->m_cCuCtxLastX               );
443  this->m_cCuCtxLastY              .copyFrom( &pSrc->m_cCuCtxLastY               );
444#else
445  this->m_cCULastSCModel           .copyFrom( &pSrc->m_cCULastSCModel            );
446#endif
447  this->m_cCUOneSCModel            .copyFrom( &pSrc->m_cCUOneSCModel             );
448  this->m_cCUAbsSCModel            .copyFrom( &pSrc->m_cCUAbsSCModel             );
449  this->m_cMVPIdxSCModel           .copyFrom( &pSrc->m_cMVPIdxSCModel            );
450  this->m_cViewIdxSCModel          .copyFrom( &pSrc->m_cViewIdxSCModel           );
451#if HHI_DMM_WEDGE_INTRA || HHI_DMM_PRED_TEX
452  this->m_cIntraDMMSCModel         .copyFrom( &pSrc->m_cIntraDMMSCModel          );
453  this->m_cIntraWedgeSCModel       .copyFrom( &pSrc->m_cIntraWedgeSCModel        );
454#endif
455}
456
457Void TEncSbac::codeMVPIdx ( TComDataCU* pcCU, UInt uiAbsPartIdx, RefPicList eRefList )
458{
459  Int iSymbol = pcCU->getMVPIdx(eRefList, uiAbsPartIdx);
460  Int iNum    = pcCU->getMVPNum(eRefList, uiAbsPartIdx);
461
462  xWriteUnaryMaxSymbol(iSymbol, m_cMVPIdxSCModel.get(0), 1, iNum-1);
463}
464
465Void TEncSbac::codePartSize( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth )
466{
467  PartSize eSize         = pcCU->getPartitionSize( uiAbsPartIdx );
468 
469  if ( pcCU->getSlice()->isInterB() && pcCU->isIntra( uiAbsPartIdx ) )
470  {
471    m_pcBinIf->encodeBin( 0, m_cCUPartSizeSCModel.get( 0, 0, 0) );
472#if HHI_RMP_SWITCH
473    if( pcCU->getSlice()->getSPS()->getUseRMP() )
474#endif
475    {
476      m_pcBinIf->encodeBin( 0, m_cCUPartSizeSCModel.get( 0, 0, 1) );
477      m_pcBinIf->encodeBin( 0, m_cCUPartSizeSCModel.get( 0, 0, 2) );
478    }
479#if HHI_DISABLE_INTER_NxN_SPLIT
480    if( uiDepth == g_uiMaxCUDepth - g_uiAddCUDepth )
481#endif
482    {
483      m_pcBinIf->encodeBin( 0, m_cCUPartSizeSCModel.get( 0, 0, 3) );
484    }
485#if MTK_DISABLE_INTRA_NxN_SPLIT
486    if( uiDepth == g_uiMaxCUDepth - g_uiAddCUDepth )
487#endif
488    {
489      m_pcBinIf->encodeBin( (eSize == SIZE_2Nx2N? 0 : 1), m_cCUPartSizeSCModel.get( 0, 0, 4) );
490    }
491    return;
492  }
493 
494  if ( pcCU->isIntra( uiAbsPartIdx ) )
495  {
496#if MTK_DISABLE_INTRA_NxN_SPLIT
497    if( uiDepth == g_uiMaxCUDepth - g_uiAddCUDepth )
498#endif
499    {
500      m_pcBinIf->encodeBin( eSize == SIZE_2Nx2N? 1 : 0, m_cCUPartSizeSCModel.get( 0, 0, 0 ) );
501    }
502    return;
503  }
504 
505  switch(eSize)
506  {
507    case SIZE_2Nx2N:
508    {
509      m_pcBinIf->encodeBin( 1, m_cCUPartSizeSCModel.get( 0, 0, 0) );
510      break;
511    }
512    case SIZE_2NxN:
513    {
514      m_pcBinIf->encodeBin( 0, m_cCUPartSizeSCModel.get( 0, 0, 0) );
515      m_pcBinIf->encodeBin( 1, m_cCUPartSizeSCModel.get( 0, 0, 1) );
516     
517      break;
518    }
519    case SIZE_Nx2N:
520    {
521      m_pcBinIf->encodeBin( 0, m_cCUPartSizeSCModel.get( 0, 0, 0) );
522      m_pcBinIf->encodeBin( 0, m_cCUPartSizeSCModel.get( 0, 0, 1) );
523      m_pcBinIf->encodeBin( 1, m_cCUPartSizeSCModel.get( 0, 0, 2) );
524     
525      break;
526    }
527    case SIZE_NxN:
528    {
529#if HHI_DISABLE_INTER_NxN_SPLIT
530      if( uiDepth == g_uiMaxCUDepth - g_uiAddCUDepth )
531#endif
532      {
533        m_pcBinIf->encodeBin( 0, m_cCUPartSizeSCModel.get( 0, 0, 0) );
534#if HHI_RMP_SWITCH
535        if( pcCU->getSlice()->getSPS()->getUseRMP() )
536#endif
537        {
538          m_pcBinIf->encodeBin( 0, m_cCUPartSizeSCModel.get( 0, 0, 1) );
539          m_pcBinIf->encodeBin( 0, m_cCUPartSizeSCModel.get( 0, 0, 2) );
540        }
541       
542        if (pcCU->getSlice()->isInterB())
543        {
544          m_pcBinIf->encodeBin( 1, m_cCUPartSizeSCModel.get( 0, 0, 3) );
545        }
546      }
547      break;
548    }
549    default:
550    {
551      assert(0);
552    }
553  }
554}
555
556/** code prediction mode
557 * \param pcCU
558 * \param uiAbsPartIdx 
559 * \returns Void
560 */
561Void TEncSbac::codePredMode( TComDataCU* pcCU, UInt uiAbsPartIdx )
562{
563  // get context function is here
564  Int iPredMode = pcCU->getPredictionMode( uiAbsPartIdx );
565  if (pcCU->getSlice()->isInterB() )
566  {
567    return;
568  }
569
570  m_pcBinIf->encodeBin( iPredMode == MODE_INTER ? 0 : 1, m_cCUPredModeSCModel.get( 0, 0, 1 ) );
571}
572
573Void TEncSbac::codeAlfCtrlFlag( TComDataCU* pcCU, UInt uiAbsPartIdx )
574{
575  if (!m_bAlfCtrl)
576    return;
577 
578  if( pcCU->getDepth(uiAbsPartIdx) > m_uiMaxAlfCtrlDepth && !pcCU->isFirstAbsZorderIdxInDepth(uiAbsPartIdx, m_uiMaxAlfCtrlDepth))
579  {
580    return;
581  }
582 
583  // get context function is here
584  UInt uiSymbol = pcCU->getAlfCtrlFlag( uiAbsPartIdx ) ? 1 : 0;
585 
586  m_pcBinIf->encodeBin( uiSymbol, m_cCUAlfCtrlFlagSCModel.get( 0, 0, pcCU->getCtxAlfCtrlFlag( uiAbsPartIdx) ) );
587}
588
589Void TEncSbac::codeAlfCtrlDepth()
590{
591  if (!m_bAlfCtrl)
592    return;
593 
594  UInt uiDepth = m_uiMaxAlfCtrlDepth;
595  xWriteUnaryMaxSymbol(uiDepth, m_cALFUvlcSCModel.get(0), 1, g_uiMaxCUDepth-1);
596}
597
598/** code skip flag
599 * \param pcCU
600 * \param uiAbsPartIdx
601 * \returns Void
602 */
603Void TEncSbac::codeSkipFlag( TComDataCU* pcCU, UInt uiAbsPartIdx )
604{
605  // get context function is here
606  UInt uiSymbol = pcCU->isSkipped( uiAbsPartIdx ) ? 1 : 0;
607  UInt uiCtxSkip = pcCU->getCtxSkipFlag( uiAbsPartIdx ) ;
608  m_pcBinIf->encodeBin( uiSymbol, m_cCUSkipFlagSCModel.get( 0, 0, uiCtxSkip ) );
609  DTRACE_CABAC_V( g_nSymbolCounter++ );
610  DTRACE_CABAC_T( "\tSkipFlag" );
611  DTRACE_CABAC_T( "\tuiCtxSkip: ");
612  DTRACE_CABAC_V( uiCtxSkip );
613  DTRACE_CABAC_T( "\tuiSymbol: ");
614  DTRACE_CABAC_V( uiSymbol );
615  DTRACE_CABAC_T( "\n");
616}
617
618/** code merge flag
619 * \param pcCU
620 * \param uiAbsPartIdx
621 * \returns Void
622 */
623Void TEncSbac::codeMergeFlag( TComDataCU* pcCU, UInt uiAbsPartIdx )
624{
625  UInt uiCtx = 0;
626#if CHANGE_MERGE_CONTEXT
627  uiCtx = pcCU->getCtxMergeFlag( uiAbsPartIdx );
628#else
629  for(UInt uiIter = 0; uiIter < MRG_MAX_NUM_CANDS; uiIter++ )
630  {
631    if( pcCU->getNeighbourCandIdx( uiIter, uiAbsPartIdx ) == uiIter + 1 )
632    {
633      if( uiIter == 0 )
634      {
635        uiCtx++;
636      }
637      else if( uiIter == 1 )
638      {
639        uiCtx++;
640      }
641    }
642  }
643#endif
644  UInt uiSymbol = pcCU->getMergeFlag( uiAbsPartIdx ) ? 1 : 0;
645  m_pcBinIf->encodeBin( uiSymbol, m_cCUMergeFlagExtSCModel.get( 0, 0, uiCtx ) );
646
647  DTRACE_CABAC_V( g_nSymbolCounter++ );
648  DTRACE_CABAC_T( "\tMergeFlag: " );
649  DTRACE_CABAC_V( uiSymbol );
650  DTRACE_CABAC_T( "\tAddress: " );
651  DTRACE_CABAC_V( pcCU->getAddr() );
652  DTRACE_CABAC_T( "\tuiAbsPartIdx: " );
653  DTRACE_CABAC_V( uiAbsPartIdx );
654  for( UInt ui = 0; ui < MRG_MAX_NUM_CANDS; ui++ )
655  {
656    DTRACE_CABAC_T( "\tNumMrgCand: " );
657    DTRACE_CABAC_V( ui );
658    DTRACE_CABAC_T( "\t==\t" );
659    DTRACE_CABAC_V( UInt( pcCU->getNeighbourCandIdx( ui, uiAbsPartIdx ) ) );
660  }
661  DTRACE_CABAC_T( "\n" );
662}
663
664
665
666#if HHI_INTER_VIEW_MOTION_PRED || HHI_MPI || POZNAN_DBMP
667Void TEncSbac::codeMergeIndexMV( TComDataCU* pcCU, UInt uiAbsPartIdx )
668{
669  //--- set number of candidates and availability ---
670  Bool  abAvailable[ MRG_MAX_NUM_CANDS ];
671  UInt  uiNumCand = 0;
672#if HHI_MPI
673  const Bool bMVIAvailable = pcCU->getSlice()->getSPS()->getUseMVI() && pcCU->getSlice()->getSliceType() != I_SLICE;
674  const UInt uiMviMergePos = bMVIAvailable ? HHI_MPI_MERGE_POS : MRG_MAX_NUM_CANDS;
675#endif
676#if POZNAN_DBMP
677  const Bool bDBMPAvailable = pcCU->getSlice()->getMP()->isDBMPEnabled();
678#endif
679  for( UInt uiIdx = 0; uiIdx < MRG_MAX_NUM_CANDS; uiIdx++ )
680  {
681#if HHI_MPI
682    if( uiIdx == uiMviMergePos )
683    {
684      abAvailable[ uiIdx ] = true;
685      uiNumCand++;
686    }
687    else if( uiIdx > uiMviMergePos )
688    {
689      if( ( abAvailable[ uiIdx ] = ( pcCU->getNeighbourCandIdx( uiIdx - 1, uiAbsPartIdx ) == uiIdx ) ) )
690      {
691        uiNumCand++;
692      }
693    }
694    else
695#endif
696    if( ( abAvailable[ uiIdx ] = ( pcCU->getNeighbourCandIdx( uiIdx, uiAbsPartIdx ) == uiIdx + 1 ) ) )
697    {
698      uiNumCand++;
699    }
700  }
701
702#if POZNAN_DBMP
703  if(bDBMPAvailable)
704  {
705    UInt uiDBMPMergePos = POZNAN_DBMP_MERGE_POS;
706#if HHI_MPI
707        if(bMVIAvailable && uiDBMPMergePos>=uiMviMergePos) uiDBMPMergePos++;
708#endif
709        for( Int iIdx = MRG_MAX_NUM_CANDS-2; iIdx >= (Int)uiDBMPMergePos; iIdx-- )
710        {
711                Int iWrIdx = iIdx+1;
712#if HHI_MPI
713                if(bMVIAvailable) 
714                {
715                        if(iIdx==(Int)uiMviMergePos) continue;
716                        if(iWrIdx==(Int)uiMviMergePos) iWrIdx++;
717                }
718#endif
719                if(iWrIdx>=MRG_MAX_NUM_CANDS) continue;
720
721                abAvailable[ iWrIdx ] = abAvailable[ iIdx ];
722        }
723        abAvailable[ uiDBMPMergePos ] = ( pcCU->getNeighbourCandIdx( POZNAN_DBMP_MRG_CAND, uiAbsPartIdx ) == POZNAN_DBMP_MRG_CAND + 1 );
724       
725        uiNumCand = 0; for( UInt uiIdx = 0; uiIdx < MRG_MAX_NUM_CANDS; uiIdx++ ) if(abAvailable[ uiIdx ]) uiNumCand++;
726  }
727#endif
728
729  AOF( uiNumCand > 1 );
730
731  //--- determine contexts ---
732  AOF( NUM_MV_MERGE_IDX_EXT_CTX >= MRG_MAX_NUM_CANDS - 1 );
733  UInt  auiCtx[ MRG_MAX_NUM_CANDS - 1 ];
734  for( UInt uiIdx = 0; uiIdx < MRG_MAX_NUM_CANDS - 1; uiIdx++ )
735  {
736    auiCtx[ uiIdx ] = MRG_MAX_NUM_CANDS;
737    if( uiNumCand > uiIdx + 1 )
738    {
739      Bool bAvComb    = false;
740      for( UInt uiCId = uiIdx; uiCId < MRG_MAX_NUM_CANDS - 1; uiCId++ )
741      {
742        bAvComb = ( bAvComb || abAvailable[ uiCId ] );
743        if( abAvailable[ uiCId + 1 ] && bAvComb )
744        {
745          auiCtx[ uiIdx ] = uiCId;
746          break;
747        }
748      }
749      AOT( auiCtx[ uiIdx ] == MRG_MAX_NUM_CANDS );
750    }
751  }
752
753  //--- determine unary index ---
754  UInt  uiMergeIdx  = pcCU->getMergeIndex( uiAbsPartIdx );
755#if POZNAN_DBMP
756  if(bDBMPAvailable)
757  {
758        if(uiMergeIdx==POZNAN_DBMP_MRG_CAND)  uiMergeIdx = POZNAN_DBMP_MERGE_POS;
759        else if(uiMergeIdx>=POZNAN_DBMP_MERGE_POS) uiMergeIdx++;
760  }
761#endif
762#if HHI_MPI
763  if( bMVIAvailable )
764  {
765    const Bool bUseMVI = pcCU->getTextureModeDepth( uiAbsPartIdx ) != -1;
766    if( bUseMVI )
767    {
768      uiMergeIdx = HHI_MPI_MERGE_POS;
769    }
770    else if( uiMergeIdx >= HHI_MPI_MERGE_POS )
771    {
772      uiMergeIdx++;
773    }
774  }
775#endif
776  UInt  uiUnaryIdx  = uiMergeIdx;
777  for( UInt uiIdx = 0; uiIdx < uiMergeIdx; uiIdx++ )
778  {
779    if( ! abAvailable[ uiIdx ] )
780    {
781      uiUnaryIdx--;
782    }
783  }
784
785  //--- code unary index ---
786  for( UInt ui = 0; ui < uiNumCand - 1; ui++ )
787  {
788    const UInt uiSymbol = ( ui == uiUnaryIdx ? 0 : 1 );
789    m_pcBinIf->encodeBin( uiSymbol, m_cCUMVMergeIdxExtSCModel.get( 0, 0, auiCtx[ui] ) );
790    if( uiSymbol == 0 )
791    {
792      break;
793    }
794  }
795
796  //--- trace ---
797  DTRACE_CABAC_V( g_nSymbolCounter++ );
798  DTRACE_CABAC_T( "\tparseMergeIndex():" );
799  DTRACE_CABAC_T( "   MRGIdx = " );
800  DTRACE_CABAC_V( uiMergeIdx );
801  DTRACE_CABAC_T( "   UnaryIdx = " );
802  DTRACE_CABAC_V( uiUnaryIdx );
803  DTRACE_CABAC_T( "   NumCand = " );
804  DTRACE_CABAC_V( uiNumCand );
805  DTRACE_CABAC_T( "   Availibility = " );
806  for( UInt uiIdx = 0; uiIdx < MRG_MAX_NUM_CANDS; uiIdx++ )
807  {
808    DTRACE_CABAC_V( abAvailable[ uiIdx ] ? 1 : 0 );
809  }
810  DTRACE_CABAC_T( "   Contexts = " );
811  for( UInt uiIdx = 0; uiIdx < MRG_MAX_NUM_CANDS - 1; uiIdx++ )
812  {
813    DTRACE_CABAC_V( auiCtx[ uiIdx ] );
814  }
815  DTRACE_CABAC_T( "\n" );
816}
817#endif
818
819
820/** code merge index
821 * \param pcCU
822 * \param uiAbsPartIdx
823 * \returns Void
824 */
825Void TEncSbac::codeMergeIndex( TComDataCU* pcCU, UInt uiAbsPartIdx )
826{
827/* todo jacek niech sie wypowie
828#if HHI_INTER_VIEW_MOTION_PRED || HHI_MPI
829#if HHI_INTER_VIEW_MOTION_PRED && HHI_MPI
830  if( ( pcCU->getSlice()->getSPS()->getViewId() > 0 && ( pcCU->getSlice()->getSPS()->getMultiviewMvPredMode() & PDM_USE_FOR_MERGE ) == PDM_USE_FOR_MERGE ) ||
831      ( pcCU->getSlice()->getSPS()->getUseMVI() && pcCU->getSlice()->getSliceType() != I_SLICE && pcCU->getPartitionSize( uiAbsPartIdx ) == SIZE_2Nx2N ) )
832#elif HHI_MPI
833  if( pcCU->getSlice()->getSPS()->getUseMVI() && pcCU->getSlice()->getSliceType() != I_SLICE && pcCU->getPartitionSize( uiAbsPartIdx ) == SIZE_2Nx2N )
834#else
835  if( pcCU->getSlice()->getSPS()->getViewId() > 0 && ( pcCU->getSlice()->getSPS()->getMultiviewMvPredMode() & PDM_USE_FOR_MERGE ) == PDM_USE_FOR_MERGE )
836#endif//*/
837#if HHI_INTER_VIEW_MOTION_PRED || HHI_MPI || POZNAN_DBMP
838  if( 
839#if HHI_INTER_VIEW_MOTION_PRED   
840          ( pcCU->getSlice()->getSPS()->getViewId() > 0 && ( pcCU->getSlice()->getSPS()->getMultiviewMvPredMode() & PDM_USE_FOR_MERGE ) == PDM_USE_FOR_MERGE ) ||
841#endif
842#if HHI_MPI
843      ( pcCU->getSlice()->getSPS()->getUseMVI() && pcCU->getSlice()->getSliceType() != I_SLICE && pcCU->getPartitionSize( uiAbsPartIdx ) == SIZE_2Nx2N )  ||
844#endif
845#if     POZNAN_DBMP 
846          ( pcCU->getSlice()->getMP()->isDBMPEnabled() ) ||
847#endif
848          0
849    )
850  {
851    codeMergeIndexMV( pcCU, uiAbsPartIdx );
852    return;
853  }
854#endif
855
856  Bool bLeftInvolved = false;
857  Bool bAboveInvolved = false;
858  Bool bCollocatedInvolved = false;
859  Bool bCornerInvolved = false;
860  Bool bCornerBLInvolved = false;
861  UInt uiNumCand = 0;
862  for( UInt uiIter = 0; uiIter < MRG_MAX_NUM_CANDS; ++uiIter )
863  {
864    if( pcCU->getNeighbourCandIdx( uiIter, uiAbsPartIdx ) == uiIter + 1 )
865    {
866      uiNumCand++;
867      if( uiIter == 0 )
868      {
869        bLeftInvolved = true;
870      }
871      else if( uiIter == 1 )
872      {
873        bAboveInvolved = true;
874      }
875      else if( uiIter == 2 )
876      {
877        bCollocatedInvolved = true;
878      }
879      else if( uiIter == 3 )
880      {
881        bCornerInvolved = true;
882      }
883      else if( uiIter == 4 )
884      {
885        bCornerBLInvolved = true;
886      }
887    }
888  }
889  assert( uiNumCand > 1 );
890
891  UInt auiCtx[4] = { 0, 0, 0, 3 };
892  if( bLeftInvolved && bAboveInvolved )
893  {
894    auiCtx[0] = 0;
895  }
896  else if( bLeftInvolved || bAboveInvolved )
897  {
898    auiCtx[0] = bCollocatedInvolved ? 1 : 2;
899  }
900  else
901  {
902    auiCtx[0] = bCollocatedInvolved ? 2 : 3;
903  }
904
905  if( uiNumCand >= 3 )
906  {
907    if( bAboveInvolved )
908    {
909      auiCtx[1] = bCollocatedInvolved ? 1 : 2;
910    }
911    else
912    {
913      auiCtx[1] = bCollocatedInvolved ? 2 : 3;
914    }
915  }
916
917  if( uiNumCand >= 4 )
918  {
919    auiCtx[2] =  bCollocatedInvolved ? 2 : 3;
920  }
921
922  UInt uiUnaryIdx = pcCU->getMergeIndex( uiAbsPartIdx );
923
924  if( !bCornerInvolved && uiUnaryIdx > 3 )
925  {
926    --uiUnaryIdx;
927  }
928  if( !bCollocatedInvolved && uiUnaryIdx > 2 )
929  {
930    --uiUnaryIdx;
931  }
932  if( !bAboveInvolved && uiUnaryIdx > 1 )
933  {
934    --uiUnaryIdx;
935  }
936  if( !bLeftInvolved && uiUnaryIdx > 0 )
937  {
938    --uiUnaryIdx;
939  }
940
941  for( UInt ui = 0; ui < uiNumCand - 1; ++ui )
942  {
943    const UInt uiSymbol = ui == uiUnaryIdx ? 0 : 1;
944    m_pcBinIf->encodeBin( uiSymbol, m_cCUMergeIdxExtSCModel.get( 0, 0, auiCtx[ui] ) );
945    if( uiSymbol == 0 )
946    {
947      break;
948    }
949  }
950
951  DTRACE_CABAC_V( g_nSymbolCounter++ );
952  DTRACE_CABAC_T( "\tparseMergeIndex()" );
953  DTRACE_CABAC_T( "\tuiMRGIdx= " );
954  DTRACE_CABAC_V( pcCU->getMergeIndex( uiAbsPartIdx ) );
955  DTRACE_CABAC_T( "\tuiNumCand= " );
956  DTRACE_CABAC_V( uiNumCand );
957  DTRACE_CABAC_T( "\tbLeftInvolved= " );
958  DTRACE_CABAC_V( bLeftInvolved );
959  DTRACE_CABAC_T( "\tbAboveInvolved= " );
960  DTRACE_CABAC_V( bAboveInvolved );
961  DTRACE_CABAC_T( "\tbCollocatedInvolved= " );
962  DTRACE_CABAC_V( bCollocatedInvolved );
963  DTRACE_CABAC_T( "\tbCornerRTInvolved= " );
964  DTRACE_CABAC_V( bCornerInvolved );
965  DTRACE_CABAC_T( "\tbCornerBLInvolved= " );
966  DTRACE_CABAC_V( bCornerBLInvolved );
967  DTRACE_CABAC_T( "\n" );
968}
969
970
971#if HHI_INTER_VIEW_RESIDUAL_PRED
972Void
973TEncSbac::codeResPredFlag( TComDataCU* pcCU, UInt uiAbsPartIdx )
974{
975  UInt  uiCtx     = 0;
976  UInt  uiSymbol  = ( pcCU->getResPredFlag( uiAbsPartIdx ) ? 1 : 0 );
977  m_pcBinIf->encodeBin( uiSymbol, m_cResPredFlagSCModel.get( 0, 0, uiCtx ) );
978}
979#endif
980
981
982Void TEncSbac::codeSplitFlag   ( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth )
983{
984  if( uiDepth == g_uiMaxCUDepth - g_uiAddCUDepth )
985    return;
986 
987  UInt uiCtx           = pcCU->getCtxSplitFlag( uiAbsPartIdx, uiDepth );
988  UInt uiCurrSplitFlag = ( pcCU->getDepth( uiAbsPartIdx ) > uiDepth ) ? 1 : 0;
989 
990  assert( uiCtx < 3 );
991  m_pcBinIf->encodeBin( uiCurrSplitFlag, m_cCUSplitFlagSCModel.get( 0, 0, uiCtx ) );
992  DTRACE_CABAC_V( g_nSymbolCounter++ )
993  DTRACE_CABAC_T( "\tSplitFlag\n" )
994  return;
995}
996
997Void TEncSbac::codeTransformSubdivFlag( UInt uiSymbol, UInt uiCtx )
998{
999  m_pcBinIf->encodeBin( uiSymbol, m_cCUTransSubdivFlagSCModel.get( 0, 0, uiCtx ) );
1000  DTRACE_CABAC_V( g_nSymbolCounter++ )
1001  DTRACE_CABAC_T( "\tparseTransformSubdivFlag()" )
1002  DTRACE_CABAC_T( "\tsymbol=" )
1003  DTRACE_CABAC_V( uiSymbol )
1004  DTRACE_CABAC_T( "\tctx=" )
1005  DTRACE_CABAC_V( uiCtx )
1006  DTRACE_CABAC_T( "\n" )
1007}
1008
1009#if HHI_DMM_WEDGE_INTRA
1010Void TEncSbac::xCodeWedgeFullInfo( TComDataCU* pcCU, UInt uiAbsPartIdx )
1011{
1012  Int iIntraIdx = pcCU->getIntraSizeIdx(uiAbsPartIdx);
1013  Int iBits = g_aucWedgeFullBitsListIdx[iIntraIdx];
1014
1015  UInt uiTabIdx = pcCU->getWedgeFullTabIdx( uiAbsPartIdx );
1016
1017  for ( Int i = 0; i < iBits; i++ )
1018  {
1019    m_pcBinIf->encodeBin( ( uiTabIdx >> i ) & 1, m_cIntraWedgeSCModel.get(0, 0, 0) );
1020  }
1021}
1022
1023Void TEncSbac::xCodeWedgeFullDeltaInfo( TComDataCU* pcCU, UInt uiAbsPartIdx )
1024   {
1025  Int iIntraIdx = pcCU->getIntraSizeIdx(uiAbsPartIdx);
1026  Int iBits = g_aucWedgeFullBitsListIdx[iIntraIdx];
1027
1028  UInt uiTabIdx = pcCU->getWedgeFullTabIdx( uiAbsPartIdx );
1029
1030  for ( Int i = 0; i < iBits; i++ )
1031  {
1032    m_pcBinIf->encodeBin( ( uiTabIdx >> i ) & 1, m_cIntraWedgeSCModel.get(0, 0, 0) );
1033  }
1034
1035  Int iDeltaDC1 = pcCU->getWedgeFullDeltaDC1( uiAbsPartIdx );
1036  Int iDeltaDC2 = pcCU->getWedgeFullDeltaDC2( uiAbsPartIdx );
1037
1038   xWriteExGolombLevel( UInt( abs( iDeltaDC1 ) ), m_cIntraWedgeSCModel.get(0, 0, 1) );
1039   if ( iDeltaDC1 != 0 )
1040   {
1041     UInt uiSign = iDeltaDC1 > 0 ? 0 : 1;
1042     m_pcBinIf->encodeBinEP( uiSign );
1043   }
1044   xWriteExGolombLevel( UInt( abs( iDeltaDC2 ) ), m_cIntraWedgeSCModel.get(0, 0, 1) );
1045   if ( iDeltaDC2 != 0 )
1046   {
1047     UInt uiSign = iDeltaDC2 > 0 ? 0 : 1;
1048     m_pcBinIf->encodeBinEP( uiSign );
1049   }
1050}
1051
1052Void TEncSbac::xCodeWedgePredDirInfo( TComDataCU* pcCU, UInt uiAbsPartIdx )
1053{
1054  if( DMM_WEDGE_PREDDIR_DELTAEND_MAX > 0 )
1055  {
1056    Int iDeltaEnd = pcCU->getWedgePredDirDeltaEnd( uiAbsPartIdx );
1057    m_pcBinIf->encodeBin( (iDeltaEnd!=0), m_cIntraWedgeSCModel.get(0, 0, 3) );
1058
1059    if( iDeltaEnd != 0 )
1060    {
1061      UInt uiAbsValMinus1 = abs(iDeltaEnd)-1;
1062      m_pcBinIf->encodeBin( (uiAbsValMinus1 & 0x01),      m_cIntraWedgeSCModel.get(0, 0, 3) );
1063      m_pcBinIf->encodeBin( (uiAbsValMinus1 & 0x02) >> 1, m_cIntraWedgeSCModel.get(0, 0, 3) );
1064
1065      UInt uiSign = iDeltaEnd > 0 ? 0 : 1;
1066      m_pcBinIf->encodeBinEP( uiSign );
1067    }
1068  }
1069}
1070
1071Void TEncSbac::xCodeWedgePredDirDeltaInfo( TComDataCU* pcCU, UInt uiAbsPartIdx )
1072{
1073  if( DMM_WEDGE_PREDDIR_DELTAEND_MAX > 0 )
1074  {
1075    Int iDeltaEnd = pcCU->getWedgePredDirDeltaEnd( uiAbsPartIdx );
1076    m_pcBinIf->encodeBin( (iDeltaEnd!=0), m_cIntraWedgeSCModel.get(0, 0, 3) );
1077
1078    if( iDeltaEnd != 0 )
1079  {
1080      UInt uiAbsValMinus1 = abs(iDeltaEnd)-1;
1081      m_pcBinIf->encodeBin( (uiAbsValMinus1 & 0x01),      m_cIntraWedgeSCModel.get(0, 0, 3) );
1082      m_pcBinIf->encodeBin( (uiAbsValMinus1 & 0x02) >> 1, m_cIntraWedgeSCModel.get(0, 0, 3) );
1083
1084      UInt uiSign = iDeltaEnd > 0 ? 0 : 1;
1085      m_pcBinIf->encodeBinEP( uiSign );
1086    }
1087  }
1088 
1089  Int iDeltaDC1 = pcCU->getWedgePredDirDeltaDC1( uiAbsPartIdx );
1090  Int iDeltaDC2 = pcCU->getWedgePredDirDeltaDC2( uiAbsPartIdx );
1091
1092  xWriteExGolombLevel( UInt( abs( iDeltaDC1 ) ), m_cIntraWedgeSCModel.get(0, 0, 1) );
1093  if ( iDeltaDC1 != 0 )
1094  {
1095    UInt uiSign = iDeltaDC1 > 0 ? 0 : 1;
1096    m_pcBinIf->encodeBinEP( uiSign );
1097  }
1098  xWriteExGolombLevel( UInt( abs( iDeltaDC2 ) ), m_cIntraWedgeSCModel.get(0, 0, 1) );
1099  if ( iDeltaDC2 != 0 )
1100  {
1101    UInt uiSign = iDeltaDC2 > 0 ? 0 : 1;
1102    m_pcBinIf->encodeBinEP( uiSign );
1103  }
1104}
1105#endif
1106#if HHI_DMM_PRED_TEX
1107Void TEncSbac::xCodeWedgePredTexDeltaInfo( TComDataCU* pcCU, UInt uiAbsPartIdx )
1108{
1109  Int iDeltaDC1 = pcCU->getWedgePredTexDeltaDC1( uiAbsPartIdx );
1110  Int iDeltaDC2 = pcCU->getWedgePredTexDeltaDC2( uiAbsPartIdx );
1111
1112  xWriteExGolombLevel( UInt( abs( iDeltaDC1 ) ), m_cIntraWedgeSCModel.get(0, 0, 1) );
1113  if ( iDeltaDC1 != 0 )
1114  {
1115    UInt uiSign = iDeltaDC1 > 0 ? 0 : 1;
1116    m_pcBinIf->encodeBinEP( uiSign );
1117  }
1118  xWriteExGolombLevel( UInt( abs( iDeltaDC2 ) ), m_cIntraWedgeSCModel.get(0, 0, 1) );
1119  if ( iDeltaDC2 != 0 )
1120  {
1121    UInt uiSign = iDeltaDC2 > 0 ? 0 : 1;
1122    m_pcBinIf->encodeBinEP( uiSign );
1123  }
1124}
1125
1126Void TEncSbac::xCodeContourPredTexDeltaInfo( TComDataCU* pcCU, UInt uiAbsPartIdx )
1127{
1128  Int iDeltaDC1 = pcCU->getContourPredTexDeltaDC1( uiAbsPartIdx );
1129  Int iDeltaDC2 = pcCU->getContourPredTexDeltaDC2( uiAbsPartIdx );
1130
1131  xWriteExGolombLevel( UInt( abs( iDeltaDC1 ) ), m_cIntraWedgeSCModel.get(0, 0, 1) );
1132  if ( iDeltaDC1 != 0 )
1133  {
1134    UInt uiSign = iDeltaDC1 > 0 ? 0 : 1;
1135    m_pcBinIf->encodeBinEP( uiSign );
1136  }
1137  xWriteExGolombLevel( UInt( abs( iDeltaDC2 ) ), m_cIntraWedgeSCModel.get(0, 0, 1) );
1138  if ( iDeltaDC2 != 0 )
1139  {
1140    UInt uiSign = iDeltaDC2 > 0 ? 0 : 1;
1141    m_pcBinIf->encodeBinEP( uiSign );
1142  }
1143}
1144#endif
1145
1146#if MTK_DCM_MPM
1147Void TEncSbac::codeIntraDirLumaAng( TComDataCU* pcCU, UInt uiAbsPartIdx )
1148{
1149  UInt uiDir = pcCU->getLumaIntraDir( uiAbsPartIdx );
1150
1151#if HHI_DMM_WEDGE_INTRA || HHI_DMM_PRED_TEX
1152  if ( pcCU->getSlice()->getSPS()->isDepth() && pcCU->getSlice()->getSPS()->getUseDMM() && pcCU->getWidth( uiAbsPartIdx ) < 64 )
1153  {
1154    m_pcBinIf->encodeBin( uiDir > MAX_MODE_ID_INTRA_DIR, m_cIntraDMMSCModel.get(0, 0, 0) );
1155  }
1156  if( uiDir > MAX_MODE_ID_INTRA_DIR )
1157  {
1158    assert( pcCU->getWidth( uiAbsPartIdx ) < 64 );
1159    UInt uiDMMode = uiDir - (MAX_MODE_ID_INTRA_DIR+1);
1160
1161#if HHI_DMM_WEDGE_INTRA && HHI_DMM_PRED_TEX
1162    m_pcBinIf->encodeBin( (uiDMMode & 0x01),      m_cIntraDMMSCModel.get(0, 0, 1) );
1163    m_pcBinIf->encodeBin( (uiDMMode & 0x02) >> 1, m_cIntraDMMSCModel.get(0, 0, 1) );
1164
1165      if ( pcCU->getPartitionSize( uiAbsPartIdx ) != SIZE_NxN && pcCU->getWidth( uiAbsPartIdx ) > 4 )
1166      {
1167      m_pcBinIf->encodeBin( (uiDMMode & 0x04) >> 2, m_cIntraDMMSCModel.get(0, 0, 1) );
1168        }
1169#else
1170                                  m_pcBinIf->encodeBin( (uiDMMode & 0x01),      m_cIntraDMMSCModel.get(0, 0, 1) );
1171
1172    if ( pcCU->getPartitionSize( uiAbsPartIdx ) != SIZE_NxN && pcCU->getWidth( uiAbsPartIdx ) > 4 )
1173    {
1174      m_pcBinIf->encodeBin( (uiDMMode & 0x02) >> 1, m_cIntraDMMSCModel.get(0, 0, 1) );
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#if FLEX_CODING_ORDER
1185    if ( !pcCU->getSlice()->getSPS()->getUseDMM34() )
1186    {
1187      assert( uiDir != DMM_WEDGE_PREDTEX_D_IDX );
1188      assert( uiDir != DMM_CONTOUR_PREDTEX_D_IDX );
1189    }
1190#endif
1191    if( uiDir == DMM_WEDGE_PREDTEX_D_IDX )     { xCodeWedgePredTexDeltaInfo  ( pcCU, uiAbsPartIdx ); }
1192    if( uiDir == DMM_CONTOUR_PREDTEX_D_IDX )   { xCodeContourPredTexDeltaInfo( pcCU, uiAbsPartIdx ); }
1193#endif
1194  }
1195  else
1196#endif
1197  {
1198  Int iIntraIdx = pcCU->getIntraSizeIdx(uiAbsPartIdx);
1199#if ADD_PLANAR_MODE
1200  UInt planarFlag    = 0;
1201  if (uiDir == PLANAR_IDX)
1202  {
1203    uiDir = 2;
1204    planarFlag = 1;
1205  }
1206#endif
1207 
1208  Int uiPreds[2] = {-1, -1};
1209  Int uiPredNum = pcCU->getIntraDirLumaPredictor(uiAbsPartIdx, uiPreds); 
1210
1211  Int uiPredIdx = -1;
1212
1213  for(UInt i = 0; i < uiPredNum; i++)
1214  {
1215    if(uiDir == uiPreds[i])
1216    {
1217      uiPredIdx = i;
1218    }
1219  }
1220 
1221  if(uiPredIdx != -1)
1222  {
1223    m_pcBinIf->encodeBin( 1, m_cCUIntraPredSCModel.get( 0, 0, 0 ) );
1224    if(uiPredNum == 2)
1225    {
1226      m_pcBinIf->encodeBin( uiPredIdx, m_cCUIntraPredSCModel.get( 0, 0, 2 ) );
1227    }
1228
1229  }
1230  else
1231  {
1232    m_pcBinIf->encodeBin( 0, m_cCUIntraPredSCModel.get( 0, 0, 0 ) );
1233 
1234    for(Int i = (uiPredNum - 1); i >= 0; i--)
1235    {
1236      uiDir = uiDir > uiPreds[i] ? uiDir - 1 : uiDir;
1237    }
1238
1239    if ( g_aucIntraModeBitsAng[iIntraIdx] < 6 )
1240    {
1241      m_pcBinIf->encodeBin((uiDir & 0x01), m_cCUIntraPredSCModel.get(0, 0, 1));
1242      if ( g_aucIntraModeBitsAng[iIntraIdx] > 2 ) { m_pcBinIf->encodeBin((uiDir & 0x02) >> 1, m_cCUIntraPredSCModel.get(0, 0, 1));}
1243      if ( g_aucIntraModeBitsAng[iIntraIdx] > 3 ) { m_pcBinIf->encodeBin((uiDir & 0x04) >> 2, m_cCUIntraPredSCModel.get(0, 0, 1));}
1244      if ( g_aucIntraModeBitsAng[iIntraIdx] > 4 ) { m_pcBinIf->encodeBin((uiDir & 0x08) >> 3, m_cCUIntraPredSCModel.get(0, 0, 1));}
1245    }
1246    else
1247    {
1248      if (uiDir < 31){ // uiDir is here 0...32, 5 bits for uiDir 0...30, 31 is an escape code for coding one more bit for 31 and 32
1249        m_pcBinIf->encodeBin((uiDir & 0x01),      m_cCUIntraPredSCModel.get(0, 0, 1));
1250        m_pcBinIf->encodeBin((uiDir & 0x02) >> 1, m_cCUIntraPredSCModel.get(0, 0, 1));
1251        m_pcBinIf->encodeBin((uiDir & 0x04) >> 2, m_cCUIntraPredSCModel.get(0, 0, 1));
1252        m_pcBinIf->encodeBin((uiDir & 0x08) >> 3, m_cCUIntraPredSCModel.get(0, 0, 1));
1253        m_pcBinIf->encodeBin((uiDir & 0x10) >> 4, m_cCUIntraPredSCModel.get(0, 0, 1));
1254      }
1255      else{
1256        m_pcBinIf->encodeBin(1, m_cCUIntraPredSCModel.get(0, 0, 1));
1257        m_pcBinIf->encodeBin(1, m_cCUIntraPredSCModel.get(0, 0, 1));
1258        m_pcBinIf->encodeBin(1, m_cCUIntraPredSCModel.get(0, 0, 1));
1259        m_pcBinIf->encodeBin(1, m_cCUIntraPredSCModel.get(0, 0, 1));
1260        m_pcBinIf->encodeBin(1, m_cCUIntraPredSCModel.get(0, 0, 1));
1261        m_pcBinIf->encodeBin((uiDir == 32) ? 1 : 0, m_cCUIntraPredSCModel.get(0, 0, 1));
1262       }
1263     }
1264   }
1265#if ADD_PLANAR_MODE
1266  uiDir = pcCU->getLumaIntraDir( uiAbsPartIdx );
1267  if ( (uiDir == PLANAR_IDX) || (uiDir == 2) )
1268  {
1269    m_pcBinIf->encodeBin( planarFlag, m_cPlanarFlagSCModel.get(0,0,0) );
1270  }
1271#endif
1272  }
1273  return;
1274}
1275#else
1276Void TEncSbac::codeIntraDirLumaAng( TComDataCU* pcCU, UInt uiAbsPartIdx )
1277{
1278  UInt uiDir = pcCU->getLumaIntraDir( uiAbsPartIdx );
1279#if HHI_DMM_WEDGE_INTRA || HHI_DMM_PRED_TEX
1280  if ( pcCU->getSlice()->getSPS()->isDepth() && pcCU->getSlice()->getSPS()->getUseDMM() && pcCU->getWidth( uiAbsPartIdx ) < 64 )
1281  {
1282    m_pcBinIf->encodeBin( uiDir > MAX_MODE_ID_INTRA_DIR, m_cIntraDMMSCModel.get(0, 0, 0) );
1283  }
1284  if( uiDir > MAX_MODE_ID_INTRA_DIR )
1285  {
1286    assert( pcCU->getWidth( uiAbsPartIdx ) < 64 );
1287    UInt uiDMMode = uiDir - (MAX_MODE_ID_INTRA_DIR+1);
1288
1289#if HHI_DMM_WEDGE_INTRA && HHI_DMM_PRED_TEX
1290    m_pcBinIf->encodeBin( (uiDMMode & 0x01),      m_cIntraDMMSCModel.get(0, 0, 1) );
1291    m_pcBinIf->encodeBin( (uiDMMode & 0x02) >> 1, m_cIntraDMMSCModel.get(0, 0, 1) );
1292
1293      if ( pcCU->getPartitionSize( uiAbsPartIdx ) != SIZE_NxN && pcCU->getWidth( uiAbsPartIdx ) > 4 )
1294      {
1295      m_pcBinIf->encodeBin( (uiDMMode & 0x04) >> 2, m_cIntraDMMSCModel.get(0, 0, 1) );
1296        }
1297#else
1298        m_pcBinIf->encodeBin( (uiDMMode & 0x01),      m_cIntraDMMSCModel.get(0, 0, 1) );
1299
1300      if ( pcCU->getPartitionSize( uiAbsPartIdx ) != SIZE_NxN && pcCU->getWidth( uiAbsPartIdx ) > 4 )
1301      {
1302      m_pcBinIf->encodeBin( (uiDMMode & 0x02) >> 1, m_cIntraDMMSCModel.get(0, 0, 1) );
1303      }
1304#endif
1305#if HHI_DMM_WEDGE_INTRA
1306    if( uiDir == DMM_WEDGE_FULL_IDX )          { xCodeWedgeFullInfo          ( pcCU, uiAbsPartIdx ); }
1307    if( uiDir == DMM_WEDGE_FULL_D_IDX )        { xCodeWedgeFullDeltaInfo     ( pcCU, uiAbsPartIdx ); }
1308    if( uiDir == DMM_WEDGE_PREDDIR_IDX )       { xCodeWedgePredDirInfo       ( pcCU, uiAbsPartIdx ); }
1309    if( uiDir == DMM_WEDGE_PREDDIR_D_IDX )     { xCodeWedgePredDirDeltaInfo  ( pcCU, uiAbsPartIdx ); }
1310#endif
1311#if HHI_DMM_PRED_TEX
1312    if( uiDir == DMM_WEDGE_PREDTEX_D_IDX )     { xCodeWedgePredTexDeltaInfo  ( pcCU, uiAbsPartIdx ); }
1313    if( uiDir == DMM_CONTOUR_PREDTEX_D_IDX )   { xCodeContourPredTexDeltaInfo( pcCU, uiAbsPartIdx ); }
1314#endif
1315  }
1316  else
1317#endif
1318  {
1319  Int  iMostProbable = pcCU->getMostProbableIntraDirLuma( uiAbsPartIdx );
1320#if ADD_PLANAR_MODE
1321  UInt planarFlag    = 0;
1322  if (uiDir == PLANAR_IDX)
1323  {
1324    uiDir = 2;
1325    planarFlag = 1;
1326  }
1327#endif
1328 
1329  if (uiDir == iMostProbable)
1330    m_pcBinIf->encodeBin( 1, m_cCUIntraPredSCModel.get( 0, 0, 0 ) );
1331  else
1332  {
1333    m_pcBinIf->encodeBin( 0, m_cCUIntraPredSCModel.get( 0, 0, 0 ) );
1334    uiDir = uiDir > iMostProbable ? uiDir - 1 : uiDir;
1335    Int iIntraIdx = pcCU->getIntraSizeIdx(uiAbsPartIdx);
1336    if ( g_aucIntraModeBitsAng[iIntraIdx] < 6 )
1337    {
1338      m_pcBinIf->encodeBin((uiDir & 0x01), m_cCUIntraPredSCModel.get(0, 0, 1));
1339      if ( g_aucIntraModeBitsAng[iIntraIdx] > 2 ) m_pcBinIf->encodeBin((uiDir & 0x02) >> 1, m_cCUIntraPredSCModel.get(0, 0, 1));
1340      if ( g_aucIntraModeBitsAng[iIntraIdx] > 3 ) m_pcBinIf->encodeBin((uiDir & 0x04) >> 2, m_cCUIntraPredSCModel.get(0, 0, 1));
1341      if ( g_aucIntraModeBitsAng[iIntraIdx] > 4 ) m_pcBinIf->encodeBin((uiDir & 0x08) >> 3, m_cCUIntraPredSCModel.get(0, 0, 1));
1342    }
1343    else
1344    {
1345      if (uiDir < 31)
1346      { // uiDir is here 0...32, 5 bits for uiDir 0...30, 31 is an escape code for coding one more bit for 31 and 32
1347        m_pcBinIf->encodeBin((uiDir & 0x01),      m_cCUIntraPredSCModel.get(0, 0, 1));
1348        m_pcBinIf->encodeBin((uiDir & 0x02) >> 1, m_cCUIntraPredSCModel.get(0, 0, 1));
1349        m_pcBinIf->encodeBin((uiDir & 0x04) >> 2, m_cCUIntraPredSCModel.get(0, 0, 1));
1350        m_pcBinIf->encodeBin((uiDir & 0x08) >> 3, m_cCUIntraPredSCModel.get(0, 0, 1));
1351        m_pcBinIf->encodeBin((uiDir & 0x10) >> 4, m_cCUIntraPredSCModel.get(0, 0, 1));
1352      }
1353      else
1354      {
1355        m_pcBinIf->encodeBin(1, m_cCUIntraPredSCModel.get(0, 0, 1));
1356        m_pcBinIf->encodeBin(1, m_cCUIntraPredSCModel.get(0, 0, 1));
1357        m_pcBinIf->encodeBin(1, m_cCUIntraPredSCModel.get(0, 0, 1));
1358        m_pcBinIf->encodeBin(1, m_cCUIntraPredSCModel.get(0, 0, 1));
1359        m_pcBinIf->encodeBin(1, m_cCUIntraPredSCModel.get(0, 0, 1));
1360        m_pcBinIf->encodeBin((uiDir == 32) ? 1 : 0, m_cCUIntraPredSCModel.get(0, 0, 1));
1361      }
1362    }
1363  }
1364 
1365#if ADD_PLANAR_MODE
1366  uiDir = pcCU->getLumaIntraDir( uiAbsPartIdx );
1367  if ( (uiDir == PLANAR_IDX) || (uiDir == 2) )
1368  {
1369    m_pcBinIf->encodeBin( planarFlag, m_cPlanarFlagSCModel.get(0,0,0) );
1370  }
1371#endif
1372  }
1373  return;
1374}
1375#endif
1376Void TEncSbac::codeIntraDirChroma( TComDataCU* pcCU, UInt uiAbsPartIdx )
1377{
1378  UInt uiCtx            = pcCU->getCtxIntraDirChroma( uiAbsPartIdx );
1379  UInt uiIntraDirChroma = pcCU->getChromaIntraDir   ( uiAbsPartIdx );
1380#if ADD_PLANAR_MODE
1381  UInt planarFlag       = 0;
1382  if (uiIntraDirChroma == PLANAR_IDX)
1383  {
1384    uiIntraDirChroma = 2;
1385    planarFlag = 1;
1386  }
1387#endif
1388 
1389#if CHROMA_CODEWORD
1390  UInt uiMode = pcCU->getLumaIntraDir(uiAbsPartIdx);
1391#if ADD_PLANAR_MODE
1392  if ( (uiMode == 2 ) || (uiMode == PLANAR_IDX) )
1393  {
1394    uiMode = 4;
1395  }
1396#endif
1397
1398#if LM_CHROMA
1399
1400  Bool bUseLMFlag = pcCU->getSlice()->getSPS()->getUseLMChroma();
1401
1402  Int  iMaxMode = bUseLMFlag ? 3 : 4;
1403
1404  Int  iMax = uiMode < iMaxMode ? 2 : 3; 
1405 
1406  //switch codeword
1407  if (uiIntraDirChroma == 4) 
1408  {
1409    uiIntraDirChroma = 0;
1410  } 
1411  else if (uiIntraDirChroma == 3 && bUseLMFlag )
1412  {
1413    uiIntraDirChroma = 1;
1414  }
1415  else
1416  {
1417    if (uiIntraDirChroma < uiMode)
1418      uiIntraDirChroma++;
1419
1420    if (bUseLMFlag)
1421      uiIntraDirChroma++;
1422
1423#if CHROMA_CODEWORD_SWITCH
1424    uiIntraDirChroma = ChromaMapping[iMax-2][uiIntraDirChroma];
1425#endif
1426
1427  }
1428
1429
1430#else // <-- LM_CHROMA
1431  Int  iMax = uiMode < 4 ? 2 : 3; 
1432 
1433  //switch codeword
1434  if (uiIntraDirChroma == 4) {
1435    uiIntraDirChroma = 0;
1436  } 
1437#if CHROMA_CODEWORD_SWITCH
1438  else {
1439    if (uiIntraDirChroma < uiMode) {
1440      uiIntraDirChroma++;
1441    }
1442    uiIntraDirChroma = ChromaMapping[iMax-2][uiIntraDirChroma];
1443  }
1444#else
1445  else if (uiIntraDirChroma < uiMode) {
1446    uiIntraDirChroma++;
1447  }
1448#endif
1449#endif // <-- LM_CHROMA
1450 
1451  if ( 0 == uiIntraDirChroma )
1452  {
1453    m_pcBinIf->encodeBin( 0, m_cCUChromaPredSCModel.get( 0, 0, uiCtx ) );
1454  }
1455  else
1456  {
1457    m_pcBinIf->encodeBin( 1, m_cCUChromaPredSCModel.get( 0, 0, uiCtx ) );
1458    xWriteUnaryMaxSymbol( uiIntraDirChroma - 1, m_cCUChromaPredSCModel.get( 0, 0 ) + 3, 0, iMax );
1459  }
1460#else // CHROMA_CODEWORD
1461  if ( 0 == uiIntraDirChroma )
1462  {
1463    m_pcBinIf->encodeBin( 0, m_cCUChromaPredSCModel.get( 0, 0, uiCtx ) );
1464  }
1465  else
1466  {
1467    m_pcBinIf->encodeBin( 1, m_cCUChromaPredSCModel.get( 0, 0, uiCtx ) );
1468    xWriteUnaryMaxSymbol( uiIntraDirChroma - 1, m_cCUChromaPredSCModel.get( 0, 0 ) + 3, 0, 3 );
1469  }
1470#endif
1471
1472#if ADD_PLANAR_MODE
1473  uiIntraDirChroma = pcCU->getChromaIntraDir( uiAbsPartIdx );
1474#if CHROMA_CODEWORD
1475  uiMode = pcCU->getLumaIntraDir(uiAbsPartIdx);
1476  mapPlanartoDC( uiIntraDirChroma );
1477  mapPlanartoDC( uiMode );
1478  if ( (uiIntraDirChroma == 2) && (uiMode != 2) )
1479#else
1480  if ( (uiIntraDirChroma == PLANAR_IDX) || (uiIntraDirChroma == 2) )
1481#endif
1482  {
1483    m_pcBinIf->encodeBin( planarFlag, m_cPlanarFlagSCModel.get(0,0,1) );
1484  }
1485#endif
1486  return;
1487}
1488
1489Void TEncSbac::codeInterDir( TComDataCU* pcCU, UInt uiAbsPartIdx )
1490{
1491  UInt uiInterDir = pcCU->getInterDir   ( uiAbsPartIdx );
1492  UInt uiCtx      = pcCU->getCtxInterDir( uiAbsPartIdx );
1493  uiInterDir--;
1494  m_pcBinIf->encodeBin( ( uiInterDir == 2 ? 1 : 0 ), m_cCUInterDirSCModel.get( 0, 0, uiCtx ) );
1495 
1496  if ( pcCU->getSlice()->getNoBackPredFlag() )
1497  {
1498    assert( uiInterDir != 1 );
1499    return;
1500  }
1501 
1502#if DCM_COMB_LIST
1503  if ( uiInterDir < 2 && pcCU->getSlice()->getNumRefIdx(REF_PIC_LIST_C) <= 0)
1504#else
1505  if ( uiInterDir < 2 )
1506#endif
1507  {
1508    m_pcBinIf->encodeBin( uiInterDir, m_cCUInterDirSCModel.get( 0, 0, 3 ) );
1509  }
1510 
1511  return;
1512}
1513
1514Void TEncSbac::codeRefFrmIdx( TComDataCU* pcCU, UInt uiAbsPartIdx, RefPicList eRefList )
1515{
1516#if DCM_COMB_LIST
1517  if ( pcCU->getSlice()->getNumRefIdx(REF_PIC_LIST_C) > 0 && pcCU->getInterDir( uiAbsPartIdx ) != 3)
1518  {
1519    Int iRefFrame = pcCU->getSlice()->getRefIdxOfLC(eRefList, pcCU->getCUMvField( eRefList )->getRefIdx( uiAbsPartIdx ));
1520    UInt uiCtx;
1521
1522    uiCtx = pcCU->getCtxRefIdx( uiAbsPartIdx, RefPicList(pcCU->getSlice()->getListIdFromIdxOfLC(0)) );
1523
1524    m_pcBinIf->encodeBin( ( iRefFrame == 0 ? 0 : 1 ), m_cCURefPicSCModel.get( 0, 0, uiCtx ) );
1525
1526    if ( iRefFrame > 0 )
1527    {
1528      xWriteUnaryMaxSymbol( iRefFrame - 1, &m_cCURefPicSCModel.get( 0, 0, 4 ), 1, pcCU->getSlice()->getNumRefIdx( REF_PIC_LIST_C )-2 );
1529    }
1530  }
1531  else
1532  {
1533#endif
1534  Int iRefFrame = pcCU->getCUMvField( eRefList )->getRefIdx( uiAbsPartIdx );
1535 
1536  UInt uiCtx = pcCU->getCtxRefIdx( uiAbsPartIdx, eRefList );
1537 
1538  m_pcBinIf->encodeBin( ( iRefFrame == 0 ? 0 : 1 ), m_cCURefPicSCModel.get( 0, 0, uiCtx ) );
1539 
1540  if ( iRefFrame > 0 )
1541  {
1542    xWriteUnaryMaxSymbol( iRefFrame - 1, &m_cCURefPicSCModel.get( 0, 0, 4 ), 1, pcCU->getSlice()->getNumRefIdx( eRefList )-2 );
1543  }
1544#if DCM_COMB_LIST
1545  }
1546#endif
1547  return;
1548}
1549
1550Void TEncSbac::codeViewIdx(Int iViewIdx)
1551{
1552  assert(0) ; // not implemented yet
1553  xWriteUnaryMaxSymbol(iViewIdx, &m_cViewIdxSCModel.get( 0, 0, 4),1, MAX_NUMBER_VIEWS   );
1554}
1555
1556Void TEncSbac::codeMvd( TComDataCU* pcCU, UInt uiAbsPartIdx, RefPicList eRefList )
1557{
1558  TComCUMvField* pcCUMvField = pcCU->getCUMvField( eRefList );
1559  Int iHor = pcCUMvField->getMvd( uiAbsPartIdx ).getHor();
1560  Int iVer = pcCUMvField->getMvd( uiAbsPartIdx ).getVer();
1561 
1562  UInt uiAbsPartIdxL, uiAbsPartIdxA;
1563#if MVD_CTX
1564  Int iHorPredL, iVerPredL;
1565  Int iHorPredA, iVerPredA;
1566#else
1567  Int iHorPred, iVerPred;
1568#endif
1569
1570  TComDataCU* pcCUL   = pcCU->getPULeft ( uiAbsPartIdxL, pcCU->getZorderIdxInCU() + uiAbsPartIdx );
1571  TComDataCU* pcCUA   = pcCU->getPUAbove( uiAbsPartIdxA, pcCU->getZorderIdxInCU() + uiAbsPartIdx );
1572 
1573  TComCUMvField* pcCUMvFieldL = ( pcCUL == NULL || pcCUL->isIntra( uiAbsPartIdxL ) ) ? NULL : pcCUL->getCUMvField( eRefList );
1574  TComCUMvField* pcCUMvFieldA = ( pcCUA == NULL || pcCUA->isIntra( uiAbsPartIdxA ) ) ? NULL : pcCUA->getCUMvField( eRefList );
1575 
1576#if MVD_CTX
1577  iHorPredA = ( (pcCUMvFieldA == NULL) ? 0 : pcCUMvFieldA->getMvd( uiAbsPartIdxA ).getAbsHor() );
1578  iVerPredA = ( (pcCUMvFieldA == NULL) ? 0 : pcCUMvFieldA->getMvd( uiAbsPartIdxA ).getAbsVer() );
1579  iHorPredL = ( (pcCUMvFieldL == NULL) ? 0 : pcCUMvFieldL->getMvd( uiAbsPartIdxL ).getAbsHor() );
1580  iVerPredL = ( (pcCUMvFieldL == NULL) ? 0 : pcCUMvFieldL->getMvd( uiAbsPartIdxL ).getAbsVer() );
1581
1582  xWriteMvd( iHor, iHorPredL, iHorPredA, 0 );
1583  xWriteMvd( iVer, iVerPredL, iVerPredA, 1 );
1584#else 
1585  iHorPred = ( (pcCUMvFieldL == NULL) ? 0 : pcCUMvFieldL->getMvd( uiAbsPartIdxL ).getAbsHor() ) +
1586  ( (pcCUMvFieldA == NULL) ? 0 : pcCUMvFieldA->getMvd( uiAbsPartIdxA ).getAbsHor() );
1587  iVerPred = ( (pcCUMvFieldL == NULL) ? 0 : pcCUMvFieldL->getMvd( uiAbsPartIdxL ).getAbsVer() ) +
1588  ( (pcCUMvFieldA == NULL) ? 0 : pcCUMvFieldA->getMvd( uiAbsPartIdxA ).getAbsVer() );
1589
1590  xWriteMvd( iHor, iHorPred, 0 );
1591  xWriteMvd( iVer, iVerPred, 1 );
1592#endif
1593
1594 
1595  return;
1596}
1597
1598Void TEncSbac::codeDeltaQP( TComDataCU* pcCU, UInt uiAbsPartIdx )
1599{
1600  Int iDQp  = pcCU->getQP( uiAbsPartIdx ) - pcCU->getSlice()->getSliceQp();
1601 
1602  if ( iDQp == 0 )
1603  {
1604    m_pcBinIf->encodeBin( 0, m_cCUDeltaQpSCModel.get( 0, 0, 0 ) );
1605  }
1606  else
1607  {
1608    m_pcBinIf->encodeBin( 1, m_cCUDeltaQpSCModel.get( 0, 0, 0 ) );
1609   
1610    UInt uiDQp = (UInt)( iDQp > 0 ? ( 2 * iDQp - 2 ) : ( -2 * iDQp - 1 ) );
1611    xWriteUnarySymbol( uiDQp, &m_cCUDeltaQpSCModel.get( 0, 0, 2 ), 1 );
1612  }
1613 
1614  return;
1615}
1616
1617Void TEncSbac::codeQtCbf( TComDataCU* pcCU, UInt uiAbsPartIdx, TextType eType, UInt uiTrDepth )
1618{
1619  UInt uiCbf = pcCU->getCbf     ( uiAbsPartIdx, eType, uiTrDepth );
1620  UInt uiCtx = pcCU->getCtxQtCbf( uiAbsPartIdx, eType, uiTrDepth );
1621  m_pcBinIf->encodeBin( uiCbf , m_cCUQtCbfSCModel.get( 0, eType ? eType - 1 : eType, uiCtx ) );
1622  DTRACE_CABAC_V( g_nSymbolCounter++ )
1623  DTRACE_CABAC_T( "\tparseQtCbf()" )
1624  DTRACE_CABAC_T( "\tsymbol=" )
1625  DTRACE_CABAC_V( uiCbf )
1626  DTRACE_CABAC_T( "\tctx=" )
1627  DTRACE_CABAC_V( uiCtx )
1628  DTRACE_CABAC_T( "\tetype=" )
1629  DTRACE_CABAC_V( eType )
1630  DTRACE_CABAC_T( "\tuiAbsPartIdx=" )
1631  DTRACE_CABAC_V( uiAbsPartIdx )
1632  DTRACE_CABAC_T( "\n" )
1633}
1634
1635UInt xCheckCoeffPlainCNoRecur( const TCoeff* pcCoef, UInt uiSize, UInt uiDepth )
1636{
1637  UInt uiNumofCoeff = 0;
1638  UInt ui = uiSize>>uiDepth;
1639  {
1640    UInt x, y;
1641    const TCoeff* pCeoff = pcCoef;
1642    for( y=0 ; y<ui ; y++ )
1643    {
1644      for( x=0 ; x<ui ; x++ )
1645      {
1646        if( pCeoff[x] != 0 )
1647        {
1648          uiNumofCoeff++;
1649        }
1650      }
1651      pCeoff += uiSize;
1652    }
1653  }
1654  return uiNumofCoeff;
1655}
1656
1657Void TEncSbac::codeQtRootCbf( TComDataCU* pcCU, UInt uiAbsPartIdx )
1658{
1659  UInt uiCbf = pcCU->getQtRootCbf( uiAbsPartIdx );
1660  UInt uiCtx = pcCU->getCtxQtRootCbf( uiAbsPartIdx );
1661  m_pcBinIf->encodeBin( uiCbf , m_cCUQtRootCbfSCModel.get( 0, 0, uiCtx ) );
1662  DTRACE_CABAC_V( g_nSymbolCounter++ )
1663  DTRACE_CABAC_T( "\tparseQtRootCbf()" )
1664  DTRACE_CABAC_T( "\tsymbol=" )
1665  DTRACE_CABAC_V( uiCbf )
1666  DTRACE_CABAC_T( "\tctx=" )
1667  DTRACE_CABAC_V( uiCtx )
1668  DTRACE_CABAC_T( "\tuiAbsPartIdx=" )
1669  DTRACE_CABAC_V( uiAbsPartIdx )
1670  DTRACE_CABAC_T( "\n" )
1671}
1672
1673Void TEncSbac::xCheckCoeff( TCoeff* pcCoef, UInt uiSize, UInt uiDepth, UInt& uiNumofCoeff, UInt& uiPart )
1674{
1675  UInt ui = uiSize>>uiDepth;
1676  if( uiPart == 0 )
1677  {
1678    if( ui <= 4 )
1679    {
1680      UInt x, y;
1681      TCoeff* pCeoff = pcCoef;
1682      for( y=0 ; y<ui ; y++ )
1683      {
1684        for( x=0 ; x<ui ; x++ )
1685        {
1686          if( pCeoff[x] != 0 )
1687          {
1688            uiNumofCoeff++;
1689          }
1690        }
1691        pCeoff += uiSize;
1692      }
1693    }
1694    else
1695    {
1696      xCheckCoeff( pcCoef,                            uiSize, uiDepth+1, uiNumofCoeff, uiPart ); uiPart++; //1st Part
1697      xCheckCoeff( pcCoef             + (ui>>1),      uiSize, uiDepth+1, uiNumofCoeff, uiPart ); uiPart++; //2nd Part
1698      xCheckCoeff( pcCoef + (ui>>1)*uiSize,           uiSize, uiDepth+1, uiNumofCoeff, uiPart ); uiPart++; //3rd Part
1699      xCheckCoeff( pcCoef + (ui>>1)*uiSize + (ui>>1), uiSize, uiDepth+1, uiNumofCoeff, uiPart );           //4th Part
1700    }
1701  }
1702  else
1703  {
1704    UInt x, y;
1705    TCoeff* pCeoff = pcCoef;
1706    for( y=0 ; y<ui ; y++ )
1707    {
1708      for( x=0 ; x<ui ; x++ )
1709      {
1710        if( pCeoff[x] != 0 )
1711        {
1712          uiNumofCoeff++;
1713        }
1714      }
1715      pCeoff += uiSize;
1716    }
1717  }
1718}
1719
1720UInt xCheckCoeffPlainCNoRecur( const TCoeff* pcCoef, UInt uiSize, UInt uiDepth );
1721
1722#if PCP_SIGMAP_SIMPLE_LAST
1723/** Encode (X,Y) position of the last significant coefficient
1724 * \param uiPosX X component of last coefficient
1725 * \param uiPosY Y component of last coefficient
1726 * \param uiWidth block width
1727 * \param eTType plane type / luminance or chrominance
1728 * \param uiCTXIdx block size context
1729 * \param uiScanIdx scan type (zig-zag, hor, ver)
1730 * \returns Void
1731 * This method encodes the X and Y component within a block of the last significant coefficient.
1732 */
1733__inline Void TEncSbac::codeLastSignificantXY( UInt uiPosX, UInt uiPosY, const UInt uiWidth, const TextType eTType, const UInt uiCTXIdx, const UInt uiScanIdx )
1734{ 
1735  UInt  uiCtxLast;
1736  const UInt uiCtxOffset = g_uiCtxXYOffset[uiCTXIdx];
1737
1738  if( uiScanIdx == SCAN_VER )
1739  {
1740    swap( uiPosX, uiPosY );
1741  }
1742
1743  for(uiCtxLast=0; uiCtxLast<uiPosX; uiCtxLast++)
1744  {
1745    m_pcBinIf->encodeBin( 0, m_cCuCtxLastX.get( 0, eTType, uiCtxOffset + g_uiCtxXY[uiCtxLast] ) );
1746  }
1747  if(uiPosX < uiWidth - 1)
1748  {
1749    m_pcBinIf->encodeBin( 1, m_cCuCtxLastX.get( 0, eTType, uiCtxOffset + g_uiCtxXY[uiCtxLast] ) );
1750  }
1751
1752  for(uiCtxLast=0; uiCtxLast<uiPosY; uiCtxLast++)
1753  {
1754    m_pcBinIf->encodeBin( 0, m_cCuCtxLastY.get( 0, eTType, uiCtxOffset + g_uiCtxXY[uiCtxLast] ) );
1755  }
1756  if(uiPosY < uiWidth - 1)
1757  {
1758    m_pcBinIf->encodeBin( 1, m_cCuCtxLastY.get( 0, eTType, uiCtxOffset + g_uiCtxXY[uiCtxLast] ) );
1759  }
1760}
1761#endif
1762
1763Void TEncSbac::codeCoeffNxN( TComDataCU* pcCU, TCoeff* pcCoef, UInt uiAbsPartIdx, UInt uiWidth, UInt uiHeight, UInt uiDepth, TextType eTType, Bool bRD )
1764{
1765  DTRACE_CABAC_V( g_nSymbolCounter++ )
1766  DTRACE_CABAC_T( "\tparseCoeffNxN()\teType=" )
1767  DTRACE_CABAC_V( eTType )
1768  DTRACE_CABAC_T( "\twidth=" )
1769  DTRACE_CABAC_V( uiWidth )
1770  DTRACE_CABAC_T( "\theight=" )
1771  DTRACE_CABAC_V( uiHeight )
1772  DTRACE_CABAC_T( "\tdepth=" )
1773  DTRACE_CABAC_V( uiDepth )
1774  DTRACE_CABAC_T( "\tabspartidx=" )
1775  DTRACE_CABAC_V( uiAbsPartIdx )
1776  DTRACE_CABAC_T( "\ttoCU-X=" )
1777  DTRACE_CABAC_V( pcCU->getCUPelX() )
1778  DTRACE_CABAC_T( "\ttoCU-Y=" )
1779  DTRACE_CABAC_V( pcCU->getCUPelY() )
1780  DTRACE_CABAC_T( "\tCU-addr=" )
1781  DTRACE_CABAC_V(  pcCU->getAddr() )
1782  DTRACE_CABAC_T( "\tinCU-X=" )
1783  DTRACE_CABAC_V( g_auiRasterToPelX[ g_auiZscanToRaster[uiAbsPartIdx] ] )
1784  DTRACE_CABAC_T( "\tinCU-Y=" )
1785  DTRACE_CABAC_V( g_auiRasterToPelY[ g_auiZscanToRaster[uiAbsPartIdx] ] )
1786  DTRACE_CABAC_T( "\tpredmode=" )
1787  DTRACE_CABAC_V(  pcCU->getPredictionMode( uiAbsPartIdx ) )
1788  DTRACE_CABAC_T( "\n" )
1789  if( uiWidth > m_pcSlice->getSPS()->getMaxTrSize() )
1790  {
1791    uiWidth  = m_pcSlice->getSPS()->getMaxTrSize();
1792    uiHeight = m_pcSlice->getSPS()->getMaxTrSize();
1793  }
1794 
1795  UInt uiNumSig = 0;
1796  UInt uiCTXIdx = 0;
1797 
1798  switch( uiWidth )
1799  {
1800    case  2: uiCTXIdx = 6; break;
1801    case  4: uiCTXIdx = 5; break;
1802    case  8: uiCTXIdx = 4; break;
1803    case 16: uiCTXIdx = 3; break;
1804    case 32: uiCTXIdx = 2; break;
1805    case 64: uiCTXIdx = 1; break;
1806    default: uiCTXIdx = 0; break;
1807  }
1808 
1809  // compute number of significant coefficients
1810  UInt  uiPart = 0;
1811  xCheckCoeff(pcCoef, uiWidth, 0, uiNumSig, uiPart );
1812 
1813  if ( bRD )
1814  {
1815    UInt uiTempDepth = uiDepth - pcCU->getDepth( uiAbsPartIdx );
1816    pcCU->setCbfSubParts( ( uiNumSig ? 1 : 0 ) << uiTempDepth, eTType, uiAbsPartIdx, uiDepth );
1817  }
1818 
1819  if ( uiNumSig == 0 )
1820    return;
1821 
1822  eTType = eTType == TEXT_LUMA ? TEXT_LUMA : ( eTType == TEXT_NONE ? TEXT_NONE : TEXT_CHROMA );
1823 
1824  //----- encode significance map -----
1825  const UInt   uiLog2BlockSize   = g_aucConvertToBit[ uiWidth ] + 2;
1826  const UInt   uiMaxNumCoeff     = 1 << ( uiLog2BlockSize << 1 );
1827#if !PCP_SIGMAP_SIMPLE_LAST
1828  const UInt   uiMaxNumCoeffM1   = uiMaxNumCoeff - 1;
1829#endif
1830  const UInt   uiNum4x4Blk       = max<UInt>( 1, uiMaxNumCoeff >> 4 );
1831#if QC_MDCS
1832  const UInt uiScanIdx = pcCU->getCoefScanIdx(uiAbsPartIdx, uiWidth, eTType==TEXT_LUMA, pcCU->isIntra(uiAbsPartIdx));
1833#endif //QC_MDCS
1834 
1835#if PCP_SIGMAP_SIMPLE_LAST
1836    //===== code last coeff =====
1837    UInt uiScanPosLast = 0, uiPosLastX, uiPosLastY;
1838    for( UInt uiScanPos = 0; uiScanPos < uiMaxNumCoeff; uiScanPos++ )
1839    {
1840#if QC_MDCS
1841      UInt uiBlkPos    = g_auiSigLastScan[uiScanIdx][uiLog2BlockSize-1][uiScanPos]; 
1842#else
1843      UInt  uiBlkPos   = g_auiFrameScanXY[ uiLog2BlockSize-1 ][ uiScanPos ];
1844#endif //QC_MDCS
1845      uiPosLastY = uiBlkPos >> uiLog2BlockSize;
1846      uiPosLastX = uiBlkPos - ( uiPosLastY << uiLog2BlockSize );
1847
1848      if( pcCoef[ uiBlkPos ] != 0 )
1849      {
1850        uiNumSig--;
1851        if( uiNumSig == 0 )
1852        {
1853          codeLastSignificantXY(uiPosLastX, uiPosLastY, uiWidth, eTType, uiCTXIdx, uiScanIdx);
1854          uiScanPosLast = uiScanPos;
1855          break;
1856        }
1857      }
1858    }
1859
1860    //===== code significance flag =====
1861    {
1862      for( UInt uiScanPos = 0; uiScanPos < uiScanPosLast; uiScanPos++ )
1863      {
1864#if QC_MDCS
1865        UInt uiBlkPos   = g_auiSigLastScan[uiScanIdx][uiLog2BlockSize-1][uiScanPos]; 
1866#else
1867        UInt  uiBlkPos  = g_auiFrameScanXY[ uiLog2BlockSize-1 ][ uiScanPos ];
1868#endif //QC_MDCS
1869        UInt  uiPosY    = uiBlkPos >> uiLog2BlockSize;
1870        UInt  uiPosX    = uiBlkPos - ( uiPosY << uiLog2BlockSize );
1871        UInt  uiSig     = pcCoef[ uiBlkPos ] != 0 ? 1 : 0;
1872        UInt  uiCtxSig  = TComTrQuant::getSigCtxInc( pcCoef, uiPosX, uiPosY, uiLog2BlockSize, uiWidth );
1873#if SIMPLE_CONTEXT_SIG
1874        if( uiCtxSig < 4 || eTType)
1875        {
1876          m_pcBinIf->encodeBin( uiSig, m_cCUSigSCModel.get( uiCTXIdx-2, eTType, uiCtxSig ) );
1877        }
1878        else
1879        {
1880          m_pcBinIf->encodeBin( uiSig, m_cCUSigSCModel.get( uiCTXIdx-2 ? uiCTXIdx-2 : 1, eTType, uiCtxSig ) );
1881        }
1882#else
1883        m_pcBinIf->encodeBin( uiSig, m_cCUSigSCModel.get( uiCTXIdx, eTType, uiCtxSig ) );
1884#endif
1885      }
1886    }
1887
1888#else
1889  for( UInt uiScanPos = 0; uiScanPos < uiMaxNumCoeffM1; uiScanPos++ )
1890  {
1891#if QC_MDCS
1892    UInt uiBlkPos   = g_auiSigLastScan[uiScanIdx][uiLog2BlockSize-1][uiScanPos]; 
1893#else
1894    UInt  uiBlkPos  = g_auiFrameScanXY[ uiLog2BlockSize-1 ][ uiScanPos ];
1895#endif //QC_MDCS
1896    UInt  uiPosY    = uiBlkPos >> uiLog2BlockSize;
1897    UInt  uiPosX    = uiBlkPos - ( uiPosY << uiLog2BlockSize );
1898   
1899    //===== code significance flag =====
1900    UInt  uiSig    = pcCoef[ uiBlkPos ] != 0 ? 1 : 0;
1901    UInt  uiCtxSig = TComTrQuant::getSigCtxInc( pcCoef, uiPosX, uiPosY, uiLog2BlockSize, uiWidth );
1902#if SIMPLE_CONTEXT_SIG
1903      if( uiCtxSig < 4 || eTType)
1904      {
1905        m_pcBinIf->encodeBin( uiSig, m_cCUSigSCModel.get( uiCTXIdx-2, eTType, uiCtxSig ) );
1906      }
1907      else
1908      {
1909        m_pcBinIf->encodeBin( uiSig, m_cCUSigSCModel.get( uiCTXIdx-2 ? uiCTXIdx-2 : 1, eTType, uiCtxSig ) );
1910      }
1911#else
1912    m_pcBinIf->encodeBin( uiSig, m_cCUSigSCModel.get( uiCTXIdx, eTType, uiCtxSig ) );
1913#endif
1914    if( uiSig )
1915    {
1916      uiNumSig--;
1917     
1918      //===== code last flag =====
1919      UInt  uiLast    = ( uiNumSig == 0 ) ? 1 : 0;
1920      UInt  uiCtxLast = TComTrQuant::getLastCtxInc( uiPosX, uiPosY, uiLog2BlockSize );
1921      m_pcBinIf->encodeBin( uiLast, m_cCULastSCModel.get( uiCTXIdx, eTType, uiCtxLast ) );
1922     
1923      if( uiLast )
1924      {
1925        break;
1926      }
1927    }
1928  }
1929#endif
1930  /*
1931   * Sign and bin0 PCP (Section 3.2 and 3.3 of JCTVC-B088)
1932   */
1933  Int  c1, c2;
1934  UInt uiSign;
1935  UInt uiAbs;
1936#if E253
1937  UInt uiGoRiceParam = 0;
1938#endif
1939
1940  if( uiNum4x4Blk > 1 )
1941  {
1942    Bool b1stBlk  = true;
1943    UInt uiNumOne = 0;
1944   
1945    for( UInt uiSubBlk = 0; uiSubBlk < uiNum4x4Blk; uiSubBlk++ )
1946    {
1947      UInt uiCtxSet    = 0;
1948      UInt uiSubNumSig = 0;
1949      UInt uiSubPosX   = 0;
1950      UInt uiSubPosY   = 0;
1951#if E253
1952      uiGoRiceParam    = 0;
1953#endif
1954
1955      uiSubPosX = g_auiFrameScanX[ g_aucConvertToBit[ uiWidth ] - 1 ][ uiSubBlk ] << 2;
1956      uiSubPosY = g_auiFrameScanY[ g_aucConvertToBit[ uiWidth ] - 1 ][ uiSubBlk ] << 2;
1957     
1958      TCoeff* piCurr = &pcCoef[ uiSubPosX + uiSubPosY * uiWidth ];
1959     
1960      for( UInt uiY = 0; uiY < 4; uiY++ )
1961      {
1962        for( UInt uiX = 0; uiX < 4; uiX++ )
1963        {
1964          if( piCurr[ uiX ] )
1965          {
1966            uiSubNumSig++;
1967          }
1968        }
1969        piCurr += uiWidth;
1970      }
1971     
1972      if( uiSubNumSig > 0 )
1973      {
1974        c1 = 1;
1975        c2 = 0;
1976       
1977        if( b1stBlk )
1978        {
1979          b1stBlk  = false;
1980          uiCtxSet = 5;
1981        }
1982        else
1983        {
1984          uiCtxSet = ( uiNumOne >> 2 ) + 1;
1985          uiNumOne = 0;
1986        }
1987       
1988        for( UInt uiScanPos = 0; uiScanPos < 16; uiScanPos++ )
1989        {
1990          UInt  uiBlkPos  = g_auiFrameScanXY[ 1 ][ 15 - uiScanPos ];
1991          UInt  uiPosY    = uiBlkPos >> 2;
1992          UInt  uiPosX    = uiBlkPos - ( uiPosY << 2 );
1993          UInt  uiIndex   = ( ( uiSubPosY + uiPosY ) << uiLog2BlockSize ) + uiSubPosX + uiPosX;
1994         
1995          if( pcCoef[ uiIndex ]  )
1996          {
1997            if( pcCoef[ uiIndex ] > 0) { uiAbs = static_cast<UInt>( pcCoef[ uiIndex ]);  uiSign = 0; }
1998            else                       { uiAbs = static_cast<UInt>(-pcCoef[ uiIndex ]);  uiSign = 1; }
1999           
2000            UInt uiCtx    = min<UInt>(c1, 4);
2001            UInt uiSymbol = uiAbs > 1 ? 1 : 0;
2002            m_pcBinIf->encodeBin( uiSymbol, m_cCUOneSCModel.get( 0, eTType, ( uiCtxSet << 2 ) + uiCtxSet + uiCtx ) );
2003           
2004            if( uiSymbol )
2005            {
2006              c1     = 0;
2007            }
2008            else if( c1 )
2009            {
2010              c1++;
2011            }
2012          }
2013        }
2014       
2015        for( UInt uiScanPos = 0; uiScanPos < 16; uiScanPos++ )
2016        {
2017          UInt  uiBlkPos  = g_auiFrameScanXY[ 1 ][ 15 - uiScanPos ];
2018          UInt  uiPosY    = uiBlkPos >> 2;
2019          UInt  uiPosX    = uiBlkPos - ( uiPosY << 2 );
2020          UInt  uiIndex   = ( ( uiSubPosY + uiPosY ) << uiLog2BlockSize ) + uiSubPosX + uiPosX;
2021         
2022          if( pcCoef[ uiIndex ]  )
2023          {
2024            if( pcCoef[ uiIndex ] > 0) { uiAbs = static_cast<UInt>( pcCoef[ uiIndex ]);  uiSign = 0; }
2025            else                       { uiAbs = static_cast<UInt>(-pcCoef[ uiIndex ]);  uiSign = 1; }
2026           
2027            UInt uiSymbol = uiAbs > 1 ? 1 : 0;
2028           
2029            if( uiSymbol )
2030            {
2031              UInt uiCtx  = min<UInt>(c2, 4);
2032              uiAbs -= 2;
2033              c2++;
2034              uiNumOne++;
2035#if E253
2036              uiSymbol = uiAbs > 0 ? 1 : 0;
2037
2038              m_pcBinIf->encodeBin( uiSymbol, m_cCUAbsSCModel.get( 0, eTType, ( uiCtxSet << 2 ) + uiCtxSet + uiCtx ) );
2039
2040              if( uiSymbol )
2041              {
2042                uiAbs -= 1;
2043                xWriteGoRiceExGolomb( uiAbs, uiGoRiceParam );
2044              }
2045#else
2046              xWriteExGolombLevel( uiAbs, m_cCUAbsSCModel.get( 0, eTType, ( uiCtxSet << 2 ) + uiCtxSet + uiCtx ) );
2047#endif
2048            }
2049          }
2050        }
2051       
2052        for( UInt uiScanPos = 0; uiScanPos < 16; uiScanPos++ )
2053        {
2054          UInt  uiBlkPos  = g_auiFrameScanXY[ 1 ][ 15 - uiScanPos ];
2055          UInt  uiPosY    = uiBlkPos >> 2;
2056          UInt  uiPosX    = uiBlkPos - ( uiPosY << 2 );
2057          UInt  uiIndex   = ( ( uiSubPosY + uiPosY ) << uiLog2BlockSize ) + uiSubPosX + uiPosX;
2058         
2059          if( pcCoef[ uiIndex ]  )
2060          {
2061            if( pcCoef[ uiIndex ] > 0) { uiAbs = static_cast<UInt>( pcCoef[ uiIndex ]);  uiSign = 0; }
2062            else                       { uiAbs = static_cast<UInt>(-pcCoef[ uiIndex ]);  uiSign = 1; }
2063            m_pcBinIf->encodeBinEP( uiSign );
2064          }
2065        }
2066       
2067      }
2068    }
2069  }
2070  else
2071  {
2072    c1 = 1;
2073    c2 = 0;
2074   
2075    for( UInt uiScanPos = 0; uiScanPos < 16; uiScanPos++ )
2076    {
2077      UInt uiIndex = g_auiFrameScanXY[ 1 ][ 15 - uiScanPos ];
2078     
2079      if( pcCoef[ uiIndex ]  )
2080      {
2081        if( pcCoef[ uiIndex ] > 0) { uiAbs = static_cast<UInt>( pcCoef[ uiIndex ]);  uiSign = 0; }
2082        else                       { uiAbs = static_cast<UInt>(-pcCoef[ uiIndex ]);  uiSign = 1; }
2083       
2084        UInt uiCtx    = min<UInt>(c1, 4);
2085        UInt uiSymbol = uiAbs > 1 ? 1 : 0;
2086        m_pcBinIf->encodeBin( uiSymbol, m_cCUOneSCModel.get( 0, eTType, uiCtx ) );
2087       
2088        if( uiSymbol )
2089        {
2090          c1 = 0;
2091        }
2092        else if( c1 )
2093        {
2094          c1++;
2095        }
2096      }
2097    }
2098   
2099    for( UInt uiScanPos = 0; uiScanPos < 16; uiScanPos++ )
2100    {
2101      UInt uiIndex = g_auiFrameScanXY[ 1 ][ 15 - uiScanPos ];
2102     
2103      if( pcCoef[ uiIndex ]  )
2104      {
2105        if( pcCoef[ uiIndex ] > 0) { uiAbs = static_cast<UInt>( pcCoef[ uiIndex ]);  uiSign = 0; }
2106        else                       { uiAbs = static_cast<UInt>(-pcCoef[ uiIndex ]);  uiSign = 1; }
2107       
2108        UInt uiSymbol = uiAbs > 1 ? 1 : 0;
2109       
2110        if( uiSymbol )
2111        {
2112          UInt uiCtx  = min<UInt>(c2, 4);
2113          uiAbs -= 2;
2114          c2++;
2115#if E253
2116          uiSymbol = uiAbs > 0 ? 1 : 0;
2117
2118          m_pcBinIf->encodeBin( uiSymbol, m_cCUAbsSCModel.get( 0, eTType, uiCtx ) );
2119
2120          if( uiSymbol )
2121          {
2122            uiAbs -= 1;
2123            xWriteGoRiceExGolomb( uiAbs, uiGoRiceParam );
2124          }
2125#else
2126          xWriteExGolombLevel( uiAbs, m_cCUAbsSCModel.get( 0, eTType, uiCtx ) );
2127#endif
2128        }
2129      }
2130    }
2131   
2132    for( UInt uiScanPos = 0; uiScanPos < 16; uiScanPos++ )
2133    {
2134      UInt uiIndex = g_auiFrameScanXY[ 1 ][ 15 - uiScanPos ];
2135     
2136      if( pcCoef[ uiIndex ]  )
2137      {
2138        if( pcCoef[ uiIndex ] > 0) { uiAbs = static_cast<UInt>( pcCoef[ uiIndex ]);  uiSign = 0; }
2139        else                       { uiAbs = static_cast<UInt>(-pcCoef[ uiIndex ]);  uiSign = 1; }
2140       
2141        m_pcBinIf->encodeBinEP( uiSign );
2142      }
2143    }
2144  }
2145  return;
2146}
2147
2148#if MVD_CTX
2149/** Encode a motion vector difference
2150 * \param iMvd motion vector difference
2151 * \param uiAbsSumL motion vector difference of left PU
2152 * \param uiAbsSumA motion vector difference of above PU
2153 * \param uiCtx index for context set based on vertical or horizontal component
2154 */
2155Void TEncSbac::xWriteMvd( Int iMvd, UInt uiAbsSumL, UInt uiAbsSumA, UInt uiCtx )
2156#else
2157Void TEncSbac::xWriteMvd( Int iMvd, UInt uiAbsSum, UInt uiCtx )
2158#endif
2159{
2160  UInt uiLocalCtx = 0;
2161#if MVD_CTX
2162  uiLocalCtx += (uiAbsSumA>16) ? 1 : 0;
2163  uiLocalCtx += (uiAbsSumL>16) ? 1 : 0;
2164#else
2165  if ( uiAbsSum >= 3 )
2166  {
2167    uiLocalCtx += ( uiAbsSum > 32 ) ? 2 : 1;
2168  }
2169#endif
2170
2171  UInt uiSymbol = ( 0 == iMvd ) ? 0 : 1;
2172  m_pcBinIf->encodeBin( uiSymbol, m_cCUMvdSCModel.get( 0, uiCtx, uiLocalCtx ) );
2173  if ( 0 == uiSymbol )
2174  {
2175    return;
2176  }
2177 
2178  UInt uiSign = 0;
2179  if ( 0 > iMvd )
2180  {
2181    uiSign = 1;
2182    iMvd   = -iMvd;
2183  }
2184  xWriteExGolombMvd( iMvd-1, &m_cCUMvdSCModel.get( 0, uiCtx, 3 ), 3 );
2185  m_pcBinIf->encodeBinEP( uiSign );
2186 
2187  return;
2188}
2189
2190Void  TEncSbac::xWriteExGolombMvd( UInt uiSymbol, ContextModel* pcSCModel, UInt uiMaxBin )
2191{
2192  if ( ! uiSymbol )
2193  {
2194    m_pcBinIf->encodeBin( 0, *pcSCModel );
2195    return;
2196  }
2197 
2198  m_pcBinIf->encodeBin( 1, *pcSCModel );
2199 
2200  Bool bNoExGo = ( uiSymbol < 8 );
2201  UInt uiCount = 1;
2202  pcSCModel++;
2203 
2204  while ( --uiSymbol && ++uiCount <= 8 )
2205  {
2206    m_pcBinIf->encodeBin( 1, *pcSCModel );
2207    if ( uiCount == 2 )
2208    {
2209      pcSCModel++;
2210    }
2211    if ( uiCount == uiMaxBin )
2212    {
2213      pcSCModel++;
2214    }
2215  }
2216 
2217  if ( bNoExGo )
2218  {
2219    m_pcBinIf->encodeBin( 0, *pcSCModel );
2220  }
2221  else
2222  {
2223    xWriteEpExGolomb( uiSymbol, 3 );
2224  }
2225 
2226  return;
2227}
2228
2229Void TEncSbac::codeAlfFlag       ( UInt uiCode )
2230{
2231  UInt uiSymbol = ( ( uiCode == 0 ) ? 0 : 1 );
2232  m_pcBinIf->encodeBin( uiSymbol, m_cALFFlagSCModel.get( 0, 0, 0 ) );
2233}
2234
2235#if TSB_ALF_HEADER
2236Void TEncSbac::codeAlfFlagNum( UInt uiCode, UInt minValue )
2237{
2238  UInt uiLength = 0;
2239  UInt maxValue = (minValue << (this->getMaxAlfCtrlDepth()*2));
2240  assert((uiCode>=minValue)&&(uiCode<=maxValue));
2241  UInt temp = maxValue - minValue;
2242  for(UInt i=0; i<32; i++)
2243  {
2244    if(temp&0x1)
2245    {
2246      uiLength = i+1;
2247    }
2248    temp = (temp >> 1);
2249  }
2250  UInt uiSymbol = uiCode - minValue;
2251  if(uiLength)
2252  {
2253    while( uiLength-- )
2254    {
2255      m_pcBinIf->encodeBinEP( (uiSymbol>>uiLength) & 0x1 );
2256    }
2257  }
2258}
2259
2260Void TEncSbac::codeAlfCtrlFlag( UInt uiSymbol )
2261{
2262  m_pcBinIf->encodeBin( uiSymbol, m_cCUAlfCtrlFlagSCModel.get( 0, 0, 0) );
2263}
2264#endif
2265
2266Void TEncSbac::codeAlfUvlc       ( UInt uiCode )
2267{
2268  Int i;
2269 
2270  if ( uiCode == 0 )
2271  {
2272    m_pcBinIf->encodeBin( 0, m_cALFUvlcSCModel.get( 0, 0, 0 ) );
2273  }
2274  else
2275  {
2276    m_pcBinIf->encodeBin( 1, m_cALFUvlcSCModel.get( 0, 0, 0 ) );
2277    for ( i=0; i<uiCode-1; i++ )
2278    {
2279      m_pcBinIf->encodeBin( 1, m_cALFUvlcSCModel.get( 0, 0, 1 ) );
2280    }
2281    m_pcBinIf->encodeBin( 0, m_cALFUvlcSCModel.get( 0, 0, 1 ) );
2282  }
2283}
2284
2285Void TEncSbac::codeAlfSvlc       ( Int iCode )
2286{
2287  Int i;
2288 
2289  if ( iCode == 0 )
2290  {
2291    m_pcBinIf->encodeBin( 0, m_cALFSvlcSCModel.get( 0, 0, 0 ) );
2292  }
2293  else
2294  {
2295    m_pcBinIf->encodeBin( 1, m_cALFSvlcSCModel.get( 0, 0, 0 ) );
2296   
2297    // write sign
2298    if ( iCode > 0 )
2299    {
2300      m_pcBinIf->encodeBin( 0, m_cALFSvlcSCModel.get( 0, 0, 1 ) );
2301    }
2302    else
2303    {
2304      m_pcBinIf->encodeBin( 1, m_cALFSvlcSCModel.get( 0, 0, 1 ) );
2305      iCode = -iCode;
2306    }
2307   
2308    // write magnitude
2309    for ( i=0; i<iCode-1; i++ )
2310    {
2311      m_pcBinIf->encodeBin( 1, m_cALFSvlcSCModel.get( 0, 0, 2 ) );
2312    }
2313    m_pcBinIf->encodeBin( 0, m_cALFSvlcSCModel.get( 0, 0, 2 ) );
2314  }
2315}
2316
2317#if MTK_SAO
2318Void TEncSbac::codeAoFlag       ( UInt uiCode )
2319{
2320  UInt uiSymbol = ( ( uiCode == 0 ) ? 0 : 1 );
2321  m_pcBinIf->encodeBin( uiSymbol, m_cAOFlagSCModel.get( 0, 0, 0 ) );
2322}
2323Void TEncSbac::codeAoUvlc       ( UInt uiCode )
2324{
2325  Int i;
2326
2327  if ( uiCode == 0 )
2328  {
2329    m_pcBinIf->encodeBin( 0, m_cAOUvlcSCModel.get( 0, 0, 0 ) );
2330  }
2331  else
2332  {
2333    m_pcBinIf->encodeBin( 1, m_cAOUvlcSCModel.get( 0, 0, 0 ) );
2334    for ( i=0; i<uiCode-1; i++ )
2335    {
2336      m_pcBinIf->encodeBin( 1, m_cAOUvlcSCModel.get( 0, 0, 1 ) );
2337    }
2338    m_pcBinIf->encodeBin( 0, m_cAOUvlcSCModel.get( 0, 0, 1 ) );
2339  }
2340}
2341Void TEncSbac::codeAoSvlc       ( Int iCode )
2342{
2343  Int i;
2344
2345  if ( iCode == 0 )
2346  {
2347    m_pcBinIf->encodeBin( 0, m_cAOSvlcSCModel.get( 0, 0, 0 ) );
2348  }
2349  else
2350  {
2351    m_pcBinIf->encodeBin( 1, m_cAOSvlcSCModel.get( 0, 0, 0 ) );
2352
2353    // write sign
2354    if ( iCode > 0 )
2355    {
2356      m_pcBinIf->encodeBin( 0, m_cAOSvlcSCModel.get( 0, 0, 1 ) );
2357    }
2358    else
2359    {
2360      m_pcBinIf->encodeBin( 1, m_cAOSvlcSCModel.get( 0, 0, 1 ) );
2361      iCode = -iCode;
2362    }
2363
2364    // write magnitude
2365    for ( i=0; i<iCode-1; i++ )
2366    {
2367      m_pcBinIf->encodeBin( 1, m_cAOSvlcSCModel.get( 0, 0, 2 ) );
2368    }
2369    m_pcBinIf->encodeBin( 0, m_cAOSvlcSCModel.get( 0, 0, 2 ) );
2370  }
2371}
2372#endif
2373
2374/*!
2375 ****************************************************************************
2376 * \brief
2377 *   estimate bit cost for CBP, significant map and significant coefficients
2378 ****************************************************************************
2379 */
2380Void TEncSbac::estBit( estBitsSbacStruct* pcEstBitsSbac, UInt uiCTXIdx, TextType eTType )
2381{
2382  estCBFBit( pcEstBitsSbac, 0, eTType );
2383 
2384  // encode significance map
2385  estSignificantMapBit( pcEstBitsSbac, uiCTXIdx, eTType );
2386 
2387  // encode significant coefficients
2388  estSignificantCoefficientsBit( pcEstBitsSbac, uiCTXIdx, eTType );
2389}
2390
2391/*!
2392 ****************************************************************************
2393 * \brief
2394 *    estimate bit cost for each CBP bit
2395 ****************************************************************************
2396 */
2397Void TEncSbac::estCBFBit( estBitsSbacStruct* pcEstBitsSbac, UInt uiCTXIdx, TextType eTType )
2398{
2399  ContextModel *pCtx = m_cCUQtCbfSCModel.get( 0 );
2400
2401  for( UInt uiCtxInc = 0; uiCtxInc < 45; uiCtxInc++ )
2402  {
2403    pcEstBitsSbac->blockCbpBits[ uiCtxInc ][ 0 ] = biari_no_bits( 0, pCtx[ uiCtxInc ] );
2404    pcEstBitsSbac->blockCbpBits[ uiCtxInc ][ 1 ] = biari_no_bits( 1, pCtx[ uiCtxInc ] );
2405  }
2406
2407  for( UInt uiCtxInc = 0; uiCtxInc < 4; uiCtxInc++ )
2408  {
2409    pcEstBitsSbac->blockRootCbpBits[ uiCtxInc ][ 0 ] = biari_no_bits( 0, m_cCUQtRootCbfSCModel.get( 0, 0, uiCtxInc ) );
2410    pcEstBitsSbac->blockRootCbpBits[ uiCtxInc ][ 1 ] = biari_no_bits( 1, m_cCUQtRootCbfSCModel.get( 0, 0, uiCtxInc ) );
2411  }
2412}
2413
2414
2415/*!
2416 ****************************************************************************
2417 * \brief
2418 *    estimate SAMBAC bit cost for significant coefficient map
2419 ****************************************************************************
2420 */
2421Void TEncSbac::estSignificantMapBit( estBitsSbacStruct* pcEstBitsSbac, UInt uiCTXIdx, TextType eTType )
2422{
2423  for ( UInt uiCtx = 0; uiCtx < 16; uiCtx++ )
2424  {
2425    for( UInt uiBin = 0; uiBin < 2; uiBin++ )
2426    {
2427#if SIMPLE_CONTEXT_SIG
2428      if( uiCtx < 4 || eTType )
2429      {
2430        pcEstBitsSbac->significantBits[ uiCtx ][ uiBin ] = biari_no_bits ( uiBin, m_cCUSigSCModel.get( uiCTXIdx-2, eTType, uiCtx ) );
2431      }
2432      else
2433      {
2434        pcEstBitsSbac->significantBits[ uiCtx ][ uiBin ] = biari_no_bits ( uiBin, m_cCUSigSCModel.get( uiCTXIdx-2 ? uiCTXIdx-2 : 1, eTType, uiCtx ) );
2435      }
2436#else
2437      pcEstBitsSbac->significantBits[ uiCtx ][ uiBin ] = biari_no_bits ( uiBin, m_cCUSigSCModel.get(  uiCTXIdx, eTType, uiCtx ) );
2438#endif
2439
2440#if !PCP_SIGMAP_SIMPLE_LAST   
2441      pcEstBitsSbac->lastBits[ uiCtx ][ uiBin ]        = biari_no_bits ( uiBin, m_cCULastSCModel.get( uiCTXIdx, eTType, uiCtx ) );
2442#endif
2443    }
2444  }
2445
2446#if PCP_SIGMAP_SIMPLE_LAST
2447  Int iBitsX = 0, iBitsY = 0;
2448  const UInt uiCtxOffset = g_uiCtxXYOffset[uiCTXIdx];
2449  const UInt uiWidthM1   = (1 << (7-uiCTXIdx)) - 1;
2450  for ( UInt uiCtx = 0; uiCtx < uiWidthM1; uiCtx++ )
2451  {
2452    pcEstBitsSbac->lastXBits[uiCtx] = iBitsX + biari_no_bits (1, m_cCuCtxLastX.get( 0, eTType, uiCtxOffset + g_uiCtxXY[uiCtx] ));
2453    pcEstBitsSbac->lastYBits[uiCtx] = iBitsY + biari_no_bits (1, m_cCuCtxLastY.get( 0, eTType, uiCtxOffset + g_uiCtxXY[uiCtx] ));
2454    iBitsX += biari_no_bits (0, m_cCuCtxLastX.get( 0, eTType, uiCtxOffset + g_uiCtxXY[uiCtx] ));
2455    iBitsY += biari_no_bits (0, m_cCuCtxLastY.get( 0, eTType, uiCtxOffset + g_uiCtxXY[uiCtx] ));
2456  }
2457  pcEstBitsSbac->lastXBits[uiWidthM1] = iBitsX;
2458  pcEstBitsSbac->lastYBits[uiWidthM1] = iBitsY;
2459#endif
2460}
2461
2462/*!
2463 ****************************************************************************
2464 * \brief
2465 *    estimate bit cost of significant coefficient
2466 ****************************************************************************
2467 */
2468Void TEncSbac::estSignificantCoefficientsBit( estBitsSbacStruct* pcEstBitsSbac, UInt uiCTXIdx, TextType eTType )
2469{
2470  for( UInt uiSet = 0; uiSet < 6; uiSet++ )
2471  {
2472    for( UInt uiCtx = 0; uiCtx < 5; uiCtx++ )
2473    {
2474      pcEstBitsSbac->greaterOneBits[ uiSet ][ 0 ][ uiCtx ][ 0 ] = biari_no_bits( 0, m_cCUOneSCModel.get( 0, eTType, ( uiSet << 2 ) + uiSet + uiCtx ) );
2475      pcEstBitsSbac->greaterOneBits[ uiSet ][ 0 ][ uiCtx ][ 1 ] = biari_no_bits( 1, m_cCUOneSCModel.get( 0, eTType, ( uiSet << 2 ) + uiSet + uiCtx ) );
2476      pcEstBitsSbac->greaterOneBits[ uiSet ][ 1 ][ uiCtx ][ 0 ] = biari_no_bits( 0, m_cCUAbsSCModel.get( 0, eTType, ( uiSet << 2 ) + uiSet + uiCtx ) );
2477      pcEstBitsSbac->greaterOneBits[ uiSet ][ 1 ][ uiCtx ][ 1 ] = biari_no_bits( 1, m_cCUAbsSCModel.get( 0, eTType, ( uiSet << 2 ) + uiSet + uiCtx ) );
2478    }
2479  }
2480}
2481
2482Int TEncSbac::biari_no_bits( Short symbol, ContextModel& rcSCModel )
2483{
2484  UInt  uiEstBits;
2485  Short ui16State;
2486 
2487  symbol    = (Short)( symbol != 0 );
2488  ui16State = symbol == rcSCModel.getMps() ? 64 + rcSCModel.getState() : 63 - rcSCModel.getState();
2489  uiEstBits = entropyBits[ 127 - ui16State ];
2490  return uiEstBits;
2491}
Note: See TracBrowser for help on using the repository browser.