Skip to content

Commit

Permalink
Merge pull request #41 from MPEGGroup/sgpd_versions
Browse files Browse the repository at this point in the history
Further improvements
  • Loading branch information
podborski committed Apr 4, 2024
2 parents 2a0e1a3 + f8dc422 commit 7eaf048
Show file tree
Hide file tree
Showing 27 changed files with 606 additions and 106 deletions.
4 changes: 2 additions & 2 deletions .github/workflows/clang-format.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ jobs:
steps:
- uses: actions/checkout@v2
- name: Run clang-format style check for C/C++ programs.
uses: jidicula/clang-format-action@v4.4.1
uses: jidicula/clang-format-action@v4.11.0
with:
clang-format-version: '13'
clang-format-version: '15'
check-path: 'IsoLib/libisomediafile'
74 changes: 69 additions & 5 deletions IsoLib/libisomediafile/src/ISOMeta.c
Original file line number Diff line number Diff line change
Expand Up @@ -1163,7 +1163,7 @@ ISO_EXTERN(ISOErr) ISOSetItemInfoItemType(ISOMetaItem item, u32 item_type, char
if(item_uri_type)
{
u32 sz = (u32)strlen(item_uri_type);
infe->item_uri_type = (char *)calloc(1, sz);
infe->item_uri_type = (char *)calloc(1, sz + 1);
memcpy(infe->item_uri_type, item_uri_type, sz);
}
else
Expand All @@ -1176,6 +1176,67 @@ ISO_EXTERN(ISOErr) ISOSetItemInfoItemType(ISOMetaItem item, u32 item_type, char
return err;
}

ISO_EXTERN(ISOErr) ISOHideItem(ISOMetaItem item)
{
MP4Err err;
ISOMetaAtomPtr myMeta;
MetaItemLocationPtr myItem;
ISOItemInfoAtomPtr iinf;
ISOPrimaryItemAtomPtr pitm;
ISOItemInfoEntryAtomPtr infe;

err = MP4NoErr;
myItem = (MetaItemLocationPtr)item;
myMeta = (ISOMetaAtomPtr)myItem->meta;
iinf = (ISOItemInfoAtomPtr)myMeta->iinf;
pitm = (ISOPrimaryItemAtomPtr)myMeta->pitm;

if(!iinf) BAILWITHERROR(MP4InvalidMediaErr);

if(pitm->item_ID == myItem->item_ID) BAILWITHERROR(MP4InvalidMediaErr);

infe = NULL;
err = iinf->getEntry(iinf, myItem->item_ID, &infe);
if(err) goto bail;

if(infe == NULL) BAILWITHERROR(MP4InvalidMediaErr);

infe->flags |= 1U;

bail:
TEST_RETURN(err);
return err;
}

ISO_EXTERN(ISOErr) ISOIsItemHidden(ISOMetaItem item)
{
MP4Err err;
ISOMetaAtomPtr myMeta;
MetaItemLocationPtr myItem;
ISOItemInfoAtomPtr iinf;
ISOItemInfoEntryAtomPtr infe;

err = MP4NoErr;
myItem = (MetaItemLocationPtr)item;
myMeta = (ISOMetaAtomPtr)myItem->meta;
iinf = (ISOItemInfoAtomPtr)myMeta->iinf;

if(!iinf) BAILWITHERROR(MP4InvalidMediaErr);

infe = NULL;
err = iinf->getEntry(iinf, myItem->item_ID, &infe);
if(err) goto bail;

if(infe == NULL) BAILWITHERROR(MP4InvalidMediaErr);

err = MP4NotFoundErr;
if(infe->flags & 1U) err = MP4NoErr;

bail:
TEST_RETURN(err);
return err;
}

ISO_EXTERN(ISOErr) ISOGetItemInfoItemType(ISOMetaItem item, u32 *item_type, char **item_uri_type)
{
MP4Err err;
Expand All @@ -1201,11 +1262,14 @@ ISO_EXTERN(ISOErr) ISOGetItemInfoItemType(ISOMetaItem item, u32 *item_type, char

*item_type = infe->item_type;

if(infe->item_uri_type)
if(item_uri_type)
{
u32 sz = (u32)strlen(infe->item_uri_type);
*item_uri_type = (char *)calloc(1, sz);
memcpy(*item_uri_type, infe->item_uri_type, sz);
if(infe->item_uri_type)
{
u32 sz = (u32)strlen(infe->item_uri_type);
*item_uri_type = (char *)calloc(1, sz + 1);
memcpy(*item_uri_type, infe->item_uri_type, sz);
}
}
bail:
TEST_RETURN(err);
Expand Down
31 changes: 31 additions & 0 deletions IsoLib/libisomediafile/src/ISOMovies.h
Original file line number Diff line number Diff line change
Expand Up @@ -715,6 +715,26 @@ extern "C"
* @todo rename the function to ISOGetOriginalFormat and parse the cinf and sinf as well
*/
ISO_EXTERN(ISOErr) ISOGetRESVOriginalFormat(MP4Handle sampleEntryH, u32 *outOrigFmt);
/**
* @brief Get scheme_type and scheme_version from the SchemeTypeBox in resv
* @ingroup SampleDescr
* @param sampleEntryH resv sample entry data
* @param schemeType [out] scheme_type 4CC
* @param schemeVersion [out] scheme_version
* @param schemeURI [out] scheme_uri
*/
ISO_EXTERN(ISOErr)
ISOGetRESVSchemeType(MP4Handle sampleEntryH, u32 *schemeType, u32 *schemeVersion,
char **schemeURI);
/**
* @brief Get the box from the SchemeInformationBox in resv
* @ingroup SampleDescr
* @param sampleEntryH resv sample entry data
* @param atomType type of the atom inside SchemeInformationBox
* @param outAtom [out] data of the found box
*/
ISO_EXTERN(ISOErr)
ISOGetRESVSchemeInfoAtom(MP4Handle sampleEntryH, u32 atomType, MP4Handle outAtom);
/**
* @brief Create a new HEVC sample entry.
* @ingroup SampleDescr
Expand Down Expand Up @@ -1081,6 +1101,17 @@ extern "C"
* @param item_uri_type can be NULL, if the item_type is not ‘uri ‘
*/
ISO_EXTERN(ISOErr) ISOSetItemInfoItemType(ISOMetaItem item, u32 item_type, char *item_uri_type);
/**
* @brief Hide item by setting the (flags & 1) = 1
* @param item Item to hide
*/
ISO_EXTERN(ISOErr) ISOHideItem(ISOMetaItem item);
/**
* @brief Check if item is hiden
* @param item Item to check
* @return MP4NoErr if item is hidden, MP4NotFoundErr if not, MP4InvalidMediaErr otherwise
*/
ISO_EXTERN(ISOErr) ISOIsItemHidden(ISOMetaItem item);
/**
* @brief Gets an item info item type from an existing item info entry.
* @param item_uri_type could be NULL, if the item_type is not ‘uri ‘.
Expand Down
59 changes: 56 additions & 3 deletions IsoLib/libisomediafile/src/ISOSampleDescriptions.c
Original file line number Diff line number Diff line change
Expand Up @@ -403,8 +403,16 @@ ISOGetSampleDescriptionDimensions(MP4Handle sampleEntryH, u16 *width, u16 *heigh
err = sampleEntryHToAtomPtr(sampleEntryH, (MP4AtomPtr *)&entry, MP4VisualSampleEntryAtomType);
if(err) goto bail;

*width = (u16)entry->width;
*height = (u16)entry->height;
if(entry->type == MP4RestrictedVideoSampleEntryAtomType)
{
*width = (u16)((MP4RestrictedVideoSampleEntryAtomPtr)entry)->width;
*height = (u16)((MP4RestrictedVideoSampleEntryAtomPtr)entry)->height;
}
else
{
*width = (u16)entry->width;
*height = (u16)entry->height;
}

bail:
if(entry) entry->destroy((MP4AtomPtr)entry);
Expand Down Expand Up @@ -1381,7 +1389,8 @@ MP4_EXTERN(MP4Err) ISOGetRESVOriginalFormat(MP4Handle sampleEntryH, u32 *outOrig

if(entry->type != MP4RestrictedVideoSampleEntryAtomType) BAILWITHERROR(MP4BadParamErr);

rinf = (MP4RestrictedSchemeInfoAtomPtr)entry->MP4RestrictedSchemeInfo;
err = entry->getRinf((MP4AtomPtr)entry, (MP4AtomPtr *)&rinf);
if(err) goto bail;
if(!rinf)
{
BAILWITHERROR(MP4BadParamErr);
Expand All @@ -1399,6 +1408,50 @@ MP4_EXTERN(MP4Err) ISOGetRESVOriginalFormat(MP4Handle sampleEntryH, u32 *outOrig
return err;
}

ISO_EXTERN(ISOErr)
ISOGetRESVSchemeType(MP4Handle sampleEntryH, u32 *schemeType, u32 *schemeVersion, char **schemeURI)
{
MP4Err err;
MP4RestrictedVideoSampleEntryAtomPtr entry = NULL;

err = sampleEntryHToAtomPtr(sampleEntryH, (MP4AtomPtr *)&entry, MP4VisualSampleEntryAtomType);
if(err) goto bail;

if(entry->type != MP4RestrictedVideoSampleEntryAtomType) BAILWITHERROR(MP4BadParamErr);

err = entry->getScheme((MP4AtomPtr)entry, schemeType, schemeVersion, schemeURI);
if(err) goto bail;

bail:
if(entry) entry->destroy((MP4AtomPtr)entry);
return err;
}

ISO_EXTERN(ISOErr)
ISOGetRESVSchemeInfoAtom(MP4Handle sampleEntryH, u32 atomType, MP4Handle outAtom)
{
MP4Err err;
MP4RestrictedVideoSampleEntryAtomPtr entry = NULL;
MP4AtomPtr found;

if(outAtom == NULL) BAILWITHERROR(MP4BadParamErr);

err = sampleEntryHToAtomPtr(sampleEntryH, (MP4AtomPtr *)&entry, MP4VisualSampleEntryAtomType);
if(err) goto bail;

if(entry->type != MP4RestrictedVideoSampleEntryAtomType) BAILWITHERROR(MP4BadParamErr);

err = entry->getSchemeInfoAtom((MP4AtomPtr)entry, atomType, &found);
if(err) goto bail;

err = atomPtrToSampleEntryH(outAtom, found);
if(err) goto bail;

bail:
if(entry) entry->destroy((MP4AtomPtr)entry);
return err;
}

MP4_EXTERN(MP4Err)
ISONewHEVCSampleDescription(MP4Track theTrack, MP4Handle sampleDescriptionH, u32 dataReferenceIndex,
u32 length_size, MP4Handle first_sps, MP4Handle first_pps,
Expand Down
2 changes: 1 addition & 1 deletion IsoLib/libisomediafile/src/ItemInfoEntryAtom.c
Original file line number Diff line number Diff line change
Expand Up @@ -231,7 +231,7 @@ static MP4Err createFromInputStream(MP4AtomPtr s, MP4AtomPtr proto, MP4InputStre
char inputstr[4096];
char *str;
u32 i;
char msgString[200];
char msgString[8192];
char typeString[8];

ISOItemInfoEntryAtomPtr self = (ISOItemInfoEntryAtomPtr)s;
Expand Down
12 changes: 9 additions & 3 deletions IsoLib/libisomediafile/src/MP4Atoms.h
Original file line number Diff line number Diff line change
Expand Up @@ -1224,13 +1224,17 @@ typedef struct MP4SubSampleInformationAtom
MP4Err (*addEntry)(struct MP4SubSampleInformationAtom *self, u32 sample_delta,
u32 subsample_count, MP4Handle subsample_size_array,
MP4Handle subsample_priority_array, MP4Handle subsample_discardable_array);
MP4Err (*addEntry2)(struct MP4SubSampleInformationAtom *self, u32 sample_delta,
u32 subsample_count, MP4Handle subsample_size_array,
MP4Handle subsample_priority_array, MP4Handle subsample_discardable_array,
MP4Handle codec_specific_parameters_array);
u32 entry_count;
u32 *sample_delta;
u32 *subsample_count;
u32 **subsample_size;
u32 **subsample_priority;
u32 **discardable;
u32 **reserved;
u32 **codec_specific_parameters;
} MP4SubSampleInformationAtom, *MP4SubSampleInformationAtomPtr;

typedef struct MP4SyncSampleAtom
Expand Down Expand Up @@ -1493,7 +1497,7 @@ enum
typedef struct MP4TrackFragmentDecodeTimeAtom
{
MP4_FULL_ATOM
u32 baseMediaDecodeTime;
u64 baseMediaDecodeTime;
} MP4TrackFragmentDecodeTimeAtom, *MP4TrackFragmentDecodeTimeAtomPtr;

typedef struct MP4ItemPropertyContainerAtom
Expand Down Expand Up @@ -1648,11 +1652,11 @@ typedef struct MP4RestrictedVideoSampleEntryAtom
MP4_BASE_ATOM
COMMON_SAMPLE_ENTRY_FIELDS

MP4AtomPtr MP4RestrictedSchemeInfo;
u32 restriction_type;

MP4Err (*addSchemeInfoAtom)(struct MP4Atom *self, struct MP4Atom *theAtom);
MP4Err (*getSchemeInfoAtom)(struct MP4Atom *self, u32 theType, struct MP4Atom **theAtom);
MP4Err (*getRinf)(struct MP4Atom *self, struct MP4Atom **theAtom);
MP4Err (*getScheme)(struct MP4Atom *self, u32 *sch_type, u32 *sch_version, char **sch_url);

MP4Err (*transform)(struct MP4Atom *self, u32 sch_type, u32 sch_version, char *sch_url);
Expand Down Expand Up @@ -1792,6 +1796,8 @@ typedef struct MP4SampleGroupDescriptionAtom

u32 default_length; /* we only handle version 1 */

u32 default_group_description_index; /* only after version 2 */

u32 groupCount;

sampleGroupEntry *groups;
Expand Down
24 changes: 24 additions & 0 deletions IsoLib/libisomediafile/src/MP4FileMappingInputStream.c
Original file line number Diff line number Diff line change
Expand Up @@ -158,6 +158,29 @@ static MP4Err skipData(struct MP4InputStreamRecord *s, u64 bytes, char *msg)
return err;
}

static MP4Err rewindData(struct MP4InputStreamRecord *s, u64 bytes, char *msg)
{
MP4Err err;
MP4FileMappingInputStreamPtr self = (MP4FileMappingInputStreamPtr)s;

if(bytes > self->current_offset) BAILWITHERROR(MP4BadParamErr);
err = MP4NoErr;

self->available += bytes;
self->current_offset -= bytes;

if(msg && self->debugging)
{
doIndent(s);
fprintf(stdout, "%s = [%lld bytes of data rewinded]\n", msg, bytes);
}

bail:
TEST_RETURN(err);

return err;
}

static MP4Err readData(struct MP4InputStreamRecord *s, u64 bytes, char *outData, char *msg)
{
MP4Err err;
Expand Down Expand Up @@ -223,6 +246,7 @@ MP4Err MP4CreateFileMappingInputStream(struct FileMappingObjectRecord *mapping,
is->read32 = read32;
is->readData = readData;
is->skipData = skipData;
is->rewindData = rewindData;
is->getStreamOffset = getStreamOffset;
is->getFileMappingObject = getFileMappingObject;
is->mapping = mapping;
Expand Down
5 changes: 5 additions & 0 deletions IsoLib/libisomediafile/src/MP4Impl.h
Original file line number Diff line number Diff line change
Expand Up @@ -236,6 +236,11 @@ derivative works. Copyright (c) 1999.
} \
}

#define REWIND_DATA(length, var) \
err = inputStream->rewindData(inputStream, length, var); \
if(err) goto bail; \
self->bytesRead -= length;

#define PUTBYTES(src, len) \
if((self->bytesWritten + len) > self->size) \
{ \
Expand Down
3 changes: 2 additions & 1 deletion IsoLib/libisomediafile/src/MP4InputStream.h
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,8 @@ derivative works. Copyright (c) 1999.
MP4Err (*read32)(struct MP4InputStreamRecord * self, u32 * outVal, char *msg); \
MP4Err (*readData)(struct MP4InputStreamRecord * self, u64 bytes, char *outData, char *msg); \
u64 (*getStreamOffset)(struct MP4InputStreamRecord * self); \
MP4Err (*skipData)(struct MP4InputStreamRecord * self, u64 bytes, char *msg);
MP4Err (*skipData)(struct MP4InputStreamRecord * self, u64 bytes, char *msg); \
MP4Err (*rewindData)(struct MP4InputStreamRecord * self, u64 bytes, char *msg);

typedef struct MP4InputStreamRecord
{
Expand Down
1 change: 1 addition & 0 deletions IsoLib/libisomediafile/src/MP4LinkedList.c
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ MP4Err MP4MakeLinkedList(MP4LinkedList *outList)
newList = (MP4LinkedList)calloc(1, sizeof(MP4List));
TESTMALLOC(newList)
newList->foundEntryNumber = -1;
newList->entryCount = 0;
*outList = newList;
bail:
return err;
Expand Down
24 changes: 24 additions & 0 deletions IsoLib/libisomediafile/src/MP4MemoryInputStream.c
Original file line number Diff line number Diff line change
Expand Up @@ -168,6 +168,29 @@ static MP4Err skipData(struct MP4InputStreamRecord *s, u64 bytes, char *msg)
return err;
}

static MP4Err rewindData(struct MP4InputStreamRecord *s, u64 bytes, char *msg)
{
MP4Err err;
MP4FileMappingInputStreamPtr self = (MP4FileMappingInputStreamPtr)s;

if(bytes > self->current_offset) BAILWITHERROR(MP4BadParamErr);
err = MP4NoErr;

self->available += bytes;
self->current_offset -= bytes;

if(msg && self->debugging)
{
doIndent(s);
fprintf(stdout, "%s = [%lld bytes of data rewinded]\n", msg, bytes);
}

bail:
TEST_RETURN(err);

return err;
}

static MP4Err readData(struct MP4InputStreamRecord *s, u64 bytes, char *outData, char *msg)
{
MP4Err err;
Expand Down Expand Up @@ -221,6 +244,7 @@ MP4Err MP4CreateMemoryInputStream(char *base, u32 size, MP4InputStreamPtr *outSt
is->read32 = read32;
is->readData = readData;
is->skipData = skipData;
is->rewindData = rewindData;
is->getStreamOffset = getStreamOffset;
is->msg = msg;
is->getFileMappingObject = getFileMappingObject;
Expand Down
Loading

0 comments on commit 7eaf048

Please sign in to comment.