source: 3DVCSoftware/branches/HTM-4.1-dev1-Sharp/source/Lib/TLibDecoder/TDecEntropy.cpp @ 753

Last change on this file since 753 was 154, checked in by sharpjp-htm, 12 years ago

B0111: decoupling inter-view candidate in AMVP

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