source: 3DVCSoftware/trunk/source/Lib/TLibDecoder/TDecEntropy.cpp @ 67

Last change on this file since 67 was 56, checked in by hschwarz, 13 years ago

updated trunk (move to HM6.1)

  • Property svn:eol-style set to native
File size: 35.4 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
56/** decode merge flag
57 * \param pcSubCU
58 * \param uiAbsPartIdx
59 * \param uiDepth
60 * \param uiPUIdx
61 * \returns Void
62 */
63Void TDecEntropy::decodeMergeFlag( TComDataCU* pcSubCU, UInt uiAbsPartIdx, UInt uiDepth, UInt uiPUIdx )
64{ 
65  // at least one merge candidate exists
66  m_pcEntropyDecoderIf->parseMergeFlag( pcSubCU, uiAbsPartIdx, uiDepth, uiPUIdx );
67}
68
69/** decode merge index
70 * \param pcCU
71 * \param uiPartIdx
72 * \param uiAbsPartIdx
73 * \param puhInterDirNeighbours pointer to list of inter direction from the casual neighbours
74 * \param pcMvFieldNeighbours pointer to list of motion vector field from the casual neighbours
75 * \param uiDepth
76 * \returns Void
77 */
78Void TDecEntropy::decodeMergeIndex( TComDataCU* pcCU, UInt uiPartIdx, UInt uiAbsPartIdx, PartSize eCUMode, UChar* puhInterDirNeighbours, TComMvField* pcMvFieldNeighbours, UInt uiDepth )
79{
80  UInt uiMergeIndex = 0;
81  m_pcEntropyDecoderIf->parseMergeIndex( pcCU, uiMergeIndex, uiAbsPartIdx, uiDepth );
82  pcCU->setMergeIndexSubParts( uiMergeIndex, uiAbsPartIdx, uiPartIdx, uiDepth );
83}
84
85#if HHI_INTER_VIEW_RESIDUAL_PRED
86Void
87TDecEntropy::decodeResPredFlag( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth, TComDataCU* pcSubCU, UInt uiPUIdx )
88{
89  Bool  bResPredAvailable   = false;
90  Bool  bResPredFlag        = false;
91
92  Bool  bResPredAllowed     =                    (!pcCU->getSlice()->getSPS()->isDepth                () );
93  bResPredAllowed           = bResPredAllowed && ( pcCU->getSlice()->getSPS()->getViewId              () );
94  bResPredAllowed           = bResPredAllowed && ( pcCU->getSlice()->getSPS()->getMultiviewResPredMode() );
95  bResPredAllowed           = bResPredAllowed && (!pcCU->isIntra           ( uiAbsPartIdx )              );
96
97  // check if supported
98  if( bResPredAllowed )
99  {
100    bResPredAvailable       = pcSubCU->getResidualSamples( uiPUIdx );
101  }
102
103  // read from bitstream
104  if( bResPredAvailable )
105  {
106    m_pcEntropyDecoderIf->parseResPredFlag( pcCU, bResPredFlag, uiAbsPartIdx, uiDepth );
107  }
108
109  // set data
110  pcCU->setResPredAvailSubParts ( bResPredAvailable, uiAbsPartIdx, uiPUIdx, uiDepth );
111  pcCU->setResPredFlagSubParts  ( bResPredFlag,      uiAbsPartIdx, uiPUIdx, uiDepth );
112}
113#endif
114
115Void TDecEntropy::decodeSplitFlag   ( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth )
116{
117  m_pcEntropyDecoderIf->parseSplitFlag( pcCU, uiAbsPartIdx, uiDepth );
118}
119
120Void TDecEntropy::decodePredMode( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth )
121{
122  m_pcEntropyDecoderIf->parsePredMode( pcCU, uiAbsPartIdx, uiDepth );
123}
124
125Void TDecEntropy::decodePartSize( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth )
126{
127  m_pcEntropyDecoderIf->parsePartSize( pcCU, uiAbsPartIdx, uiDepth );
128}
129
130Void TDecEntropy::decodePredInfo    ( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth, TComDataCU* pcSubCU )
131{
132  PartSize eMode = pcCU->getPartitionSize( uiAbsPartIdx );
133 
134  if( pcCU->isIntra( uiAbsPartIdx ) )                                 // If it is Intra mode, encode intra prediction mode.
135  {
136    if( eMode == SIZE_NxN )                                         // if it is NxN size, encode 4 intra directions.
137    {
138      UInt uiPartOffset = ( pcCU->getPic()->getNumPartInCU() >> ( pcCU->getDepth(uiAbsPartIdx) << 1 ) ) >> 2;
139      // if it is NxN size, this size might be the smallest partition size.                                                         // if it is NxN size, this size might be the smallest partition size.
140      decodeIntraDirModeLuma( pcCU, uiAbsPartIdx,                  uiDepth+1 );
141      decodeIntraDirModeLuma( pcCU, uiAbsPartIdx + uiPartOffset,   uiDepth+1 );
142      decodeIntraDirModeLuma( pcCU, uiAbsPartIdx + uiPartOffset*2, uiDepth+1 );
143      decodeIntraDirModeLuma( pcCU, uiAbsPartIdx + uiPartOffset*3, uiDepth+1 );
144      decodeIntraDirModeChroma( pcCU, uiAbsPartIdx, uiDepth );
145    }
146    else                                                                // if it is not NxN size, encode 1 intra directions
147    {
148      decodeIntraDirModeLuma  ( pcCU, uiAbsPartIdx, uiDepth );
149      decodeIntraDirModeChroma( pcCU, uiAbsPartIdx, uiDepth );
150    }
151  }
152  else                                                                // if it is Inter mode, encode motion vector and reference index
153  {
154    decodePUWise( pcCU, uiAbsPartIdx, uiDepth, pcSubCU );
155  }
156}
157
158/** Parse I_PCM information.
159 * \param pcCU  pointer to CUpointer to CU
160 * \param uiAbsPartIdx CU index
161 * \param uiDepth CU depth
162 * \returns Void
163 */
164Void TDecEntropy::decodeIPCMInfo( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth )
165{
166  if(!pcCU->getSlice()->getSPS()->getUsePCM()
167    || pcCU->getWidth(uiAbsPartIdx) > (1<<pcCU->getSlice()->getSPS()->getPCMLog2MaxSize())
168    || pcCU->getWidth(uiAbsPartIdx) < (1<<pcCU->getSlice()->getSPS()->getPCMLog2MinSize()) )
169  {
170    return;
171  }
172 
173  m_pcEntropyDecoderIf->parseIPCMInfo( pcCU, uiAbsPartIdx, uiDepth );
174}
175
176Void TDecEntropy::decodeIntraDirModeLuma  ( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth )
177{
178  m_pcEntropyDecoderIf->parseIntraDirLumaAng( pcCU, uiAbsPartIdx, uiDepth );
179}
180
181Void TDecEntropy::decodeIntraDirModeChroma( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth )
182{
183  m_pcEntropyDecoderIf->parseIntraDirChroma( pcCU, uiAbsPartIdx, uiDepth );
184}
185
186/** decode motion information for every PU block.
187 * \param pcCU
188 * \param uiAbsPartIdx
189 * \param uiDepth
190 * \param pcSubCU
191 * \returns Void
192 */
193Void TDecEntropy::decodePUWise( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth, TComDataCU* pcSubCU )
194{
195  PartSize ePartSize = pcCU->getPartitionSize( uiAbsPartIdx );
196  UInt uiNumPU = ( ePartSize == SIZE_2Nx2N ? 1 : ( ePartSize == SIZE_NxN ? 4 : 2 ) );
197  UInt uiPUOffset = ( g_auiPUOffset[UInt( ePartSize )] << ( ( pcCU->getSlice()->getSPS()->getMaxCUDepth() - uiDepth ) << 1 ) ) >> 4;
198
199#if CU_BASED_MRG_CAND_LIST
200#if HHI_INTER_VIEW_MOTION_PRED
201  TComMvField cMvFieldNeighbours[MRG_MAX_NUM_CANDS_MEM << 1]; // double length for mv of both lists
202  UChar uhInterDirNeighbours[MRG_MAX_NUM_CANDS_MEM];
203  for ( UInt ui = 0; ui < MRG_MAX_NUM_CANDS_MEM; ui++ )
204#else
205  TComMvField cMvFieldNeighbours[MRG_MAX_NUM_CANDS << 1]; // double length for mv of both lists
206  UChar uhInterDirNeighbours[MRG_MAX_NUM_CANDS];
207  for ( UInt ui = 0; ui < MRG_MAX_NUM_CANDS; ui++ )
208#endif
209  {
210    uhInterDirNeighbours[ui] = 0;
211  }
212  Int numValidMergeCand = 0;
213  bool isMerged = false;
214#endif
215
216  pcSubCU->copyInterPredInfoFrom( pcCU, uiAbsPartIdx, REF_PIC_LIST_0 );
217  pcSubCU->copyInterPredInfoFrom( pcCU, uiAbsPartIdx, REF_PIC_LIST_1 );
218  for ( UInt uiPartIdx = 0, uiSubPartIdx = uiAbsPartIdx; uiPartIdx < uiNumPU; uiPartIdx++, uiSubPartIdx += uiPUOffset )
219  {
220#if !CU_BASED_MRG_CAND_LIST
221#if HHI_INTER_VIEW_MOTION_PRED
222    TComMvField cMvFieldNeighbours[MRG_MAX_NUM_CANDS_MEM << 1]; // double length for mv of both lists
223    UChar uhInterDirNeighbours[MRG_MAX_NUM_CANDS_MEM];
224    Int numValidMergeCand = 0;
225    for( UInt ui = 0; ui < MRG_MAX_NUM_CANDS_MEM; ++ui )
226#else
227    TComMvField cMvFieldNeighbours[MRG_MAX_NUM_CANDS << 1]; // double length for mv of both lists
228    UChar uhInterDirNeighbours[MRG_MAX_NUM_CANDS];
229    Int numValidMergeCand = 0;
230    for( UInt ui = 0; ui < MRG_MAX_NUM_CANDS; ++ui )
231#endif
232    {
233      uhInterDirNeighbours[ui] = 0;
234    }
235#endif
236    decodeMergeFlag( pcCU, uiSubPartIdx, uiDepth, uiPartIdx );
237    if ( pcCU->getMergeFlag( uiSubPartIdx ) )
238    {
239      decodeMergeIndex( pcCU, uiPartIdx, uiSubPartIdx, ePartSize, uhInterDirNeighbours, cMvFieldNeighbours, uiDepth );
240#if CU_BASED_MRG_CAND_LIST
241      UInt uiMergeIndex = pcCU->getMergeIndex(uiSubPartIdx);
242      if ( pcCU->getSlice()->getPPS()->getLog2ParallelMergeLevelMinus2() && ePartSize != SIZE_2Nx2N && pcSubCU->getWidth( 0 ) <= 8 ) 
243      {
244        pcSubCU->setPartSizeSubParts( SIZE_2Nx2N, 0, uiDepth );
245        if ( !isMerged )
246        {
247          pcSubCU->getInterMergeCandidates( 0, 0, uiDepth, cMvFieldNeighbours, uhInterDirNeighbours, numValidMergeCand );
248          isMerged = true;
249        }
250        pcSubCU->setPartSizeSubParts( ePartSize, 0, uiDepth );
251      }
252      else
253      {
254#if SIMP_MRG_PRUN
255        uiMergeIndex = pcCU->getMergeIndex(uiSubPartIdx);
256        pcSubCU->getInterMergeCandidates( uiSubPartIdx-uiAbsPartIdx, uiPartIdx, uiDepth, cMvFieldNeighbours, uhInterDirNeighbours, numValidMergeCand, uiMergeIndex );
257#else     
258        pcSubCU->getInterMergeCandidates( uiSubPartIdx-uiAbsPartIdx, uiPartIdx, uiDepth, cMvFieldNeighbours, uhInterDirNeighbours, numValidMergeCand );
259        uiMergeIndex = pcCU->getMergeIndex(uiSubPartIdx);
260#endif
261      }
262#else
263#if SIMP_MRG_PRUN       
264      UInt uiMergeIndex = pcCU->getMergeIndex(uiSubPartIdx);
265      pcSubCU->getInterMergeCandidates( uiSubPartIdx-uiAbsPartIdx, uiPartIdx, uiDepth, cMvFieldNeighbours, uhInterDirNeighbours, numValidMergeCand, uiMergeIndex );
266#else     
267      pcSubCU->getInterMergeCandidates( uiSubPartIdx-uiAbsPartIdx, uiPartIdx, uiDepth, cMvFieldNeighbours, uhInterDirNeighbours, numValidMergeCand );
268      UInt uiMergeIndex = pcCU->getMergeIndex(uiSubPartIdx);
269#endif
270#endif
271      pcCU->setInterDirSubParts( uhInterDirNeighbours[uiMergeIndex], uiSubPartIdx, uiPartIdx, uiDepth );
272
273      TComMv cTmpMv( 0, 0 );
274      for ( UInt uiRefListIdx = 0; uiRefListIdx < 2; uiRefListIdx++ )
275      {       
276        if ( pcCU->getSlice()->getNumRefIdx( RefPicList( uiRefListIdx ) ) > 0 )
277        {
278          pcCU->setMVPIdxSubParts( 0, RefPicList( uiRefListIdx ), uiSubPartIdx, uiPartIdx, uiDepth);
279          pcCU->setMVPNumSubParts( 0, RefPicList( uiRefListIdx ), uiSubPartIdx, uiPartIdx, uiDepth);
280          pcCU->getCUMvField( RefPicList( uiRefListIdx ) )->setAllMvd( cTmpMv, ePartSize, uiSubPartIdx, uiDepth, uiPartIdx );
281          pcCU->getCUMvField( RefPicList( uiRefListIdx ) )->setAllMvField( cMvFieldNeighbours[ 2*uiMergeIndex + uiRefListIdx ], ePartSize, uiSubPartIdx, uiDepth, uiPartIdx );
282
283        }
284      }
285    }
286    else
287    {
288      decodeInterDirPU( pcCU, uiSubPartIdx, uiDepth, uiPartIdx );
289      for ( UInt uiRefListIdx = 0; uiRefListIdx < 2; uiRefListIdx++ )
290      {       
291        if ( pcCU->getSlice()->getNumRefIdx( RefPicList( uiRefListIdx ) ) > 0 )
292        {
293          decodeRefFrmIdxPU( pcCU,    uiSubPartIdx,              uiDepth, uiPartIdx, RefPicList( uiRefListIdx ) );
294          decodeMvdPU      ( pcCU,    uiSubPartIdx,              uiDepth, uiPartIdx, RefPicList( uiRefListIdx ) );
295          decodeMVPIdxPU   ( pcSubCU, uiSubPartIdx-uiAbsPartIdx, uiDepth, uiPartIdx, RefPicList( uiRefListIdx ) );
296        }
297      }
298    }
299  }
300  return;
301}
302
303/** decode inter direction for a PU block
304 * \param pcCU
305 * \param uiAbsPartIdx
306 * \param uiDepth
307 * \param uiPartIdx
308 * \returns Void
309 */
310Void TDecEntropy::decodeInterDirPU( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth, UInt uiPartIdx )
311{
312  UInt uiInterDir;
313
314  if ( pcCU->getSlice()->isInterP() )
315  {
316    uiInterDir = 1;
317  }
318  else
319  {
320    m_pcEntropyDecoderIf->parseInterDir( pcCU, uiInterDir, uiAbsPartIdx, uiDepth );
321  }
322
323  pcCU->setInterDirSubParts( uiInterDir, uiAbsPartIdx, uiPartIdx, uiDepth );
324}
325
326Void TDecEntropy::decodeRefFrmIdxPU( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth, UInt uiPartIdx, RefPicList eRefList )
327{
328  if(pcCU->getSlice()->getNumRefIdx(REF_PIC_LIST_C) > 0 && pcCU->getInterDir( uiAbsPartIdx ) != 3)
329  {
330    if(eRefList == REF_PIC_LIST_1)
331    {
332      return;
333    }
334
335    Int iRefFrmIdx = 0;
336    Int iRefFrmIdxTemp;
337    UInt uiInterDir;
338    RefPicList eRefListTemp;
339
340    PartSize ePartSize = pcCU->getPartitionSize( uiAbsPartIdx );
341
342    if ( pcCU->getSlice()->getNumRefIdx ( REF_PIC_LIST_C ) > 1 )
343    {
344      m_pcEntropyDecoderIf->parseRefFrmIdx( pcCU, iRefFrmIdx, uiAbsPartIdx, uiDepth, REF_PIC_LIST_C );
345    }
346    else
347    {
348      iRefFrmIdx=0;
349    }
350    uiInterDir = pcCU->getSlice()->getListIdFromIdxOfLC(iRefFrmIdx) + 1;
351    iRefFrmIdxTemp = pcCU->getSlice()->getRefIdxFromIdxOfLC(iRefFrmIdx);
352    eRefListTemp = (RefPicList)pcCU->getSlice()->getListIdFromIdxOfLC(iRefFrmIdx);
353
354    pcCU->getCUMvField( eRefListTemp )->setAllRefIdx( iRefFrmIdxTemp, ePartSize, uiAbsPartIdx, uiDepth, uiPartIdx );
355
356    pcCU->setInterDirSubParts( uiInterDir, uiAbsPartIdx, uiPartIdx, uiDepth );
357  }
358  else
359  {
360    Int iRefFrmIdx = 0;
361    Int iParseRefFrmIdx = pcCU->getInterDir( uiAbsPartIdx ) & ( 1 << eRefList );
362
363    if ( pcCU->getSlice()->getNumRefIdx( eRefList ) > 1 && iParseRefFrmIdx )
364    {
365      m_pcEntropyDecoderIf->parseRefFrmIdx( pcCU, iRefFrmIdx, uiAbsPartIdx, uiDepth, eRefList );
366    }
367    else if ( !iParseRefFrmIdx )
368    {
369      iRefFrmIdx = NOT_VALID;
370    }
371    else
372    {
373      iRefFrmIdx = 0;
374    }
375
376    PartSize ePartSize = pcCU->getPartitionSize( uiAbsPartIdx );
377    pcCU->getCUMvField( eRefList )->setAllRefIdx( iRefFrmIdx, ePartSize, uiAbsPartIdx, uiDepth, uiPartIdx );
378  }
379}
380
381/** decode motion vector difference for a PU block
382 * \param pcCU
383 * \param uiAbsPartIdx
384 * \param uiDepth
385 * \param uiPartIdx
386 * \param eRefList
387 * \returns Void
388 */
389Void TDecEntropy::decodeMvdPU( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth, UInt uiPartIdx, RefPicList eRefList )
390{
391  if ( pcCU->getInterDir( uiAbsPartIdx ) & ( 1 << eRefList ) )
392  {
393    m_pcEntropyDecoderIf->parseMvd( pcCU, uiAbsPartIdx, uiPartIdx, uiDepth, eRefList );
394  }
395}
396
397Void TDecEntropy::decodeMVPIdxPU( TComDataCU* pcSubCU, UInt uiPartAddr, UInt uiDepth, UInt uiPartIdx, RefPicList eRefList )
398{
399  Int iMVPIdx = -1;
400
401  TComMv cZeroMv( 0, 0 );
402  TComMv cMv     = cZeroMv;
403  Int    iRefIdx = -1;
404
405  TComCUMvField* pcSubCUMvField = pcSubCU->getCUMvField( eRefList );
406  AMVPInfo* pAMVPInfo = pcSubCUMvField->getAMVPInfo();
407
408  iRefIdx = pcSubCUMvField->getRefIdx(uiPartAddr);
409  cMv = cZeroMv;
410
411  if ( (pcSubCU->getInterDir(uiPartAddr) & ( 1 << eRefList )) && (pcSubCU->getAMVPMode(uiPartAddr) == AM_EXPL) )
412  {
413#if HHI_INTER_VIEW_MOTION_PRED
414    const Int iNumAMVPCands = AMVP_MAX_NUM_CANDS + ( pcSubCU->getSlice()->getSPS()->getMultiviewMvPredMode() ? 1 : 0 );
415    m_pcEntropyDecoderIf->parseMVPIdx( iMVPIdx, iNumAMVPCands );
416#else
417    m_pcEntropyDecoderIf->parseMVPIdx( iMVPIdx );
418#endif
419  }
420  pcSubCU->fillMvpCand(uiPartIdx, uiPartAddr, eRefList, iRefIdx, pAMVPInfo);
421  pcSubCU->setMVPNumSubParts(pAMVPInfo->iN, eRefList, uiPartAddr, uiPartIdx, uiDepth);
422  pcSubCU->setMVPIdxSubParts( iMVPIdx, eRefList, uiPartAddr, uiPartIdx, uiDepth );
423  if ( iRefIdx >= 0 )
424  {
425    m_pcPrediction->getMvPredAMVP( pcSubCU, uiPartIdx, uiPartAddr, eRefList, iRefIdx, cMv);
426    cMv += pcSubCUMvField->getMvd( uiPartAddr );
427  }
428
429  PartSize ePartSize = pcSubCU->getPartitionSize( uiPartAddr );
430  pcSubCU->getCUMvField( eRefList )->setAllMv(cMv, ePartSize, uiPartAddr, 0, uiPartIdx);
431}
432
433#if UNIFIED_TRANSFORM_TREE
434Void TDecEntropy::xDecodeTransform( TComDataCU* pcCU, UInt offsetLuma, UInt offsetChroma, UInt uiAbsPartIdx, UInt absTUPartIdx, UInt uiDepth, UInt width, UInt height, UInt uiTrIdx, UInt uiInnerQuadIdx, UInt& uiYCbfFront3, UInt& uiUCbfFront3, UInt& uiVCbfFront3, Bool& bCodeDQP )
435#else
436Void TDecEntropy::xDecodeTransformSubdiv( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt absTUPartIdx, UInt uiDepth, UInt uiInnerQuadIdx, UInt& uiYCbfFront3, UInt& uiUCbfFront3, UInt& uiVCbfFront3 )
437#endif
438{
439  UInt uiSubdiv;
440  const UInt uiLog2TrafoSize = g_aucConvertToBit[pcCU->getSlice()->getSPS()->getMaxCUWidth()]+2 - uiDepth;
441
442#if UNIFIED_TRANSFORM_TREE
443  if(uiTrIdx==0)
444  {
445    m_bakAbsPartIdxCU = uiAbsPartIdx;
446  }
447  if( uiLog2TrafoSize == 2 )
448  {
449    UInt partNum = pcCU->getPic()->getNumPartInCU() >> ( ( uiDepth - 1 ) << 1 );
450    if( ( uiAbsPartIdx % partNum ) == 0 )
451    {
452      m_uiBakAbsPartIdx   = uiAbsPartIdx;
453      m_uiBakChromaOffset = offsetChroma;
454    }
455  }
456#endif // UNIFIED_TRANSFORM_TREE
457  if( pcCU->getPredictionMode(uiAbsPartIdx) == MODE_INTRA && pcCU->getPartitionSize(uiAbsPartIdx) == SIZE_NxN && uiDepth == pcCU->getDepth(uiAbsPartIdx) )
458  {
459    uiSubdiv = 1;
460  }
461#if G519_TU_AMP_NSQT_HARMONIZATION
462  else if( (pcCU->getSlice()->getSPS()->getQuadtreeTUMaxDepthInter() == 1) && (pcCU->getPredictionMode(uiAbsPartIdx) == MODE_INTER) && ( pcCU->getPartitionSize(uiAbsPartIdx) != SIZE_2Nx2N ) && (uiDepth == pcCU->getDepth(uiAbsPartIdx)) )
463#else
464  else if( (pcCU->getSlice()->getSPS()->getQuadtreeTUMaxDepthInter() == 1) && (pcCU->getPredictionMode(uiAbsPartIdx) == MODE_INTER) && ( pcCU->getPartitionSize(uiAbsPartIdx) == SIZE_2NxN || pcCU->getPartitionSize(uiAbsPartIdx) == SIZE_Nx2N) && (uiDepth == pcCU->getDepth(uiAbsPartIdx)) )
465#endif
466  {
467    uiSubdiv = (uiLog2TrafoSize > pcCU->getQuadtreeTULog2MinSizeInCU(uiAbsPartIdx));
468  }
469  else if( uiLog2TrafoSize > pcCU->getSlice()->getSPS()->getQuadtreeTULog2MaxSize() )
470  {
471    uiSubdiv = 1;
472  }
473  else if( uiLog2TrafoSize == pcCU->getSlice()->getSPS()->getQuadtreeTULog2MinSize() )
474  {
475    uiSubdiv = 0;
476  }
477  else if( uiLog2TrafoSize == pcCU->getQuadtreeTULog2MinSizeInCU(uiAbsPartIdx) )
478  {
479    uiSubdiv = 0;
480  }
481  else
482  {
483    assert( uiLog2TrafoSize > pcCU->getQuadtreeTULog2MinSizeInCU(uiAbsPartIdx) );
484    m_pcEntropyDecoderIf->parseTransformSubdivFlag( uiSubdiv, uiDepth );
485  }
486 
487  const UInt uiTrDepth = uiDepth - pcCU->getDepth( uiAbsPartIdx );
488 
489  if( uiLog2TrafoSize <= pcCU->getSlice()->getSPS()->getQuadtreeTULog2MaxSize() )
490  {
491    const Bool bFirstCbfOfCU = uiLog2TrafoSize == pcCU->getSlice()->getSPS()->getQuadtreeTULog2MaxSize() || uiTrDepth == 0;
492    if( bFirstCbfOfCU )
493    {
494      pcCU->setCbfSubParts( 0, TEXT_CHROMA_U, uiAbsPartIdx, uiDepth );
495      pcCU->setCbfSubParts( 0, TEXT_CHROMA_V, uiAbsPartIdx, uiDepth );
496    }
497    if( bFirstCbfOfCU || uiLog2TrafoSize > 2 )
498    {
499      if( bFirstCbfOfCU || pcCU->getCbf( uiAbsPartIdx, TEXT_CHROMA_U, uiTrDepth - 1 ) )
500      {
501        if ( uiInnerQuadIdx == 3 && uiUCbfFront3 == 0 && uiLog2TrafoSize < pcCU->getSlice()->getSPS()->getQuadtreeTULog2MaxSize() )
502        {
503          uiUCbfFront3++;
504          pcCU->setCbfSubParts( 1 << uiTrDepth, TEXT_CHROMA_U, uiAbsPartIdx, uiDepth );
505          //printf( " \nsave bits, U Cbf");
506        }
507        else
508        {
509          m_pcEntropyDecoderIf->parseQtCbf( pcCU, uiAbsPartIdx, TEXT_CHROMA_U, uiTrDepth, uiDepth );
510          uiUCbfFront3 += pcCU->getCbf( uiAbsPartIdx, TEXT_CHROMA_U, uiTrDepth );
511        }
512      }
513      if( bFirstCbfOfCU || pcCU->getCbf( uiAbsPartIdx, TEXT_CHROMA_V, uiTrDepth - 1 ) )
514      {
515        if ( uiInnerQuadIdx == 3 && uiVCbfFront3 == 0 && uiLog2TrafoSize < pcCU->getSlice()->getSPS()->getQuadtreeTULog2MaxSize() )
516        {
517          uiVCbfFront3++;
518          pcCU->setCbfSubParts( 1 << uiTrDepth, TEXT_CHROMA_V, uiAbsPartIdx, uiDepth );
519          //printf( " \nsave bits, V Cbf");
520        }
521        else
522        {
523          m_pcEntropyDecoderIf->parseQtCbf( pcCU, uiAbsPartIdx, TEXT_CHROMA_V, uiTrDepth, uiDepth );
524          uiVCbfFront3 += pcCU->getCbf( uiAbsPartIdx, TEXT_CHROMA_V, uiTrDepth );
525        }
526      }
527    }
528    else
529    {
530      pcCU->setCbfSubParts( pcCU->getCbf( uiAbsPartIdx, TEXT_CHROMA_U, uiTrDepth - 1 ) << uiTrDepth, TEXT_CHROMA_U, uiAbsPartIdx, uiDepth );
531      pcCU->setCbfSubParts( pcCU->getCbf( uiAbsPartIdx, TEXT_CHROMA_V, uiTrDepth - 1 ) << uiTrDepth, TEXT_CHROMA_V, uiAbsPartIdx, uiDepth );
532      if ( uiLog2TrafoSize == 2 )
533      {
534        uiUCbfFront3 += pcCU->getCbf( uiAbsPartIdx, TEXT_CHROMA_U, uiTrDepth );
535        uiVCbfFront3 += pcCU->getCbf( uiAbsPartIdx, TEXT_CHROMA_V, uiTrDepth );
536      }
537    }
538  }
539 
540  if( uiSubdiv )
541  {
542#if UNIFIED_TRANSFORM_TREE
543    UInt size;
544    width  >>= 1;
545    height >>= 1;
546    size = width*height;
547    uiTrIdx++;
548#endif
549    ++uiDepth;
550    const UInt uiQPartNum = pcCU->getPic()->getNumPartInCU() >> (uiDepth << 1);
551    const UInt uiStartAbsPartIdx = uiAbsPartIdx;
552    UInt uiLumaTrMode, uiChromaTrMode;
553    pcCU->convertTransIdx( uiStartAbsPartIdx, uiTrDepth+1, uiLumaTrMode, uiChromaTrMode );
554    UInt uiYCbf = 0;
555    UInt uiUCbf = 0;
556    UInt uiVCbf = 0;
557   
558    UInt uiCurrentCbfY = 0;
559    UInt uiCurrentCbfU = 0;
560    UInt uiCurrentCbfV = 0;
561   
562    for( Int i = 0; i < 4; i++ )
563    {
564#if UNIFIED_TRANSFORM_TREE
565      UInt nsAddr = 0;
566      nsAddr = pcCU->getNSAbsPartIdx( uiLog2TrafoSize-1, uiAbsPartIdx, absTUPartIdx, i, uiTrDepth+1 );
567      xDecodeTransform( pcCU, offsetLuma, offsetChroma, uiAbsPartIdx, nsAddr, uiDepth, width, height, uiTrIdx, i, uiCurrentCbfY, uiCurrentCbfU, uiCurrentCbfV, bCodeDQP );
568#else
569      UInt nsAddr = 0;
570      nsAddr = pcCU->getNSAbsPartIdx( uiLog2TrafoSize-1, uiAbsPartIdx, absTUPartIdx, i, uiTrDepth+1 );
571      xDecodeTransformSubdiv( pcCU, uiAbsPartIdx, nsAddr, uiDepth, i, uiCurrentCbfY, uiCurrentCbfU, uiCurrentCbfV );
572#endif
573      uiYCbf |= pcCU->getCbf( uiAbsPartIdx, TEXT_LUMA, uiLumaTrMode );
574      uiUCbf |= pcCU->getCbf( uiAbsPartIdx, TEXT_CHROMA_U, uiChromaTrMode );
575      uiVCbf |= pcCU->getCbf( uiAbsPartIdx, TEXT_CHROMA_V, uiChromaTrMode );
576      uiAbsPartIdx += uiQPartNum;
577#if UNIFIED_TRANSFORM_TREE
578      offsetLuma += size;  offsetChroma += (size>>2);
579#endif
580    }
581   
582    uiYCbfFront3 += uiCurrentCbfY;
583    uiUCbfFront3 += uiCurrentCbfU;
584    uiVCbfFront3 += uiCurrentCbfV;
585   
586    pcCU->convertTransIdx( uiStartAbsPartIdx, uiTrDepth, uiLumaTrMode, uiChromaTrMode );
587    for( UInt ui = 0; ui < 4 * uiQPartNum; ++ui )
588    {
589      pcCU->getCbf( TEXT_LUMA     )[uiStartAbsPartIdx + ui] |= uiYCbf << uiLumaTrMode;
590      pcCU->getCbf( TEXT_CHROMA_U )[uiStartAbsPartIdx + ui] |= uiUCbf << uiChromaTrMode;
591      pcCU->getCbf( TEXT_CHROMA_V )[uiStartAbsPartIdx + ui] |= uiVCbf << uiChromaTrMode;
592    }
593  }
594  else
595  {
596    assert( uiDepth >= pcCU->getDepth( uiAbsPartIdx ) );
597    pcCU->setTrIdxSubParts( uiTrDepth, uiAbsPartIdx, uiDepth );
598   
599    {
600      DTRACE_CABAC_VL( g_nSymbolCounter++ );
601      DTRACE_CABAC_T( "\tTrIdx: abspart=" );
602      DTRACE_CABAC_V( uiAbsPartIdx );
603      DTRACE_CABAC_T( "\tdepth=" );
604      DTRACE_CABAC_V( uiDepth );
605      DTRACE_CABAC_T( "\ttrdepth=" );
606      DTRACE_CABAC_V( uiTrDepth );
607      DTRACE_CABAC_T( "\n" );
608    }
609   
610    UInt uiLumaTrMode, uiChromaTrMode;
611    pcCU->convertTransIdx( uiAbsPartIdx, uiTrDepth, uiLumaTrMode, uiChromaTrMode );
612    if(pcCU->getPredictionMode( uiAbsPartIdx ) == MODE_INTER && pcCU->useNonSquarePU( uiAbsPartIdx ) )
613    {
614      pcCU->setNSQTIdxSubParts( uiLog2TrafoSize, uiAbsPartIdx, absTUPartIdx, uiLumaTrMode );
615    }
616    pcCU->setCbfSubParts ( 0, TEXT_LUMA, uiAbsPartIdx, uiDepth );
617    if( pcCU->getPredictionMode(uiAbsPartIdx) != MODE_INTRA && uiDepth == pcCU->getDepth( uiAbsPartIdx ) && !pcCU->getCbf( uiAbsPartIdx, TEXT_CHROMA_U, 0 ) && !pcCU->getCbf( uiAbsPartIdx, TEXT_CHROMA_V, 0 ) )
618    {
619      pcCU->setCbfSubParts( 1 << uiLumaTrMode, TEXT_LUMA, uiAbsPartIdx, uiDepth );
620    }
621    else
622    {
623      const UInt uiLog2CUSize = g_aucConvertToBit[pcCU->getSlice()->getSPS()->getMaxCUWidth()] + 2 - pcCU->getDepth( uiAbsPartIdx );
624      if ( pcCU->getPredictionMode( uiAbsPartIdx ) != MODE_INTRA && uiInnerQuadIdx == 3 && uiYCbfFront3 == 0 && uiUCbfFront3 == 0 && uiVCbfFront3 == 0
625          && ( uiLog2CUSize <= pcCU->getSlice()->getSPS()->getQuadtreeTULog2MaxSize() + 1 || uiLog2TrafoSize < pcCU->getSlice()->getSPS()->getQuadtreeTULog2MaxSize() ) )
626      {
627        pcCU->setCbfSubParts( 1 << uiLumaTrMode, TEXT_LUMA, uiAbsPartIdx, uiDepth );
628        //printf( " \nsave bits, Y Cbf");
629        uiYCbfFront3++;   
630      }
631      else
632      {
633        m_pcEntropyDecoderIf->parseQtCbf( pcCU, uiAbsPartIdx, TEXT_LUMA, uiLumaTrMode, uiDepth );
634        uiYCbfFront3 += pcCU->getCbf( uiAbsPartIdx, TEXT_LUMA, uiLumaTrMode );
635      }
636    }
637#if UNIFIED_TRANSFORM_TREE
638    // transform_unit begin
639    UInt cbfY = pcCU->getCbf( uiAbsPartIdx, TEXT_LUMA    , uiTrIdx );
640    UInt cbfU = pcCU->getCbf( uiAbsPartIdx, TEXT_CHROMA_U, uiTrIdx );
641    UInt cbfV = pcCU->getCbf( uiAbsPartIdx, TEXT_CHROMA_V, uiTrIdx );
642    if( uiLog2TrafoSize == 2 )
643    {
644      UInt partNum = pcCU->getPic()->getNumPartInCU() >> ( ( uiDepth - 1 ) << 1 );
645      if( ( uiAbsPartIdx % partNum ) == (partNum - 1) )
646      {
647        cbfU = pcCU->getCbf( m_uiBakAbsPartIdx, TEXT_CHROMA_U, uiTrIdx );
648        cbfV = pcCU->getCbf( m_uiBakAbsPartIdx, TEXT_CHROMA_V, uiTrIdx );
649      }
650    }
651    if ( cbfY || cbfU || cbfV )
652    {
653      // dQP: only for LCU
654      if ( pcCU->getSlice()->getPPS()->getUseDQP() )
655      {
656        if ( bCodeDQP )
657        {
658          decodeQP( pcCU, m_bakAbsPartIdxCU);
659          bCodeDQP = false;
660        }
661      }
662    }
663    if( cbfY )
664    {
665      Int trWidth = width;
666      Int trHeight = height;
667      pcCU->getNSQTSize( uiTrIdx, uiAbsPartIdx, trWidth, trHeight );
668      m_pcEntropyDecoderIf->parseCoeffNxN( pcCU, (pcCU->getCoeffY()+offsetLuma), uiAbsPartIdx, trWidth, trHeight, uiDepth, TEXT_LUMA );
669    }
670    if( uiLog2TrafoSize > 2 )
671    {
672      Int trWidth = width >> 1;
673      Int trHeight = height >> 1;
674      pcCU->getNSQTSize( uiTrIdx, uiAbsPartIdx, trWidth, trHeight );
675      if( cbfU )
676      {
677        m_pcEntropyDecoderIf->parseCoeffNxN( pcCU, (pcCU->getCoeffCb()+offsetChroma), uiAbsPartIdx, trWidth, trHeight, uiDepth, TEXT_CHROMA_U );
678      }
679      if( cbfV )
680      {
681        m_pcEntropyDecoderIf->parseCoeffNxN( pcCU, (pcCU->getCoeffCr()+offsetChroma), uiAbsPartIdx, trWidth, trHeight, uiDepth, TEXT_CHROMA_V );
682      }
683    }
684    else
685    {
686      UInt partNum = pcCU->getPic()->getNumPartInCU() >> ( ( uiDepth - 1 ) << 1 );
687      if( ( uiAbsPartIdx % partNum ) == (partNum - 1) )
688      {
689        Int trWidth = width;
690        Int trHeight = height;
691        pcCU->getNSQTSize( uiTrIdx - 1, uiAbsPartIdx, trWidth, trHeight );
692        if( cbfU )
693        {
694          m_pcEntropyDecoderIf->parseCoeffNxN( pcCU, (pcCU->getCoeffCb()+m_uiBakChromaOffset), m_uiBakAbsPartIdx, trWidth, trHeight, uiDepth, TEXT_CHROMA_U );
695        }
696        if( cbfV )
697        {
698          m_pcEntropyDecoderIf->parseCoeffNxN( pcCU, (pcCU->getCoeffCr()+m_uiBakChromaOffset), m_uiBakAbsPartIdx, trWidth, trHeight, uiDepth, TEXT_CHROMA_V );
699        }
700      }
701    }
702    // transform_unit end
703#endif // UNIFIED_TRANSFORM_TREE
704  }
705}
706
707#if !UNIFIED_TRANSFORM_TREE
708Void TDecEntropy::decodeTransformIdx( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth )
709{
710  DTRACE_CABAC_VL( g_nSymbolCounter++ )
711  DTRACE_CABAC_T( "\tdecodeTransformIdx()\tCUDepth=" )
712  DTRACE_CABAC_V( uiDepth )
713  DTRACE_CABAC_T( "\n" )
714  UInt temp = 0;
715  UInt temp1 = 0;
716  UInt temp2 = 0;
717  xDecodeTransformSubdiv( pcCU, uiAbsPartIdx, uiAbsPartIdx, uiDepth, 0, temp, temp1, temp2 );
718}
719#endif // UNIFIED_TRANSFORM_TREE
720
721#if UNIFIED_TRANSFORM_TREE
722Void TDecEntropy::decodeQP          ( TComDataCU* pcCU, UInt uiAbsPartIdx )
723{
724  if ( pcCU->getSlice()->getPPS()->getUseDQP() )
725  {
726    m_pcEntropyDecoderIf->parseDeltaQP( pcCU, uiAbsPartIdx, pcCU->getDepth( uiAbsPartIdx ) );
727  }
728}
729#else
730Void TDecEntropy::decodeQP          ( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth )
731{
732  if ( pcCU->getSlice()->getPPS()->getUseDQP() )
733  {
734    m_pcEntropyDecoderIf->parseDeltaQP( pcCU, uiAbsPartIdx, uiDepth );
735  }
736}
737#endif
738
739#if !UNIFIED_TRANSFORM_TREE
740Void TDecEntropy::xDecodeCoeff( TComDataCU* pcCU, UInt uiLumaOffset, UInt uiChromaOffset, UInt uiAbsPartIdx, UInt uiDepth, UInt uiWidth, UInt uiHeight, UInt uiTrIdx, UInt uiCurrTrIdx, Bool& bCodeDQP )
741{
742  UInt uiLog2TrSize = g_aucConvertToBit[ pcCU->getSlice()->getSPS()->getMaxCUWidth() >> uiDepth ] + 2;
743  UInt uiCbfY = pcCU->getCbf( uiAbsPartIdx, TEXT_LUMA, uiTrIdx );
744  UInt uiCbfU = pcCU->getCbf( uiAbsPartIdx, TEXT_CHROMA_U, uiTrIdx );
745  UInt uiCbfV = pcCU->getCbf( uiAbsPartIdx, TEXT_CHROMA_V, uiTrIdx );
746  if( uiLog2TrSize == 2 )
747  {
748    UInt uiQPDiv = pcCU->getPic()->getNumPartInCU() >> ( ( uiDepth - 1 ) << 1 );
749    if( ( uiAbsPartIdx % uiQPDiv ) == 0 )
750    {
751      m_uiBakAbsPartIdx   = uiAbsPartIdx;
752      m_uiBakChromaOffset = uiChromaOffset;
753    }
754    else if( ( uiAbsPartIdx % uiQPDiv ) == (uiQPDiv - 1) )
755    {
756      uiCbfU = pcCU->getCbf( m_uiBakAbsPartIdx, TEXT_CHROMA_U, uiTrIdx );
757      uiCbfV = pcCU->getCbf( m_uiBakAbsPartIdx, TEXT_CHROMA_V, uiTrIdx );
758    }
759  }
760
761  if ( uiCbfY || uiCbfU || uiCbfV )
762  {
763    // dQP: only for LCU
764    if ( pcCU->getSlice()->getPPS()->getUseDQP() )
765    {
766      if ( bCodeDQP )
767      {
768        decodeQP( pcCU, uiAbsPartIdx, uiDepth);
769        bCodeDQP = false;
770      }
771    }   
772    UInt uiLumaTrMode, uiChromaTrMode;
773    pcCU->convertTransIdx( uiAbsPartIdx, pcCU->getTransformIdx( uiAbsPartIdx ), uiLumaTrMode, uiChromaTrMode );
774    const UInt uiStopTrMode = uiLumaTrMode;
775   
776    if( uiTrIdx == uiStopTrMode )
777    {
778      if( pcCU->getCbf( uiAbsPartIdx, TEXT_LUMA, uiTrIdx ) )
779      {
780        Int trWidth = uiWidth;
781        Int trHeight = uiHeight;
782        pcCU->getNSQTSize( uiTrIdx, uiAbsPartIdx, trWidth, trHeight );
783        m_pcEntropyDecoderIf->parseCoeffNxN( pcCU, (pcCU->getCoeffY()+uiLumaOffset), uiAbsPartIdx, trWidth, trHeight, uiDepth, TEXT_LUMA );
784      }
785     
786      uiWidth  >>= 1;
787      uiHeight >>= 1;
788
789      if( uiLog2TrSize == 2 )
790      {
791        UInt uiQPDiv = pcCU->getPic()->getNumPartInCU() >> ( ( uiDepth - 1 ) << 1 );
792        if( ( uiAbsPartIdx % uiQPDiv ) == (uiQPDiv - 1) )
793        {
794          uiWidth  <<= 1;
795          uiHeight <<= 1;
796          Int trWidth = uiWidth;
797          Int trHeight = uiHeight;
798          pcCU->getNSQTSize( uiTrIdx-1, uiAbsPartIdx, trWidth, trHeight );
799          if( pcCU->getCbf( m_uiBakAbsPartIdx, TEXT_CHROMA_U, uiTrIdx ) )
800          {
801            m_pcEntropyDecoderIf->parseCoeffNxN( pcCU, (pcCU->getCoeffCb()+m_uiBakChromaOffset), m_uiBakAbsPartIdx, trWidth, trHeight, uiDepth, TEXT_CHROMA_U );
802          }
803          if( pcCU->getCbf( m_uiBakAbsPartIdx, TEXT_CHROMA_V, uiTrIdx ) )
804          {
805            m_pcEntropyDecoderIf->parseCoeffNxN( pcCU, (pcCU->getCoeffCr()+m_uiBakChromaOffset), m_uiBakAbsPartIdx, trWidth, trHeight, uiDepth, TEXT_CHROMA_V );
806          }
807        }
808      }
809      else
810      {
811        Int trWidth = uiWidth;
812        Int trHeight = uiHeight;
813        pcCU->getNSQTSize( uiTrIdx, uiAbsPartIdx, trWidth, trHeight );
814        if( pcCU->getCbf( uiAbsPartIdx, TEXT_CHROMA_U, uiTrIdx ) )
815        {
816          m_pcEntropyDecoderIf->parseCoeffNxN( pcCU, (pcCU->getCoeffCb()+uiChromaOffset), uiAbsPartIdx, trWidth, trHeight, uiDepth, TEXT_CHROMA_U );
817        }
818        if( pcCU->getCbf( uiAbsPartIdx, TEXT_CHROMA_V, uiTrIdx ) )
819        {
820          m_pcEntropyDecoderIf->parseCoeffNxN( pcCU, (pcCU->getCoeffCr()+uiChromaOffset), uiAbsPartIdx, trWidth, trHeight, uiDepth, TEXT_CHROMA_V );
821        }
822      }
823    }
824    else
825    {
826      {
827        DTRACE_CABAC_VL( g_nSymbolCounter++ );
828        DTRACE_CABAC_T( "\tgoing down\tdepth=" );
829        DTRACE_CABAC_V( uiDepth );
830        DTRACE_CABAC_T( "\ttridx=" );
831        DTRACE_CABAC_V( uiTrIdx );
832        DTRACE_CABAC_T( "\n" );
833      }
834      if( uiCurrTrIdx <= uiTrIdx )
835      {
836        assert(1);
837      }
838      UInt uiSize;
839      uiWidth  >>= 1;
840      uiHeight >>= 1;
841      uiSize = uiWidth*uiHeight;
842      uiDepth++;
843      uiTrIdx++;
844     
845      UInt uiQPartNum = pcCU->getPic()->getNumPartInCU() >> (uiDepth << 1);
846      UInt uiIdx      = uiAbsPartIdx;
847     
848      xDecodeCoeff( pcCU, uiLumaOffset, uiChromaOffset, uiIdx, uiDepth, uiWidth, uiHeight, uiTrIdx, uiCurrTrIdx, bCodeDQP );
849      uiLumaOffset += uiSize;  uiChromaOffset += (uiSize>>2);  uiIdx += uiQPartNum;
850     
851      xDecodeCoeff( pcCU, uiLumaOffset, uiChromaOffset, uiIdx, uiDepth, uiWidth, uiHeight, uiTrIdx, uiCurrTrIdx, bCodeDQP );
852      uiLumaOffset += uiSize;  uiChromaOffset += (uiSize>>2);  uiIdx += uiQPartNum;
853     
854      xDecodeCoeff( pcCU, uiLumaOffset, uiChromaOffset, uiIdx, uiDepth, uiWidth, uiHeight, uiTrIdx, uiCurrTrIdx, bCodeDQP );
855      uiLumaOffset += uiSize;  uiChromaOffset += (uiSize>>2);  uiIdx += uiQPartNum;
856     
857      xDecodeCoeff( pcCU, uiLumaOffset, uiChromaOffset, uiIdx, uiDepth, uiWidth, uiHeight, uiTrIdx, uiCurrTrIdx, bCodeDQP );
858      {
859        DTRACE_CABAC_VL( g_nSymbolCounter++ );
860        DTRACE_CABAC_T( "\tgoing up\n" );
861      }
862    }
863  }
864}
865#endif // !UNIFIED_TRANSFORM_TREE
866
867/** decode coefficients
868 * \param pcCU
869 * \param uiAbsPartIdx
870 * \param uiDepth
871 * \param uiWidth
872 * \param uiHeight
873 * \returns Void
874 */
875Void TDecEntropy::decodeCoeff( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth, UInt uiWidth, UInt uiHeight, Bool& bCodeDQP )
876{
877  UInt uiMinCoeffSize = pcCU->getPic()->getMinCUWidth()*pcCU->getPic()->getMinCUHeight();
878  UInt uiLumaOffset   = uiMinCoeffSize*uiAbsPartIdx;
879  UInt uiChromaOffset = uiLumaOffset>>2;
880#if UNIFIED_TRANSFORM_TREE
881  UInt temp  = 0;
882  UInt temp1 = 0;
883  UInt temp2 = 0;
884#else
885  UInt uiLumaTrMode, uiChromaTrMode;
886#endif
887 
888  if( pcCU->isIntra(uiAbsPartIdx) )
889  {
890#if !UNIFIED_TRANSFORM_TREE
891    decodeTransformIdx( pcCU, uiAbsPartIdx, pcCU->getDepth(uiAbsPartIdx) );
892   
893    pcCU->convertTransIdx( uiAbsPartIdx, pcCU->getTransformIdx(uiAbsPartIdx), uiLumaTrMode, uiChromaTrMode );
894   
895#endif // !UNIFIED_TRANSFORM_TREE
896  }
897  else
898  {
899    UInt uiQtRootCbf = 1;
900#if HHI_MPI
901    if( !(pcCU->getMergeFlag( uiAbsPartIdx ) && pcCU->getPartitionSize(uiAbsPartIdx) == SIZE_2Nx2N &&
902          ( pcCU->getTextureModeDepth( uiAbsPartIdx ) == -1 || uiDepth == pcCU->getTextureModeDepth( uiAbsPartIdx ) ) ) )
903#else
904    if( !( pcCU->getPartitionSize( uiAbsPartIdx) == SIZE_2Nx2N && pcCU->getMergeFlag( uiAbsPartIdx ) ) )
905#endif
906    {
907      m_pcEntropyDecoderIf->parseQtRootCbf( pcCU, uiAbsPartIdx, uiDepth, uiQtRootCbf );
908    }
909    if ( !uiQtRootCbf )
910    {
911      pcCU->setCbfSubParts( 0, 0, 0, uiAbsPartIdx, uiDepth );
912      pcCU->setTrIdxSubParts( 0 , uiAbsPartIdx, uiDepth );
913      pcCU->setNSQTIdxSubParts( uiAbsPartIdx, uiDepth );
914      return;
915    }
916   
917#if !UNIFIED_TRANSFORM_TREE
918    decodeTransformIdx( pcCU, uiAbsPartIdx, pcCU->getDepth(uiAbsPartIdx) );
919   
920    pcCU->convertTransIdx( uiAbsPartIdx, pcCU->getTransformIdx(uiAbsPartIdx), uiLumaTrMode, uiChromaTrMode );
921#endif // !UNIFIED_TRANSFORM_TREE
922  }
923#if UNIFIED_TRANSFORM_TREE
924  xDecodeTransform( pcCU, uiLumaOffset, uiChromaOffset, uiAbsPartIdx, uiAbsPartIdx, uiDepth, uiWidth, uiHeight, 0, 0, temp, temp1, temp2, bCodeDQP );
925#else // UNIFIED_TRANSFORM_TREE
926  xDecodeCoeff( pcCU, uiLumaOffset, uiChromaOffset, uiAbsPartIdx, uiDepth, uiWidth, uiHeight, 0, uiLumaTrMode, bCodeDQP );
927#endif // UNIFIED_TRANSFORM_TREE
928}
929
930//! \}
Note: See TracBrowser for help on using the repository browser.