source: 3DVCSoftware/branches/HTM-DEV-0.2-dev/source/Lib/TLibEncoder/TEncEntropy.cpp @ 496

Last change on this file since 496 was 446, checked in by tech, 12 years ago

Added missing parts.

  • Property svn:eol-style set to native
File size: 21.3 KB
Line 
1/* The copyright in this software is being made available under the BSD
2 * License, included below. This software may be subject to other third party
3 * and contributor rights, including patent rights, and no such rights are
4 * granted under this license. 
5 *
6 * Copyright (c) 2010-2013, ITU/ISO/IEC
7 * All rights reserved.
8 *
9 * Redistribution and use in source and binary forms, with or without
10 * modification, are permitted provided that the following conditions are met:
11 *
12 *  * Redistributions of source code must retain the above copyright notice,
13 *    this list of conditions and the following disclaimer.
14 *  * Redistributions in binary form must reproduce the above copyright notice,
15 *    this list of conditions and the following disclaimer in the documentation
16 *    and/or other materials provided with the distribution.
17 *  * Neither the name of the ITU/ISO/IEC nor the names of its contributors may
18 *    be used to endorse or promote products derived from this software without
19 *    specific prior written permission.
20 *
21 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
22 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS
25 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
26 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
27 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
28 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
29 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
30 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
31 * THE POSSIBILITY OF SUCH DAMAGE.
32 */
33
34/** \file     TEncEntropy.cpp
35    \brief    entropy encoder class
36*/
37
38#include "TEncEntropy.h"
39#include "TLibCommon/TypeDef.h"
40#include "TLibCommon/TComSampleAdaptiveOffset.h"
41
42//! \ingroup TLibEncoder
43//! \{
44
45Void TEncEntropy::setEntropyCoder ( TEncEntropyIf* e, TComSlice* pcSlice )
46{
47  m_pcEntropyCoderIf = e;
48  m_pcEntropyCoderIf->setSlice ( pcSlice );
49}
50
51Void TEncEntropy::encodeSliceHeader ( TComSlice* pcSlice )
52{
53  if (pcSlice->getSPS()->getUseSAO())
54  {
55    SAOParam *saoParam = pcSlice->getPic()->getPicSym()->getSaoParam();
56    pcSlice->setSaoEnabledFlag     (saoParam->bSaoFlag[0]);
57    {
58      pcSlice->setSaoEnabledFlagChroma   (saoParam->bSaoFlag[1]);
59    }
60  }
61
62  m_pcEntropyCoderIf->codeSliceHeader( pcSlice );
63  return;
64}
65
66Void  TEncEntropy::encodeTilesWPPEntryPoint( TComSlice* pSlice )
67{
68  m_pcEntropyCoderIf->codeTilesWPPEntryPoint( pSlice );
69}
70
71Void TEncEntropy::encodeTerminatingBit      ( UInt uiIsLast )
72{
73  m_pcEntropyCoderIf->codeTerminatingBit( uiIsLast );
74 
75  return;
76}
77
78Void TEncEntropy::encodeSliceFinish()
79{
80  m_pcEntropyCoderIf->codeSliceFinish();
81}
82
83Void TEncEntropy::encodePPS( TComPPS* pcPPS )
84{
85  m_pcEntropyCoderIf->codePPS( pcPPS );
86  return;
87}
88
89#if H_3D
90Void TEncEntropy::encodeSPS( TComSPS* pcSPS, Int viewIndex, Bool depthFlag )
91{
92  m_pcEntropyCoderIf->codeSPS( pcSPS, viewIndex, depthFlag );
93  return;
94}
95#else
96Void TEncEntropy::encodeSPS( TComSPS* pcSPS )
97{
98  m_pcEntropyCoderIf->codeSPS( pcSPS );
99  return;
100}
101#endif
102
103Void TEncEntropy::encodeCUTransquantBypassFlag( TComDataCU* pcCU, UInt uiAbsPartIdx, Bool bRD )
104{
105  if( bRD )
106  {
107    uiAbsPartIdx = 0;
108  }
109  m_pcEntropyCoderIf->codeCUTransquantBypassFlag( pcCU, uiAbsPartIdx );
110}
111
112Void TEncEntropy::encodeVPS( TComVPS* pcVPS )
113{
114  m_pcEntropyCoderIf->codeVPS( pcVPS );
115  return;
116}
117
118Void TEncEntropy::encodeSkipFlag( TComDataCU* pcCU, UInt uiAbsPartIdx, Bool bRD )
119{
120  if ( pcCU->getSlice()->isIntra() )
121  {
122    return;
123  }
124  if( bRD )
125  {
126    uiAbsPartIdx = 0;
127  }
128  m_pcEntropyCoderIf->codeSkipFlag( pcCU, uiAbsPartIdx );
129}
130
131/** encode merge flag
132 * \param pcCU
133 * \param uiAbsPartIdx
134 * \returns Void
135 */
136Void TEncEntropy::encodeMergeFlag( TComDataCU* pcCU, UInt uiAbsPartIdx )
137{ 
138  // at least one merge candidate exists
139  m_pcEntropyCoderIf->codeMergeFlag( pcCU, uiAbsPartIdx );
140}
141
142/** encode merge index
143 * \param pcCU
144 * \param uiAbsPartIdx
145 * \param uiPUIdx
146 * \param bRD
147 * \returns Void
148 */
149Void TEncEntropy::encodeMergeIndex( TComDataCU* pcCU, UInt uiAbsPartIdx, Bool bRD )
150{
151  if( bRD )
152  {
153    uiAbsPartIdx = 0;
154    assert( pcCU->getPartitionSize(uiAbsPartIdx) == SIZE_2Nx2N );
155  }
156  m_pcEntropyCoderIf->codeMergeIndex( pcCU, uiAbsPartIdx );
157}
158
159/** encode prediction mode
160 * \param pcCU
161 * \param uiAbsPartIdx
162 * \param bRD
163 * \returns Void
164 */
165Void TEncEntropy::encodePredMode( TComDataCU* pcCU, UInt uiAbsPartIdx, Bool bRD )
166{
167  if( bRD )
168  {
169    uiAbsPartIdx = 0;
170  }
171  if ( pcCU->getSlice()->isIntra() )
172  {
173    return;
174  }
175
176  m_pcEntropyCoderIf->codePredMode( pcCU, uiAbsPartIdx );
177}
178
179// Split mode
180Void TEncEntropy::encodeSplitFlag( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth, Bool bRD )
181{
182  if( bRD )
183  {
184    uiAbsPartIdx = 0;
185  }
186  m_pcEntropyCoderIf->codeSplitFlag( pcCU, uiAbsPartIdx, uiDepth );
187}
188
189/** encode partition size
190 * \param pcCU
191 * \param uiAbsPartIdx
192 * \param uiDepth
193 * \param bRD
194 * \returns Void
195 */
196Void TEncEntropy::encodePartSize( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth, Bool bRD )
197{
198  if( bRD )
199  {
200    uiAbsPartIdx = 0;
201  }
202  m_pcEntropyCoderIf->codePartSize( pcCU, uiAbsPartIdx, uiDepth );
203}
204
205/** Encode I_PCM information.
206 * \param pcCU pointer to CU
207 * \param uiAbsPartIdx CU index
208 * \param bRD flag indicating estimation or encoding
209 * \returns Void
210 */
211Void TEncEntropy::encodeIPCMInfo( TComDataCU* pcCU, UInt uiAbsPartIdx, Bool bRD )
212{
213  if(!pcCU->getSlice()->getSPS()->getUsePCM()
214    || pcCU->getWidth(uiAbsPartIdx) > (1<<pcCU->getSlice()->getSPS()->getPCMLog2MaxSize())
215    || pcCU->getWidth(uiAbsPartIdx) < (1<<pcCU->getSlice()->getSPS()->getPCMLog2MinSize()))
216  {
217    return;
218  }
219 
220  if( bRD )
221  {
222    uiAbsPartIdx = 0;
223  }
224 
225  m_pcEntropyCoderIf->codeIPCMInfo ( pcCU, uiAbsPartIdx );
226}
227
228Void TEncEntropy::xEncodeTransform( TComDataCU* pcCU,UInt offsetLuma, UInt offsetChroma, UInt uiAbsPartIdx, UInt uiDepth, UInt width, UInt height, UInt uiTrIdx, Bool& bCodeDQP )
229{
230  const UInt uiSubdiv = pcCU->getTransformIdx( uiAbsPartIdx ) + pcCU->getDepth( uiAbsPartIdx ) > uiDepth;
231  const UInt uiLog2TrafoSize = g_aucConvertToBit[pcCU->getSlice()->getSPS()->getMaxCUWidth()]+2 - uiDepth;
232  UInt cbfY = pcCU->getCbf( uiAbsPartIdx, TEXT_LUMA    , uiTrIdx );
233  UInt cbfU = pcCU->getCbf( uiAbsPartIdx, TEXT_CHROMA_U, uiTrIdx );
234  UInt cbfV = pcCU->getCbf( uiAbsPartIdx, TEXT_CHROMA_V, uiTrIdx );
235
236  if(uiTrIdx==0)
237  {
238    m_bakAbsPartIdxCU = uiAbsPartIdx;
239  }
240  if( uiLog2TrafoSize == 2 )
241  {
242    UInt partNum = pcCU->getPic()->getNumPartInCU() >> ( ( uiDepth - 1 ) << 1 );
243    if( ( uiAbsPartIdx % partNum ) == 0 )
244    {
245      m_uiBakAbsPartIdx   = uiAbsPartIdx;
246      m_uiBakChromaOffset = offsetChroma;
247    }
248    else if( ( uiAbsPartIdx % partNum ) == (partNum - 1) )
249    {
250      cbfU = pcCU->getCbf( m_uiBakAbsPartIdx, TEXT_CHROMA_U, uiTrIdx );
251      cbfV = pcCU->getCbf( m_uiBakAbsPartIdx, TEXT_CHROMA_V, uiTrIdx );
252    }
253  }
254 
255  if( pcCU->getPredictionMode(uiAbsPartIdx) == MODE_INTRA && pcCU->getPartitionSize(uiAbsPartIdx) == SIZE_NxN && uiDepth == pcCU->getDepth(uiAbsPartIdx) )
256  {
257    assert( uiSubdiv );
258  }
259  else if( pcCU->getPredictionMode(uiAbsPartIdx) == MODE_INTER && (pcCU->getPartitionSize(uiAbsPartIdx) != SIZE_2Nx2N) && uiDepth == pcCU->getDepth(uiAbsPartIdx) &&  (pcCU->getSlice()->getSPS()->getQuadtreeTUMaxDepthInter() == 1) )
260  {
261    if ( uiLog2TrafoSize > pcCU->getQuadtreeTULog2MinSizeInCU(uiAbsPartIdx) )
262    {
263      assert( uiSubdiv );
264    }
265    else
266    {
267      assert(!uiSubdiv );
268    }
269  }
270  else if( uiLog2TrafoSize > pcCU->getSlice()->getSPS()->getQuadtreeTULog2MaxSize() )
271  {
272    assert( uiSubdiv );
273  }
274  else if( uiLog2TrafoSize == pcCU->getSlice()->getSPS()->getQuadtreeTULog2MinSize() )
275  {
276    assert( !uiSubdiv );
277  }
278  else if( uiLog2TrafoSize == pcCU->getQuadtreeTULog2MinSizeInCU(uiAbsPartIdx) )
279  {
280    assert( !uiSubdiv );
281  }
282  else
283  {
284    assert( uiLog2TrafoSize > pcCU->getQuadtreeTULog2MinSizeInCU(uiAbsPartIdx) );
285    m_pcEntropyCoderIf->codeTransformSubdivFlag( uiSubdiv, 5 - uiLog2TrafoSize );
286  }
287
288  const UInt uiTrDepthCurr = uiDepth - pcCU->getDepth( uiAbsPartIdx );
289  const Bool bFirstCbfOfCU = uiTrDepthCurr == 0;
290  if( bFirstCbfOfCU || uiLog2TrafoSize > 2 )
291  {
292    if( bFirstCbfOfCU || pcCU->getCbf( uiAbsPartIdx, TEXT_CHROMA_U, uiTrDepthCurr - 1 ) )
293    {
294      m_pcEntropyCoderIf->codeQtCbf( pcCU, uiAbsPartIdx, TEXT_CHROMA_U, uiTrDepthCurr );
295    }
296    if( bFirstCbfOfCU || pcCU->getCbf( uiAbsPartIdx, TEXT_CHROMA_V, uiTrDepthCurr - 1 ) )
297    {
298      m_pcEntropyCoderIf->codeQtCbf( pcCU, uiAbsPartIdx, TEXT_CHROMA_V, uiTrDepthCurr );
299    }
300  }
301  else if( uiLog2TrafoSize == 2 )
302  {
303    assert( pcCU->getCbf( uiAbsPartIdx, TEXT_CHROMA_U, uiTrDepthCurr ) == pcCU->getCbf( uiAbsPartIdx, TEXT_CHROMA_U, uiTrDepthCurr - 1 ) );
304    assert( pcCU->getCbf( uiAbsPartIdx, TEXT_CHROMA_V, uiTrDepthCurr ) == pcCU->getCbf( uiAbsPartIdx, TEXT_CHROMA_V, uiTrDepthCurr - 1 ) );
305  }
306 
307  if( uiSubdiv )
308  {
309    UInt size;
310    width  >>= 1;
311    height >>= 1;
312    size = width*height;
313    uiTrIdx++;
314    ++uiDepth;
315    const UInt partNum = pcCU->getPic()->getNumPartInCU() >> (uiDepth << 1);
316   
317    xEncodeTransform( pcCU, offsetLuma, offsetChroma, uiAbsPartIdx, uiDepth, width, height, uiTrIdx, bCodeDQP );
318
319    uiAbsPartIdx += partNum;  offsetLuma += size;  offsetChroma += (size>>2);
320    xEncodeTransform( pcCU, offsetLuma, offsetChroma, uiAbsPartIdx, uiDepth, width, height, uiTrIdx, bCodeDQP );
321
322    uiAbsPartIdx += partNum;  offsetLuma += size;  offsetChroma += (size>>2);
323    xEncodeTransform( pcCU, offsetLuma, offsetChroma, uiAbsPartIdx, uiDepth, width, height, uiTrIdx, bCodeDQP );
324
325    uiAbsPartIdx += partNum;  offsetLuma += size;  offsetChroma += (size>>2);
326    xEncodeTransform( pcCU, offsetLuma, offsetChroma, uiAbsPartIdx, uiDepth, width, height, uiTrIdx, bCodeDQP );
327  }
328  else
329  {
330    {
331      DTRACE_CABAC_VL( g_nSymbolCounter++ );
332      DTRACE_CABAC_T( "\tTrIdx: abspart=" );
333      DTRACE_CABAC_V( uiAbsPartIdx );
334      DTRACE_CABAC_T( "\tdepth=" );
335      DTRACE_CABAC_V( uiDepth );
336      DTRACE_CABAC_T( "\ttrdepth=" );
337      DTRACE_CABAC_V( pcCU->getTransformIdx( uiAbsPartIdx ) );
338      DTRACE_CABAC_T( "\n" );
339    }
340   
341    if( pcCU->getPredictionMode(uiAbsPartIdx) != MODE_INTRA && uiDepth == pcCU->getDepth( uiAbsPartIdx ) && !pcCU->getCbf( uiAbsPartIdx, TEXT_CHROMA_U, 0 ) && !pcCU->getCbf( uiAbsPartIdx, TEXT_CHROMA_V, 0 ) )
342    {
343      assert( pcCU->getCbf( uiAbsPartIdx, TEXT_LUMA, 0 ) );
344      //      printf( "saved one bin! " );
345    }
346    else
347    {
348      m_pcEntropyCoderIf->codeQtCbf( pcCU, uiAbsPartIdx, TEXT_LUMA, pcCU->getTransformIdx( uiAbsPartIdx ) );
349    }
350
351
352    if ( cbfY || cbfU || cbfV )
353    {
354      // dQP: only for LCU once
355      if ( pcCU->getSlice()->getPPS()->getUseDQP() )
356      {
357        if ( bCodeDQP )
358        {
359          encodeQP( pcCU, m_bakAbsPartIdxCU );
360          bCodeDQP = false;
361        }
362      }
363    }
364    if( cbfY )
365    {
366      Int trWidth = width;
367      Int trHeight = height;
368      m_pcEntropyCoderIf->codeCoeffNxN( pcCU, (pcCU->getCoeffY()+offsetLuma), uiAbsPartIdx, trWidth, trHeight, uiDepth, TEXT_LUMA );
369    }
370    if( uiLog2TrafoSize > 2 )
371    {
372      Int trWidth = width >> 1;
373      Int trHeight = height >> 1;
374      if( cbfU )
375      {
376        m_pcEntropyCoderIf->codeCoeffNxN( pcCU, (pcCU->getCoeffCb()+offsetChroma), uiAbsPartIdx, trWidth, trHeight, uiDepth, TEXT_CHROMA_U );
377      }
378      if( cbfV )
379      {
380        m_pcEntropyCoderIf->codeCoeffNxN( pcCU, (pcCU->getCoeffCr()+offsetChroma), uiAbsPartIdx, trWidth, trHeight, uiDepth, TEXT_CHROMA_V );
381      }
382    }
383    else
384    {
385      UInt partNum = pcCU->getPic()->getNumPartInCU() >> ( ( uiDepth - 1 ) << 1 );
386      if( ( uiAbsPartIdx % partNum ) == (partNum - 1) )
387      {
388        Int trWidth = width;
389        Int trHeight = height;
390        if( cbfU )
391        {
392          m_pcEntropyCoderIf->codeCoeffNxN( pcCU, (pcCU->getCoeffCb()+m_uiBakChromaOffset), m_uiBakAbsPartIdx, trWidth, trHeight, uiDepth, TEXT_CHROMA_U );
393        }
394        if( cbfV )
395        {
396          m_pcEntropyCoderIf->codeCoeffNxN( pcCU, (pcCU->getCoeffCr()+m_uiBakChromaOffset), m_uiBakAbsPartIdx, trWidth, trHeight, uiDepth, TEXT_CHROMA_V );
397        }
398      }
399    }
400  }
401}
402
403// Intra direction for Luma
404Void TEncEntropy::encodeIntraDirModeLuma  ( TComDataCU* pcCU, UInt absPartIdx, Bool isMultiplePU )
405{
406  m_pcEntropyCoderIf->codeIntraDirLumaAng( pcCU, absPartIdx , isMultiplePU);
407}
408
409// Intra direction for Chroma
410Void TEncEntropy::encodeIntraDirModeChroma( TComDataCU* pcCU, UInt uiAbsPartIdx, Bool bRD )
411{
412  if( bRD )
413  {
414    uiAbsPartIdx = 0;
415  }
416 
417  m_pcEntropyCoderIf->codeIntraDirChroma( pcCU, uiAbsPartIdx );
418}
419
420Void TEncEntropy::encodePredInfo( TComDataCU* pcCU, UInt uiAbsPartIdx, Bool bRD )
421{
422  if( bRD )
423  {
424    uiAbsPartIdx = 0;
425  }
426  if( pcCU->isIntra( uiAbsPartIdx ) )                                 // If it is Intra mode, encode intra prediction mode.
427  {
428    encodeIntraDirModeLuma  ( pcCU, uiAbsPartIdx,true );
429    encodeIntraDirModeChroma( pcCU, uiAbsPartIdx, bRD );
430  }
431  else                                                                // if it is Inter mode, encode motion vector and reference index
432  {
433    encodePUWise( pcCU, uiAbsPartIdx, bRD );
434  }
435}
436
437/** encode motion information for every PU block
438 * \param pcCU
439 * \param uiAbsPartIdx
440 * \param bRD
441 * \returns Void
442 */
443Void TEncEntropy::encodePUWise( TComDataCU* pcCU, UInt uiAbsPartIdx, Bool bRD )
444{
445  if ( bRD )
446  {
447    uiAbsPartIdx = 0;
448  }
449 
450  PartSize ePartSize = pcCU->getPartitionSize( uiAbsPartIdx );
451  UInt uiNumPU = ( ePartSize == SIZE_2Nx2N ? 1 : ( ePartSize == SIZE_NxN ? 4 : 2 ) );
452  UInt uiDepth = pcCU->getDepth( uiAbsPartIdx );
453  UInt uiPUOffset = ( g_auiPUOffset[UInt( ePartSize )] << ( ( pcCU->getSlice()->getSPS()->getMaxCUDepth() - uiDepth ) << 1 ) ) >> 4;
454
455  for ( UInt uiPartIdx = 0, uiSubPartIdx = uiAbsPartIdx; uiPartIdx < uiNumPU; uiPartIdx++, uiSubPartIdx += uiPUOffset )
456  {
457    encodeMergeFlag( pcCU, uiSubPartIdx );
458    if ( pcCU->getMergeFlag( uiSubPartIdx ) )
459    {
460      encodeMergeIndex( pcCU, uiSubPartIdx );
461    }
462    else
463    {
464      encodeInterDirPU( pcCU, uiSubPartIdx );
465      for ( UInt uiRefListIdx = 0; uiRefListIdx < 2; uiRefListIdx++ )
466      {
467        if ( pcCU->getSlice()->getNumRefIdx( RefPicList( uiRefListIdx ) ) > 0 )
468        {
469          encodeRefFrmIdxPU ( pcCU, uiSubPartIdx, RefPicList( uiRefListIdx ) );
470          encodeMvdPU       ( pcCU, uiSubPartIdx, RefPicList( uiRefListIdx ) );
471          encodeMVPIdxPU    ( pcCU, uiSubPartIdx, RefPicList( uiRefListIdx ) );
472        }
473      }
474    }
475  }
476
477  return;
478}
479
480Void TEncEntropy::encodeInterDirPU( TComDataCU* pcCU, UInt uiAbsPartIdx )
481{
482  if ( !pcCU->getSlice()->isInterB() )
483  {
484    return;
485  }
486
487  m_pcEntropyCoderIf->codeInterDir( pcCU, uiAbsPartIdx );
488  return;
489}
490
491/** encode reference frame index for a PU block
492 * \param pcCU
493 * \param uiAbsPartIdx
494 * \param eRefList
495 * \returns Void
496 */
497Void TEncEntropy::encodeRefFrmIdxPU( TComDataCU* pcCU, UInt uiAbsPartIdx, RefPicList eRefList )
498{
499  assert( !pcCU->isIntra( uiAbsPartIdx ) );
500  {
501    if ( ( pcCU->getSlice()->getNumRefIdx( eRefList ) == 1 ) )
502    {
503      return;
504    }
505
506    if ( pcCU->getInterDir( uiAbsPartIdx ) & ( 1 << eRefList ) )
507    {
508      m_pcEntropyCoderIf->codeRefFrmIdx( pcCU, uiAbsPartIdx, eRefList );
509    }
510  }
511
512  return;
513}
514
515/** encode motion vector difference for a PU block
516 * \param pcCU
517 * \param uiAbsPartIdx
518 * \param eRefList
519 * \returns Void
520 */
521Void TEncEntropy::encodeMvdPU( TComDataCU* pcCU, UInt uiAbsPartIdx, RefPicList eRefList )
522{
523  assert( !pcCU->isIntra( uiAbsPartIdx ) );
524
525  if ( pcCU->getInterDir( uiAbsPartIdx ) & ( 1 << eRefList ) )
526  {
527    m_pcEntropyCoderIf->codeMvd( pcCU, uiAbsPartIdx, eRefList );
528  }
529  return;
530}
531
532Void TEncEntropy::encodeMVPIdxPU( TComDataCU* pcCU, UInt uiAbsPartIdx, RefPicList eRefList )
533{
534  if ( (pcCU->getInterDir( uiAbsPartIdx ) & ( 1 << eRefList )) )
535  {
536    m_pcEntropyCoderIf->codeMVPIdx( pcCU, uiAbsPartIdx, eRefList );
537  }
538
539  return;
540}
541
542Void TEncEntropy::encodeQtCbf( TComDataCU* pcCU, UInt uiAbsPartIdx, TextType eType, UInt uiTrDepth )
543{
544  m_pcEntropyCoderIf->codeQtCbf( pcCU, uiAbsPartIdx, eType, uiTrDepth );
545}
546
547Void TEncEntropy::encodeTransformSubdivFlag( UInt uiSymbol, UInt uiCtx )
548{
549  m_pcEntropyCoderIf->codeTransformSubdivFlag( uiSymbol, uiCtx );
550}
551
552Void TEncEntropy::encodeQtRootCbf( TComDataCU* pcCU, UInt uiAbsPartIdx )
553{
554  m_pcEntropyCoderIf->codeQtRootCbf( pcCU, uiAbsPartIdx );
555}
556
557Void TEncEntropy::encodeQtCbfZero( TComDataCU* pcCU, TextType eType, UInt uiTrDepth )
558{
559  m_pcEntropyCoderIf->codeQtCbfZero( pcCU, eType, uiTrDepth );
560}
561Void TEncEntropy::encodeQtRootCbfZero( TComDataCU* pcCU )
562{
563  m_pcEntropyCoderIf->codeQtRootCbfZero( pcCU );
564}
565
566// dQP
567Void TEncEntropy::encodeQP( TComDataCU* pcCU, UInt uiAbsPartIdx, Bool bRD )
568{
569  if( bRD )
570  {
571    uiAbsPartIdx = 0;
572  }
573 
574  if ( pcCU->getSlice()->getPPS()->getUseDQP() )
575  {
576    m_pcEntropyCoderIf->codeDeltaQP( pcCU, uiAbsPartIdx );
577  }
578}
579
580
581// texture
582/** encode coefficients
583 * \param pcCU
584 * \param uiAbsPartIdx
585 * \param uiDepth
586 * \param uiWidth
587 * \param uiHeight
588 */
589Void TEncEntropy::encodeCoeff( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth, UInt uiWidth, UInt uiHeight, Bool& bCodeDQP )
590{
591  UInt uiMinCoeffSize = pcCU->getPic()->getMinCUWidth()*pcCU->getPic()->getMinCUHeight();
592  UInt uiLumaOffset   = uiMinCoeffSize*uiAbsPartIdx;
593  UInt uiChromaOffset = uiLumaOffset>>2;
594   
595  if( pcCU->isIntra(uiAbsPartIdx) )
596  {
597#if !H_MV
598    DTRACE_CABAC_VL( g_nSymbolCounter++ )
599    DTRACE_CABAC_T( "\tdecodeTransformIdx()\tCUDepth=" )
600    DTRACE_CABAC_V( uiDepth )
601    DTRACE_CABAC_T( "\n" )
602#endif
603  }
604  else
605  {
606    if( !(pcCU->getMergeFlag( uiAbsPartIdx ) && pcCU->getPartitionSize(uiAbsPartIdx) == SIZE_2Nx2N ) )
607    {
608      m_pcEntropyCoderIf->codeQtRootCbf( pcCU, uiAbsPartIdx );
609    }
610    if ( !pcCU->getQtRootCbf( uiAbsPartIdx ) )
611    {
612      return;
613    }
614  }
615 
616  xEncodeTransform( pcCU, uiLumaOffset, uiChromaOffset, uiAbsPartIdx, uiDepth, uiWidth, uiHeight, 0, bCodeDQP);
617}
618
619Void TEncEntropy::encodeCoeffNxN( TComDataCU* pcCU, TCoeff* pcCoeff, UInt uiAbsPartIdx, UInt uiTrWidth, UInt uiTrHeight, UInt uiDepth, TextType eType )
620{
621  // This is for Transform unit processing. This may be used at mode selection stage for Inter.
622  m_pcEntropyCoderIf->codeCoeffNxN( pcCU, pcCoeff, uiAbsPartIdx, uiTrWidth, uiTrHeight, uiDepth, eType );
623}
624
625Void TEncEntropy::estimateBit (estBitsSbacStruct* pcEstBitsSbac, Int width, Int height, TextType eTType)
626{ 
627  eTType = eTType == TEXT_LUMA ? TEXT_LUMA : TEXT_CHROMA;
628 
629  m_pcEntropyCoderIf->estBit ( pcEstBitsSbac, width, height, eTType );
630}
631
632/** Encode SAO Offset
633 * \param  saoLcuParam SAO LCU paramters
634 */
635Void TEncEntropy::encodeSaoOffset(SaoLcuParam* saoLcuParam, UInt compIdx)
636{
637  UInt uiSymbol;
638  Int i;
639
640  uiSymbol = saoLcuParam->typeIdx + 1;
641  if (compIdx!=2)
642  {
643    m_pcEntropyCoderIf->codeSaoTypeIdx(uiSymbol);
644  }
645  if (uiSymbol)
646  {
647    if (saoLcuParam->typeIdx < 4 && compIdx != 2)
648    {
649      saoLcuParam->subTypeIdx = saoLcuParam->typeIdx;
650    }
651    Int bitDepth = compIdx ? g_bitDepthC : g_bitDepthY;
652    Int offsetTh = 1 << min(bitDepth - 5,5);
653    if( saoLcuParam->typeIdx == SAO_BO )
654    {
655      for( i=0; i< saoLcuParam->length; i++)
656      {
657        UInt absOffset = ( (saoLcuParam->offset[i] < 0) ? -saoLcuParam->offset[i] : saoLcuParam->offset[i]);
658        m_pcEntropyCoderIf->codeSaoMaxUvlc(absOffset, offsetTh-1);
659      } 
660      for( i=0; i< saoLcuParam->length; i++)
661      {
662        if (saoLcuParam->offset[i] != 0)
663        {
664          UInt sign = (saoLcuParam->offset[i] < 0) ? 1 : 0 ;
665          m_pcEntropyCoderIf->codeSAOSign(sign);
666        }
667      }
668      uiSymbol = (UInt) (saoLcuParam->subTypeIdx);
669      m_pcEntropyCoderIf->codeSaoUflc(5, uiSymbol);
670    }
671    else if( saoLcuParam->typeIdx < 4 )
672    {
673      m_pcEntropyCoderIf->codeSaoMaxUvlc( saoLcuParam->offset[0], offsetTh-1);
674      m_pcEntropyCoderIf->codeSaoMaxUvlc( saoLcuParam->offset[1], offsetTh-1);
675      m_pcEntropyCoderIf->codeSaoMaxUvlc(-saoLcuParam->offset[2], offsetTh-1);
676      m_pcEntropyCoderIf->codeSaoMaxUvlc(-saoLcuParam->offset[3], offsetTh-1);
677      if (compIdx!=2)
678      {
679        uiSymbol = (UInt) (saoLcuParam->subTypeIdx);
680        m_pcEntropyCoderIf->codeSaoUflc(2, uiSymbol);
681      }
682    }
683  }
684}
685
686/** Encode SAO unit interleaving
687* \param  rx
688* \param  ry
689* \param  pSaoParam
690* \param  pcCU
691* \param  iCUAddrInSlice
692* \param  iCUAddrUpInSlice
693* \param  bLFCrossSliceBoundaryFlag
694 */
695Void TEncEntropy::encodeSaoUnitInterleaving(Int compIdx, Bool saoFlag, Int rx, Int ry, SaoLcuParam* saoLcuParam, Int cuAddrInSlice, Int cuAddrUpInSlice, Int allowMergeLeft, Int allowMergeUp)
696{
697  if (saoFlag)
698  {
699    if (rx>0 && cuAddrInSlice!=0 && allowMergeLeft)
700    {
701      m_pcEntropyCoderIf->codeSaoMerge(saoLcuParam->mergeLeftFlag);
702    }
703    else
704    {
705      saoLcuParam->mergeLeftFlag = 0;
706    }
707    if (saoLcuParam->mergeLeftFlag == 0)
708    {
709      if ( (ry > 0) && (cuAddrUpInSlice>=0) && allowMergeUp )
710      {
711        m_pcEntropyCoderIf->codeSaoMerge(saoLcuParam->mergeUpFlag);
712      }
713      else
714      {
715        saoLcuParam->mergeUpFlag = 0;
716      }
717      if (!saoLcuParam->mergeUpFlag)
718      {
719        encodeSaoOffset(saoLcuParam, compIdx);
720      }
721    }
722  }
723}
724
725Int TEncEntropy::countNonZeroCoeffs( TCoeff* pcCoef, UInt uiSize )
726{
727  Int count = 0;
728 
729  for ( Int i = 0; i < uiSize; i++ )
730  {
731    count += pcCoef[i] != 0;
732  }
733 
734  return count;
735}
736
737/** encode quantization matrix
738 * \param scalingList quantization matrix information
739 */
740Void TEncEntropy::encodeScalingList( TComScalingList* scalingList )
741{
742  m_pcEntropyCoderIf->codeScalingList( scalingList );
743}
744
745//! \}
Note: See TracBrowser for help on using the repository browser.