source: 3DVCSoftware/branches/HTM-8.2-dev2-ETRI/source/Lib/TLibDecoder/TDecEntropy.cpp

Last change on this file was 708, checked in by etri-htm, 11 years ago

Integration of "Results on simple merge candidate list construction for 3DV"
JCT3V-F0093
MACRO "ETRIKHU_MERGE_REUSE_F0093"

By Gun Bang (gbang@…)

  • Property svn:eol-style set to native
File size: 26.5 KB
Line 
1/* The copyright in this software is being made available under the BSD
2 * License, included below. This software may be subject to other third party
3 * and contributor rights, including patent rights, and no such rights are
4 * granted under this license. 
5 *
6 * Copyright (c) 2010-2013, ITU/ISO/IEC
7 * All rights reserved.
8 *
9 * Redistribution and use in source and binary forms, with or without
10 * modification, are permitted provided that the following conditions are met:
11 *
12 *  * Redistributions of source code must retain the above copyright notice,
13 *    this list of conditions and the following disclaimer.
14 *  * Redistributions in binary form must reproduce the above copyright notice,
15 *    this list of conditions and the following disclaimer in the documentation
16 *    and/or other materials provided with the distribution.
17 *  * Neither the name of the ITU/ISO/IEC nor the names of its contributors may
18 *    be used to endorse or promote products derived from this software without
19 *    specific prior written permission.
20 *
21 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
22 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS
25 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
26 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
27 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
28 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
29 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
30 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
31 * THE POSSIBILITY OF SUCH DAMAGE.
32 */
33
34/** \file     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/TComSampleAdaptiveOffset.h"
49
50Void TDecEntropy::decodeSkipFlag( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth )
51{
52  m_pcEntropyDecoderIf->parseSkipFlag( pcCU, uiAbsPartIdx, uiDepth );
53}
54
55Void TDecEntropy::decodeCUTransquantBypassFlag(TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth )
56{
57  m_pcEntropyDecoderIf->parseCUTransquantBypassFlag( pcCU, uiAbsPartIdx, uiDepth );
58}
59
60/** decode merge flag
61 * \param pcSubCU
62 * \param uiAbsPartIdx
63 * \param uiDepth
64 * \param uiPUIdx
65 * \returns Void
66 */
67Void TDecEntropy::decodeMergeFlag( TComDataCU* pcSubCU, UInt uiAbsPartIdx, UInt uiDepth, UInt uiPUIdx )
68{ 
69  // at least one merge candidate exists
70  m_pcEntropyDecoderIf->parseMergeFlag( pcSubCU, uiAbsPartIdx, uiDepth, uiPUIdx );
71}
72
73/** decode merge index
74 * \param pcCU
75 * \param uiPartIdx
76 * \param uiAbsPartIdx
77 * \param puhInterDirNeighbours pointer to list of inter direction from the casual neighbours
78 * \param pcMvFieldNeighbours pointer to list of motion vector field from the casual neighbours
79 * \param uiDepth
80 * \returns Void
81 */
82Void TDecEntropy::decodeMergeIndex( TComDataCU* pcCU, UInt uiPartIdx, UInt uiAbsPartIdx, UInt uiDepth )
83{
84  UInt uiMergeIndex = 0;
85  m_pcEntropyDecoderIf->parseMergeIndex( pcCU, uiMergeIndex );
86  pcCU->setMergeIndexSubParts( uiMergeIndex, uiAbsPartIdx, uiPartIdx, uiDepth );
87}
88
89#if H_3D_ARP
90Void TDecEntropy::decodeARPW( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth )
91{
92  if( !pcCU->getSlice()->getARPStepNum() || pcCU->isIntra( uiAbsPartIdx ) )
93  {
94    return;
95  }
96
97  if( pcCU->getPartitionSize(uiAbsPartIdx) != SIZE_2Nx2N )
98  {
99    pcCU->setARPWSubParts( 0 , uiAbsPartIdx, uiDepth );
100  }
101  else
102  {
103    m_pcEntropyDecoderIf->parseARPW( pcCU , uiAbsPartIdx , uiDepth );
104  }
105}
106#endif
107
108#if H_3D_IC
109Void TDecEntropy::decodeICFlag( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth )
110{
111  pcCU->setICFlagSubParts( false , uiAbsPartIdx, 0, uiDepth );
112
113  if ( pcCU->isIntra( uiAbsPartIdx ) || ( pcCU->getSlice()->getViewIndex() == 0 ) )
114  {
115    return;
116  }
117
118  if( !pcCU->getSlice()->getApplyIC() )
119    return;
120
121  if( pcCU->isICFlagRequired( uiAbsPartIdx ) )
122    m_pcEntropyDecoderIf->parseICFlag( pcCU, uiAbsPartIdx, uiDepth );
123}
124#endif
125
126Void TDecEntropy::decodeSplitFlag   ( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth )
127{
128  m_pcEntropyDecoderIf->parseSplitFlag( pcCU, uiAbsPartIdx, uiDepth );
129}
130
131Void TDecEntropy::decodePredMode( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth )
132{
133  m_pcEntropyDecoderIf->parsePredMode( pcCU, uiAbsPartIdx, uiDepth );
134}
135
136Void TDecEntropy::decodePartSize( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth )
137{
138  m_pcEntropyDecoderIf->parsePartSize( pcCU, uiAbsPartIdx, uiDepth );
139}
140
141Void TDecEntropy::decodePredInfo    ( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth, TComDataCU* pcSubCU )
142{
143  if( pcCU->isIntra( uiAbsPartIdx ) )                                 // If it is Intra mode, encode intra prediction mode.
144  {
145    decodeIntraDirModeLuma  ( pcCU, uiAbsPartIdx, uiDepth );
146#if H_3D_DIM_SDC
147    if(!pcCU->getSDCFlag(uiAbsPartIdx))
148#endif
149    decodeIntraDirModeChroma( pcCU, uiAbsPartIdx, uiDepth );
150  }
151  else                                                                // if it is Inter mode, encode motion vector and reference index
152  {
153    decodePUWise( pcCU, uiAbsPartIdx, uiDepth, pcSubCU );
154  }
155}
156
157/** Parse I_PCM information.
158 * \param pcCU  pointer to CUpointer to CU
159 * \param uiAbsPartIdx CU index
160 * \param uiDepth CU depth
161 * \returns Void
162 */
163Void TDecEntropy::decodeIPCMInfo( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth )
164{
165  if(!pcCU->getSlice()->getSPS()->getUsePCM()
166    || pcCU->getWidth(uiAbsPartIdx) > (1<<pcCU->getSlice()->getSPS()->getPCMLog2MaxSize())
167    || pcCU->getWidth(uiAbsPartIdx) < (1<<pcCU->getSlice()->getSPS()->getPCMLog2MinSize()) )
168  {
169    return;
170  }
171#if H_3D_DIM_SDC
172  if( pcCU->getSDCFlag(uiAbsPartIdx) )
173  {
174    return;
175  }
176#endif
177 
178  m_pcEntropyDecoderIf->parseIPCMInfo( pcCU, uiAbsPartIdx, uiDepth );
179}
180
181Void TDecEntropy::decodeIntraDirModeLuma  ( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth )
182{
183  m_pcEntropyDecoderIf->parseIntraDirLumaAng( pcCU, uiAbsPartIdx, uiDepth );
184}
185
186Void TDecEntropy::decodeIntraDirModeChroma( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth )
187{
188  m_pcEntropyDecoderIf->parseIntraDirChroma( pcCU, uiAbsPartIdx, uiDepth );
189}
190
191/** decode motion information for every PU block.
192 * \param pcCU
193 * \param uiAbsPartIdx
194 * \param uiDepth
195 * \param pcSubCU
196 * \returns Void
197 */
198Void TDecEntropy::decodePUWise( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth, TComDataCU* pcSubCU )
199{
200  PartSize ePartSize = pcCU->getPartitionSize( uiAbsPartIdx );
201  UInt uiNumPU = ( ePartSize == SIZE_2Nx2N ? 1 : ( ePartSize == SIZE_NxN ? 4 : 2 ) );
202  UInt uiPUOffset = ( g_auiPUOffset[UInt( ePartSize )] << ( ( pcCU->getSlice()->getSPS()->getMaxCUDepth() - uiDepth ) << 1 ) ) >> 4;
203
204#if H_3D_IV_MERGE
205  TComMvField cMvFieldNeighbours[MRG_MAX_NUM_CANDS_MEM << 1]; // double length for mv of both lists
206  UChar uhInterDirNeighbours[MRG_MAX_NUM_CANDS_MEM];
207#else
208  TComMvField cMvFieldNeighbours[MRG_MAX_NUM_CANDS << 1]; // double length for mv of both lists
209  UChar uhInterDirNeighbours[MRG_MAX_NUM_CANDS];
210#endif
211
212  for ( UInt ui = 0; ui < pcCU->getSlice()->getMaxNumMergeCand(); ui++ )
213  {
214    uhInterDirNeighbours[ui] = 0;
215  }
216  Int numValidMergeCand = 0;
217  Bool isMerged = false;
218
219  pcSubCU->copyInterPredInfoFrom( pcCU, uiAbsPartIdx, REF_PIC_LIST_0 );
220  pcSubCU->copyInterPredInfoFrom( pcCU, uiAbsPartIdx, REF_PIC_LIST_1 );
221#if H_3D_IV_MERGE
222  pcSubCU->copyDVInfoFrom( pcCU, uiAbsPartIdx);
223#endif
224  for ( UInt uiPartIdx = 0, uiSubPartIdx = uiAbsPartIdx; uiPartIdx < uiNumPU; uiPartIdx++, uiSubPartIdx += uiPUOffset )
225  {
226#if H_MV_ENC_DEC_TRAC
227    DTRACE_PU_S("=========== prediction_unit ===========\n")
228    // ToDo:
229    //DTRACE_PU("x0", uiLPelX)
230    //DTRACE_PU("x1", uiTPelY)
231#endif
232    decodeMergeFlag( pcCU, uiSubPartIdx, uiDepth, uiPartIdx );
233    if ( pcCU->getMergeFlag( uiSubPartIdx ) )
234    {
235      decodeMergeIndex( pcCU, uiPartIdx, uiSubPartIdx, uiDepth );
236      UInt uiMergeIndex = pcCU->getMergeIndex(uiSubPartIdx);
237#if LGE_SHARP_VSP_INHERIT_F0104
238#if H_3D_IC
239      decodeICFlag( pcCU, uiAbsPartIdx, uiDepth );
240#endif
241#if H_3D_ARP
242      decodeARPW  ( pcCU, uiAbsPartIdx, uiDepth );
243#endif
244#endif
245      if ( pcCU->getSlice()->getPPS()->getLog2ParallelMergeLevelMinus2() && ePartSize != SIZE_2Nx2N && pcSubCU->getWidth( 0 ) <= 8 ) 
246      {
247        pcSubCU->setPartSizeSubParts( SIZE_2Nx2N, 0, uiDepth );
248        if ( !isMerged )
249        {
250#if H_3D_VSP
251          Int vspFlag[MRG_MAX_NUM_CANDS_MEM];
252          memset(vspFlag, 0, sizeof(Int)*MRG_MAX_NUM_CANDS_MEM);
253          InheritedVSPDisInfo inheritedVSPDisInfo[MRG_MAX_NUM_CANDS_MEM];
254#if ETRIKHU_MERGE_REUSE_F0093
255          pcSubCU->initAvailableFlags();
256          pcSubCU->getInterMergeCandidates( 0, 0, cMvFieldNeighbours, uhInterDirNeighbours, numValidMergeCand);
257          pcSubCU->xGetInterMergeCandidates( 0, 0, cMvFieldNeighbours, uhInterDirNeighbours, vspFlag, inheritedVSPDisInfo, numValidMergeCand );
258#else
259          pcSubCU->getInterMergeCandidates( 0, 0, cMvFieldNeighbours, uhInterDirNeighbours, vspFlag, inheritedVSPDisInfo, numValidMergeCand );
260#endif
261          pcCU->setVSPFlagSubParts( vspFlag[uiMergeIndex], uiSubPartIdx, uiPartIdx, uiDepth );
262
263          if(vspFlag[uiMergeIndex])
264          {
265            pcCU->setDvInfoSubParts(inheritedVSPDisInfo[uiMergeIndex].m_acDvInfo, uiSubPartIdx, uiPartIdx, uiDepth);
266          }
267#else
268#if ETRIKHU_MERGE_REUSE_F0093
269          pcSubCU->initAvailableFlags();
270          pcSubCU->getInterMergeCandidates( 0, 0, cMvFieldNeighbours, uhInterDirNeighbours, numValidMergeCand);
271          pcSubCU->xGetInterMergeCandidates( 0, 0, cMvFieldNeighbours, uhInterDirNeighbours, numValidMergeCand );
272
273#else
274          pcSubCU->getInterMergeCandidates( 0, 0, cMvFieldNeighbours, uhInterDirNeighbours, numValidMergeCand );
275#endif
276#endif
277          isMerged = true;
278        }
279        pcSubCU->setPartSizeSubParts( ePartSize, 0, uiDepth );
280      }
281      else
282      {
283        uiMergeIndex = pcCU->getMergeIndex(uiSubPartIdx);
284#if H_3D_VSP
285        Int vspFlag[MRG_MAX_NUM_CANDS_MEM];
286        memset(vspFlag, 0, sizeof(Int)*MRG_MAX_NUM_CANDS_MEM);
287        InheritedVSPDisInfo inheritedVSPDisInfo[MRG_MAX_NUM_CANDS_MEM];
288#if ETRIKHU_MERGE_REUSE_F0093
289        pcSubCU->initAvailableFlags();
290        pcSubCU->getInterMergeCandidates( uiSubPartIdx-uiAbsPartIdx, uiPartIdx, cMvFieldNeighbours, uhInterDirNeighbours, numValidMergeCand, uiMergeIndex );
291        pcSubCU->xGetInterMergeCandidates( uiSubPartIdx-uiAbsPartIdx, uiPartIdx, cMvFieldNeighbours, uhInterDirNeighbours, vspFlag, inheritedVSPDisInfo,numValidMergeCand, uiMergeIndex );
292#else
293        pcSubCU->getInterMergeCandidates( uiSubPartIdx-uiAbsPartIdx, uiPartIdx, cMvFieldNeighbours, uhInterDirNeighbours, vspFlag, inheritedVSPDisInfo,numValidMergeCand, uiMergeIndex );
294#endif
295        pcCU->setVSPFlagSubParts( vspFlag[uiMergeIndex], uiSubPartIdx, uiPartIdx, uiDepth );
296        if(vspFlag[uiMergeIndex])
297        {
298          pcCU->setDvInfoSubParts(inheritedVSPDisInfo[uiMergeIndex].m_acDvInfo, uiSubPartIdx, uiPartIdx, uiDepth);
299        }
300#else
301#if ETRIKHU_MERGE_REUSE_F0093
302        pcSubCU->initAvailableFlags();
303        pcSubCU->getInterMergeCandidates( uiSubPartIdx-uiAbsPartIdx, uiPartIdx, cMvFieldNeighbours, uhInterDirNeighbours, numValidMergeCand, uiMergeIndex );
304        pcSubCU->xGetInterMergeCandidates( uiSubPartIdx-uiAbsPartIdx, uiPartIdx, cMvFieldNeighbours, uhInterDirNeighbours, numValidMergeCand, uiMergeIndex );
305#else
306        pcSubCU->getInterMergeCandidates( uiSubPartIdx-uiAbsPartIdx, uiPartIdx, cMvFieldNeighbours, uhInterDirNeighbours, numValidMergeCand, uiMergeIndex );
307#endif
308#endif
309      }
310      pcCU->setInterDirSubParts( uhInterDirNeighbours[uiMergeIndex], uiSubPartIdx, uiPartIdx, uiDepth );
311
312      TComMv cTmpMv( 0, 0 );
313      for ( UInt uiRefListIdx = 0; uiRefListIdx < 2; uiRefListIdx++ )
314      {       
315        if ( pcCU->getSlice()->getNumRefIdx( RefPicList( uiRefListIdx ) ) > 0 )
316        {
317          pcCU->setMVPIdxSubParts( 0, RefPicList( uiRefListIdx ), uiSubPartIdx, uiPartIdx, uiDepth);
318          pcCU->setMVPNumSubParts( 0, RefPicList( uiRefListIdx ), uiSubPartIdx, uiPartIdx, uiDepth);
319          pcCU->getCUMvField( RefPicList( uiRefListIdx ) )->setAllMvd( cTmpMv, ePartSize, uiSubPartIdx, uiDepth, uiPartIdx );
320          pcCU->getCUMvField( RefPicList( uiRefListIdx ) )->setAllMvField( cMvFieldNeighbours[ 2*uiMergeIndex + uiRefListIdx ], ePartSize, uiSubPartIdx, uiDepth, uiPartIdx );
321        }
322      }
323    }
324    else
325    {
326      decodeInterDirPU( pcCU, uiSubPartIdx, uiDepth, uiPartIdx );
327      for ( UInt uiRefListIdx = 0; uiRefListIdx < 2; uiRefListIdx++ )
328      {       
329        if ( pcCU->getSlice()->getNumRefIdx( RefPicList( uiRefListIdx ) ) > 0 )
330        {
331          decodeRefFrmIdxPU( pcCU,    uiSubPartIdx,              uiDepth, uiPartIdx, RefPicList( uiRefListIdx ) );
332          decodeMvdPU      ( pcCU,    uiSubPartIdx,              uiDepth, uiPartIdx, RefPicList( uiRefListIdx ) );
333          decodeMVPIdxPU   ( pcSubCU, uiSubPartIdx-uiAbsPartIdx, uiDepth, uiPartIdx, RefPicList( uiRefListIdx ) );
334        }
335      }
336#if LGE_SHARP_VSP_INHERIT_F0104
337#if H_3D_IC
338      decodeICFlag( pcCU, uiAbsPartIdx, uiDepth );
339#endif
340#if H_3D_ARP
341      decodeARPW  ( pcCU, uiAbsPartIdx, uiDepth );
342#endif
343#endif
344    }
345#if H_3D_VSP
346    if ( (pcCU->getInterDir(uiSubPartIdx) == 3) && pcSubCU->isBipredRestriction(uiPartIdx) && (pcCU->getVSPFlag(uiSubPartIdx) == false))
347#else
348    if ( (pcCU->getInterDir(uiSubPartIdx) == 3) && pcSubCU->isBipredRestriction(uiPartIdx) )
349#endif
350    {
351      pcCU->getCUMvField( REF_PIC_LIST_1 )->setAllMv( TComMv(0,0), ePartSize, uiSubPartIdx, uiDepth, uiPartIdx);
352      pcCU->getCUMvField( REF_PIC_LIST_1 )->setAllRefIdx( -1, ePartSize, uiSubPartIdx, uiDepth, uiPartIdx);
353      pcCU->setInterDirSubParts( 1, uiSubPartIdx, uiPartIdx, uiDepth);
354    }
355  }
356  return;
357}
358
359/** decode inter direction for a PU block
360 * \param pcCU
361 * \param uiAbsPartIdx
362 * \param uiDepth
363 * \param uiPartIdx
364 * \returns Void
365 */
366Void TDecEntropy::decodeInterDirPU( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth, UInt uiPartIdx )
367{
368  UInt uiInterDir;
369
370  if ( pcCU->getSlice()->isInterP() )
371  {
372    uiInterDir = 1;
373  }
374  else
375  {
376    m_pcEntropyDecoderIf->parseInterDir( pcCU, uiInterDir, uiAbsPartIdx );
377  }
378
379  pcCU->setInterDirSubParts( uiInterDir, uiAbsPartIdx, uiPartIdx, uiDepth );
380}
381
382Void TDecEntropy::decodeRefFrmIdxPU( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth, UInt uiPartIdx, RefPicList eRefList )
383{
384  Int iRefFrmIdx = 0;
385  Int iParseRefFrmIdx = pcCU->getInterDir( uiAbsPartIdx ) & ( 1 << eRefList );
386
387  if ( pcCU->getSlice()->getNumRefIdx( eRefList ) > 1 && iParseRefFrmIdx )
388  {
389    m_pcEntropyDecoderIf->parseRefFrmIdx( pcCU, iRefFrmIdx, eRefList );
390  }
391  else if ( !iParseRefFrmIdx )
392  {
393    iRefFrmIdx = NOT_VALID;
394  }
395  else
396  {
397    iRefFrmIdx = 0;
398  }
399
400  PartSize ePartSize = pcCU->getPartitionSize( uiAbsPartIdx );
401  pcCU->getCUMvField( eRefList )->setAllRefIdx( iRefFrmIdx, ePartSize, uiAbsPartIdx, uiDepth, uiPartIdx );
402}
403
404/** decode motion vector difference for a PU block
405 * \param pcCU
406 * \param uiAbsPartIdx
407 * \param uiDepth
408 * \param uiPartIdx
409 * \param eRefList
410 * \returns Void
411 */
412Void TDecEntropy::decodeMvdPU( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth, UInt uiPartIdx, RefPicList eRefList )
413{
414  if ( pcCU->getInterDir( uiAbsPartIdx ) & ( 1 << eRefList ) )
415  {
416    m_pcEntropyDecoderIf->parseMvd( pcCU, uiAbsPartIdx, uiPartIdx, uiDepth, eRefList );
417  }
418}
419
420Void TDecEntropy::decodeMVPIdxPU( TComDataCU* pcSubCU, UInt uiPartAddr, UInt uiDepth, UInt uiPartIdx, RefPicList eRefList )
421{
422  Int iMVPIdx = -1;
423
424  TComMv cZeroMv( 0, 0 );
425  TComMv cMv     = cZeroMv;
426  Int    iRefIdx = -1;
427
428  TComCUMvField* pcSubCUMvField = pcSubCU->getCUMvField( eRefList );
429  AMVPInfo* pAMVPInfo = pcSubCUMvField->getAMVPInfo();
430
431  iRefIdx = pcSubCUMvField->getRefIdx(uiPartAddr);
432  cMv = cZeroMv;
433
434  if ( (pcSubCU->getInterDir(uiPartAddr) & ( 1 << eRefList )) )
435  {
436    m_pcEntropyDecoderIf->parseMVPIdx( iMVPIdx );
437#if H_MV_ENC_DEC_TRAC
438#if ENC_DEC_TRACE
439    if ( eRefList == REF_PIC_LIST_0 )
440    {
441      DTRACE_PU("mvp_l0_flag", iMVPIdx)
442    }
443    else
444    {
445      DTRACE_PU("mvp_l1_flag", iMVPIdx)
446    }
447#endif
448#endif
449  }
450  pcSubCU->fillMvpCand(uiPartIdx, uiPartAddr, eRefList, iRefIdx, pAMVPInfo);
451  pcSubCU->setMVPNumSubParts(pAMVPInfo->iN, eRefList, uiPartAddr, uiPartIdx, uiDepth);
452  pcSubCU->setMVPIdxSubParts( iMVPIdx, eRefList, uiPartAddr, uiPartIdx, uiDepth );
453  if ( iRefIdx >= 0 )
454  {
455    m_pcPrediction->getMvPredAMVP( pcSubCU, uiPartIdx, uiPartAddr, eRefList, cMv);
456    cMv += pcSubCUMvField->getMvd( uiPartAddr );
457  }
458
459  PartSize ePartSize = pcSubCU->getPartitionSize( uiPartAddr );
460  pcSubCU->getCUMvField( eRefList )->setAllMv(cMv, ePartSize, uiPartAddr, 0, uiPartIdx);
461}
462
463Void TDecEntropy::xDecodeTransform( TComDataCU* pcCU, UInt offsetLuma, UInt offsetChroma, UInt uiAbsPartIdx, UInt uiDepth, UInt width, UInt height, UInt uiTrIdx, Bool& bCodeDQP)
464{
465  UInt uiSubdiv;
466  const UInt uiLog2TrafoSize = g_aucConvertToBit[pcCU->getSlice()->getSPS()->getMaxCUWidth()]+2 - uiDepth;
467
468  if(uiTrIdx==0)
469  {
470    m_bakAbsPartIdxCU = uiAbsPartIdx;
471  }
472  if( uiLog2TrafoSize == 2 )
473  {
474    UInt partNum = pcCU->getPic()->getNumPartInCU() >> ( ( uiDepth - 1 ) << 1 );
475    if( ( uiAbsPartIdx % partNum ) == 0 )
476    {
477      m_uiBakAbsPartIdx   = uiAbsPartIdx;
478      m_uiBakChromaOffset = offsetChroma;
479    }
480  }
481  if( pcCU->getPredictionMode(uiAbsPartIdx) == MODE_INTRA && pcCU->getPartitionSize(uiAbsPartIdx) == SIZE_NxN && uiDepth == pcCU->getDepth(uiAbsPartIdx) )
482  {
483    uiSubdiv = 1;
484  }
485  else if( (pcCU->getSlice()->getSPS()->getQuadtreeTUMaxDepthInter() == 1) && (pcCU->getPredictionMode(uiAbsPartIdx) == MODE_INTER) && ( pcCU->getPartitionSize(uiAbsPartIdx) != SIZE_2Nx2N ) && (uiDepth == pcCU->getDepth(uiAbsPartIdx)) )
486  {
487    uiSubdiv = (uiLog2TrafoSize > pcCU->getQuadtreeTULog2MinSizeInCU(uiAbsPartIdx));
488  }
489  else if( uiLog2TrafoSize > pcCU->getSlice()->getSPS()->getQuadtreeTULog2MaxSize() )
490  {
491    uiSubdiv = 1;
492  }
493  else if( uiLog2TrafoSize == pcCU->getSlice()->getSPS()->getQuadtreeTULog2MinSize() )
494  {
495    uiSubdiv = 0;
496  }
497  else if( uiLog2TrafoSize == pcCU->getQuadtreeTULog2MinSizeInCU(uiAbsPartIdx) )
498  {
499    uiSubdiv = 0;
500  }
501  else
502  {
503    assert( uiLog2TrafoSize > pcCU->getQuadtreeTULog2MinSizeInCU(uiAbsPartIdx) );
504    m_pcEntropyDecoderIf->parseTransformSubdivFlag( uiSubdiv, 5 - uiLog2TrafoSize );
505  }
506 
507  const UInt uiTrDepth = uiDepth - pcCU->getDepth( uiAbsPartIdx );
508  {
509    const Bool bFirstCbfOfCU = uiTrDepth == 0;
510    if( bFirstCbfOfCU )
511    {
512      pcCU->setCbfSubParts( 0, TEXT_CHROMA_U, uiAbsPartIdx, uiDepth );
513      pcCU->setCbfSubParts( 0, TEXT_CHROMA_V, uiAbsPartIdx, uiDepth );
514    }
515    if( bFirstCbfOfCU || uiLog2TrafoSize > 2 )
516    {
517      if( bFirstCbfOfCU || pcCU->getCbf( uiAbsPartIdx, TEXT_CHROMA_U, uiTrDepth - 1 ) )
518      {
519        m_pcEntropyDecoderIf->parseQtCbf( pcCU, uiAbsPartIdx, TEXT_CHROMA_U, uiTrDepth, uiDepth );
520      }
521      if( bFirstCbfOfCU || pcCU->getCbf( uiAbsPartIdx, TEXT_CHROMA_V, uiTrDepth - 1 ) )
522      {
523        m_pcEntropyDecoderIf->parseQtCbf( pcCU, uiAbsPartIdx, TEXT_CHROMA_V, uiTrDepth, uiDepth );
524      }
525    }
526    else
527    {
528      pcCU->setCbfSubParts( pcCU->getCbf( uiAbsPartIdx, TEXT_CHROMA_U, uiTrDepth - 1 ) << uiTrDepth, TEXT_CHROMA_U, uiAbsPartIdx, uiDepth );
529      pcCU->setCbfSubParts( pcCU->getCbf( uiAbsPartIdx, TEXT_CHROMA_V, uiTrDepth - 1 ) << uiTrDepth, TEXT_CHROMA_V, uiAbsPartIdx, uiDepth );
530    }
531  }
532 
533  if( uiSubdiv )
534  {
535    UInt size;
536    width  >>= 1;
537    height >>= 1;
538    size = width*height;
539    uiTrIdx++;
540    ++uiDepth;
541    const UInt uiQPartNum = pcCU->getPic()->getNumPartInCU() >> (uiDepth << 1);
542    const UInt uiStartAbsPartIdx = uiAbsPartIdx;
543    UInt uiYCbf = 0;
544    UInt uiUCbf = 0;
545    UInt uiVCbf = 0;
546   
547    for( Int i = 0; i < 4; i++ )
548    {
549      xDecodeTransform( pcCU, offsetLuma, offsetChroma, uiAbsPartIdx, uiDepth, width, height, uiTrIdx, bCodeDQP );
550      uiYCbf |= pcCU->getCbf( uiAbsPartIdx, TEXT_LUMA, uiTrDepth+1 );
551      uiUCbf |= pcCU->getCbf( uiAbsPartIdx, TEXT_CHROMA_U, uiTrDepth+1 );
552      uiVCbf |= pcCU->getCbf( uiAbsPartIdx, TEXT_CHROMA_V, uiTrDepth+1 );
553      uiAbsPartIdx += uiQPartNum;
554      offsetLuma += size;  offsetChroma += (size>>2);
555    }
556   
557    for( UInt ui = 0; ui < 4 * uiQPartNum; ++ui )
558    {
559      pcCU->getCbf( TEXT_LUMA     )[uiStartAbsPartIdx + ui] |= uiYCbf << uiTrDepth;
560      pcCU->getCbf( TEXT_CHROMA_U )[uiStartAbsPartIdx + ui] |= uiUCbf << uiTrDepth;
561      pcCU->getCbf( TEXT_CHROMA_V )[uiStartAbsPartIdx + ui] |= uiVCbf << uiTrDepth;
562    }
563  }
564  else
565  {
566    assert( uiDepth >= pcCU->getDepth( uiAbsPartIdx ) );
567    pcCU->setTrIdxSubParts( uiTrDepth, uiAbsPartIdx, uiDepth );
568   
569#if !H_MV_ENC_DEC_TRAC
570    {
571      DTRACE_CABAC_VL( g_nSymbolCounter++ );
572      DTRACE_CABAC_T( "\tTrIdx: abspart=" );
573      DTRACE_CABAC_V( uiAbsPartIdx );
574      DTRACE_CABAC_T( "\tdepth=" );
575      DTRACE_CABAC_V( uiDepth );
576      DTRACE_CABAC_T( "\ttrdepth=" );
577      DTRACE_CABAC_V( uiTrDepth );
578      DTRACE_CABAC_T( "\n" );
579    }
580#endif
581   
582    pcCU->setCbfSubParts ( 0, TEXT_LUMA, uiAbsPartIdx, uiDepth );
583    if( pcCU->getPredictionMode(uiAbsPartIdx) != MODE_INTRA && uiDepth == pcCU->getDepth( uiAbsPartIdx ) && !pcCU->getCbf( uiAbsPartIdx, TEXT_CHROMA_U, 0 ) && !pcCU->getCbf( uiAbsPartIdx, TEXT_CHROMA_V, 0 ) )
584    {
585      pcCU->setCbfSubParts( 1 << uiTrDepth, TEXT_LUMA, uiAbsPartIdx, uiDepth );
586    }
587    else
588    {
589      m_pcEntropyDecoderIf->parseQtCbf( pcCU, uiAbsPartIdx, TEXT_LUMA, uiTrDepth, uiDepth );
590    }
591
592
593    // transform_unit begin
594    UInt cbfY = pcCU->getCbf( uiAbsPartIdx, TEXT_LUMA    , uiTrIdx );
595    UInt cbfU = pcCU->getCbf( uiAbsPartIdx, TEXT_CHROMA_U, uiTrIdx );
596    UInt cbfV = pcCU->getCbf( uiAbsPartIdx, TEXT_CHROMA_V, uiTrIdx );
597    if( uiLog2TrafoSize == 2 )
598    {
599      UInt partNum = pcCU->getPic()->getNumPartInCU() >> ( ( uiDepth - 1 ) << 1 );
600      if( ( uiAbsPartIdx % partNum ) == (partNum - 1) )
601      {
602        cbfU = pcCU->getCbf( m_uiBakAbsPartIdx, TEXT_CHROMA_U, uiTrIdx );
603        cbfV = pcCU->getCbf( m_uiBakAbsPartIdx, TEXT_CHROMA_V, uiTrIdx );
604      }
605    }
606    if ( cbfY || cbfU || cbfV )
607    {
608      // dQP: only for LCU
609      if ( pcCU->getSlice()->getPPS()->getUseDQP() )
610      {
611        if ( bCodeDQP )
612        {
613          decodeQP( pcCU, m_bakAbsPartIdxCU);
614          bCodeDQP = false;
615        }
616      }
617    }
618    if( cbfY )
619    {
620      Int trWidth = width;
621      Int trHeight = height;
622      m_pcEntropyDecoderIf->parseCoeffNxN( pcCU, (pcCU->getCoeffY()+offsetLuma), uiAbsPartIdx, trWidth, trHeight, uiDepth, TEXT_LUMA );
623    }
624    if( uiLog2TrafoSize > 2 )
625    {
626      Int trWidth = width >> 1;
627      Int trHeight = height >> 1;
628      if( cbfU )
629      {
630        m_pcEntropyDecoderIf->parseCoeffNxN( pcCU, (pcCU->getCoeffCb()+offsetChroma), uiAbsPartIdx, trWidth, trHeight, uiDepth, TEXT_CHROMA_U );
631      }
632      if( cbfV )
633      {
634        m_pcEntropyDecoderIf->parseCoeffNxN( pcCU, (pcCU->getCoeffCr()+offsetChroma), uiAbsPartIdx, trWidth, trHeight, uiDepth, TEXT_CHROMA_V );
635      }
636    }
637    else
638    {
639      UInt partNum = pcCU->getPic()->getNumPartInCU() >> ( ( uiDepth - 1 ) << 1 );
640      if( ( uiAbsPartIdx % partNum ) == (partNum - 1) )
641      {
642        Int trWidth = width;
643        Int trHeight = height;
644        if( cbfU )
645        {
646          m_pcEntropyDecoderIf->parseCoeffNxN( pcCU, (pcCU->getCoeffCb()+m_uiBakChromaOffset), m_uiBakAbsPartIdx, trWidth, trHeight, uiDepth, TEXT_CHROMA_U );
647        }
648        if( cbfV )
649        {
650          m_pcEntropyDecoderIf->parseCoeffNxN( pcCU, (pcCU->getCoeffCr()+m_uiBakChromaOffset), m_uiBakAbsPartIdx, trWidth, trHeight, uiDepth, TEXT_CHROMA_V );
651        }
652      }
653    }
654    // transform_unit end
655  }
656}
657
658Void TDecEntropy::decodeQP          ( TComDataCU* pcCU, UInt uiAbsPartIdx )
659{
660  if ( pcCU->getSlice()->getPPS()->getUseDQP() )
661  {
662    m_pcEntropyDecoderIf->parseDeltaQP( pcCU, uiAbsPartIdx, pcCU->getDepth( uiAbsPartIdx ) );
663  }
664}
665
666
667/** decode coefficients
668 * \param pcCU
669 * \param uiAbsPartIdx
670 * \param uiDepth
671 * \param uiWidth
672 * \param uiHeight
673 * \returns Void
674 */
675Void TDecEntropy::decodeCoeff( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth, UInt uiWidth, UInt uiHeight, Bool& bCodeDQP )
676{
677  UInt uiMinCoeffSize = pcCU->getPic()->getMinCUWidth()*pcCU->getPic()->getMinCUHeight();
678  UInt uiLumaOffset   = uiMinCoeffSize*uiAbsPartIdx;
679  UInt uiChromaOffset = uiLumaOffset>>2;
680 
681#if H_3D_DIM_SDC
682  if( pcCU->getSDCFlag( uiAbsPartIdx ) )
683  {
684    assert( pcCU->getPartitionSize(uiAbsPartIdx) == SIZE_2Nx2N );
685    assert( pcCU->getTransformIdx(uiAbsPartIdx) == 0 );
686    assert( pcCU->getCbf(uiAbsPartIdx, TEXT_LUMA) == 1 );
687    assert( pcCU->getCbf(uiAbsPartIdx, TEXT_CHROMA_U) == 1 );
688    assert( pcCU->getCbf(uiAbsPartIdx, TEXT_CHROMA_V) == 1 );
689    return;
690  }
691#endif
692 
693#if H_3D_INTER_SDC
694  if( pcCU->getInterSDCFlag( uiAbsPartIdx ) )
695  {
696    assert( !pcCU->isSkipped( uiAbsPartIdx ) );
697    assert( !pcCU->isIntra( uiAbsPartIdx) );
698    assert( pcCU->getSlice()->getIsDepth() );
699
700    decodeInterSDCResidualData( pcCU, uiAbsPartIdx, uiDepth );
701    return;
702  }
703#endif
704
705  if( pcCU->isIntra(uiAbsPartIdx) )
706  {
707  }
708  else
709  {
710    UInt uiQtRootCbf = 1;
711    if( !( pcCU->getPartitionSize( uiAbsPartIdx) == SIZE_2Nx2N && pcCU->getMergeFlag( uiAbsPartIdx ) ) )
712    {
713      m_pcEntropyDecoderIf->parseQtRootCbf( uiAbsPartIdx, uiQtRootCbf );
714    }
715    if ( !uiQtRootCbf )
716    {
717      pcCU->setCbfSubParts( 0, 0, 0, uiAbsPartIdx, uiDepth );
718      pcCU->setTrIdxSubParts( 0 , uiAbsPartIdx, uiDepth );
719      return;
720    }
721   
722  }
723  xDecodeTransform( pcCU, uiLumaOffset, uiChromaOffset, uiAbsPartIdx, uiDepth, uiWidth, uiHeight, 0, bCodeDQP );
724}
725
726#if H_3D_INTER_SDC
727Void TDecEntropy::decodeInterSDCFlag( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth )
728{
729  pcCU->setInterSDCFlagSubParts( false, uiAbsPartIdx, 0, uiDepth);
730
731  if( !pcCU->getSlice()->getVPS()->getInterSDCFlag( pcCU->getSlice()->getLayerIdInVps() ) )
732  {
733    return;
734  }
735
736  if( !pcCU->getSlice()->getIsDepth() || pcCU->isIntra( uiAbsPartIdx ) || pcCU->isSkipped( uiAbsPartIdx ) )
737  {
738    return;
739  }
740
741  m_pcEntropyDecoderIf->parseInterSDCFlag( pcCU, uiAbsPartIdx, uiDepth );
742}
743
744Void TDecEntropy::decodeInterSDCResidualData( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth )
745{
746  if( !pcCU->getSlice()->getVPS()->getInterSDCFlag( pcCU->getSlice()->getLayerIdInVps() ) )
747  {
748    return;
749  }
750
751  if( !pcCU->getSlice()->getIsDepth() || pcCU->isIntra( uiAbsPartIdx ) || !pcCU->getInterSDCFlag( uiAbsPartIdx ) )
752  {
753    return;
754  }
755
756  UInt uiNumSegments = ( pcCU->getPartitionSize( uiAbsPartIdx ) == SIZE_2Nx2N ) ? 1 : ( pcCU->getPartitionSize( uiAbsPartIdx ) == SIZE_NxN ? 4 : 2 );
757
758  // decode residual data for each segment
759  for( UInt uiSeg = 0; uiSeg < uiNumSegments; uiSeg++ )
760  {
761    m_pcEntropyDecoderIf->parseInterSDCResidualData( pcCU, uiAbsPartIdx, uiDepth, uiSeg );
762  }
763}
764#endif
765
766//! \}
Note: See TracBrowser for help on using the repository browser.