source: 3DVCSoftware/branches/0.1-poznan-univ/source/Lib/TLibEncoder/TEncSbac.cpp @ 408

Last change on this file since 408 was 2, checked in by hhi, 13 years ago

inital import

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