source: SHVCSoftware/branches/0.1.1-bugfix/source/Lib/TLibDecoder/TDecEntropy.cpp @ 1606

Last change on this file since 1606 was 2, checked in by seregin, 12 years ago

Initial import by Vadim Seregin <vseregin@…>

File size: 23.0 KB
Line 
1/* The copyright in this software is being made available under the BSD
2 * License, included below. This software may be subject to other third party
3 * and contributor rights, including patent rights, and no such rights are
4 * granted under this license. 
5 *
6 * Copyright (c) 2010-2012, ITU/ISO/IEC
7 * All rights reserved.
8 *
9 * Redistribution and use in source and binary forms, with or without
10 * modification, are permitted provided that the following conditions are met:
11 *
12 *  * Redistributions of source code must retain the above copyright notice,
13 *    this list of conditions and the following disclaimer.
14 *  * Redistributions in binary form must reproduce the above copyright notice,
15 *    this list of conditions and the following disclaimer in the documentation
16 *    and/or other materials provided with the distribution.
17 *  * Neither the name of the ITU/ISO/IEC nor the names of its contributors may
18 *    be used to endorse or promote products derived from this software without
19 *    specific prior written permission.
20 *
21 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
22 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS
25 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
26 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
27 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
28 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
29 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
30 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
31 * THE POSSIBILITY OF SUCH DAMAGE.
32 */
33
34/** \file     TDecEntropy.cpp
35    \brief    entropy decoder class
36*/
37
38#include "TDecEntropy.h"
39
40//! \ingroup TLibDecoder
41//! \{
42
43Void TDecEntropy::setEntropyDecoder         ( TDecEntropyIf* p )
44{
45  m_pcEntropyDecoderIf = p;
46}
47
48#include "TLibCommon/TComAdaptiveLoopFilter.h"
49#include "TLibCommon/TComSampleAdaptiveOffset.h"
50
51Void TDecEntropy::decodeSkipFlag( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth )
52{
53  m_pcEntropyDecoderIf->parseSkipFlag( pcCU, uiAbsPartIdx, uiDepth );
54}
55
56Void TDecEntropy::decodeCUTransquantBypassFlag(TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth )
57{
58  m_pcEntropyDecoderIf->parseCUTransquantBypassFlag( pcCU, uiAbsPartIdx, uiDepth );
59}
60
61#if INTRA_BL
62Void TDecEntropy::decodeIntraBLFlag( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiPartIdx, UInt uiDepth )
63{
64  m_pcEntropyDecoderIf->parseIntraBLFlag( pcCU, uiAbsPartIdx, uiPartIdx, uiDepth );
65}
66#endif
67
68/** decode merge flag
69 * \param pcSubCU
70 * \param uiAbsPartIdx
71 * \param uiDepth
72 * \param uiPUIdx
73 * \returns Void
74 */
75Void TDecEntropy::decodeMergeFlag( TComDataCU* pcSubCU, UInt uiAbsPartIdx, UInt uiDepth, UInt uiPUIdx )
76{ 
77  // at least one merge candidate exists
78  m_pcEntropyDecoderIf->parseMergeFlag( pcSubCU, uiAbsPartIdx, uiDepth, uiPUIdx );
79}
80
81/** decode merge index
82 * \param pcCU
83 * \param uiPartIdx
84 * \param uiAbsPartIdx
85 * \param puhInterDirNeighbours pointer to list of inter direction from the casual neighbours
86 * \param pcMvFieldNeighbours pointer to list of motion vector field from the casual neighbours
87 * \param uiDepth
88 * \returns Void
89 */
90Void TDecEntropy::decodeMergeIndex( TComDataCU* pcCU, UInt uiPartIdx, UInt uiAbsPartIdx, PartSize eCUMode, UChar* puhInterDirNeighbours, TComMvField* pcMvFieldNeighbours, UInt uiDepth )
91{
92  UInt uiMergeIndex = 0;
93  m_pcEntropyDecoderIf->parseMergeIndex( pcCU, uiMergeIndex, uiAbsPartIdx, uiDepth );
94  pcCU->setMergeIndexSubParts( uiMergeIndex, uiAbsPartIdx, uiPartIdx, uiDepth );
95}
96
97Void TDecEntropy::decodeSplitFlag   ( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth )
98{
99  m_pcEntropyDecoderIf->parseSplitFlag( pcCU, uiAbsPartIdx, uiDepth );
100}
101
102Void TDecEntropy::decodePredMode( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth )
103{
104  m_pcEntropyDecoderIf->parsePredMode( pcCU, uiAbsPartIdx, uiDepth );
105}
106
107Void TDecEntropy::decodePartSize( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth )
108{
109  m_pcEntropyDecoderIf->parsePartSize( pcCU, uiAbsPartIdx, uiDepth );
110}
111
112Void TDecEntropy::decodePredInfo    ( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth, TComDataCU* pcSubCU )
113{
114#if INTRA_BL
115  if( pcCU->isIntraBL( uiAbsPartIdx ) )                                 // Do nothing for Intra BL mode.
116  {
117    return;
118  }
119#endif
120  if( pcCU->isIntra( uiAbsPartIdx ) )                                 // If it is Intra mode, encode intra prediction mode.
121  {
122    decodeIntraDirModeLuma  ( pcCU, uiAbsPartIdx, uiDepth );
123    decodeIntraDirModeChroma( pcCU, uiAbsPartIdx, uiDepth );
124  }
125  else                                                                // if it is Inter mode, encode motion vector and reference index
126  {
127    decodePUWise( pcCU, uiAbsPartIdx, uiDepth, pcSubCU );
128  }
129}
130
131/** Parse I_PCM information.
132 * \param pcCU  pointer to CUpointer to CU
133 * \param uiAbsPartIdx CU index
134 * \param uiDepth CU depth
135 * \returns Void
136 */
137Void TDecEntropy::decodeIPCMInfo( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth )
138{
139  if(!pcCU->getSlice()->getSPS()->getUsePCM()
140    || pcCU->getWidth(uiAbsPartIdx) > (1<<pcCU->getSlice()->getSPS()->getPCMLog2MaxSize())
141    || pcCU->getWidth(uiAbsPartIdx) < (1<<pcCU->getSlice()->getSPS()->getPCMLog2MinSize()) )
142  {
143    return;
144  }
145 
146  m_pcEntropyDecoderIf->parseIPCMInfo( pcCU, uiAbsPartIdx, uiDepth );
147}
148
149Void TDecEntropy::decodeIntraDirModeLuma  ( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth )
150{
151  m_pcEntropyDecoderIf->parseIntraDirLumaAng( pcCU, uiAbsPartIdx, uiDepth );
152}
153
154Void TDecEntropy::decodeIntraDirModeChroma( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth )
155{
156  m_pcEntropyDecoderIf->parseIntraDirChroma( pcCU, uiAbsPartIdx, uiDepth );
157}
158
159/** decode motion information for every PU block.
160 * \param pcCU
161 * \param uiAbsPartIdx
162 * \param uiDepth
163 * \param pcSubCU
164 * \returns Void
165 */
166Void TDecEntropy::decodePUWise( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth, TComDataCU* pcSubCU )
167{
168  PartSize ePartSize = pcCU->getPartitionSize( uiAbsPartIdx );
169  UInt uiNumPU = ( ePartSize == SIZE_2Nx2N ? 1 : ( ePartSize == SIZE_NxN ? 4 : 2 ) );
170  UInt uiPUOffset = ( g_auiPUOffset[UInt( ePartSize )] << ( ( pcCU->getSlice()->getSPS()->getMaxCUDepth() - uiDepth ) << 1 ) ) >> 4;
171
172  TComMvField cMvFieldNeighbours[MRG_MAX_NUM_CANDS << 1]; // double length for mv of both lists
173  UChar uhInterDirNeighbours[MRG_MAX_NUM_CANDS];
174
175  for ( UInt ui = 0; ui < pcCU->getSlice()->getMaxNumMergeCand(); ui++ )
176  {
177    uhInterDirNeighbours[ui] = 0;
178  }
179  Int numValidMergeCand = 0;
180  bool isMerged = false;
181
182  pcSubCU->copyInterPredInfoFrom( pcCU, uiAbsPartIdx, REF_PIC_LIST_0 );
183  pcSubCU->copyInterPredInfoFrom( pcCU, uiAbsPartIdx, REF_PIC_LIST_1 );
184  for ( UInt uiPartIdx = 0, uiSubPartIdx = uiAbsPartIdx; uiPartIdx < uiNumPU; uiPartIdx++, uiSubPartIdx += uiPUOffset )
185  {
186    decodeMergeFlag( pcCU, uiSubPartIdx, uiDepth, uiPartIdx );
187    if ( pcCU->getMergeFlag( uiSubPartIdx ) )
188    {
189      decodeMergeIndex( pcCU, uiPartIdx, uiSubPartIdx, ePartSize, uhInterDirNeighbours, cMvFieldNeighbours, uiDepth );
190      UInt uiMergeIndex = pcCU->getMergeIndex(uiSubPartIdx);
191#if REF_IDX_FRAMEWORK  // HM bug fix
192      if(uiPartIdx)
193      {
194        for(UInt ui=0; ui<uiMergeIndex+1; ui++)
195        {
196          cMvFieldNeighbours[(ui<<1)].setMvField(TComMv(), NOT_VALID);
197          cMvFieldNeighbours[(ui<<1)+1].setMvField(TComMv(), NOT_VALID);
198        }
199      }
200#endif
201      if ( pcCU->getSlice()->getPPS()->getLog2ParallelMergeLevelMinus2() && ePartSize != SIZE_2Nx2N && pcSubCU->getWidth( 0 ) <= 8 ) 
202      {
203        pcSubCU->setPartSizeSubParts( SIZE_2Nx2N, 0, uiDepth );
204        if ( !isMerged )
205        {
206          pcSubCU->getInterMergeCandidates( 0, 0, uiDepth, cMvFieldNeighbours, uhInterDirNeighbours, numValidMergeCand );
207          isMerged = true;
208        }
209        pcSubCU->setPartSizeSubParts( ePartSize, 0, uiDepth );
210      }
211      else
212      {
213        uiMergeIndex = pcCU->getMergeIndex(uiSubPartIdx);
214        pcSubCU->getInterMergeCandidates( uiSubPartIdx-uiAbsPartIdx, uiPartIdx, uiDepth, cMvFieldNeighbours, uhInterDirNeighbours, numValidMergeCand, uiMergeIndex );
215      }
216      pcCU->setInterDirSubParts( uhInterDirNeighbours[uiMergeIndex], uiSubPartIdx, uiPartIdx, uiDepth );
217
218      TComMv cTmpMv( 0, 0 );
219      for ( UInt uiRefListIdx = 0; uiRefListIdx < 2; uiRefListIdx++ )
220      {       
221        if ( pcCU->getSlice()->getNumRefIdx( RefPicList( uiRefListIdx ) ) > 0 )
222        {
223          pcCU->setMVPIdxSubParts( 0, RefPicList( uiRefListIdx ), uiSubPartIdx, uiPartIdx, uiDepth);
224          pcCU->setMVPNumSubParts( 0, RefPicList( uiRefListIdx ), uiSubPartIdx, uiPartIdx, uiDepth);
225          pcCU->getCUMvField( RefPicList( uiRefListIdx ) )->setAllMvd( cTmpMv, ePartSize, uiSubPartIdx, uiDepth, uiPartIdx );
226          pcCU->getCUMvField( RefPicList( uiRefListIdx ) )->setAllMvField( cMvFieldNeighbours[ 2*uiMergeIndex + uiRefListIdx ], ePartSize, uiSubPartIdx, uiDepth, uiPartIdx );
227        }
228      }
229    }
230    else
231    {
232      decodeInterDirPU( pcCU, uiSubPartIdx, uiDepth, uiPartIdx );
233      for ( UInt uiRefListIdx = 0; uiRefListIdx < 2; uiRefListIdx++ )
234      {       
235        if ( pcCU->getSlice()->getNumRefIdx( RefPicList( uiRefListIdx ) ) > 0 )
236        {
237          decodeRefFrmIdxPU( pcCU,    uiSubPartIdx,              uiDepth, uiPartIdx, RefPicList( uiRefListIdx ) );
238          decodeMvdPU      ( pcCU,    uiSubPartIdx,              uiDepth, uiPartIdx, RefPicList( uiRefListIdx ) );
239          decodeMVPIdxPU   ( pcSubCU, uiSubPartIdx-uiAbsPartIdx, uiDepth, uiPartIdx, RefPicList( uiRefListIdx ) );
240        }
241      }
242    }
243    if ( (pcCU->getInterDir(uiSubPartIdx) == 3) && pcSubCU->isBipredRestriction(uiPartIdx) )
244    {
245      pcCU->getCUMvField( REF_PIC_LIST_1 )->setAllMv( TComMv(0,0), ePartSize, uiSubPartIdx, uiDepth, uiPartIdx);
246      pcCU->getCUMvField( REF_PIC_LIST_1 )->setAllRefIdx( -1, ePartSize, uiSubPartIdx, uiDepth, uiPartIdx);
247      pcCU->setInterDirSubParts( 1, uiSubPartIdx, uiPartIdx, uiDepth);
248    }
249  }
250  return;
251}
252
253/** decode inter direction for a PU block
254 * \param pcCU
255 * \param uiAbsPartIdx
256 * \param uiDepth
257 * \param uiPartIdx
258 * \returns Void
259 */
260Void TDecEntropy::decodeInterDirPU( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth, UInt uiPartIdx )
261{
262  UInt uiInterDir;
263
264  if ( pcCU->getSlice()->isInterP() )
265  {
266    uiInterDir = 1;
267  }
268  else
269  {
270    m_pcEntropyDecoderIf->parseInterDir( pcCU, uiInterDir, uiAbsPartIdx, uiDepth );
271  }
272
273  pcCU->setInterDirSubParts( uiInterDir, uiAbsPartIdx, uiPartIdx, uiDepth );
274}
275
276Void TDecEntropy::decodeRefFrmIdxPU( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth, UInt uiPartIdx, RefPicList eRefList )
277{
278  Int iRefFrmIdx = 0;
279  Int iParseRefFrmIdx = pcCU->getInterDir( uiAbsPartIdx ) & ( 1 << eRefList );
280
281  if ( pcCU->getSlice()->getNumRefIdx( eRefList ) > 1 && iParseRefFrmIdx )
282  {
283    m_pcEntropyDecoderIf->parseRefFrmIdx( pcCU, iRefFrmIdx, uiAbsPartIdx, uiDepth, eRefList );
284  }
285  else if ( !iParseRefFrmIdx )
286  {
287    iRefFrmIdx = NOT_VALID;
288  }
289  else
290  {
291    iRefFrmIdx = 0;
292  }
293
294  PartSize ePartSize = pcCU->getPartitionSize( uiAbsPartIdx );
295  pcCU->getCUMvField( eRefList )->setAllRefIdx( iRefFrmIdx, ePartSize, uiAbsPartIdx, uiDepth, uiPartIdx );
296}
297
298/** decode motion vector difference for a PU block
299 * \param pcCU
300 * \param uiAbsPartIdx
301 * \param uiDepth
302 * \param uiPartIdx
303 * \param eRefList
304 * \returns Void
305 */
306Void TDecEntropy::decodeMvdPU( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth, UInt uiPartIdx, RefPicList eRefList )
307{
308  if ( pcCU->getInterDir( uiAbsPartIdx ) & ( 1 << eRefList ) )
309  {
310    m_pcEntropyDecoderIf->parseMvd( pcCU, uiAbsPartIdx, uiPartIdx, uiDepth, eRefList );
311  }
312}
313
314Void TDecEntropy::decodeMVPIdxPU( TComDataCU* pcSubCU, UInt uiPartAddr, UInt uiDepth, UInt uiPartIdx, RefPicList eRefList )
315{
316  Int iMVPIdx = -1;
317
318  TComMv cZeroMv( 0, 0 );
319  TComMv cMv     = cZeroMv;
320  Int    iRefIdx = -1;
321
322  TComCUMvField* pcSubCUMvField = pcSubCU->getCUMvField( eRefList );
323  AMVPInfo* pAMVPInfo = pcSubCUMvField->getAMVPInfo();
324
325  iRefIdx = pcSubCUMvField->getRefIdx(uiPartAddr);
326  cMv = cZeroMv;
327
328#if !SPS_AMVP_CLEANUP
329  if ( (pcSubCU->getInterDir(uiPartAddr) & ( 1 << eRefList )) && (pcSubCU->getAMVPMode(uiPartAddr) == AM_EXPL) )
330#else
331  if ( (pcSubCU->getInterDir(uiPartAddr) & ( 1 << eRefList )) )
332#endif
333  {
334    m_pcEntropyDecoderIf->parseMVPIdx( iMVPIdx );
335  }
336  pcSubCU->fillMvpCand(uiPartIdx, uiPartAddr, eRefList, iRefIdx, pAMVPInfo);
337  pcSubCU->setMVPNumSubParts(pAMVPInfo->iN, eRefList, uiPartAddr, uiPartIdx, uiDepth);
338  pcSubCU->setMVPIdxSubParts( iMVPIdx, eRefList, uiPartAddr, uiPartIdx, uiDepth );
339  if ( iRefIdx >= 0 )
340  {
341    m_pcPrediction->getMvPredAMVP( pcSubCU, uiPartIdx, uiPartAddr, eRefList, iRefIdx, cMv);
342    cMv += pcSubCUMvField->getMvd( uiPartAddr );
343  }
344
345  PartSize ePartSize = pcSubCU->getPartitionSize( uiPartAddr );
346  pcSubCU->getCUMvField( eRefList )->setAllMv(cMv, ePartSize, uiPartAddr, 0, uiPartIdx);
347}
348
349Void TDecEntropy::xDecodeTransform( TComDataCU* pcCU, UInt offsetLuma, UInt offsetChroma, UInt uiAbsPartIdx, UInt absTUPartIdx, UInt uiDepth, UInt width, UInt height, UInt uiTrIdx, UInt uiInnerQuadIdx, Bool& bCodeDQP)
350{
351  UInt uiSubdiv;
352  const UInt uiLog2TrafoSize = g_aucConvertToBit[pcCU->getSlice()->getSPS()->getMaxCUWidth()]+2 - uiDepth;
353
354  if(uiTrIdx==0)
355  {
356    m_bakAbsPartIdxCU = uiAbsPartIdx;
357  }
358  if( uiLog2TrafoSize == 2 )
359  {
360    UInt partNum = pcCU->getPic()->getNumPartInCU() >> ( ( uiDepth - 1 ) << 1 );
361    if( ( uiAbsPartIdx % partNum ) == 0 )
362    {
363      m_uiBakAbsPartIdx   = uiAbsPartIdx;
364      m_uiBakChromaOffset = offsetChroma;
365    }
366  }
367  if( pcCU->getPredictionMode(uiAbsPartIdx) == MODE_INTRA && pcCU->getPartitionSize(uiAbsPartIdx) == SIZE_NxN && uiDepth == pcCU->getDepth(uiAbsPartIdx) )
368  {
369    uiSubdiv = 1;
370  }
371  else if( (pcCU->getSlice()->getSPS()->getQuadtreeTUMaxDepthInter() == 1) && (pcCU->getPredictionMode(uiAbsPartIdx) == MODE_INTER) && ( pcCU->getPartitionSize(uiAbsPartIdx) != SIZE_2Nx2N ) && (uiDepth == pcCU->getDepth(uiAbsPartIdx)) )
372  {
373    uiSubdiv = (uiLog2TrafoSize > pcCU->getQuadtreeTULog2MinSizeInCU(uiAbsPartIdx));
374  }
375  else if( uiLog2TrafoSize > pcCU->getSlice()->getSPS()->getQuadtreeTULog2MaxSize() )
376  {
377    uiSubdiv = 1;
378  }
379  else if( uiLog2TrafoSize == pcCU->getSlice()->getSPS()->getQuadtreeTULog2MinSize() )
380  {
381    uiSubdiv = 0;
382  }
383  else if( uiLog2TrafoSize == pcCU->getQuadtreeTULog2MinSizeInCU(uiAbsPartIdx) )
384  {
385    uiSubdiv = 0;
386  }
387  else
388  {
389    assert( uiLog2TrafoSize > pcCU->getQuadtreeTULog2MinSizeInCU(uiAbsPartIdx) );
390#if TRANS_SPLIT_FLAG_CTX_REDUCTION
391    m_pcEntropyDecoderIf->parseTransformSubdivFlag( uiSubdiv, 5 - uiLog2TrafoSize );
392#else
393    m_pcEntropyDecoderIf->parseTransformSubdivFlag( uiSubdiv, uiDepth );
394#endif
395  }
396 
397  const UInt uiTrDepth = uiDepth - pcCU->getDepth( uiAbsPartIdx );
398  {
399    const Bool bFirstCbfOfCU = uiTrDepth == 0;
400    if( bFirstCbfOfCU )
401    {
402      pcCU->setCbfSubParts( 0, TEXT_CHROMA_U, uiAbsPartIdx, uiDepth );
403      pcCU->setCbfSubParts( 0, TEXT_CHROMA_V, uiAbsPartIdx, uiDepth );
404    }
405    if( bFirstCbfOfCU || uiLog2TrafoSize > 2 )
406    {
407      if( bFirstCbfOfCU || pcCU->getCbf( uiAbsPartIdx, TEXT_CHROMA_U, uiTrDepth - 1 ) )
408      {
409        m_pcEntropyDecoderIf->parseQtCbf( pcCU, uiAbsPartIdx, TEXT_CHROMA_U, uiTrDepth, uiDepth );
410      }
411      if( bFirstCbfOfCU || pcCU->getCbf( uiAbsPartIdx, TEXT_CHROMA_V, uiTrDepth - 1 ) )
412      {
413        m_pcEntropyDecoderIf->parseQtCbf( pcCU, uiAbsPartIdx, TEXT_CHROMA_V, uiTrDepth, uiDepth );
414      }
415    }
416    else
417    {
418      pcCU->setCbfSubParts( pcCU->getCbf( uiAbsPartIdx, TEXT_CHROMA_U, uiTrDepth - 1 ) << uiTrDepth, TEXT_CHROMA_U, uiAbsPartIdx, uiDepth );
419      pcCU->setCbfSubParts( pcCU->getCbf( uiAbsPartIdx, TEXT_CHROMA_V, uiTrDepth - 1 ) << uiTrDepth, TEXT_CHROMA_V, uiAbsPartIdx, uiDepth );
420    }
421  }
422 
423  if( uiSubdiv )
424  {
425    UInt size;
426    width  >>= 1;
427    height >>= 1;
428    size = width*height;
429    uiTrIdx++;
430    ++uiDepth;
431    const UInt uiQPartNum = pcCU->getPic()->getNumPartInCU() >> (uiDepth << 1);
432    const UInt uiStartAbsPartIdx = uiAbsPartIdx;
433    UInt uiLumaTrMode, uiChromaTrMode;
434    pcCU->convertTransIdx( uiStartAbsPartIdx, uiTrDepth+1, uiLumaTrMode, uiChromaTrMode );
435    UInt uiYCbf = 0;
436    UInt uiUCbf = 0;
437    UInt uiVCbf = 0;
438   
439    for( Int i = 0; i < 4; i++ )
440    {
441#if REMOVE_NSQT
442      UInt nsAddr = uiAbsPartIdx;
443#else
444      UInt nsAddr = 0;
445      nsAddr = pcCU->getNSAbsPartIdx( uiLog2TrafoSize-1, uiAbsPartIdx, absTUPartIdx, i, uiTrDepth+1 );
446#endif
447      xDecodeTransform( pcCU, offsetLuma, offsetChroma, uiAbsPartIdx, nsAddr, uiDepth, width, height, uiTrIdx, i, bCodeDQP );
448      uiYCbf |= pcCU->getCbf( uiAbsPartIdx, TEXT_LUMA, uiLumaTrMode );
449      uiUCbf |= pcCU->getCbf( uiAbsPartIdx, TEXT_CHROMA_U, uiChromaTrMode );
450      uiVCbf |= pcCU->getCbf( uiAbsPartIdx, TEXT_CHROMA_V, uiChromaTrMode );
451      uiAbsPartIdx += uiQPartNum;
452      offsetLuma += size;  offsetChroma += (size>>2);
453    }
454   
455    pcCU->convertTransIdx( uiStartAbsPartIdx, uiTrDepth, uiLumaTrMode, uiChromaTrMode );
456    for( UInt ui = 0; ui < 4 * uiQPartNum; ++ui )
457    {
458      pcCU->getCbf( TEXT_LUMA     )[uiStartAbsPartIdx + ui] |= uiYCbf << uiLumaTrMode;
459      pcCU->getCbf( TEXT_CHROMA_U )[uiStartAbsPartIdx + ui] |= uiUCbf << uiChromaTrMode;
460      pcCU->getCbf( TEXT_CHROMA_V )[uiStartAbsPartIdx + ui] |= uiVCbf << uiChromaTrMode;
461    }
462  }
463  else
464  {
465    assert( uiDepth >= pcCU->getDepth( uiAbsPartIdx ) );
466    pcCU->setTrIdxSubParts( uiTrDepth, uiAbsPartIdx, uiDepth );
467   
468    {
469      DTRACE_CABAC_VL( g_nSymbolCounter++ );
470      DTRACE_CABAC_T( "\tTrIdx: abspart=" );
471      DTRACE_CABAC_V( uiAbsPartIdx );
472      DTRACE_CABAC_T( "\tdepth=" );
473      DTRACE_CABAC_V( uiDepth );
474      DTRACE_CABAC_T( "\ttrdepth=" );
475      DTRACE_CABAC_V( uiTrDepth );
476      DTRACE_CABAC_T( "\n" );
477    }
478   
479    UInt uiLumaTrMode, uiChromaTrMode;
480    pcCU->convertTransIdx( uiAbsPartIdx, uiTrDepth, uiLumaTrMode, uiChromaTrMode );
481#if !REMOVE_NSQT
482    if(pcCU->getPredictionMode( uiAbsPartIdx ) == MODE_INTER && pcCU->useNonSquarePU( uiAbsPartIdx ) )
483    {
484      pcCU->setNSQTIdxSubParts( uiLog2TrafoSize, uiAbsPartIdx, absTUPartIdx, uiLumaTrMode );
485    }
486#endif
487    pcCU->setCbfSubParts ( 0, TEXT_LUMA, uiAbsPartIdx, uiDepth );
488#if INTRA_BL
489    if( ( !pcCU->isIntra(uiAbsPartIdx) ) && uiDepth == pcCU->getDepth( uiAbsPartIdx ) && !pcCU->getCbf( uiAbsPartIdx, TEXT_CHROMA_U, 0 ) && !pcCU->getCbf( uiAbsPartIdx, TEXT_CHROMA_V, 0 ) )
490#else
491    if( pcCU->getPredictionMode(uiAbsPartIdx) != MODE_INTRA && uiDepth == pcCU->getDepth( uiAbsPartIdx ) && !pcCU->getCbf( uiAbsPartIdx, TEXT_CHROMA_U, 0 ) && !pcCU->getCbf( uiAbsPartIdx, TEXT_CHROMA_V, 0 ) )
492#endif
493    {
494      pcCU->setCbfSubParts( 1 << uiLumaTrMode, TEXT_LUMA, uiAbsPartIdx, uiDepth );
495    }
496    else
497    {
498      m_pcEntropyDecoderIf->parseQtCbf( pcCU, uiAbsPartIdx, TEXT_LUMA, uiLumaTrMode, uiDepth );
499    }
500
501
502    // transform_unit begin
503    UInt cbfY = pcCU->getCbf( uiAbsPartIdx, TEXT_LUMA    , uiTrIdx );
504    UInt cbfU = pcCU->getCbf( uiAbsPartIdx, TEXT_CHROMA_U, uiTrIdx );
505    UInt cbfV = pcCU->getCbf( uiAbsPartIdx, TEXT_CHROMA_V, uiTrIdx );
506    if( uiLog2TrafoSize == 2 )
507    {
508      UInt partNum = pcCU->getPic()->getNumPartInCU() >> ( ( uiDepth - 1 ) << 1 );
509      if( ( uiAbsPartIdx % partNum ) == (partNum - 1) )
510      {
511        cbfU = pcCU->getCbf( m_uiBakAbsPartIdx, TEXT_CHROMA_U, uiTrIdx );
512        cbfV = pcCU->getCbf( m_uiBakAbsPartIdx, TEXT_CHROMA_V, uiTrIdx );
513      }
514    }
515    if ( cbfY || cbfU || cbfV )
516    {
517      // dQP: only for LCU
518      if ( pcCU->getSlice()->getPPS()->getUseDQP() )
519      {
520        if ( bCodeDQP )
521        {
522          decodeQP( pcCU, m_bakAbsPartIdxCU);
523          bCodeDQP = false;
524        }
525      }
526    }
527    if( cbfY )
528    {
529      Int trWidth = width;
530      Int trHeight = height;
531#if !REMOVE_NSQT
532      pcCU->getNSQTSize( uiTrIdx, uiAbsPartIdx, trWidth, trHeight );
533#endif
534      m_pcEntropyDecoderIf->parseCoeffNxN( pcCU, (pcCU->getCoeffY()+offsetLuma), uiAbsPartIdx, trWidth, trHeight, uiDepth, TEXT_LUMA );
535    }
536    if( uiLog2TrafoSize > 2 )
537    {
538      Int trWidth = width >> 1;
539      Int trHeight = height >> 1;
540#if !REMOVE_NSQT
541      pcCU->getNSQTSize( uiTrIdx, uiAbsPartIdx, trWidth, trHeight );
542#endif
543      if( cbfU )
544      {
545        m_pcEntropyDecoderIf->parseCoeffNxN( pcCU, (pcCU->getCoeffCb()+offsetChroma), uiAbsPartIdx, trWidth, trHeight, uiDepth, TEXT_CHROMA_U );
546      }
547      if( cbfV )
548      {
549        m_pcEntropyDecoderIf->parseCoeffNxN( pcCU, (pcCU->getCoeffCr()+offsetChroma), uiAbsPartIdx, trWidth, trHeight, uiDepth, TEXT_CHROMA_V );
550      }
551    }
552    else
553    {
554      UInt partNum = pcCU->getPic()->getNumPartInCU() >> ( ( uiDepth - 1 ) << 1 );
555      if( ( uiAbsPartIdx % partNum ) == (partNum - 1) )
556      {
557        Int trWidth = width;
558        Int trHeight = height;
559#if !REMOVE_NSQT
560        pcCU->getNSQTSize( uiTrIdx - 1, uiAbsPartIdx, trWidth, trHeight );
561#endif
562        if( cbfU )
563        {
564          m_pcEntropyDecoderIf->parseCoeffNxN( pcCU, (pcCU->getCoeffCb()+m_uiBakChromaOffset), m_uiBakAbsPartIdx, trWidth, trHeight, uiDepth, TEXT_CHROMA_U );
565        }
566        if( cbfV )
567        {
568          m_pcEntropyDecoderIf->parseCoeffNxN( pcCU, (pcCU->getCoeffCr()+m_uiBakChromaOffset), m_uiBakAbsPartIdx, trWidth, trHeight, uiDepth, TEXT_CHROMA_V );
569        }
570      }
571    }
572    // transform_unit end
573  }
574}
575
576Void TDecEntropy::decodeQP          ( TComDataCU* pcCU, UInt uiAbsPartIdx )
577{
578  if ( pcCU->getSlice()->getPPS()->getUseDQP() )
579  {
580    m_pcEntropyDecoderIf->parseDeltaQP( pcCU, uiAbsPartIdx, pcCU->getDepth( uiAbsPartIdx ) );
581  }
582}
583
584
585/** decode coefficients
586 * \param pcCU
587 * \param uiAbsPartIdx
588 * \param uiDepth
589 * \param uiWidth
590 * \param uiHeight
591 * \returns Void
592 */
593Void TDecEntropy::decodeCoeff( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth, UInt uiWidth, UInt uiHeight, Bool& bCodeDQP )
594{
595  UInt uiMinCoeffSize = pcCU->getPic()->getMinCUWidth()*pcCU->getPic()->getMinCUHeight();
596  UInt uiLumaOffset   = uiMinCoeffSize*uiAbsPartIdx;
597  UInt uiChromaOffset = uiLumaOffset>>2;
598 
599  if( pcCU->isIntra(uiAbsPartIdx) )
600  {
601  }
602  else
603  {
604    UInt uiQtRootCbf = 1;
605    if( !( pcCU->getPartitionSize( uiAbsPartIdx) == SIZE_2Nx2N && pcCU->getMergeFlag( uiAbsPartIdx ) ) )
606    {
607      m_pcEntropyDecoderIf->parseQtRootCbf( pcCU, uiAbsPartIdx, uiDepth, uiQtRootCbf );
608    }
609    if ( !uiQtRootCbf )
610    {
611      pcCU->setCbfSubParts( 0, 0, 0, uiAbsPartIdx, uiDepth );
612      pcCU->setTrIdxSubParts( 0 , uiAbsPartIdx, uiDepth );
613#if !REMOVE_NSQT
614      pcCU->setNSQTIdxSubParts( uiAbsPartIdx, uiDepth );
615#endif
616      return;
617    }
618   
619  }
620  xDecodeTransform( pcCU, uiLumaOffset, uiChromaOffset, uiAbsPartIdx, uiAbsPartIdx, uiDepth, uiWidth, uiHeight, 0, 0, bCodeDQP );
621}
622
623//! \}
Note: See TracBrowser for help on using the repository browser.