diff --git a/IsoLib/hevc_extractors/src/HEVCExtractorReader.cpp b/IsoLib/hevc_extractors/src/HEVCExtractorReader.cpp index 4852881..f7dadab 100644 --- a/IsoLib/hevc_extractors/src/HEVCExtractorReader.cpp +++ b/IsoLib/hevc_extractors/src/HEVCExtractorReader.cpp @@ -49,9 +49,9 @@ MP4_EXTERN(MP4Err) ISOGetHEVCSampleDescriptionPS(MP4Handle sampleEntryH, u32 index); MP4_EXTERN(MP4Err) ISOGetRESVLengthSizeMinusOne(MP4Handle sampleEntryH, u32* out); +MP4_EXTERN ( MP4Err ) ISOGetSampleDescriptionType(MP4Handle sampleEntryH, u32 *type); } - int32_t HEVCExtractorReader::getPSfromSampleEntry(ISOHandle sampleEntryH, ISOHandle vpsH, ISOHandle spsH, ISOHandle ppsH) const { ISOErr err; @@ -134,6 +134,33 @@ int32_t HEVCExtractorReader::getLengthSizeMinusOneFlag(uint32_t uiTrackID, uint3 return err; } +std::string HEVCExtractorReader::getSampleEntryType(uint32_t uiTrackID) const +{ + ISOErr err; + std::string strRet = std::string(); + ISOTrackReader* pTrackReader = getTrackReader(uiTrackID); + if(!pTrackReader) { return strRet; } + + ISOHandle sampleEntryH; + ISONewHandle(1, &sampleEntryH); + err = MP4TrackReaderGetCurrentSampleDescription(*pTrackReader, sampleEntryH); + + if(MP4NoErr==err) + { + u32 type; + err = ISOGetSampleDescriptionType(sampleEntryH, &type); + if(MP4NoErr==err) + { + strRet += static_cast((type >> 24) & 255); + strRet += static_cast((type >> 16) & 255); + strRet += static_cast((type >> 8) & 255); + strRet += static_cast((type) & 255); + } + } + ISODisposeHandle(sampleEntryH); + return strRet; +} + std::string HEVCExtractorReader::getOriginalFormat(uint32_t uiTrackID) const { ISOErr err; @@ -384,7 +411,7 @@ std::vector HEVCExtractorReader::getNextAUResolveExtractors() uiDataLength = uiRefSampleSize - uiDataOffset; bNaluLengthRewrite = true; } - else { assert(0); } // this should not happen if the file is OMAF compliant + else { assert(0); } } // now get the right portion of the sample and write it to the output vector vRet.insert(vRet.end(), *sampleFromConstrH+uiDataOffset, *sampleFromConstrH+uiDataOffset+uiDataLength); @@ -520,12 +547,17 @@ int32_t HEVCExtractorReader::init(std::string strFileName, bool bForce) setNextSampleNr(uiTrackID, getCurrentSampleNr(uiTrackID)+1); // get original format - std::string strOriginalFormat = getOriginalFormat(uiTrackID); - if(strOriginalFormat.find("hvc1")!=std::string::npos) + std::string strSampleEntryType = getSampleEntryType(uiTrackID); + if(strSampleEntryType.find("resv")!=std::string::npos) + { + strSampleEntryType = getOriginalFormat(uiTrackID); + } + + if(strSampleEntryType.find("hvc1")!=std::string::npos) { m_vHvc1TrackIDs.push_back(uiTrackID); } - else if(strOriginalFormat.find("hvc2")!=std::string::npos) + else if(strSampleEntryType.find("hvc2")!=std::string::npos) { m_vHvc2TrackIDs.push_back(uiTrackID); m_mHvc2Dependencies[uiTrackID] = getRefTrackIDs(trak); diff --git a/IsoLib/hevc_extractors/src/HEVCExtractorReader.h b/IsoLib/hevc_extractors/src/HEVCExtractorReader.h index 7d38f4d..6756c70 100644 --- a/IsoLib/hevc_extractors/src/HEVCExtractorReader.h +++ b/IsoLib/hevc_extractors/src/HEVCExtractorReader.h @@ -51,6 +51,8 @@ class HEVCExtractorReader int32_t getPSwithStartCodesFromTrack(uint32_t uiTrackID, std::vector& rvOut) const; /// + std::string getSampleEntryType(uint32_t uiTrackID) const; + /// /// \brief getOriginalFormat returns the original_format string /// \param uiTrackID which track to select /// \return original_format string diff --git a/IsoLib/libisomediafile/src/ISOSampleDescriptions.c b/IsoLib/libisomediafile/src/ISOSampleDescriptions.c index 793d8ee..4298aff 100644 --- a/IsoLib/libisomediafile/src/ISOSampleDescriptions.c +++ b/IsoLib/libisomediafile/src/ISOSampleDescriptions.c @@ -1042,7 +1042,7 @@ MP4_EXTERN(MP4Err) ISOGetHEVCSampleDescriptionPS(MP4Handle sampleEntryH, err = sampleEntryHToAtomPtr(sampleEntryH, (MP4AtomPtr *)&entry, MP4VisualSampleEntryAtomType); if (err) goto bail; - if (entry->type != ISOHEVCSampleEntryAtomType) BAILWITHERROR(MP4BadParamErr); + if (entry->type != ISOHEVCSampleEntryAtomType && entry->type != ISOLHEVCSampleEntryAtomType) BAILWITHERROR(MP4BadParamErr); err = MP4GetListEntryAtom(entry->ExtensionAtomList, ISOHEVCConfigAtomType, (MP4AtomPtr*)&config); if (err == MP4NotFoundErr) { BAILWITHERROR(MP4BadDataErr);