Changeset 1319 in SHVCSoftware for branches/SHM-dev/source/Lib/TLibDecoder


Ignore:
Timestamp:
21 Jul 2015, 23:31:40 (10 years ago)
Author:
seregin
Message:

port rev 4394

Location:
branches/SHM-dev/source/Lib/TLibDecoder
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • branches/SHM-dev/source/Lib/TLibDecoder/NALread.cpp

    r1259 r1319  
    3434/**
    3535 \file     NALread.cpp
    36  \brief    reading funtionality for NAL units
     36 \brief    reading functionality for NAL units
    3737 */
    3838
     
    105105Void readNalUnitHeader(InputNALUnit& nalu)
    106106{
    107   TComInputBitstream& bs = *nalu.m_Bitstream;
     107  TComInputBitstream& bs = nalu.getBitstream();
    108108
    109109  Bool forbidden_zero_bit = bs.read(1);           // forbidden_zero_bit
     
    165165 * a bitstream
    166166 */
    167 Void read(InputNALUnit& nalu, vector<uint8_t>& nalUnitBuf)
     167Void read(InputNALUnit& nalu)
    168168{
    169   /* perform anti-emulation prevention */
    170   TComInputBitstream *pcBitstream = new TComInputBitstream(NULL);
    171   convertPayloadToRBSP(nalUnitBuf, pcBitstream, (nalUnitBuf[0] & 64) == 0);
    172 
    173   nalu.m_Bitstream = new TComInputBitstream(&nalUnitBuf);
    174   nalu.m_Bitstream->setEmulationPreventionByteLocation(pcBitstream->getEmulationPreventionByteLocation());
    175   delete pcBitstream;
     169  TComInputBitstream &bitstream = nalu.getBitstream();
     170  vector<uint8_t>& nalUnitBuf=bitstream.getFifo();
     171  // perform anti-emulation prevention
     172  convertPayloadToRBSP(nalUnitBuf, &bitstream, (nalUnitBuf[0] & 64) == 0);
     173  bitstream.resetToStart();
    176174  readNalUnitHeader(nalu);
    177175}
  • branches/SHM-dev/source/Lib/TLibDecoder/NALread.h

    r1259 r1319  
    3434/**
    3535 \file     NALread.h
    36  \brief    reading funtionality for NAL units
     36 \brief    reading functionality for NAL units
    3737 */
    3838
     
    5353 * bitstream object.
    5454 */
    55 struct InputNALUnit : public NALUnit
     55class InputNALUnit : public NALUnit
    5656{
    57   InputNALUnit() : m_Bitstream(0) {};
    58   ~InputNALUnit() { delete m_Bitstream; }
     57  private:
     58    TComInputBitstream m_Bitstream;
    5959
    60   TComInputBitstream* m_Bitstream;
     60  public:
     61    InputNALUnit(const InputNALUnit &src) : NALUnit(src), m_Bitstream(src.m_Bitstream) {};
     62    InputNALUnit() : m_Bitstream() {};
     63    virtual ~InputNALUnit() { }
     64    const TComInputBitstream &getBitstream() const { return m_Bitstream; }
     65          TComInputBitstream &getBitstream()       { return m_Bitstream; }
    6166};
    6267
    63 Void read(InputNALUnit& nalu, std::vector<uint8_t>& nalUnitBuf);
     68Void read(InputNALUnit& nalu);
     69Void readNalUnitHeader(InputNALUnit& nalu);
    6470
    6571//! \}
  • branches/SHM-dev/source/Lib/TLibDecoder/SEIread.cpp

    r1307 r1319  
    471471
    472472  /* restore primary bitstream for sei_message */
    473   getBitstream()->deleteFifo();
    474473  delete getBitstream();
    475474  setBitstream(bs);
  • branches/SHM-dev/source/Lib/TLibDecoder/TDecGop.cpp

    r1292 r1319  
    154154  for (UInt ui = 0; ui < uiNumSubstreams; ui++)
    155155  {
    156     ppcSubstreams[ui]->deleteFifo();
    157156    delete ppcSubstreams[ui];
    158157  }
  • branches/SHM-dev/source/Lib/TLibDecoder/TDecTop.cpp

    r1316 r1319  
    6363
    6464TDecTop::TDecTop()
    65   : m_pDecodedSEIOutputStream(NULL),
    66     m_warningMessageSkipPicture(false)
    67 {
    68   m_pcPic = 0;
    69   m_iMaxRefPicNum = 0;
     65  : m_iMaxRefPicNum(0)
     66  , m_associatedIRAPType(NAL_UNIT_INVALID)
     67  , m_pocCRA(0)
     68  , m_pocRandomAccess(MAX_INT)
     69  , m_cListPic()
     70  , m_parameterSetManager()
     71  , m_apcSlicePilot(NULL)
     72  , m_SEIs()
     73  , m_cPrediction()
     74  , m_cTrQuant()
     75  , m_cGopDecoder()
     76  , m_cSliceDecoder()
     77  , m_cCuDecoder()
     78  , m_cEntropyDecoder()
     79  , m_cCavlcDecoder()
     80  , m_cSbacDecoder()
     81  , m_cBinCABAC()
     82  , m_seiReader()
     83  , m_cLoopFilter()
     84  , m_cSAO()
     85  , m_pcPic(NULL)
     86#if !SVC_EXTENSION
     87  , m_prevPOC(MAX_INT)
     88#endif
     89  , m_prevTid0POC(0)
     90  , m_bFirstSliceInPicture(true)
     91#if !SVC_EXTENSION
     92  , m_bFirstSliceInSequence(true)
     93#endif
     94  , m_prevSliceSkipped(false)
     95  , m_skippedPOC(0)
     96  , m_bFirstSliceInBitstream(true)
     97  , m_lastPOCNoOutputPriorPics(-1)
     98  , m_isNoOutputPriorPics(false)
     99  , m_craNoRaslOutputFlag(false)
     100#if O0043_BEST_EFFORT_DECODING
     101  , m_forceDecodeBitDepth(8)
     102#endif
     103  , m_pDecodedSEIOutputStream(NULL)
     104  , m_warningMessageSkipPicture(false)
     105  , m_prefixSEINALUs()
     106{
    70107#if ENC_DEC_TRACE
    71108  if (g_hTrace == NULL)
     
    76113  g_nSymbolCounter = 0;
    77114#endif
    78   m_associatedIRAPType = NAL_UNIT_INVALID;
    79   m_pocCRA = 0;
    80   m_pocRandomAccess = MAX_INT;
    81 #if !SVC_EXTENSION
    82   m_prevPOC                = MAX_INT;
    83 #endif
    84   m_prevTid0POC            = 0;
    85   m_bFirstSliceInPicture    = true;
    86 #if !SVC_EXTENSION
    87   m_bFirstSliceInSequence   = true;
    88 #endif
    89   m_prevSliceSkipped = false;
    90   m_skippedPOC = 0;
    91   m_bFirstSliceInBitstream  = true;
    92   m_lastPOCNoOutputPriorPics = -1;
    93   m_craNoRaslOutputFlag = false;
    94   m_isNoOutputPriorPics = false;
    95115
    96116#if SVC_EXTENSION
     
    133153  }
    134154#endif
     155  while (!m_prefixSEINALUs.empty())
     156  {
     157    delete m_prefixSEINALUs.front();
     158    m_prefixSEINALUs.pop_front();
     159  }
    135160#if CGS_3D_ASYMLUT
    136161  if(m_pColorMappedPic)
     
    431456      assert (0);
    432457    }
     458
     459    xParsePrefixSEImessages();
    433460
    434461#if RExt__HIGH_BIT_DEPTH_SUPPORT==0
     
    699726    }
    700727
     728    xParsePrefixSEImessages();
     729
    701730    // Check if any new SEI has arrived
    702731     if(!m_SEIs.empty())
     
    709738     }
    710739  }
    711 
     740}
     741
     742
     743Void TDecTop::xParsePrefixSEIsForUnknownVCLNal()
     744{
     745  while (!m_prefixSEINALUs.empty())
     746  {
     747    // do nothing?
     748    printf("Discarding Prefix SEI associated with unknown VCL NAL unit.\n");
     749    delete m_prefixSEINALUs.front();
     750  }
     751  // TODO: discard following suffix SEIs as well?
     752}
     753
     754
     755Void TDecTop::xParsePrefixSEImessages()
     756{
     757#if SVC_EXTENSION
     758    if (m_prevSliceSkipped) // No need to decode SEI messages of a skipped access unit
     759    {
     760      return;
     761    }
     762#endif
     763
     764  while (!m_prefixSEINALUs.empty())
     765  {
     766    InputNALUnit &nalu=*m_prefixSEINALUs.front();
     767#if LAYERS_NOT_PRESENT_SEI
     768    m_seiReader.parseSEImessage( &(nalu.getBitstream()), m_SEIs, nalu.m_nalUnitType, m_parameterSetManager.getActiveVPS(), m_parameterSetManager.getActiveSPS(), m_pDecodedSEIOutputStream );
     769#else
     770    m_seiReader.parseSEImessage( &(nalu.getBitstream()), m_SEIs, nalu.m_nalUnitType, m_parameterSetManager.getActiveSPS(), m_pDecodedSEIOutputStream );
     771#endif
     772    delete m_prefixSEINALUs.front();
     773    m_prefixSEINALUs.pop_front();
     774  }
    712775}
    713776
     
    783846    m_apcSlicePilot->setPOC(m_skippedPOC);
    784847  }
     848
     849  xUpdatePreviousTid0POC(m_apcSlicePilot);
    785850
    786851  m_apcSlicePilot->setAssociatedIRAPPOC(m_pocCRA);
     
    17951860
    17961861  //  Decode a picture
    1797   m_cGopDecoder.decompressSlice(nalu.m_Bitstream, m_pcPic);
     1862  m_cGopDecoder.decompressSlice(&(nalu.getBitstream()), m_pcPic);
    17981863
    17991864#if SVC_EXTENSION
     
    18081873}
    18091874
    1810 Void TDecTop::xDecodeVPS(const std::vector<UChar> *pNaluData)
     1875Void TDecTop::xDecodeVPS(const std::vector<UChar> &naluData)
    18111876{
    18121877  TComVPS* vps = new TComVPS();
    18131878
    18141879  m_cEntropyDecoder.decodeVPS( vps );
    1815   m_parameterSetManager.storeVPS(vps, pNaluData);
     1880  m_parameterSetManager.storeVPS(vps, naluData);
    18161881#if SVC_EXTENSION
    18171882  checkValueOfTargetOutputLayerSetIdx(vps);
     
    18371902}
    18381903
    1839 Void TDecTop::xDecodeSPS(const std::vector<UChar> *pNaluData)
     1904Void TDecTop::xDecodeSPS(const std::vector<UChar> &naluData)
    18401905{
    18411906  TComSPS* sps = new TComSPS();
     
    18471912#endif
    18481913  m_cEntropyDecoder.decodeSPS( sps );
    1849   m_parameterSetManager.storeSPS(sps, pNaluData);
     1914  m_parameterSetManager.storeSPS(sps, naluData);
    18501915}
    18511916
    18521917#if CGS_3D_ASYMLUT
    1853 Void TDecTop::xDecodePPS( const std::vector<UChar> *pNaluData, TCom3DAsymLUT * pc3DAsymLUT )
     1918Void TDecTop::xDecodePPS( const std::vector<UChar> &naluData, TCom3DAsymLUT * pc3DAsymLUT )
    18541919#else
    1855 Void TDecTop::xDecodePPS(const std::vector<UChar> *pNaluData)
     1920Void TDecTop::xDecodePPS(const std::vector<UChar> &naluData)
    18561921#endif
    18571922{
     
    18661931  m_cEntropyDecoder.decodePPS( pps );
    18671932#endif
    1868   m_parameterSetManager.storePPS( pps, pNaluData);
    1869 }
    1870 
    1871 Void TDecTop::xDecodeSEI( TComInputBitstream* bs, const NalUnitType nalUnitType )
    1872 {
    1873   if(nalUnitType == NAL_UNIT_SUFFIX_SEI)
    1874   {
    1875 #if SVC_EXTENSION
    1876     if (m_prevSliceSkipped) // No need to decode SEI messages of a skipped access unit
    1877     {
    1878       return;
    1879     }
    1880 #endif
    1881 #if LAYERS_NOT_PRESENT_SEI
    1882     m_seiReader.parseSEImessage( bs, m_pcPic->getSEIs(), nalUnitType, m_parameterSetManager.getActiveVPS(), m_parameterSetManager.getActiveSPS(), m_pDecodedSEIOutputStream  );
    1883 #else
    1884     m_seiReader.parseSEImessage( bs, m_pcPic->getSEIs(), nalUnitType, m_parameterSetManager.getActiveSPS(), m_pDecodedSEIOutputStream );
    1885 #endif
    1886   }
    1887   else
    1888   {
    1889 #if LAYERS_NOT_PRESENT_SEI
    1890     m_seiReader.parseSEImessage( bs, m_SEIs, nalUnitType, m_parameterSetManager.getActiveVPS(), m_parameterSetManager.getActiveSPS(), m_pDecodedSEIOutputStream  );
    1891 #else
    1892     m_seiReader.parseSEImessage( bs, m_SEIs, nalUnitType, m_parameterSetManager.getActiveSPS(), m_pDecodedSEIOutputStream );
    1893 #endif
    1894     SEIMessages activeParamSets = getSeisByType(m_SEIs, SEI::ACTIVE_PARAMETER_SETS);
    1895     if (activeParamSets.size()>0)
    1896     {
    1897       SEIActiveParameterSets *seiAps = (SEIActiveParameterSets*)(*activeParamSets.begin());
    1898 #if R0247_SEI_ACTIVE
    1899       assert(seiAps->activeSeqParameterSetId.size()>0);
    1900       if( !getLayerDec(0)->m_parameterSetManager.activateSPSWithSEI( seiAps->activeSeqParameterSetId[0] ) )
    1901       {
    1902         printf ("Warning SPS activation with Active parameter set SEI failed");
    1903       }
    1904       for (Int c=1 ; c <= seiAps->numSpsIdsMinus1; c++)
    1905       {
    1906         Int layerIdx = seiAps->layerSpsIdx[c];
    1907         if( !getLayerDec(layerIdx)->m_parameterSetManager.activateSPSWithSEI( seiAps->activeSeqParameterSetId[layerIdx] ) )
    1908         {
    1909           printf ("Warning SPS activation with Active parameter set SEI failed");
    1910         }
    1911       }
    1912 #else
    1913       assert(seiAps->activeSeqParameterSetId.size()>0);
    1914       if (! m_parameterSetManager.activateSPSWithSEI(seiAps->activeSeqParameterSetId[0] ))
    1915       {
    1916         printf ("Warning SPS activation with Active parameter set SEI failed");
    1917       }
    1918 #endif
    1919     }
    1920   }
     1933  m_parameterSetManager.storePPS( pps, naluData);
    19211934}
    19221935
     
    19371950  // Initialize entropy decoder
    19381951  m_cEntropyDecoder.setEntropyDecoder (&m_cCavlcDecoder);
    1939   m_cEntropyDecoder.setBitstream      (nalu.m_Bitstream);
     1952  m_cEntropyDecoder.setBitstream      (&(nalu.getBitstream()));
    19401953
    19411954#if SVC_EXTENSION
     
    19521965      assert( nalu.m_nuhLayerId == 0 ); // Non-conforming bitstream. The value of nuh_layer_id of VPS NAL unit shall be equal to 0.
    19531966#endif
    1954       xDecodeVPS(nalu.m_Bitstream->getFifo());
     1967      xDecodeVPS(nalu.getBitstream().getFifo());
    19551968#if RExt__DECODER_DEBUG_BIT_STATISTICS
    1956       TComCodingStatistics::IncrementStatisticEP(STATS__BYTE_ALIGNMENT_BITS,nalu.m_Bitstream->readByteAlignment(),0);
     1969      TComCodingStatistics::IncrementStatisticEP(STATS__BYTE_ALIGNMENT_BITS, nalu.getBitstream().readByteAlignment(), 0);
    19571970#endif
    19581971#if SVC_EXTENSION
     
    19621975
    19631976    case NAL_UNIT_SPS:
    1964       xDecodeSPS(nalu.m_Bitstream->getFifo());
     1977      xDecodeSPS(nalu.getBitstream().getFifo());
    19651978#if RExt__DECODER_DEBUG_BIT_STATISTICS
    1966       TComCodingStatistics::IncrementStatisticEP(STATS__BYTE_ALIGNMENT_BITS,nalu.m_Bitstream->readByteAlignment(),0);
     1979      TComCodingStatistics::IncrementStatisticEP(STATS__BYTE_ALIGNMENT_BITS, nalu.getBitstream().readByteAlignment(), 0);
    19671980#endif
    19681981      return false;
     
    19701983    case NAL_UNIT_PPS:
    19711984#if CGS_3D_ASYMLUT
    1972       xDecodePPS( nalu.m_Bitstream->getFifo(), &m_c3DAsymLUTPPS );
     1985      xDecodePPS( nalu.getBitstream().getFifo(), &m_c3DAsymLUTPPS );
    19731986#else
    1974       xDecodePPS(nalu.m_Bitstream->getFifo());
     1987      xDecodePPS(nalu.getBitstream().getFifo());
    19751988#endif
    19761989#if RExt__DECODER_DEBUG_BIT_STATISTICS
    1977       TComCodingStatistics::IncrementStatisticEP(STATS__BYTE_ALIGNMENT_BITS,nalu.m_Bitstream->readByteAlignment(),0);
     1990      TComCodingStatistics::IncrementStatisticEP(STATS__BYTE_ALIGNMENT_BITS, nalu.getBitstream().readByteAlignment(),0);
    19781991#endif
    19791992      return false;
    19801993
    19811994    case NAL_UNIT_PREFIX_SEI:
     1995      // Buffer up prefix SEI messages until SPS of associated VCL is known.
     1996      m_prefixSEINALUs.push_back(new InputNALUnit(nalu));
     1997      return false;
     1998
    19821999    case NAL_UNIT_SUFFIX_SEI:
    19832000#if SVC_EXTENSION
     
    19872004      }
    19882005#endif
    1989       xDecodeSEI( nalu.m_Bitstream, nalu.m_nalUnitType );
     2006      if (m_pcPic)
     2007      {
     2008#if SVC_EXTENSION
     2009        m_seiReader.parseSEImessage( &(nalu.getBitstream()), m_pcPic->getSEIs(), nalu.m_nalUnitType, m_parameterSetManager.getActiveVPS(), m_parameterSetManager.getActiveSPS(), m_pDecodedSEIOutputStream );
     2010#else
     2011        m_seiReader.parseSEImessage( &(nalu.getBitstream()), m_pcPic->getSEIs(), nalu.m_nalUnitType, m_parameterSetManager.getActiveSPS(), m_pDecodedSEIOutputStream );
     2012#endif
     2013      }
     2014      else
     2015      {
     2016        printf ("Note: received suffix SEI but no picture currently active.\n");
     2017      }
    19902018      return false;
    19912019
     
    20792107    case NAL_UNIT_RESERVED_VCL30:
    20802108    case NAL_UNIT_RESERVED_VCL31:
     2109      printf ("Note: found reserved VCL NAL unit.\n");
     2110      xParsePrefixSEIsForUnknownVCLNal();
     2111      return false;
    20812112
    20822113    case NAL_UNIT_RESERVED_NVCL41:
  • branches/SHM-dev/source/Lib/TLibDecoder/TDecTop.h

    r1295 r1319  
    5656#include "SEIread.h"
    5757
    58 struct InputNALUnit;
     58class InputNALUnit;
    5959
    6060//! \ingroup TLibDecoder
     
    7979  TComSlice*              m_apcSlicePilot;
    8080
    81   SEIMessages             m_SEIs; ///< List of SEI messages that have been received before the first slice and between slices
     81  SEIMessages             m_SEIs; ///< List of SEI messages that have been received before the first slice and between slices, excluding prefix SEIs...
    8282
    8383  // functional classes
     
    123123
    124124  Bool                    m_warningMessageSkipPicture;
     125
     126  std::list<InputNALUnit*> m_prefixSEINALUs; /// Buffered up prefix SEI NAL Units.
    125127
    126128#if SVC_EXTENSION
     
    277279  Bool      xDecodeSlice(InputNALUnit &nalu, Int &iSkipFrame, Int iPOCLastDisplay);
    278280#endif
    279   Void      xDecodeVPS(const std::vector<UChar> *pNaluData);
    280   Void      xDecodeSPS(const std::vector<UChar> *pNaluData);
     281  Void      xDecodeVPS(const std::vector<UChar> &naluData);
     282  Void      xDecodeSPS(const std::vector<UChar> &naluData); 
    281283#if CGS_3D_ASYMLUT
    282   Void      xDecodePPS(const std::vector<UChar> *pNaluData, TCom3DAsymLUT *pc3DAsymLUT);
     284  Void      xDecodePPS(const std::vector<UChar> &naluData, TCom3DAsymLUT *pc3DAsymLUT);
    283285#else
    284   Void      xDecodePPS(const std::vector<UChar> *pNaluData);
     286  Void      xDecodePPS(const std::vector<UChar> &naluData);
    285287#endif
    286288  Void      xDecodeSEI( TComInputBitstream* bs, const NalUnitType nalUnitType );
    287289  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(); } }
     290  Void      xParsePrefixSEImessages();
     291  Void      xParsePrefixSEIsForUnknownVCLNal();
    288292
    289293
Note: See TracChangeset for help on using the changeset viewer.