Changeset 1319 in SHVCSoftware
- Timestamp:
- 21 Jul 2015, 23:31:40 (9 years ago)
- Location:
- branches/SHM-dev/source
- Files:
-
- 14 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/SHM-dev/source/App/TAppDecoder/TAppDecTop.cpp
r1292 r1319 215 215 AnnexBStats stats = AnnexBStats(); 216 216 217 vector<uint8_t> nalUnit;218 217 InputNALUnit nalu; 219 byteStreamNALUnit(bytestream, nal Unit, stats);218 byteStreamNALUnit(bytestream, nalu.getBitstream().getFifo(), stats); 220 219 221 220 // call actual decoding function … … 223 222 Bool bNewPOC = false; 224 223 225 if (nal Unit.empty())224 if (nalu.getBitstream().getFifo().empty()) 226 225 { 227 226 /* this can happen if the following occur: … … 234 233 else 235 234 { 236 read(nalu , nalUnit);235 read(nalu); 237 236 if( (m_iMaxTemporalLayer >= 0 && nalu.m_temporalId > m_iMaxTemporalLayer) || !isNaluWithinTargetDecLayerIdSet(&nalu) || 238 237 #if CONFORMANCE_BITSTREAM_MODE … … 473 472 AnnexBStats stats = AnnexBStats(); 474 473 475 vector<uint8_t> nalUnit;476 474 InputNALUnit nalu; 477 byteStreamNALUnit(bytestream, nal Unit, stats);475 byteStreamNALUnit(bytestream, nalu.getBitstream().getFifo(), stats); 478 476 479 477 // call actual decoding function 480 478 Bool bNewPicture = false; 481 if (nal Unit.empty())479 if (nalu.getBitstream().getFifo().empty()) 482 480 { 483 481 /* this can happen if the following occur: … … 490 488 else 491 489 { 492 read(nalu , nalUnit);490 read(nalu); 493 491 if( (m_iMaxTemporalLayer >= 0 && nalu.m_temporalId > m_iMaxTemporalLayer) || !isNaluWithinTargetDecLayerIdSet(&nalu) ) 494 492 { -
branches/SHM-dev/source/App/TAppEncoder/TAppEncCfg.cpp
r1316 r1319 3114 3114 fprintf(stderr, "****************************************************************************\n"); 3115 3115 } 3116 }3117 if ( m_bufferingPeriodSEIEnabled && !m_activeParameterSetsSEIEnabled)3118 {3119 fprintf(stderr, "****************************************************************************\n");3120 fprintf(stderr, "** WARNING: using buffering period SEI requires SPS activation with **\n");3121 fprintf(stderr, "** active parameter sets SEI. Enabling active parameter sets SEI **\n");3122 fprintf(stderr, "****************************************************************************\n");3123 m_activeParameterSetsSEIEnabled = 1;3124 }3125 if ( m_pictureTimingSEIEnabled && !m_activeParameterSetsSEIEnabled)3126 {3127 fprintf(stderr, "****************************************************************************\n");3128 fprintf(stderr, "** WARNING: using picture timing SEI requires SPS activation with active **\n");3129 fprintf(stderr, "** parameter sets SEI. Enabling active parameter sets SEI. **\n");3130 fprintf(stderr, "****************************************************************************\n");3131 m_activeParameterSetsSEIEnabled = 1;3132 3116 } 3133 3117 -
branches/SHM-dev/source/Lib/TLibCommon/NAL.h
r1262 r1319 51 51 UInt m_nuhLayerId; ///< nuh_layer_id 52 52 53 NALUnit(const NALUnit &src) 54 :m_nalUnitType (src.m_nalUnitType) 55 ,m_temporalId (src.m_temporalId) 56 ,m_nuhLayerId (src.m_nuhLayerId) 57 { } 53 58 /** construct an NALunit structure with given header values. */ 54 59 NALUnit( … … 61 66 {} 62 67 63 /** default constructor - no initialization; must be perfo med by user */68 /** default constructor - no initialization; must be performed by user */ 64 69 NALUnit() {} 70 71 virtual ~NALUnit() { } 65 72 66 73 /** returns true if the NALunit is a slice NALunit */ -
branches/SHM-dev/source/Lib/TLibCommon/TComBitStream.cpp
r1260 r1319 60 60 } 61 61 62 TComInputBitstream::TComInputBitstream(std::vector<uint8_t>* buf) 63 { 64 m_fifo = buf; 65 m_fifo_idx = 0; 66 m_held_bits = 0; 67 m_num_held_bits = 0; 68 m_numBitsRead = 0; 69 } 70 71 TComInputBitstream::~TComInputBitstream() 72 { 73 } 62 63 TComInputBitstream::TComInputBitstream() 64 : m_fifo() 65 , m_emulationPreventionByteLocation() 66 , m_fifo_idx(0) 67 , m_num_held_bits(0) 68 , m_held_bits(0) 69 , m_numBitsRead(0) 70 { } 71 72 TComInputBitstream::TComInputBitstream(const TComInputBitstream &src) 73 : m_fifo(src.m_fifo) 74 , m_emulationPreventionByteLocation(src.m_emulationPreventionByteLocation) 75 , m_fifo_idx(src.m_fifo_idx) 76 , m_num_held_bits(src.m_num_held_bits) 77 , m_held_bits(src.m_held_bits) 78 , m_numBitsRead(src.m_numBitsRead) 79 { } 74 80 75 81 // ==================================================================================================================== 76 82 // Public member functions 77 83 // ==================================================================================================================== 84 85 Void TComInputBitstream::resetToStart() 86 { 87 m_fifo_idx=0; 88 m_num_held_bits=0; 89 m_held_bits=0; 90 m_numBitsRead=0; 91 } 78 92 79 93 Char* TComOutputBitstream::getByteStream() const … … 283 297 UInt aligned_word = 0; 284 298 UInt num_bytes_to_load = (uiNumberOfBits - 1) >> 3; 285 assert(m_fifo_idx + num_bytes_to_load < m_fifo ->size());299 assert(m_fifo_idx + num_bytes_to_load < m_fifo.size()); 286 300 287 301 switch (num_bytes_to_load) 288 302 { 289 case 3: aligned_word = (*m_fifo)[m_fifo_idx++] << 24;290 case 2: aligned_word |= (*m_fifo)[m_fifo_idx++] << 16;291 case 1: aligned_word |= (*m_fifo)[m_fifo_idx++] << 8;292 case 0: aligned_word |= (*m_fifo)[m_fifo_idx++];303 case 3: aligned_word = m_fifo[m_fifo_idx++] << 24; 304 case 2: aligned_word |= m_fifo[m_fifo_idx++] << 16; 305 case 1: aligned_word |= m_fifo[m_fifo_idx++] << 8; 306 case 0: aligned_word |= m_fifo[m_fifo_idx++]; 293 307 } 294 308 … … 351 365 { 352 366 UInt uiNumBytes = uiNumBits/8; 353 std::vector<uint8_t>* buf = new std::vector<uint8_t>; 354 UInt uiByte; 355 for (UInt ui = 0; ui < uiNumBytes; ui++) 356 { 357 read(8, uiByte); 358 buf->push_back(uiByte); 367 TComInputBitstream *pResult = new TComInputBitstream; 368 369 std::vector<uint8_t> &buf = pResult->getFifo(); 370 buf.reserve((uiNumBits+7)>>3); 371 372 if (m_num_held_bits == 0) 373 { 374 std::size_t currentOutputBufferSize=buf.size(); 375 const UInt uiNumBytesToReadFromFifo = std::min<UInt>(uiNumBytes, m_fifo.size() - m_fifo_idx); 376 buf.resize(currentOutputBufferSize+uiNumBytes); 377 memcpy(&(buf[currentOutputBufferSize]), &(m_fifo[m_fifo_idx]), uiNumBytesToReadFromFifo); m_fifo_idx+=uiNumBytesToReadFromFifo; 378 if (uiNumBytesToReadFromFifo != uiNumBytes) 379 { 380 memset(&(buf[currentOutputBufferSize+uiNumBytesToReadFromFifo]), 0, uiNumBytes - uiNumBytesToReadFromFifo); 381 } 382 } 383 else 384 { 385 for (UInt ui = 0; ui < uiNumBytes; ui++) 386 { 387 UInt uiByte; 388 read(8, uiByte); 389 buf.push_back(uiByte); 390 } 359 391 } 360 392 if (uiNumBits&0x7) 361 393 { 362 uiByte = 0;394 UInt uiByte = 0; 363 395 read(uiNumBits&0x7, uiByte); 364 396 uiByte <<= 8-(uiNumBits&0x7); 365 buf->push_back(uiByte); 366 } 367 return new TComInputBitstream(buf); 368 } 369 370 /** 371 - delete internal fifo 372 */ 373 Void TComInputBitstream::deleteFifo() 374 { 375 delete m_fifo; 376 m_fifo = NULL; 397 buf.push_back(uiByte); 398 } 399 return pResult; 377 400 } 378 401 -
branches/SHM-dev/source/Lib/TLibCommon/TComBitStream.h
r1262 r1319 163 163 class TComInputBitstream 164 164 { 165 std::vector<uint8_t> *m_fifo; /// FIFO for storage of complete bytes166 std::vector<UInt> m_emulationPreventionByteLocation;167 168 165 protected: 166 std::vector<uint8_t> m_fifo; /// FIFO for storage of complete bytes 167 std::vector<UInt> m_emulationPreventionByteLocation; 168 169 169 UInt m_fifo_idx; /// Read index into m_fifo 170 170 … … 175 175 public: 176 176 /** 177 * Create a new bitstream reader object that reads from buf. Ownership 178 * of buf remains with the callee, although the constructed object 179 * will hold a reference to buf 180 */ 181 TComInputBitstream(std::vector<uint8_t>* buf); 182 ~TComInputBitstream(); 177 * Create a new bitstream reader object that reads from buf. 178 */ 179 TComInputBitstream(); 180 virtual ~TComInputBitstream() { } 181 TComInputBitstream(const TComInputBitstream &src); 182 183 Void resetToStart(); 183 184 184 185 // interface for decoding … … 187 188 Void readByte ( UInt &ruiBits ) 188 189 { 189 assert(m_fifo_idx < m_fifo ->size());190 ruiBits = (*m_fifo)[m_fifo_idx++];190 assert(m_fifo_idx < m_fifo.size()); 191 ruiBits = m_fifo[m_fifo_idx++]; 191 192 } 192 193 … … 194 195 { 195 196 assert(m_fifo_idx > 0); 196 byte = (*m_fifo)[m_fifo_idx - 1];197 byte = m_fifo[m_fifo_idx - 1]; 197 198 } 198 199 … … 209 210 UInt readByte() { UInt tmp; readByte( tmp ); return tmp; } 210 211 UInt getNumBitsUntilByteAligned() { return m_num_held_bits & (0x7); } 211 UInt getNumBitsLeft() { return 8*((UInt)m_fifo ->size() - m_fifo_idx) + m_num_held_bits; }212 UInt getNumBitsLeft() { return 8*((UInt)m_fifo.size() - m_fifo_idx) + m_num_held_bits; } 212 213 TComInputBitstream *extractSubstream( UInt uiNumBits ); // Read the nominated number of bits, and return as a bitstream. 213 Void deleteFifo(); // Delete internal fifo of bitstream.214 214 UInt getNumBitsRead() { return m_numBitsRead; } 215 215 UInt readByteAlignment(); 216 216 217 Void pushEmulationPreventionByteLocation ( UInt pos ) { m_emulationPreventionByteLocation.push_back( pos ); } 218 UInt numEmulationPreventionBytesRead () { return (UInt) m_emulationPreventionByteLocation.size(); } 219 std::vector<UInt> getEmulationPreventionByteLocation () { return m_emulationPreventionByteLocation; } 220 UInt getEmulationPreventionByteLocation ( UInt idx ) { return m_emulationPreventionByteLocation[ idx ]; } 221 Void clearEmulationPreventionByteLocation() { m_emulationPreventionByteLocation.clear(); } 222 Void setEmulationPreventionByteLocation ( std::vector<UInt> vec ) { m_emulationPreventionByteLocation = vec; } 223 224 const std::vector<uint8_t> *getFifo() const { return m_fifo; } 217 Void pushEmulationPreventionByteLocation ( UInt pos ) { m_emulationPreventionByteLocation.push_back( pos ); } 218 UInt numEmulationPreventionBytesRead () { return (UInt) m_emulationPreventionByteLocation.size(); } 219 const std::vector<UInt> &getEmulationPreventionByteLocation () const { return m_emulationPreventionByteLocation; } 220 UInt getEmulationPreventionByteLocation ( UInt idx ) { return m_emulationPreventionByteLocation[ idx ]; } 221 Void clearEmulationPreventionByteLocation() { m_emulationPreventionByteLocation.clear(); } 222 Void setEmulationPreventionByteLocation ( const std::vector<UInt> &vec ) { m_emulationPreventionByteLocation = vec; } 223 224 const std::vector<uint8_t> &getFifo() const { return m_fifo; } 225 std::vector<uint8_t> &getFifo() { return m_fifo; } 225 226 }; 226 227 -
branches/SHM-dev/source/Lib/TLibCommon/TComSlice.cpp
r1316 r1319 51 51 ParameterSetMap<TComSPS> ParameterSetManager::m_spsMap(MAX_NUM_SPS); 52 52 ParameterSetMap<TComPPS> ParameterSetManager::m_ppsMap(MAX_NUM_PPS); 53 TComVPS ParameterSetManager::m_activeVPS;53 Int ParameterSetManager::m_activeVPSId = -1; 54 54 #endif 55 55 … … 2790 2790 ParameterSetManager::ParameterSetManager() 2791 2791 #if SVC_EXTENSION 2792 : m_active SPS()2792 : m_activePPSId(-1) 2793 2793 #else 2794 2794 : m_vpsMap(MAX_NUM_VPS) 2795 2795 , m_spsMap(MAX_NUM_SPS) 2796 2796 , m_ppsMap(MAX_NUM_PPS) 2797 , m_activeVPS() 2798 , m_activeSPS() 2799 #endif 2800 { 2801 #if !SVC_EXTENSION 2802 m_activeVPS.setVPSId(-1); 2803 #endif 2804 m_activeSPS.setSPSId(-1); 2797 , m_activeVPSId(-1) 2798 #endif 2799 , m_activeSPSId(-1) 2800 { 2805 2801 } 2806 2802 … … 2812 2808 //! activate a SPS from a active parameter sets SEI message 2813 2809 //! \returns true, if activation is successful 2814 Bool ParameterSetManager::activateSPSWithSEI(Int spsId)2815 {2816 TComSPS *sps = m_spsMap.getPS(spsId);2817 if (sps)2818 {2819 Int vpsId = sps->getVPSId();2820 TComVPS *vps = m_vpsMap.getPS(vpsId);2821 if (vps)2822 {2823 m_activeVPS = *(vps);2824 m_activeSPS = *(sps);2825 return true;2826 }2827 else2828 {2829 printf("Warning: tried to activate SPS using an Active parameter sets SEI message. Referenced VPS does not exist.");2830 }2831 }2832 else2833 {2834 printf("Warning: tried to activate non-existing SPS using an Active parameter sets SEI message.");2835 }2836 return false;2837 }2810 //Bool ParameterSetManager::activateSPSWithSEI(Int spsId) 2811 //{ 2812 // TComSPS *sps = m_spsMap.getPS(spsId); 2813 // if (sps) 2814 // { 2815 // Int vpsId = sps->getVPSId(); 2816 // TComVPS *vps = m_vpsMap.getPS(vpsId); 2817 // if (vps) 2818 // { 2819 // m_activeVPS = *(vps); 2820 // m_activeSPS = *(sps); 2821 // return true; 2822 // } 2823 // else 2824 // { 2825 // printf("Warning: tried to activate SPS using an Active parameter sets SEI message. Referenced VPS does not exist."); 2826 // } 2827 // } 2828 // else 2829 // { 2830 // printf("Warning: tried to activate non-existing SPS using an Active parameter sets SEI message."); 2831 // } 2832 // return false; 2833 //} 2838 2834 2839 2835 //! activate a PPS and depending on isIDR parameter also SPS and VPS … … 2844 2840 if (pps) 2845 2841 { 2842 #if SVC_EXTENSION 2843 m_activePPSId = ppsId; 2844 #endif 2846 2845 Int spsId = pps->getSPSId(); 2847 if (!isIRAP && (spsId != m_activeSPS .getSPSId()))2846 if (!isIRAP && (spsId != m_activeSPSId )) 2848 2847 { 2849 2848 printf("Warning: tried to activate PPS referring to a inactive SPS at non-IDR."); 2850 return false; 2851 } 2852 TComSPS *sps = m_spsMap.getPS(spsId); 2853 if (sps) 2854 { 2855 Int vpsId = sps->getVPSId(); 2856 if (!isIRAP && (vpsId != m_activeVPS.getVPSId() )) 2857 { 2858 printf("Warning: tried to activate PPS referring to a inactive VPS at non-IDR."); 2859 return false; 2860 } 2861 TComVPS *vps =m_vpsMap.getPS(vpsId); 2862 if (vps) 2863 { 2864 m_activeVPS = *(vps); 2865 m_activeSPS = *(sps); 2866 #if SVC_EXTENSION 2867 m_activePPS = *(pps); 2868 #endif 2869 return true; 2849 } 2850 else 2851 { 2852 TComSPS *sps = m_spsMap.getPS(spsId); 2853 if (sps) 2854 { 2855 Int vpsId = sps->getVPSId(); 2856 if (!isIRAP && (vpsId != m_activeVPSId )) 2857 { 2858 printf("Warning: tried to activate PPS referring to a inactive VPS at non-IDR."); 2859 } 2860 else 2861 { 2862 TComVPS *vps =m_vpsMap.getPS(vpsId); 2863 if (vps) 2864 { 2865 m_activeVPSId = vpsId; 2866 m_activeSPSId = spsId; 2867 return true; 2868 } 2869 else 2870 { 2871 printf("Warning: tried to activate PPS that refers to a non-existing VPS."); 2872 } 2873 } 2870 2874 } 2871 2875 else 2872 2876 { 2873 printf("Warning: tried to activate PPS that refers to a non-existing VPS."); 2874 } 2875 } 2876 else 2877 { 2878 printf("Warning: tried to activate a PPS that refers to a non-existing SPS."); 2877 printf("Warning: tried to activate a PPS that refers to a non-existing SPS."); 2878 } 2879 2879 } 2880 2880 } … … 2883 2883 printf("Warning: tried to activate non-existing PPS."); 2884 2884 } 2885 2886 // Failed to activate if reach here. 2887 m_activeSPSId=-1; 2888 m_activeVPSId=-1; 2885 2889 return false; 2886 2890 } … … 2905 2909 } 2906 2910 2907 Void calculateParameterSetChangedFlag(Bool &bChanged, const std::vector<UChar> *pOldData, const std::vector<UChar> *pNewData)2911 Void calculateParameterSetChangedFlag(Bool &bChanged, const std::vector<UChar> *pOldData, const std::vector<UChar> &newData) 2908 2912 { 2909 2913 if (!bChanged) … … 2922 2926 else 2923 2927 { 2924 const UChar *pNewDataArray=&( *pNewData)[0];2928 const UChar *pNewDataArray=&(newData)[0]; 2925 2929 const UChar *pOldDataArray=&(*pOldData)[0]; 2926 2930 if (memcmp(pOldDataArray, pNewDataArray, pOldData->size())) -
branches/SHM-dev/source/Lib/TLibCommon/TComSlice.h
r1316 r1319 2502 2502 2503 2503 2504 Void calculateParameterSetChangedFlag(Bool &bChanged, const std::vector<UChar> *pOldData, const std::vector<UChar> *pNewData);2504 Void calculateParameterSetChangedFlag(Bool &bChanged, const std::vector<UChar> *pOldData, const std::vector<UChar> &newData); 2505 2505 2506 2506 template <class T> class ParameterSetMap … … 2528 2528 } 2529 2529 2530 Void storePS(Int psId, T *ps, const std::vector<UChar> *pNaluData)2530 Void storePS(Int psId, T *ps, const std::vector<UChar> &naluData) 2531 2531 { 2532 2532 assert ( psId < m_maxId ); … … 2536 2536 2537 2537 // work out changed flag 2538 calculateParameterSetChangedFlag(mapData.bChanged, mapData.pNaluData, pNaluData);2538 calculateParameterSetChangedFlag(mapData.bChanged, mapData.pNaluData, naluData); 2539 2539 delete m_paramsetMap[psId].pNaluData; 2540 2540 delete m_paramsetMap[psId].parameterSet; … … 2547 2547 m_paramsetMap[psId].bChanged = false; 2548 2548 } 2549 if (pNaluData) 2550 { 2551 m_paramsetMap[psId].pNaluData=new std::vector<UChar>; 2552 *(m_paramsetMap[psId].pNaluData) = *pNaluData; 2553 } 2554 else 2555 { 2556 m_paramsetMap[psId].pNaluData=0; 2557 } 2549 m_paramsetMap[psId].pNaluData=new std::vector<UChar>; 2550 *(m_paramsetMap[psId].pNaluData) = naluData; 2558 2551 } 2559 2552 … … 2578 2571 T* getPS(Int psId) 2579 2572 { 2580 return ( m_paramsetMap.find(psId) == m_paramsetMap.end() ) ? NULL : m_paramsetMap[psId].parameterSet; 2573 typename std::map<Int,MapData<T> >::iterator it=m_paramsetMap.find(psId); 2574 return ( it == m_paramsetMap.end() ) ? NULL : (it)->second.parameterSet; 2575 } 2576 2577 const T* getPS(Int psId) const 2578 { 2579 typename std::map<Int,MapData<T> >::const_iterator it=m_paramsetMap.find(psId); 2580 return ( it == m_paramsetMap.end() ) ? NULL : (it)->second.parameterSet; 2581 2581 } 2582 2582 … … 2598 2598 2599 2599 //! store sequence parameter set and take ownership of it 2600 Void storeVPS(TComVPS *vps, const std::vector<UChar> *pNaluData) { m_vpsMap.storePS( vps->getVPSId(), vps, pNaluData); };2600 Void storeVPS(TComVPS *vps, const std::vector<UChar> &naluData) { m_vpsMap.storePS( vps->getVPSId(), vps, naluData); }; 2601 2601 //! get pointer to existing video parameter set 2602 2602 TComVPS* getVPS(Int vpsId) { return m_vpsMap.getPS(vpsId); }; … … 2606 2606 2607 2607 //! store sequence parameter set and take ownership of it 2608 Void storeSPS(TComSPS *sps, const std::vector<UChar> *pNaluData) { m_spsMap.storePS( sps->getSPSId(), sps, pNaluData); };2608 Void storeSPS(TComSPS *sps, const std::vector<UChar> &naluData) { m_spsMap.storePS( sps->getSPSId(), sps, naluData); }; 2609 2609 //! get pointer to existing sequence parameter set 2610 2610 TComSPS* getSPS(Int spsId) { return m_spsMap.getPS(spsId); }; … … 2614 2614 2615 2615 //! store picture parameter set and take ownership of it 2616 Void storePPS(TComPPS *pps, const std::vector<UChar> *pNaluData) { m_ppsMap.storePS( pps->getPPSId(), pps, pNaluData); };2616 Void storePPS(TComPPS *pps, const std::vector<UChar> &naluData) { m_ppsMap.storePS( pps->getPPSId(), pps, naluData); }; 2617 2617 //! get pointer to existing picture parameter set 2618 2618 TComPPS* getPPS(Int ppsId) { return m_ppsMap.getPS(ppsId); }; … … 2623 2623 //! activate a SPS from a active parameter sets SEI message 2624 2624 //! \returns true, if activation is successful 2625 Bool activateSPSWithSEI(Int SPSId);2625 // Bool activateSPSWithSEI(Int SPSId); 2626 2626 2627 2627 //! activate a PPS and depending on isIDR parameter also SPS and VPS … … 2629 2629 Bool activatePPS(Int ppsId, Bool isIRAP); 2630 2630 2631 const TComVPS* getActiveVPS()const { return &m_activeVPS; };2632 const TComSPS* getActiveSPS()const { return &m_activeSPS; };2631 const TComVPS* getActiveVPS()const { return m_vpsMap.getPS(m_activeVPSId); }; 2632 const TComSPS* getActiveSPS()const { return m_spsMap.getPS(m_activeSPSId); }; 2633 2633 2634 2634 #if SVC_EXTENSION 2635 const TComPPS* getActivePPS()const { return &m_activePPS; };2635 const TComPPS* getActivePPS()const { return m_ppsMap.getPS(m_activePPSId); }; 2636 2636 #endif 2637 2637 … … 2643 2643 static ParameterSetMap<TComPPS> m_ppsMap; 2644 2644 2645 TComPPS m_activePPS;2646 static TComVPS m_activeVPS;2645 Int m_activePPSId; 2646 static Int m_activeVPSId; // -1 for nothing active; 2647 2647 #else 2648 2648 ParameterSetMap<TComVPS> m_vpsMap; … … 2650 2650 ParameterSetMap<TComPPS> m_ppsMap; 2651 2651 2652 TComVPS m_activeVPS; // used for SEI message2653 #endif 2654 2655 TComSPS m_activeSPS; // used for SEI message2652 Int m_activeVPSId; // -1 for nothing active 2653 #endif 2654 2655 Int m_activeSPSId; // -1 for nothing active 2656 2656 }; 2657 2657 -
branches/SHM-dev/source/Lib/TLibDecoder/NALread.cpp
r1259 r1319 34 34 /** 35 35 \file NALread.cpp 36 \brief reading fun tionality for NAL units36 \brief reading functionality for NAL units 37 37 */ 38 38 … … 105 105 Void readNalUnitHeader(InputNALUnit& nalu) 106 106 { 107 TComInputBitstream& bs = *nalu.m_Bitstream;107 TComInputBitstream& bs = nalu.getBitstream(); 108 108 109 109 Bool forbidden_zero_bit = bs.read(1); // forbidden_zero_bit … … 165 165 * a bitstream 166 166 */ 167 Void read(InputNALUnit& nalu , vector<uint8_t>& nalUnitBuf)167 Void read(InputNALUnit& nalu) 168 168 { 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(); 176 174 readNalUnitHeader(nalu); 177 175 } -
branches/SHM-dev/source/Lib/TLibDecoder/NALread.h
r1259 r1319 34 34 /** 35 35 \file NALread.h 36 \brief reading fun tionality for NAL units36 \brief reading functionality for NAL units 37 37 */ 38 38 … … 53 53 * bitstream object. 54 54 */ 55 structInputNALUnit : public NALUnit55 class InputNALUnit : public NALUnit 56 56 { 57 InputNALUnit() : m_Bitstream(0) {};58 ~InputNALUnit() { delete m_Bitstream; }57 private: 58 TComInputBitstream m_Bitstream; 59 59 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; } 61 66 }; 62 67 63 Void read(InputNALUnit& nalu, std::vector<uint8_t>& nalUnitBuf); 68 Void read(InputNALUnit& nalu); 69 Void readNalUnitHeader(InputNALUnit& nalu); 64 70 65 71 //! \} -
branches/SHM-dev/source/Lib/TLibDecoder/SEIread.cpp
r1307 r1319 471 471 472 472 /* restore primary bitstream for sei_message */ 473 getBitstream()->deleteFifo();474 473 delete getBitstream(); 475 474 setBitstream(bs); -
branches/SHM-dev/source/Lib/TLibDecoder/TDecGop.cpp
r1292 r1319 154 154 for (UInt ui = 0; ui < uiNumSubstreams; ui++) 155 155 { 156 ppcSubstreams[ui]->deleteFifo();157 156 delete ppcSubstreams[ui]; 158 157 } -
branches/SHM-dev/source/Lib/TLibDecoder/TDecTop.cpp
r1316 r1319 63 63 64 64 TDecTop::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 { 70 107 #if ENC_DEC_TRACE 71 108 if (g_hTrace == NULL) … … 76 113 g_nSymbolCounter = 0; 77 114 #endif 78 m_associatedIRAPType = NAL_UNIT_INVALID;79 m_pocCRA = 0;80 m_pocRandomAccess = MAX_INT;81 #if !SVC_EXTENSION82 m_prevPOC = MAX_INT;83 #endif84 m_prevTid0POC = 0;85 m_bFirstSliceInPicture = true;86 #if !SVC_EXTENSION87 m_bFirstSliceInSequence = true;88 #endif89 m_prevSliceSkipped = false;90 m_skippedPOC = 0;91 m_bFirstSliceInBitstream = true;92 m_lastPOCNoOutputPriorPics = -1;93 m_craNoRaslOutputFlag = false;94 m_isNoOutputPriorPics = false;95 115 96 116 #if SVC_EXTENSION … … 133 153 } 134 154 #endif 155 while (!m_prefixSEINALUs.empty()) 156 { 157 delete m_prefixSEINALUs.front(); 158 m_prefixSEINALUs.pop_front(); 159 } 135 160 #if CGS_3D_ASYMLUT 136 161 if(m_pColorMappedPic) … … 431 456 assert (0); 432 457 } 458 459 xParsePrefixSEImessages(); 433 460 434 461 #if RExt__HIGH_BIT_DEPTH_SUPPORT==0 … … 699 726 } 700 727 728 xParsePrefixSEImessages(); 729 701 730 // Check if any new SEI has arrived 702 731 if(!m_SEIs.empty()) … … 709 738 } 710 739 } 711 740 } 741 742 743 Void 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 755 Void 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 } 712 775 } 713 776 … … 783 846 m_apcSlicePilot->setPOC(m_skippedPOC); 784 847 } 848 849 xUpdatePreviousTid0POC(m_apcSlicePilot); 785 850 786 851 m_apcSlicePilot->setAssociatedIRAPPOC(m_pocCRA); … … 1795 1860 1796 1861 // Decode a picture 1797 m_cGopDecoder.decompressSlice( nalu.m_Bitstream, m_pcPic);1862 m_cGopDecoder.decompressSlice(&(nalu.getBitstream()), m_pcPic); 1798 1863 1799 1864 #if SVC_EXTENSION … … 1808 1873 } 1809 1874 1810 Void TDecTop::xDecodeVPS(const std::vector<UChar> *pNaluData)1875 Void TDecTop::xDecodeVPS(const std::vector<UChar> &naluData) 1811 1876 { 1812 1877 TComVPS* vps = new TComVPS(); 1813 1878 1814 1879 m_cEntropyDecoder.decodeVPS( vps ); 1815 m_parameterSetManager.storeVPS(vps, pNaluData);1880 m_parameterSetManager.storeVPS(vps, naluData); 1816 1881 #if SVC_EXTENSION 1817 1882 checkValueOfTargetOutputLayerSetIdx(vps); … … 1837 1902 } 1838 1903 1839 Void TDecTop::xDecodeSPS(const std::vector<UChar> *pNaluData)1904 Void TDecTop::xDecodeSPS(const std::vector<UChar> &naluData) 1840 1905 { 1841 1906 TComSPS* sps = new TComSPS(); … … 1847 1912 #endif 1848 1913 m_cEntropyDecoder.decodeSPS( sps ); 1849 m_parameterSetManager.storeSPS(sps, pNaluData);1914 m_parameterSetManager.storeSPS(sps, naluData); 1850 1915 } 1851 1916 1852 1917 #if CGS_3D_ASYMLUT 1853 Void TDecTop::xDecodePPS( const std::vector<UChar> *pNaluData, TCom3DAsymLUT * pc3DAsymLUT )1918 Void TDecTop::xDecodePPS( const std::vector<UChar> &naluData, TCom3DAsymLUT * pc3DAsymLUT ) 1854 1919 #else 1855 Void TDecTop::xDecodePPS(const std::vector<UChar> *pNaluData)1920 Void TDecTop::xDecodePPS(const std::vector<UChar> &naluData) 1856 1921 #endif 1857 1922 { … … 1866 1931 m_cEntropyDecoder.decodePPS( pps ); 1867 1932 #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); 1921 1934 } 1922 1935 … … 1937 1950 // Initialize entropy decoder 1938 1951 m_cEntropyDecoder.setEntropyDecoder (&m_cCavlcDecoder); 1939 m_cEntropyDecoder.setBitstream ( nalu.m_Bitstream);1952 m_cEntropyDecoder.setBitstream (&(nalu.getBitstream())); 1940 1953 1941 1954 #if SVC_EXTENSION … … 1952 1965 assert( nalu.m_nuhLayerId == 0 ); // Non-conforming bitstream. The value of nuh_layer_id of VPS NAL unit shall be equal to 0. 1953 1966 #endif 1954 xDecodeVPS(nalu. m_Bitstream->getFifo());1967 xDecodeVPS(nalu.getBitstream().getFifo()); 1955 1968 #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); 1957 1970 #endif 1958 1971 #if SVC_EXTENSION … … 1962 1975 1963 1976 case NAL_UNIT_SPS: 1964 xDecodeSPS(nalu. m_Bitstream->getFifo());1977 xDecodeSPS(nalu.getBitstream().getFifo()); 1965 1978 #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); 1967 1980 #endif 1968 1981 return false; … … 1970 1983 case NAL_UNIT_PPS: 1971 1984 #if CGS_3D_ASYMLUT 1972 xDecodePPS( nalu. m_Bitstream->getFifo(), &m_c3DAsymLUTPPS );1985 xDecodePPS( nalu.getBitstream().getFifo(), &m_c3DAsymLUTPPS ); 1973 1986 #else 1974 xDecodePPS(nalu. m_Bitstream->getFifo());1987 xDecodePPS(nalu.getBitstream().getFifo()); 1975 1988 #endif 1976 1989 #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); 1978 1991 #endif 1979 1992 return false; 1980 1993 1981 1994 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 1982 1999 case NAL_UNIT_SUFFIX_SEI: 1983 2000 #if SVC_EXTENSION … … 1987 2004 } 1988 2005 #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 } 1990 2018 return false; 1991 2019 … … 2079 2107 case NAL_UNIT_RESERVED_VCL30: 2080 2108 case NAL_UNIT_RESERVED_VCL31: 2109 printf ("Note: found reserved VCL NAL unit.\n"); 2110 xParsePrefixSEIsForUnknownVCLNal(); 2111 return false; 2081 2112 2082 2113 case NAL_UNIT_RESERVED_NVCL41: -
branches/SHM-dev/source/Lib/TLibDecoder/TDecTop.h
r1295 r1319 56 56 #include "SEIread.h" 57 57 58 structInputNALUnit;58 class InputNALUnit; 59 59 60 60 //! \ingroup TLibDecoder … … 79 79 TComSlice* m_apcSlicePilot; 80 80 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... 82 82 83 83 // functional classes … … 123 123 124 124 Bool m_warningMessageSkipPicture; 125 126 std::list<InputNALUnit*> m_prefixSEINALUs; /// Buffered up prefix SEI NAL Units. 125 127 126 128 #if SVC_EXTENSION … … 277 279 Bool xDecodeSlice(InputNALUnit &nalu, Int &iSkipFrame, Int iPOCLastDisplay); 278 280 #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); 281 283 #if CGS_3D_ASYMLUT 282 Void xDecodePPS(const std::vector<UChar> *pNaluData, TCom3DAsymLUT *pc3DAsymLUT);284 Void xDecodePPS(const std::vector<UChar> &naluData, TCom3DAsymLUT *pc3DAsymLUT); 283 285 #else 284 Void xDecodePPS(const std::vector<UChar> *pNaluData);286 Void xDecodePPS(const std::vector<UChar> &naluData); 285 287 #endif 286 288 Void xDecodeSEI( TComInputBitstream* bs, const NalUnitType nalUnitType ); 287 289 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(); 288 292 289 293 -
branches/SHM-dev/source/Lib/TLibEncoder/SEIwrite.cpp
r1307 r1319 79 79 case SEI::ACTIVE_PARAMETER_SETS: 80 80 xWriteSEIActiveParameterSets(*static_cast<const SEIActiveParameterSets*>(& sei)); 81 break;82 case SEI::DECODED_PICTURE_HASH:83 xWriteSEIDecodedPictureHash(*static_cast<const SEIDecodedPictureHash*>(&sei));84 81 break; 85 82 #if SVC_EXTENSION … … 97 94 xWriteSEIDecodingUnitInfo(*static_cast<const SEIDecodingUnitInfo*>(& sei), sps); 98 95 break; 96 #endif 97 case SEI::DECODED_PICTURE_HASH: 98 xWriteSEIDecodedPictureHash(*static_cast<const SEIDecodedPictureHash*>(&sei)); 99 break; 100 #if !SVC_EXTENSION 99 101 case SEI::BUFFERING_PERIOD: 100 102 xWriteSEIBufferingPeriod(*static_cast<const SEIBufferingPeriod*>(&sei), sps); … … 398 400 if(vui->getHrdParameters()->getSubPicCpbParamsInPicTimingSEIFlag()) 399 401 { 400 WRITE_CODE( sei.m_duSptCpbRemovalDelay, (vui->getHrdParameters()->getDuCpbRemovalDelayLengthMinus1() + 1), "du_spt_cpb_removal_delay ");402 WRITE_CODE( sei.m_duSptCpbRemovalDelay, (vui->getHrdParameters()->getDuCpbRemovalDelayLengthMinus1() + 1), "du_spt_cpb_removal_delay_increment"); 401 403 } 402 404 WRITE_FLAG( sei.m_dpbOutputDuDelayPresentFlag, "dpb_output_du_delay_present_flag");
Note: See TracChangeset for help on using the changeset viewer.