source: 3DVCSoftware/branches/HTM-4.0.1-VSP-dev0/source/Lib/TLibDecoder/TDecEntropy.cpp @ 166

Last change on this file since 166 was 166, checked in by mitsubishi-htm, 12 years ago

Initial integration of VSP into HTM 4.0.1. The version used for JCT3V-B0102 at Shanghai meeting.

  • VC9 project/solution files updated. Other Visual C++ project/solution files are not updated.
  • Linux make file updated.

TODO

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