source: 3DVCSoftware/trunk/source/Lib/TLibDecoder/TDecTop.h

Last change on this file was 1413, checked in by tech, 6 years ago

Merged HTM-16.2-dev@1412

  • Property svn:eol-style set to native
File size: 16.1 KB
RevLine 
[5]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
[1313]4 * granted under this license.
[5]5 *
[1413]6 * Copyright (c) 2010-2017, ITU/ISO/IEC
[5]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.
[56]17 *  * Neither the name of the ITU/ISO/IEC nor the names of its contributors may
[5]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 */
[2]33
34/** \file     TDecTop.h
35    \brief    decoder class (header)
36*/
37
38#ifndef __TDECTOP__
39#define __TDECTOP__
40
[56]41#include "TLibCommon/CommonDef.h"
42#include "TLibCommon/TComList.h"
43#include "TLibCommon/TComPicYuv.h"
44#include "TLibCommon/TComPic.h"
45#include "TLibCommon/TComTrQuant.h"
[1313]46#include "TLibCommon/TComPrediction.h"
[56]47#include "TLibCommon/SEI.h"
[2]48
49#include "TDecGop.h"
50#include "TDecEntropy.h"
51#include "TDecSbac.h"
52#include "TDecCAVLC.h"
[608]53#include "SEIread.h"
[1413]54#include "TDecConformance.h"
[2]55
[1313]56class InputNALUnit;
[56]57
58//! \ingroup TLibDecoder
59//! \{
60
[2]61// ====================================================================================================================
62// Class definition
63// ====================================================================================================================
64
[1313]65#if NH_MV
[56]66class TAppDecTop;
[608]67#endif
[1313]68#if NH_3D
[2]69class CamParsCollector
70{
71public:
72  CamParsCollector  ();
73  ~CamParsCollector ();
74
[1313]75  Void  init        ( const TComVPS* vps );
76  Void  setCodeScaleOffsetFile( FILE* pCodedScaleOffsetFile ) { m_pCodedScaleOffsetFile = pCodedScaleOffsetFile; };     
[872]77
[2]78  Void  uninit      ();
[1313]79  Void setSlice ( const TComSlice* pcSlice );
[2]80
[608]81  Bool  isInitialized() const     { return m_bInitialized; }
82  Int**** getBaseViewShiftLUTI()  { return m_aiBaseViewShiftLUT;   }
[57]83
[2]84private:
[872]85  Void xResetReceivedIdc( Bool overWriteFlag ); 
[2]86  Void  xOutput     ( Int iPOC );
87
88private:
89  Bool    m_bInitialized;
90  FILE*   m_pCodedScaleOffsetFile;
91
92  Int**   m_aaiCodedOffset;
93  Int**   m_aaiCodedScale;
[872]94 
[1313]95  const TComVPS* m_vps; 
[872]96  Int**    m_receivedIdc; 
97  Int      m_lastPoc; 
98  Int      m_firstReceivedPoc; 
[608]99
[872]100 
[2]101  Bool    m_bCamParsVaryOverTime;
[296]102
103  UInt    m_uiBitDepthForLUT;
104  UInt    m_iLog2Precision;
[1313]105  // UInt    m_uiInputBitDepth;
[608]106
[296]107  // look-up tables
108  Double****   m_adBaseViewShiftLUT;       ///< Disparity LUT
109  Int****      m_aiBaseViewShiftLUT;       ///< Disparity LUT
110  Void xCreateLUTs( UInt uiNumberSourceViews, UInt uiNumberTargetViews, Double****& radLUT, Int****& raiLUT);
111  Void xInitLUTs( UInt uiSourceView, UInt uiTargetView, Int iScale, Int iOffset, Double****& radLUT, Int****& raiLUT);
112  template<class T> Void  xDeleteArray  ( T*& rpt, UInt uiSize1, UInt uiSize2, UInt uiSize3 );
113  template<class T> Void  xDeleteArray  ( T*& rpt, UInt uiSize1, UInt uiSize2 );
114  template<class T> Void  xDeleteArray  ( T*& rpt, UInt uiSize );
115
[2]116};
117
[296]118template <class T>
119Void CamParsCollector::xDeleteArray( T*& rpt, UInt uiSize1, UInt uiSize2, UInt uiSize3 )
120{
121  if( rpt )
122  {
123    for( UInt uiK = 0; uiK < uiSize1; uiK++ )
124    {
125      for( UInt uiL = 0; uiL < uiSize2; uiL++ )
126      {
127        for( UInt uiM = 0; uiM < uiSize3; uiM++ )
128        {
129          delete[] rpt[ uiK ][ uiL ][ uiM ];
130        }
131        delete[] rpt[ uiK ][ uiL ];
132      }
133      delete[] rpt[ uiK ];
134    }
135    delete[] rpt;
136  }
137  rpt = NULL;
138};
139
140
141template <class T>
142Void CamParsCollector::xDeleteArray( T*& rpt, UInt uiSize1, UInt uiSize2 )
143{
144  if( rpt )
145  {
146    for( UInt uiK = 0; uiK < uiSize1; uiK++ )
147    {
148      for( UInt uiL = 0; uiL < uiSize2; uiL++ )
149      {
150        delete[] rpt[ uiK ][ uiL ];
151      }
152      delete[] rpt[ uiK ];
153    }
154    delete[] rpt;
155  }
156  rpt = NULL;
157};
158
159
160template <class T>
161Void CamParsCollector::xDeleteArray( T*& rpt, UInt uiSize )
162{
163  if( rpt )
164  {
165    for( UInt uiK = 0; uiK < uiSize; uiK++ )
166    {
167      delete[] rpt[ uiK ];
168    }
169    delete[] rpt;
170  }
171  rpt = NULL;
172};
173
[1313]174#endif //NH_3D
[2]175/// decoder class
176class TDecTop
177{
178private:
[1321]179  Int                         m_iMaxRefPicNum;
180                             
181  NalUnitType                 m_associatedIRAPType; ///< NAL unit type of the associated IRAP picture
182#if !NH_MV
183  Int                         m_pocCRA;            ///< POC number of the latest CRA picture
184  Int                         m_pocRandomAccess;   ///< POC number of the random access point (the first IDR or CRA picture)
185 
186  TComList<TComPic*>           m_cListPic;         //  Dynamic buffer
187  ParameterSetManager          m_parameterSetManager;  // storage for parameter sets
188#endif
[1313]189
[2]190  TComSlice*              m_apcSlicePilot;
191
[1313]192  SEIMessages             m_SEIs; ///< List of SEI messages that have been received before the first slice and between slices, excluding prefix SEIs...
193
[2]194  // functional classes
195  TComPrediction          m_cPrediction;
196  TComTrQuant             m_cTrQuant;
197  TDecGop                 m_cGopDecoder;
198  TDecSlice               m_cSliceDecoder;
199  TDecCu                  m_cCuDecoder;
200  TDecEntropy             m_cEntropyDecoder;
201  TDecCavlc               m_cCavlcDecoder;
202  TDecSbac                m_cSbacDecoder;
203  TDecBinCABAC            m_cBinCABAC;
[608]204  SEIReader               m_seiReader;
[2]205  TComLoopFilter          m_cLoopFilter;
206  TComSampleAdaptiveOffset m_cSAO;
[1413]207  TDecConformanceCheck    m_conformanceCheck;
[56]208
[608]209  Bool isSkipPictureForBLA(Int& iPOCLastDisplay);
[1321]210#if !NH_MV
[2]211  Bool isRandomAccessSkipPicture(Int& iSkipFrame,  Int& iPOCLastDisplay);
[1313]212#endif
[1321]213
[2]214  TComPic*                m_pcPic;
215  UInt                    m_uiSliceIdx;
[1321]216#if !NH_MV
[56]217  Int                     m_prevPOC;
[1313]218  Int                     m_prevTid0POC;
[1321]219  Bool                    m_bFirstSliceInPicture; 
[2]220  Bool                    m_bFirstSliceInSequence;
[655]221  Bool                    m_prevSliceSkipped;
222  Int                     m_skippedPOC;
[964]223  Bool                    m_bFirstSliceInBitstream;
224  Int                     m_lastPOCNoOutputPriorPics;
225  Bool                    m_isNoOutputPriorPics;
226  Bool                    m_craNoRaslOutputFlag;    //value of variable NoRaslOutputFlag of the last CRA pic
[1321]227#endif
228 
[1313]229#if O0043_BEST_EFFORT_DECODING
230  UInt                    m_forceDecodeBitDepth;
[964]231#endif
[1321]232
233
[1313]234  std::ostream           *m_pDecodedSEIOutputStream;
235
[1321]236#if !NH_MV
[1313]237  Bool                    m_warningMessageSkipPicture;
[1321]238#endif
239
[1413]240#if MCTS_ENC_CHECK
241  Bool                    m_tmctsCheckEnabled;
242
243#endif
244
[1313]245#if NH_MV
[1321]246  // Class interface
247  static ParameterSetManager  m_parameterSetManager;  // storage for parameter sets
248  TComPicLists*           m_dpb; 
249#if NH_3D
250  CamParsCollector*       m_pcCamParsCollector;
[964]251#endif
[655]252
[1321]253  // Layer identification
[608]254  Int                     m_layerId;
[56]255  Int                     m_viewId;
[1396]256#if NH_3D || NH_3D_VSO
[608]257  Int                     m_viewIndex; 
[56]258  Bool                    m_isDepth;
[608]259#endif
[1321]260
261  // Layer set
262  Int                     m_targetOlsIdx; 
263  Int                     m_smallestLayerId; 
264  Bool                    m_isInOwnTargetDecLayerIdList;   
265
266  // Decoding processes
267  DecodingProcess         m_decodingProcess;
268  DecodingProcess         m_decProcPocAndRps;
269
270  // Decoding state
271  Bool*                   m_firstPicInLayerDecodedFlag;   
272   
273  Int                     m_prevPicOrderCnt; 
274  Int                     m_prevTid0PicPicOrderCntMsb;
275  Int                     m_prevTid0PicSlicePicOrderCntLsb;
276 
277  Int*                    m_lastPresentPocResetIdc;
278  Bool*                   m_pocDecrementedInDpbFlag; 
279
280  Int                     m_prevIrapPoc;
281  Int64                   m_prevIrapDecodingOrder;
282  Int64                   m_prevStsaDecOrder;
283  Int                     m_prevStsaTemporalId;
[1179]284#endif
[56]285
[1313]286  std::list<InputNALUnit*> m_prefixSEINALUs; /// Buffered up prefix SEI NAL Units.
[2]287public:
288  TDecTop();
289  virtual ~TDecTop();
[1313]290
[2]291  Void  create  ();
292  Void  destroy ();
293
[1313]294  Void setDecodedPictureHashSEIEnabled(Int enabled) { m_cGopDecoder.setDecodedPictureHashSEIEnabled(enabled); }
[1413]295#if MCTS_ENC_CHECK
296  Void setTMctsCheckEnabled(Bool enabled) { m_tmctsCheckEnabled = enabled; }
297#endif
[608]298  Void  init();
[1321]299#if !NH_MV
[56]300  Bool  decode(InputNALUnit& nalu, Int& iSkipFrame, Int& iPOCLastDisplay);
301  Void  deletePicBuffer();
[1313]302
303  Void  executeLoopFilters(Int& poc, TComList<TComPic*>*& rpcListPic);
304  Void  checkNoOutputPriorPics (TComList<TComPic*>* rpcListPic);
[964]305
306  Bool  getNoOutputPriorPicsFlag () { return m_isNoOutputPriorPics; }
[1313]307  Void  setNoOutputPriorPicsFlag (Bool val) { m_isNoOutputPriorPics = val; }
[1321]308 
[1313]309  Void  setFirstSliceInPicture (bool val)  { m_bFirstSliceInPicture = val; }
[1321]310
[1313]311  Bool  getFirstSliceInSequence ()         { return m_bFirstSliceInSequence; }
312  Void  setFirstSliceInSequence (bool val) { m_bFirstSliceInSequence = val; }
[1321]313#endif
314
[1313]315#if O0043_BEST_EFFORT_DECODING
316  Void  setForceDecodeBitDepth(UInt bitDepth) { m_forceDecodeBitDepth = bitDepth; }
[964]317#endif
[1321]318
[1313]319  Void  setDecodedSEIMessageOutputStream(std::ostream *pOpStream) { m_pDecodedSEIOutputStream = pOpStream; }
320  UInt  getNumberOfChecksumErrorsDetected() const { return m_cGopDecoder.getNumberOfChecksumErrorsDetected(); }
[1321]321
[1313]322#if NH_MV   
[1179]323
[1321]324  /////////////////////////
325  // For access from TAppDecTop
326  /////////////////////////
[1313]327
[1321]328  // Non VCL decoding
329  Bool       decodeNonVclNalu            ( InputNALUnit& nalu );                                   
330                                   
331  // Start picture decoding         
332  Int        preDecodePoc                ( Bool firstPicInLayerDecodedFlag, Bool isFstPicOfAllLayOfPocResetPer, Bool isPocResettingPicture ); 
333  Void       inferPocResetPeriodId       ( );
334  Void       decodeSliceHeader           ( InputNALUnit &nalu );   
335
336  // Picture decoding
337  Void       activatePSsAndInitPicOrSlice( TComPic* newPic ); 
338  Void       decodePocAndRps             ( );
339  Void       genUnavailableRefPics       ( );                               
340  Void       decodeSliceSegment          ( InputNALUnit &nalu );
341                                   
342  // End Picture decoding           
343  Void       executeLoopFilters          ( );
344  Void       finalizePic( );
345 
346  //////////////////////////
347  // For access from slice
348  /////////////////////////
349  Void       initFromActiveVps           ( const TComVPS* vps );
350
351  //////////////////////////
352  // General access
353  /////////////////////////
354 
355  // Picture identification
356  Void       setLayerId            ( Int layer )       { m_layerId = layer;   }
357  Int        getLayerId            ( )                 { return m_layerId;    }
358  Void       setViewId             ( Int viewId )      { m_viewId  = viewId;  }
359  Int        getViewId             ( )                 { return m_viewId;     } 
360#if NH_3D   
361  Void       setViewIndex          ( Int viewIndex )   { m_viewIndex  = viewIndex;  }
362  Int        getViewIndex          ( )                 { return m_viewIndex;     } 
363  Void       setIsDepth            ( Bool isDepth )    { m_isDepth = isDepth; }
364  Bool       getIsDepth            ( )                 { return m_isDepth;    }
[21]365#endif
[1321]366
367  // Classes
368  Void       setDpb                ( TComPicLists* picLists) { m_dpb = picLists; }
369#if NH_3D                                       
370  Void       setCamParsCollector   ( CamParsCollector* pcCamParsCollector ) { m_pcCamParsCollector = pcCamParsCollector; }
[1179]371#endif
[1313]372
[1321]373  // Slice pilot access
374  TComSlice* getSlicePilot                ( )               { return m_apcSlicePilot; }
375                                                                         
376  // Decoding state                                                     
377  Bool      getFirstSliceSegementInPicFlag( );             
378  Void      setFirstPicInLayerDecodedFlag(Bool* val )      { m_firstPicInLayerDecodedFlag = val;  }
379  Void      setPocDecrementedInDPBFlag   (Bool* val )      { m_pocDecrementedInDpbFlag = val;  } 
380  Void      setLastPresentPocResetIdc    (Int*  val )      { m_lastPresentPocResetIdc  = val;  }
381                                                           
382  // Layer sets                                                         
383  Void      setTargetOlsIdx        ( Int targetOlsIdx )    { m_targetOlsIdx = targetOlsIdx; }   
384  Int       getTargetOlsIdx        ( )                     { return m_targetOlsIdx; }   
385  Int       getSmallestLayerId     ( )                     { return m_smallestLayerId; }   
386  Bool      getIsInOwnTargetDecLayerIdList()               { return m_isInOwnTargetDecLayerIdList; }
387                                                                         
388  // Decoding processes identification                                   
389  Bool      decProcClause8( )                              { return ( m_decodingProcess == CLAUSE_8 ); }
390  Bool      decProcAnnexF ( )                              { return ( decProcAnnexG() || decProcAnnexH() || decProcAnnexI() ); }
391  Bool      decProcAnnexG ( )                              { return ( m_decodingProcess == ANNEX_G || decProcAnnexI() ); }
392  Bool      decProcAnnexH ( )                              { return ( m_decodingProcess == ANNEX_H  ); }
393  Bool      decProcAnnexI ( )                              { return ( m_decodingProcess == ANNEX_I  ); }
394                                                                         
395  DecodingProcess getDecodingProcess ( ) const                   { return m_decodingProcess;                }
396  Void      setDecProcPocAndRps( DecodingProcess decProc ) { m_decProcPocAndRps = decProc; }   
397#endif
398
[2]399protected:
[5]400
[1321]401#if !NH_MV
402  Void      xGetNewPicBuffer  (const TComSPS &sps, const TComPPS &pps, TComPic*& rpcPic, const UInt temporalLayer);
403  Void      xCreateLostPicture (Int iLostPOC);
[56]404  Void      xActivateParameterSets();
[1321]405  Bool      xDecodeSlice                   (InputNALUnit &nalu, Int &iSkipFrame, Int iPOCLastDisplay);
406#endif
[738]407
[1313]408  Void      xDecodeVPS(const std::vector<UChar> &naluData);
409  Void      xDecodeSPS(const std::vector<UChar> &naluData);
[1321]410  Void      xDecodePPS(const std::vector<UChar> &naluData); 
411#if !NH_MV
[1313]412  Void      xUpdatePreviousTid0POC( TComSlice *pSlice ) { if ((pSlice->getTLayer()==0) && (pSlice->isReferenceNalu() && (pSlice->getNalUnitType()!=NAL_UNIT_CODED_SLICE_RASL_R)&& (pSlice->getNalUnitType()!=NAL_UNIT_CODED_SLICE_RADL_R))) { m_prevTid0POC=pSlice->getPOC(); } }
[1321]413#endif
[56]414
[1313]415  Void      xParsePrefixSEImessages();
[1413]416#if MCTS_ENC_CHECK
417  Void      xAnalysePrefixSEImessages();
418#endif
[1313]419  Void      xParsePrefixSEIsForUnknownVCLNal();
420
[1321]421#if NH_MV
422  // POC
423  Void      x831DecProcForPicOrderCount         ( );
424  Void      xF831DecProcForPicOrderCount        ( );
425  Int       xGetCurrMsb                         ( Int cl, Int pl, Int pm, Int ml ); 
426
427  //RPS                                         
428  Void      x832DecProcForRefPicSet             ( Bool annexFModifications ); 
429  Void      xF832DecProcForRefPicSet            ( );
430  Void      xG813DecProcForInterLayerRefPicSet  ( );
431
432  // Unavailable Pics
433  Void      x8331GenDecProcForGenUnavilRefPics  ( );
434  TComPic*  x8332GenOfOneUnavailPic             ( Bool calledFromCl8331 );
435  Void      xF817DecProcForGenUnavRefPicForPicsFrstInDecOrderInLay();
436  Void      xF833DecProcForGenUnavRefPics       ( ); 
437  Void      xCheckUnavailableRefPics            ( ); 
438#endif
439
[2]440};// END CLASS DEFINITION TDecTop
441
442
[56]443//! \}
[2]444#endif // __TDECTOP__
445
Note: See TracBrowser for help on using the repository browser.