source: 3DVCSoftware/branches/HTM-15.2-dev/source/Lib/TLibCommon/TComPic.h @ 1360

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

Update to HM-16.7.

  • Property svn:eol-style set to native
File size: 21.1 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-2015, 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     TComPic.h
35    \brief    picture class (header)
36*/
37
38#ifndef __TCOMPIC__
39#define __TCOMPIC__
40
41// Include files
42#include "CommonDef.h"
43#include "TComPicSym.h"
44#include "TComPicYuv.h"
45#include "TComBitStream.h"
46
47//! \ingroup TLibCommon
48//! \{
49
50// ====================================================================================================================
51// Class definition
52// ====================================================================================================================
53
54/// picture class (symbol + YUV buffers)
55
56
57
58#if NH_MV
59class TComPic; 
60
61class TComDecodedRps
62{
63public: 
64
65  TComDecodedRps()
66  {
67    m_refPicSetsCurr[0] = &m_refPicSetStCurrBefore;
68    m_refPicSetsCurr[1] = &m_refPicSetStCurrAfter ;
69    m_refPicSetsCurr[2] = &m_refPicSetLtCurr      ; 
70
71    m_refPicSetsLt  [0] = &m_refPicSetLtCurr      ; 
72    m_refPicSetsLt  [1] = &m_refPicSetLtFoll      ;
73
74    m_refPicSetsAll [0] = &m_refPicSetStCurrBefore;
75    m_refPicSetsAll [1] = &m_refPicSetStCurrAfter ;
76    m_refPicSetsAll [2] = &m_refPicSetStFoll      ;
77    m_refPicSetsAll [3] = &m_refPicSetLtCurr      ;
78    m_refPicSetsAll [4] = &m_refPicSetLtFoll      ;
79  };   
80
81  std::vector<Int>       m_pocStCurrBefore;
82  std::vector<Int>       m_pocStCurrAfter;
83  std::vector<Int>       m_pocStFoll;   
84  std::vector<Int>       m_pocLtCurr;
85  std::vector<Int>       m_pocLtFoll; 
86
87  Int                    m_numPocStCurrBefore;
88  Int                    m_numPocStCurrAfter;
89  Int                    m_numPocStFoll;
90  Int                    m_numPocLtCurr;
91  Int                    m_numPocLtFoll;
92
93  std::vector<TComPic*>  m_refPicSetStCurrBefore; 
94  std::vector<TComPic*>  m_refPicSetStCurrAfter; 
95  std::vector<TComPic*>  m_refPicSetStFoll; 
96  std::vector<TComPic*>  m_refPicSetLtCurr; 
97  std::vector<TComPic*>  m_refPicSetLtFoll;   
98
99  std::vector<TComPic*>* m_refPicSetsCurr[3];
100  std::vector<TComPic*>* m_refPicSetsLt  [2];
101  std::vector<TComPic*>* m_refPicSetsAll [5];
102
103  // Annex F
104  Int                    m_numActiveRefLayerPics0;
105  Int                    m_numActiveRefLayerPics1;     
106
107  std::vector<TComPic*>  m_refPicSetInterLayer0;
108  std::vector<TComPic*>  m_refPicSetInterLayer1;
109};
110#endif
111
112class TComPic
113{
114public:
115  typedef enum { PIC_YUV_ORG=0, PIC_YUV_REC=1, PIC_YUV_TRUE_ORG=2, NUM_PIC_YUV=3 } PIC_YUV_T;
116     // TRUE_ORG is the input file without any pre-encoder colour space conversion (but with possible bit depth increment)
117  TComPicYuv*   getPicYuvTrueOrg()        { return  m_apcPicYuv[PIC_YUV_TRUE_ORG]; }
118
119private:
120  UInt                  m_uiTLayer;               //  Temporal layer
121  Bool                  m_bUsedByCurr;            //  Used by current picture
122  Bool                  m_bIsLongTerm;            //  IS long term picture
123  TComPicSym            m_picSym;                 //  Symbol
124  TComPicYuv*           m_apcPicYuv[NUM_PIC_YUV];
125
126  TComPicYuv*           m_pcPicYuvPred;           //  Prediction
127  TComPicYuv*           m_pcPicYuvResi;           //  Residual
128  Bool                  m_bReconstructed;
129  Bool                  m_bNeededForOutput;
130
131  UInt                  m_uiCurrSliceIdx;         // Index of current slice
132  Bool                  m_bCheckLTMSB;
133
134  Bool                  m_isTop;
135  Bool                  m_isField;
136
137  std::vector<std::vector<TComDataCU*> > m_vSliceCUDataLink;
138
139  SEIMessages  m_SEIs; ///< Any SEI messages that have been received.  If !NULL we own the object.
140#if NH_MV
141  Int                   m_layerId;
142  Int                   m_viewId;
143  Bool                  m_bPicOutputFlag;                // Semantics variable
144  Bool                  m_hasGeneratedRefPics; 
145  Bool                  m_isPocResettingPic; 
146  Bool                  m_isFstPicOfAllLayOfPocResetPer; 
147  Int64                 m_decodingOrder; 
148  Bool                  m_noRaslOutputFlag; 
149  Bool                  m_noClrasOutputFlag; 
150  Int                   m_picLatencyCount; 
151  Bool                  m_isGenerated;
152  Bool                  m_isGeneratedCl833; 
153  Bool                  m_activatesNewVps;
154  TComDecodedRps        m_decodedRps;
155#endif
156#if NH_3D
157  Int                   m_viewIndex;
158  Bool                  m_isDepth;
159  Int**                 m_aaiCodedScale;
160  Int**                 m_aaiCodedOffset;
161#if NH_3D_QTLPC
162  Bool                  m_bReduceBitsQTL;
163#endif
164#if NH_3D_NBDV
165  UInt                   m_uiRapRefIdx;
166  RefPicList             m_eRapRefList;
167  Int                    m_iNumDdvCandPics;
168  Bool                   m_abTIVRINCurrRL [2][2][MAX_NUM_REF]; //whether an inter-view reference picture with the same view index of the inter-view reference picture of temporal reference picture of current picture exists in current reference picture lists
169  Int                    m_aiTexToDepRef  [2][MAX_NUM_REF];
170#endif
171#endif
172public:
173  TComPic();
174  virtual ~TComPic();
175
176  Void          create( const TComSPS &sps, const TComPPS &pps, const Bool bIsVirtual /*= false*/ );
177
178  virtual Void  destroy();
179
180  UInt          getTLayer() const               { return m_uiTLayer;   }
181  Void          setTLayer( UInt uiTLayer ) { m_uiTLayer = uiTLayer; }
182
183  Bool          getUsedByCurr() const            { return m_bUsedByCurr; }
184  Void          setUsedByCurr( Bool bUsed ) { m_bUsedByCurr = bUsed; }
185  Bool          getIsLongTerm() const            { return m_bIsLongTerm; }
186  Void          setIsLongTerm( Bool lt ) { m_bIsLongTerm = lt; }
187  Void          setCheckLTMSBPresent     (Bool b ) {m_bCheckLTMSB=b;}
188  Bool          getCheckLTMSBPresent     () { return m_bCheckLTMSB;}
189
190  TComPicSym*   getPicSym()           { return  &m_picSym;    }
191  const TComPicSym* getPicSym() const { return  &m_picSym;    }
192  TComSlice*    getSlice(Int i)       { return  m_picSym.getSlice(i);  }
193  Int           getPOC() const        { return  m_picSym.getSlice(m_uiCurrSliceIdx)->getPOC();  }
194  TComDataCU*   getCtu( UInt ctuRsAddr )           { return  m_picSym.getCtu( ctuRsAddr ); }
195  const TComDataCU* getCtu( UInt ctuRsAddr ) const { return  m_picSym.getCtu( ctuRsAddr ); }
196
197  TComPicYuv*   getPicYuvOrg()        { return  m_apcPicYuv[PIC_YUV_ORG]; }
198  TComPicYuv*   getPicYuvRec()        { return  m_apcPicYuv[PIC_YUV_REC]; }
199
200  TComPicYuv*   getPicYuvPred()       { return  m_pcPicYuvPred; }
201  TComPicYuv*   getPicYuvResi()       { return  m_pcPicYuvResi; }
202  Void          setPicYuvPred( TComPicYuv* pcPicYuv )       { m_pcPicYuvPred = pcPicYuv; }
203  Void          setPicYuvResi( TComPicYuv* pcPicYuv )       { m_pcPicYuvResi = pcPicYuv; }
204
205  UInt          getNumberOfCtusInFrame() const     { return m_picSym.getNumberOfCtusInFrame(); }
206  UInt          getNumPartInCtuWidth() const       { return m_picSym.getNumPartInCtuWidth();   }
207  UInt          getNumPartInCtuHeight() const      { return m_picSym.getNumPartInCtuHeight();  }
208  UInt          getNumPartitionsInCtu() const      { return m_picSym.getNumPartitionsInCtu();  }
209  UInt          getFrameWidthInCtus() const        { return m_picSym.getFrameWidthInCtus();    }
210  UInt          getFrameHeightInCtus() const       { return m_picSym.getFrameHeightInCtus();   }
211  UInt          getMinCUWidth() const              { return m_picSym.getMinCUWidth();          }
212  UInt          getMinCUHeight() const             { return m_picSym.getMinCUHeight();         }
213
214  Int           getStride(const ComponentID id) const          { return m_apcPicYuv[PIC_YUV_REC]->getStride(id); }
215  Int           getComponentScaleX(const ComponentID id) const    { return m_apcPicYuv[PIC_YUV_REC]->getComponentScaleX(id); }
216  Int           getComponentScaleY(const ComponentID id) const    { return m_apcPicYuv[PIC_YUV_REC]->getComponentScaleY(id); }
217  ChromaFormat  getChromaFormat() const                           { return m_apcPicYuv[PIC_YUV_REC]->getChromaFormat(); }
218  Int           getNumberValidComponents() const                  { return m_apcPicYuv[PIC_YUV_REC]->getNumberValidComponents(); }
219
220  Void          setReconMark (Bool b) { m_bReconstructed = b;     }
221  Bool          getReconMark () const      { return m_bReconstructed;  }
222  Void          setOutputMark (Bool b) { m_bNeededForOutput = b;     }
223  Bool          getOutputMark () const      { return m_bNeededForOutput;  }
224
225#if !NH_3D
226  Void          compressMotion();
227#endif
228  UInt          getCurrSliceIdx() const           { return m_uiCurrSliceIdx;                }
229  Void          setCurrSliceIdx(UInt i)      { m_uiCurrSliceIdx = i;                   }
230  UInt          getNumAllocatedSlice() const      {return m_picSym.getNumAllocatedSlice();}
231  Void          allocateNewSlice()           {m_picSym.allocateNewSlice();         }
232  Void          clearSliceBuffer()           {m_picSym.clearSliceBuffer();         }
233
234  const Window& getConformanceWindow() const { return m_picSym.getSPS().getConformanceWindow(); }
235  Window        getDefDisplayWindow() const  { return m_picSym.getSPS().getVuiParametersPresentFlag() ? m_picSym.getSPS().getVuiParameters()->getDefaultDisplayWindow() : Window(); }
236
237  Bool          getSAOMergeAvailability(Int currAddr, Int mergeAddr);
238
239  UInt          getSubstreamForCtuAddr(const UInt ctuAddr, const Bool bAddressInRaster, TComSlice *pcSlice);
240
241  /* field coding parameters*/
242
243   Void              setTopField(Bool b)                  {m_isTop = b;}
244   Bool              isTopField()                         {return m_isTop;}
245   Void              setField(Bool b)                     {m_isField = b;}
246   Bool              isField()                            {return m_isField;}
247
248#if NH_MV
249   Void          setLayerId            ( Int layerId )    { m_layerId      = layerId; }
250   Int           getLayerId            () const           { return m_layerId;    }
251   
252   Void          setViewId             ( Int viewId )     { m_viewId = viewId;   }
253   Int           getViewId             () const           { return m_viewId;     }
254
255   Void          setPicOutputFlag(Bool b)                 { m_bPicOutputFlag = b;      }
256   Bool          getPicOutputFlag() const                 { return m_bPicOutputFlag ;  }
257
258   Bool          getPocResetPeriodId();
259
260   Void          markAsUsedForShortTermReference();
261   Void          markAsUsedForLongTermReference(); 
262   Void          markAsUnusedForReference(); 
263
264   Bool          getMarkedUnUsedForReference();
265   Bool          getMarkedAsShortTerm();
266
267   Void          setHasGeneratedRefPics(Bool val)       { m_hasGeneratedRefPics  = val;    }
268   Bool          getHasGeneratedRefPics( )              { return m_hasGeneratedRefPics;   }
269
270   Void          setIsPocResettingPic(Bool val)         { m_isPocResettingPic = val;    }
271   Bool          getIsPocResettingPic( )                { return m_isPocResettingPic;   }
272
273   Void          setIsFstPicOfAllLayOfPocResetPer(Bool val) { m_isFstPicOfAllLayOfPocResetPer = val;  }
274   Bool          getIsFstPicOfAllLayOfPocResetPer( )        { return m_isFstPicOfAllLayOfPocResetPer; }
275
276   Int64         getDecodingOrder( )                    { return m_decodingOrder;       }
277   Void          setDecodingOrder( UInt64 val  )        { m_decodingOrder = val;        }
278
279   Bool          getNoRaslOutputFlag()                  { return m_noRaslOutputFlag;     }
280   Void          setNoRaslOutputFlag( Bool b )          { m_noRaslOutputFlag = b;        }
281
282   Bool          getNoClrasOutputFlag()                 { return m_noClrasOutputFlag;    }
283   Void          setNoClrasOutputFlag( Bool b )         { m_noClrasOutputFlag = b;       }
284
285   Int           getPicLatencyCount()                   { return m_picLatencyCount;      }
286   Void          setPicLatencyCount( Int val )          { m_picLatencyCount = val;       }
287
288   Bool          getIsGenerated() const                 { return m_isGenerated;          }
289   Void          setIsGenerated( Bool b )               { m_isGenerated = b;             }
290
291   Bool          getIsGeneratedCl833() const            { return m_isGeneratedCl833;     }
292   Void          setIsGeneratedCl833( Bool b )          { m_isGeneratedCl833 = b;        }
293
294   Int           getTemporalId( )                       { return getSlice(0)->getTemporalId(); }
295
296   Bool          getActivatesNewVps()                   { return m_activatesNewVps;      }
297   Void          setActivatesNewVps( Bool b )           { m_activatesNewVps = b;         }
298
299   TComDecodedRps* getDecodedRps()                      { return &m_decodedRps;          }
300
301   Bool          isIrap()                               { return getSlice(0)->isIRAP(); } 
302   Bool          isBla ()                               { return getSlice(0)->isBla (); } 
303   Bool          isIdr ()                               { return getSlice(0)->isIdr (); } 
304   Bool          isCra ()                               { return getSlice(0)->isCra (); } 
305   Bool          isSlnr ()                              { return getSlice(0)->isSlnr (); }
306   Bool          isRasl ()                              { return getSlice(0)->isRasl (); }
307   Bool          isRadl ()                              { return getSlice(0)->isRadl (); }
308   Bool          isStsa ()                              { return getSlice(0)->isStsa (); }
309   Bool          isTsa ()                               { return getSlice(0)->isTsa  (); }
310
311   Void          print( Int outputLevel );
312
313#if NH_3D
314   Void          setViewIndex          ( Int viewIndex )  { m_viewIndex = viewIndex;   }
315   Int           getViewIndex          () const           { return m_viewIndex;     }
316
317   Void          setIsDepth            ( Bool isDepth )   { m_isDepth = isDepth; }
318   Bool          getIsDepth            ()                 { return m_isDepth; }
319
320   Void          setScaleOffset( Int** pS, Int** pO )     { m_aaiCodedScale = pS; m_aaiCodedOffset = pO; }
321   Int**         getCodedScale ()                         { return m_aaiCodedScale;  }
322   Int**         getCodedOffset()                         { return m_aaiCodedOffset; }
323
324   Void          compressMotion(Int scale); 
325   Void          printMotion( );
326#if NH_3D_ARP
327   Void          getCUAddrAndPartIdx( Int iX, Int iY, Int& riCuAddr, Int& riAbsZorderIdx );
328#endif
329#if NH_3D_QTLPC
330   Bool          getReduceBitsFlag ()                     { return m_bReduceBitsQTL;     }
331   Void          setReduceBitsFlag ( Bool bFlag )         { m_bReduceBitsQTL = bFlag;    }
332#endif
333#if NH_3D_NBDV
334  Int            getNumDdvCandPics()                      { return m_iNumDdvCandPics;    }
335  Int            getDisCandRefPictures(Int iColPOC);       
336  Void           setRapRefIdx(UInt uiRapRefIdx)           { m_uiRapRefIdx = uiRapRefIdx; }
337  Void           setRapRefList(RefPicList eRefPicList)    { m_eRapRefList = eRefPicList; }
338  Void           setNumDdvCandPics (Int i)                { m_iNumDdvCandPics = i;       }
339  UInt           getRapRefIdx()                           { return m_uiRapRefIdx;        }
340  RefPicList     getRapRefList()                          { return m_eRapRefList;        }
341  Void           checkTemporalIVRef();                     
342  Bool           isTempIVRefValid(Int currCandPic, Int iTempRefDir, Int iTempRefIdx);
343  Void           checkTextureRef(  );
344  Int            isTextRefValid(Int iTextRefDir, Int iTextRefIdx);
345#endif
346#endif
347#endif
348
349  /** transfer ownership of seis to this picture */
350  Void setSEIs(SEIMessages& seis) { m_SEIs = seis; }
351
352  /**
353   * return the current list of SEI messages associated with this picture.
354   * Pointer is valid until this->destroy() is called */
355  SEIMessages& getSEIs() { return m_SEIs; }
356
357  /**
358   * return the current list of SEI messages associated with this picture.
359   * Pointer is valid until this->destroy() is called */
360  const SEIMessages& getSEIs() const { return m_SEIs; }
361};// END CLASS DEFINITION TComPic
362
363#if NH_MV
364
365class TComAu : public TComList<TComPic*>
366{
367 
368public:
369
370  Int                 getPoc            ( )                     {  assert(!empty()); return back()->getPOC            ();  }
371  Void                setPicLatencyCount( Int picLatenyCount );
372  Int                 getPicLatencyCount( )                     {  assert(!empty()); return back()->getPicLatencyCount();  } 
373  TComPic*            getPic            ( Int nuhLayerId  );
374  Void                addPic            ( TComPic* pic, Bool pocUnkown );
375  Bool                containsPic       ( TComPic* pic ); 
376};
377
378
379class TComSubDpb : public TComList<TComPic*>
380{
381private: 
382  Int m_nuhLayerId; 
383public: 
384  TComSubDpb( Int nuhLayerid );
385
386  Int                 getLayerId                      ( ) { return m_nuhLayerId; }
387
388  TComPic*            getPic                          ( Int poc  );
389  TComPic*            getPicFromLsb                   ( Int pocLsb, Int maxPicOrderCntLsb );
390  TComPic*            getShortTermRefPic              ( Int poc  );
391  TComList<TComPic*>  getPicsMarkedNeedForOutput      ( );
392
393  Void                markAllAsUnusedForReference     ( );
394
395  Void                addPic                          ( TComPic* pic );
396  Void                removePics                      ( std::vector<TComPic*> picToRemove );
397  Bool                areAllPicsMarkedNotNeedForOutput( );
398};
399
400class TComPicLists
401{
402private: 
403  TComList<TComAu*    >       m_aus; 
404  TComList<TComSubDpb*>       m_subDpbs; 
405  Bool                        m_printPicOutput; 
406#if NH_3D                     
407  const TComVPS*              m_vps; 
408#endif
409public: 
410  TComPicLists() { m_printPicOutput = false; };
411  ~TComPicLists();
412
413  // Add and remove single pictures
414  Void                   addNewPic( TComPic* pic );
415  Void                   removePic( TComPic* pic );
416
417  // Get Pics
418  TComPic*               getPic                         ( Int layerIdInNuh, Int poc );
419  TComPicYuv*            getPicYuv                      ( Int layerIdInNuh, Int poc, Bool recon );
420
421  // Get and AUs and SubDPBs
422  TComSubDpb*            getSubDpb                      ( Int nuhLayerId, Bool create );
423  TComList<TComSubDpb*>* getSubDpbs                     ( );
424                                                       
425  TComAu*                addAu                          ( Int poc  );
426  TComAu*                getAu                          ( Int poc, Bool create );
427  TComList<TComAu*>*     getAus                         ( );
428  TComList<TComAu*>      getAusHavingPicsMarkedForOutput( );
429
430  // Mark pictures and set POCs
431  Void                   markSubDpbAsUnusedForReference ( Int layerIdInNuh );
432  Void                   markSubDpbAsUnusedForReference ( TComSubDpb& subDpb );
433  Void                   markAllSubDpbAsUnusedForReference(  );
434  Void                   decrementPocsInSubDpb          ( Int nuhLayerId, Int deltaPocVal );
435 
436  // Empty Sub DPBs
437  Void                   emptyAllSubDpbs                ( );
438  Void                   emptySubDpbs                   ( TComList<TComSubDpb*>* subDpbs);
439  Void                   emptySubDpb                    ( TComSubDpb* subDpb);
440  Void                   emptySubDpb                    ( Int nuhLayerId );
441
442  Void                   emptyNotNeedForOutputAndUnusedForRef      ( );
443  Void                   emptySubDpbNotNeedForOutputAndUnusedForRef( Int layerId  );
444  Void                   emptySubDpbNotNeedForOutputAndUnusedForRef( TComSubDpb subDpb ); 
445
446  // For printing to std::out
447  Void                   setPrintPicOutput ( Bool printPicOutput ) { m_printPicOutput = printPicOutput; };
448  Void                   print(); 
449
450#if NH_3D                                   
451  Void                   setVPS                        ( const TComVPS* vps ) { m_vps = vps;  }; 
452  TComPic*               getPic                        ( Int viewIndex, Bool depthFlag, Int poc );
453  TComPicYuv*            getPicYuv                     ( Int viewIndex, Bool depthFlag, Int poc, Bool recon );
454#endif 
455
456}; 
457
458// END CLASS DEFINITION TComPicLists
459
460#endif
461
462
463//! \}
464
465#endif // __TCOMPIC__
Note: See TracBrowser for help on using the repository browser.