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

Last change on this file since 1327 was 1321, checked in by tech, 9 years ago

Merged 15.0-dev0@1320.

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