Skip to content

Commit

Permalink
hevc extractors for non OMAF files
Browse files Browse the repository at this point in the history
  • Loading branch information
podborski committed Sep 18, 2020
1 parent f9ce64c commit bd5892b
Show file tree
Hide file tree
Showing 4 changed files with 41 additions and 6 deletions.
41 changes: 36 additions & 5 deletions IsoLib/hevc_extractors/src/HEVCExtractorReader.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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<char>((type >> 24) & 255);
strRet += static_cast<char>((type >> 16) & 255);
strRet += static_cast<char>((type >> 8) & 255);
strRet += static_cast<char>((type) & 255);
}
}
ISODisposeHandle(sampleEntryH);
return strRet;
}

std::string HEVCExtractorReader::getOriginalFormat(uint32_t uiTrackID) const
{
ISOErr err;
Expand Down Expand Up @@ -384,7 +411,6 @@ std::vector<char> HEVCExtractorReader::getNextAUResolveExtractors()
uiDataLength = uiRefSampleSize - uiDataOffset;
bNaluLengthRewrite = true;
}
else { assert(0); } // this should not happen if the file is OMAF compliant
}
// now get the right portion of the sample and write it to the output vector
vRet.insert(vRet.end(), *sampleFromConstrH+uiDataOffset, *sampleFromConstrH+uiDataOffset+uiDataLength);
Expand Down Expand Up @@ -520,12 +546,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);
Expand Down
2 changes: 2 additions & 0 deletions IsoLib/hevc_extractors/src/HEVCExtractorReader.h
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,8 @@ class HEVCExtractorReader
int32_t getPSwithStartCodesFromTrack(uint32_t uiTrackID,
std::vector<char>& 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
Expand Down
2 changes: 1 addition & 1 deletion IsoLib/libisomediafile/src/ISOSampleDescriptions.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
2 changes: 2 additions & 0 deletions IsoLib/libisomediafile/src/MP4Atoms.h
Original file line number Diff line number Diff line change
Expand Up @@ -1976,6 +1976,8 @@ MP4Err MP4CreateItemPropertiesAtom(MP4ItemPropertiesAtomPtr *outAtom);
MP4Err MP4CreateItemPropertyContainerAtom(MP4ItemPropertyContainerAtomPtr *outAtom);
MP4Err MP4CreateItemPropertyAssociationAtom(MP4ItemPropertyAssociationAtomPtr *outAtom);

MP4Err MP4CreateHEVCConfigAtom(ISOHEVCConfigAtomPtr *outAtom);

MP4Err MP4CreateOriginalFormatAtom(MP4OriginalFormatAtomPtr *outAtom);
MP4Err MP4CreateSchemeInfoAtom(MP4SchemeInfoAtomPtr *outAtom);
MP4Err MP4CreateRestrictedSchemeInfoAtom(MP4RestrictedSchemeInfoAtomPtr *outAtom);
Expand Down

0 comments on commit bd5892b

Please sign in to comment.