From e084c3f2400091c5ccb32902901d587854dd44c8 Mon Sep 17 00:00:00 2001 From: Dimitri Podborski Date: Wed, 18 Jan 2023 20:16:11 -0800 Subject: [PATCH 01/31] sgpd version!=1 parsing --- IsoLib/libisomediafile/src/MP4Atoms.h | 2 ++ .../src/SampleGroupDescriptionAtom.c | 25 +++++++++++++------ 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/IsoLib/libisomediafile/src/MP4Atoms.h b/IsoLib/libisomediafile/src/MP4Atoms.h index 7a94d81..9979e5a 100644 --- a/IsoLib/libisomediafile/src/MP4Atoms.h +++ b/IsoLib/libisomediafile/src/MP4Atoms.h @@ -1792,6 +1792,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; diff --git a/IsoLib/libisomediafile/src/SampleGroupDescriptionAtom.c b/IsoLib/libisomediafile/src/SampleGroupDescriptionAtom.c index 5c67cdd..9b8ad26 100644 --- a/IsoLib/libisomediafile/src/SampleGroupDescriptionAtom.c +++ b/IsoLib/libisomediafile/src/SampleGroupDescriptionAtom.c @@ -222,14 +222,13 @@ static MP4Err createFromInputStream(MP4AtomPtr s, MP4AtomPtr proto, MP4InputStre sprintf(msgString, " grouping type is '%s'", typeString); inputStream->msg(inputStream, msgString); - if(self->version == 1) + if(self->version >= 1) { GET32(default_length); } - else + if(self->version >= 2) { - err = MP4NotImplementedErr; - goto bail; + GET32(default_group_description_index); } GET32(groupCount); @@ -240,12 +239,22 @@ static MP4Err createFromInputStream(MP4AtomPtr s, MP4AtomPtr proto, MP4InputStre for(i = 0; i < self->groupCount; i++) { u32 count; - if(self->default_length == 0) + if(self->version >= 1) { - GET32_V_MSG(count, NULL); + if(self->default_length == 0) + { + GET32_V_MSG(count, NULL); + } + else + { + count = self->default_length; + } } else - count = self->default_length; + { + assert(self->size > self->bytesRead); + count = self->size - self->bytesRead; + } sprintf(msgString, " entry %d, size %d", i + 1, count); inputStream->msg(inputStream, msgString); @@ -287,6 +296,8 @@ MP4Err MP4CreateSampleGroupDescriptionAtom(MP4SampleGroupDescriptionAtomPtr *out self->groupCount = 0; self->groups = NULL; + self->default_group_description_index = 0; + *outAtom = self; bail: TEST_RETURN(err); From 88b4eb1ad4fa4e622a79b948f1260837badf2085 Mon Sep 17 00:00:00 2001 From: Dimitri Podborski Date: Fri, 26 May 2023 02:31:09 -0700 Subject: [PATCH 02/31] remove unused variable --- IsoLib/libisomediafile/src/SampleTableAtom.c | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/IsoLib/libisomediafile/src/SampleTableAtom.c b/IsoLib/libisomediafile/src/SampleTableAtom.c index 3094996..9346b5e 100644 --- a/IsoLib/libisomediafile/src/SampleTableAtom.c +++ b/IsoLib/libisomediafile/src/SampleTableAtom.c @@ -712,7 +712,7 @@ static MP4Err getSampleGroupSampleNumbers(struct MP4SampleTableAtom *self, u32 g { MP4Err err; MP4SampletoGroupAtomPtr theGroup; - u32 i, cur_index, cur_count; + u32 i, cur_index; *outSampleCnt = 0; err = MP4FindGroupAtom(self->sampletoGroupList, groupType, (MP4AtomPtr *)&theGroup); @@ -721,17 +721,14 @@ static MP4Err getSampleGroupSampleNumbers(struct MP4SampleTableAtom *self, u32 g *outSampleNumbers = (u32 *)malloc((theGroup->sampleCount) * sizeof(u32)); TESTMALLOC(*outSampleNumbers); cur_index = (theGroup->group_index)[0]; - cur_count = 1; for(i = 1; i < theGroup->sampleCount; i++) { - if((theGroup->group_index)[i - 1] == (theGroup->group_index)[i]) cur_count++; - else + if((theGroup->group_index)[i - 1] != (theGroup->group_index)[i]) { if(cur_index == groupIndex) { (*outSampleNumbers)[(*outSampleCnt)++] = i; } - cur_count = 1; cur_index = (theGroup->group_index)[i]; } } @@ -743,7 +740,6 @@ static MP4Err getSampleGroupSampleNumbers(struct MP4SampleTableAtom *self, u32 g bail: TEST_RETURN(err); - return err; } From ae5861cab9422ef695bf2706b218f661ad6af10c Mon Sep 17 00:00:00 2001 From: Dimitri Podborski Date: Sun, 28 May 2023 23:52:03 -0700 Subject: [PATCH 03/31] suppress release build warning --- IsoLib/libisomediafile/src/SampleToGroupAtom.c | 1 + 1 file changed, 1 insertion(+) diff --git a/IsoLib/libisomediafile/src/SampleToGroupAtom.c b/IsoLib/libisomediafile/src/SampleToGroupAtom.c index d02df47..b87501b 100644 --- a/IsoLib/libisomediafile/src/SampleToGroupAtom.c +++ b/IsoLib/libisomediafile/src/SampleToGroupAtom.c @@ -712,6 +712,7 @@ static MP4Err serialize(struct MP4Atom *s, char *buffer) entryCount++; assert(entryCount == self->entryCount); + (void)entryCount; /* remove the release build warning */ } else { From 5db1f3bcabd781c6ba9543a3fae17d81e6859dab Mon Sep 17 00:00:00 2001 From: Dimitri Podborski Date: Mon, 3 Jul 2023 07:23:48 -0700 Subject: [PATCH 04/31] resv bugfix --- .../src/ISOSampleDescriptions.c | 3 +- IsoLib/libisomediafile/src/MP4Atoms.h | 4 +- IsoLib/libisomediafile/src/MP4Movies.c | 1 + .../src/RestrictedVideoSampleEntry.c | 79 +++++++++++++------ 4 files changed, 63 insertions(+), 24 deletions(-) diff --git a/IsoLib/libisomediafile/src/ISOSampleDescriptions.c b/IsoLib/libisomediafile/src/ISOSampleDescriptions.c index b562b1a..14bf899 100644 --- a/IsoLib/libisomediafile/src/ISOSampleDescriptions.c +++ b/IsoLib/libisomediafile/src/ISOSampleDescriptions.c @@ -1381,7 +1381,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); diff --git a/IsoLib/libisomediafile/src/MP4Atoms.h b/IsoLib/libisomediafile/src/MP4Atoms.h index 9979e5a..2714157 100644 --- a/IsoLib/libisomediafile/src/MP4Atoms.h +++ b/IsoLib/libisomediafile/src/MP4Atoms.h @@ -1648,11 +1648,13 @@ typedef struct MP4RestrictedVideoSampleEntryAtom MP4_BASE_ATOM COMMON_SAMPLE_ENTRY_FIELDS - MP4AtomPtr MP4RestrictedSchemeInfo; + // 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); diff --git a/IsoLib/libisomediafile/src/MP4Movies.c b/IsoLib/libisomediafile/src/MP4Movies.c index 3821f61..cedef18 100644 --- a/IsoLib/libisomediafile/src/MP4Movies.c +++ b/IsoLib/libisomediafile/src/MP4Movies.c @@ -395,6 +395,7 @@ MP4_EXTERN(MP4Err) MP4GetMovieTrackCount(MP4Movie theMovie, u32 *outTrackCount) { GETMOVIEATOM(theMovie); + if(movieAtom == NULL) BAILWITHERROR(MP4BadDataErr); *outTrackCount = movieAtom->getTrackCount(movieAtom); bail: TEST_RETURN(err); diff --git a/IsoLib/libisomediafile/src/RestrictedVideoSampleEntry.c b/IsoLib/libisomediafile/src/RestrictedVideoSampleEntry.c index 1fa704f..df69c83 100644 --- a/IsoLib/libisomediafile/src/RestrictedVideoSampleEntry.c +++ b/IsoLib/libisomediafile/src/RestrictedVideoSampleEntry.c @@ -42,11 +42,6 @@ static void destroy(MP4AtomPtr s) self = (MP4RestrictedVideoSampleEntryAtomPtr)s; if(self == NULL) BAILWITHERROR(MP4BadParamErr) - if(self->MP4RestrictedSchemeInfo) - { - self->MP4RestrictedSchemeInfo->destroy(self->MP4RestrictedSchemeInfo); - self->MP4RestrictedSchemeInfo = NULL; - } DESTROY_ATOM_LIST_F(ExtensionAtomList) if(self->super) self->super->destroy(s); @@ -81,7 +76,6 @@ static MP4Err serialize(struct MP4Atom *s, char *buffer) PUT16(reserved8); PUT16(reserved9); - SERIALIZE_ATOM(MP4RestrictedSchemeInfo); SERIALIZE_ATOM_LIST(ExtensionAtomList); assert(self->bytesWritten == self->size); @@ -102,7 +96,6 @@ static MP4Err calculateSize(struct MP4Atom *s) if(err) goto bail; self->size += (6 + 16 + 31 + (4 * 2) + (1 * 1) + (4 * 4)); /* TODO this probably includes restriction_type */ - ADD_ATOM_SIZE(MP4RestrictedSchemeInfo); ADD_ATOM_LIST_SIZE(ExtensionAtomList); bail: TEST_RETURN(err); @@ -115,12 +108,9 @@ static MP4Err addAtom(MP4RestrictedVideoSampleEntryAtomPtr self, MP4AtomPtr atom MP4Err err; err = MP4NoErr; if(atom == NULL) BAILWITHERROR(MP4BadParamErr); - if(atom->type == MP4RestrictedSchemeInfoAtomType) self->MP4RestrictedSchemeInfo = atom; - else - { - err = MP4AddListEntry(atom, self->ExtensionAtomList); - if(err) goto bail; - } + err = MP4AddListEntry(atom, self->ExtensionAtomList); + if(err) goto bail; + bail: TEST_RETURN(err); @@ -151,7 +141,6 @@ static MP4Err createFromInputStream(MP4AtomPtr s, MP4AtomPtr proto, MP4InputStre GETBYTES(31, name31); GET16(reserved8); GET16(reserved9); - GETATOM(MP4RestrictedSchemeInfo); GETATOM_LIST(ExtensionAtomList); if(self->bytesRead != self->size) BAILWITHERROR(MP4BadDataErr); @@ -228,14 +217,30 @@ static MP4Err transform(struct MP4Atom *s, u32 sch_type, u32 sch_version, char * static MP4Err untransform(struct MP4Atom *s) { MP4Err err; - + u32 atomListSize; + u32 index, i; MP4RestrictedVideoSampleEntryAtomPtr self = (MP4RestrictedVideoSampleEntryAtomPtr)s; MP4OriginalFormatAtomPtr fmt; MP4RestrictedSchemeInfoAtomPtr rinf; err = MP4NoErr; + rinf = NULL; + + err = MP4GetListEntryCount(self->ExtensionAtomList, &atomListSize); + if(err) goto bail; + for(i = 0; i < atomListSize; i++) + { + MP4AtomPtr a; + err = MP4GetListEntry(self->ExtensionAtomList, i, (char **)&a); + if(err) goto bail; + if(a->type == MP4RestrictedSchemeInfoAtomType) + { + index = i; + rinf = (MP4RestrictedSchemeInfoAtomPtr)a; + break; + } + } - rinf = (MP4RestrictedSchemeInfoAtomPtr)self->MP4RestrictedSchemeInfo; if(!rinf) { err = MP4BadParamErr; @@ -249,11 +254,11 @@ static MP4Err untransform(struct MP4Atom *s) goto bail; } - self->type = fmt->original_format; - self->MP4RestrictedSchemeInfo = NULL; - + self->type = fmt->original_format; rinf->destroy((MP4AtomPtr)rinf); + err = MP4DeleteListEntry(self->ExtensionAtomList, index); + bail: TEST_RETURN(err); @@ -268,7 +273,8 @@ static MP4Err addSchemeInfoAtom(struct MP4Atom *s, struct MP4Atom *theAtom) MP4SchemeInfoAtomPtr schi; MP4RestrictedSchemeInfoAtomPtr rinf; - rinf = (MP4RestrictedSchemeInfoAtomPtr)self->MP4RestrictedSchemeInfo; + err = self->getRinf((MP4AtomPtr)self, (MP4AtomPtr *)&rinf); + if(err) goto bail; if(!rinf) { err = MP4BadParamErr; @@ -301,7 +307,8 @@ static MP4Err getSchemeInfoAtom(struct MP4Atom *s, u32 theType, struct MP4Atom * err = MP4NoErr; - rinf = (MP4RestrictedSchemeInfoAtomPtr)self->MP4RestrictedSchemeInfo; + err = self->getRinf((MP4AtomPtr)self, (MP4AtomPtr *)&rinf); + if(err) goto bail; if(!rinf) { err = MP4BadParamErr; @@ -344,6 +351,32 @@ static MP4Err getSchemeInfoAtom(struct MP4Atom *s, u32 theType, struct MP4Atom * return err; } +static MP4Err getRinf(struct MP4Atom *s, struct MP4Atom **theAtom) +{ + MP4Err err; + u32 atomListSize; + u32 i; + MP4RestrictedVideoSampleEntryAtomPtr self = (MP4RestrictedVideoSampleEntryAtomPtr)s; + + err = MP4GetListEntryCount(self->ExtensionAtomList, &atomListSize); + if(err) goto bail; + for(i = 0; i < atomListSize; i++) + { + MP4AtomPtr a; + err = MP4GetListEntry(self->ExtensionAtomList, i, (char **)&a); + if(err) goto bail; + if(a->type == MP4RestrictedSchemeInfoAtomType) + { + *theAtom = a; + return MP4NoErr; + } + } + +bail: + TEST_RETURN(err); + return err; +} + static MP4Err getScheme(struct MP4Atom *s, u32 *sch_type, u32 *sch_version, char **sch_url) { MP4Err err; @@ -355,7 +388,8 @@ static MP4Err getScheme(struct MP4Atom *s, u32 *sch_type, u32 *sch_version, char err = MP4NoErr; - rinf = (MP4RestrictedSchemeInfoAtomPtr)self->MP4RestrictedSchemeInfo; + err = self->getRinf((MP4AtomPtr)self, (MP4AtomPtr *)&rinf); + if(err) goto bail; if(!rinf) { err = MP4BadParamErr; @@ -400,6 +434,7 @@ MP4Err MP4CreateRestrictedVideoSampleEntryAtom(MP4RestrictedVideoSampleEntryAtom self->untransform = untransform; self->addSchemeInfoAtom = addSchemeInfoAtom; self->getSchemeInfoAtom = getSchemeInfoAtom; + self->getRinf = getRinf; self->getScheme = getScheme; self->transform = transform; self->addAtom = addAtom; From 9ad1234904088dfa90e6bbd07c4879715899d85e Mon Sep 17 00:00:00 2001 From: Dimitri Podborski Date: Mon, 3 Jul 2023 07:24:40 -0700 Subject: [PATCH 05/31] clangformat --- IsoLib/libisomediafile/src/MP4TrackReader.h | 2 +- .../libisomediafile/src/RestrictedVideoSampleEntry.c | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/IsoLib/libisomediafile/src/MP4TrackReader.h b/IsoLib/libisomediafile/src/MP4TrackReader.h index b8de546..ad7c582 100644 --- a/IsoLib/libisomediafile/src/MP4TrackReader.h +++ b/IsoLib/libisomediafile/src/MP4TrackReader.h @@ -58,7 +58,7 @@ typedef struct MP4TrackReaderStruct { TRACK_READER_ENTRIES u32 isODTrack; -} * MP4TrackReaderPtr; +} *MP4TrackReaderPtr; MP4Err MP4CreateODTrackReader(MP4Movie theMovie, MP4Track theTrack, MP4TrackReaderPtr *outReader); MP4Err MP4CreateOrdinaryTrackReader(MP4Movie theMovie, MP4Track theTrack, diff --git a/IsoLib/libisomediafile/src/RestrictedVideoSampleEntry.c b/IsoLib/libisomediafile/src/RestrictedVideoSampleEntry.c index df69c83..610232f 100644 --- a/IsoLib/libisomediafile/src/RestrictedVideoSampleEntry.c +++ b/IsoLib/libisomediafile/src/RestrictedVideoSampleEntry.c @@ -110,7 +110,7 @@ static MP4Err addAtom(MP4RestrictedVideoSampleEntryAtomPtr self, MP4AtomPtr atom if(atom == NULL) BAILWITHERROR(MP4BadParamErr); err = MP4AddListEntry(atom, self->ExtensionAtomList); if(err) goto bail; - + bail: TEST_RETURN(err); @@ -223,12 +223,12 @@ static MP4Err untransform(struct MP4Atom *s) MP4OriginalFormatAtomPtr fmt; MP4RestrictedSchemeInfoAtomPtr rinf; - err = MP4NoErr; + err = MP4NoErr; rinf = NULL; err = MP4GetListEntryCount(self->ExtensionAtomList, &atomListSize); if(err) goto bail; - for(i = 0; i < atomListSize; i++) + for(i = 0; i < atomListSize; i++) { MP4AtomPtr a; err = MP4GetListEntry(self->ExtensionAtomList, i, (char **)&a); @@ -236,7 +236,7 @@ static MP4Err untransform(struct MP4Atom *s) if(a->type == MP4RestrictedSchemeInfoAtomType) { index = i; - rinf = (MP4RestrictedSchemeInfoAtomPtr)a; + rinf = (MP4RestrictedSchemeInfoAtomPtr)a; break; } } @@ -357,10 +357,10 @@ static MP4Err getRinf(struct MP4Atom *s, struct MP4Atom **theAtom) u32 atomListSize; u32 i; MP4RestrictedVideoSampleEntryAtomPtr self = (MP4RestrictedVideoSampleEntryAtomPtr)s; - + err = MP4GetListEntryCount(self->ExtensionAtomList, &atomListSize); if(err) goto bail; - for(i = 0; i < atomListSize; i++) + for(i = 0; i < atomListSize; i++) { MP4AtomPtr a; err = MP4GetListEntry(self->ExtensionAtomList, i, (char **)&a); From b21eb9e8b06c9f9b1c5274f5ce24e9d1843bef05 Mon Sep 17 00:00:00 2001 From: Dimitri Podborski Date: Mon, 3 Jul 2023 07:50:18 -0700 Subject: [PATCH 06/31] clangformat --- IsoLib/libisomediafile/src/MP4Atoms.h | 2 -- IsoLib/libisomediafile/src/MP4Media.c | 8 ++++---- IsoLib/libisomediafile/src/MP4Movies.c | 2 +- IsoLib/libisomediafile/src/MP4TrackReader.h | 2 +- 4 files changed, 6 insertions(+), 8 deletions(-) diff --git a/IsoLib/libisomediafile/src/MP4Atoms.h b/IsoLib/libisomediafile/src/MP4Atoms.h index 2714157..5c4500c 100644 --- a/IsoLib/libisomediafile/src/MP4Atoms.h +++ b/IsoLib/libisomediafile/src/MP4Atoms.h @@ -1648,8 +1648,6 @@ typedef struct MP4RestrictedVideoSampleEntryAtom MP4_BASE_ATOM COMMON_SAMPLE_ENTRY_FIELDS - // MP4AtomPtr MP4RestrictedSchemeInfo; - u32 restriction_type; MP4Err (*addSchemeInfoAtom)(struct MP4Atom *self, struct MP4Atom *theAtom); diff --git a/IsoLib/libisomediafile/src/MP4Media.c b/IsoLib/libisomediafile/src/MP4Media.c index 2e9212f..cdd203c 100644 --- a/IsoLib/libisomediafile/src/MP4Media.c +++ b/IsoLib/libisomediafile/src/MP4Media.c @@ -84,7 +84,7 @@ MP4AddMediaSampleReferencePad(MP4Media media, u64 dataOffset, u32 sampleCount, M } mdia = (MP4MediaAtomPtr)media; err = mdia->addSampleReference(mdia, dataOffset, sampleCount, durationsH, sizesH, sampleEntryH, - decodingOffsetsH, syncSamplesH, padsH); + decodingOffsetsH, syncSamplesH, padsH); bail: TEST_RETURN(err); @@ -107,7 +107,7 @@ MP4AddMediaSamplesPad(MP4Media media, MP4Handle sampleH, u32 sampleCount, MP4Han } mdia = (MP4MediaAtomPtr)media; err = mdia->addSamples(mdia, sampleH, sampleCount, durationsH, sizesH, sampleEntryH, - decodingOffsetsH, syncSamplesH, padsH); + decodingOffsetsH, syncSamplesH, padsH); bail: TEST_RETURN(err); @@ -130,7 +130,7 @@ MP4AddMediaSampleReference(MP4Media media, u64 dataOffset, u32 sampleCount, MP4H } mdia = (MP4MediaAtomPtr)media; err = mdia->addSampleReference(mdia, dataOffset, sampleCount, durationsH, sizesH, sampleEntryH, - decodingOffsetsH, syncSamplesH, NULL); + decodingOffsetsH, syncSamplesH, NULL); bail: TEST_RETURN(err); @@ -153,7 +153,7 @@ MP4AddMediaSamples(MP4Media media, MP4Handle sampleH, u32 sampleCount, MP4Handle } mdia = (MP4MediaAtomPtr)media; err = mdia->addSamples(mdia, sampleH, sampleCount, durationsH, sizesH, sampleEntryH, - decodingOffsetsH, syncSamplesH, NULL); + decodingOffsetsH, syncSamplesH, NULL); bail: TEST_RETURN(err); diff --git a/IsoLib/libisomediafile/src/MP4Movies.c b/IsoLib/libisomediafile/src/MP4Movies.c index cedef18..c2bbd64 100644 --- a/IsoLib/libisomediafile/src/MP4Movies.c +++ b/IsoLib/libisomediafile/src/MP4Movies.c @@ -378,7 +378,7 @@ MP4OpenMovieFile(MP4Movie *theMovie, const char *movieURL, int openMovieFlags) moov->prepend_handle = NULL; moov->moovAtomPtr = NULL; err = MP4CreateFileMappingObject((char *)movieURL, - (struct FileMappingObjectRecord **)&moov->fileMappingObject); + (struct FileMappingObjectRecord **)&moov->fileMappingObject); if(err) goto bail; err = MP4CreateFileMappingInputStream(moov->fileMappingObject, &moov->inputStream); if(err) goto bail; diff --git a/IsoLib/libisomediafile/src/MP4TrackReader.h b/IsoLib/libisomediafile/src/MP4TrackReader.h index ad7c582..b8de546 100644 --- a/IsoLib/libisomediafile/src/MP4TrackReader.h +++ b/IsoLib/libisomediafile/src/MP4TrackReader.h @@ -58,7 +58,7 @@ typedef struct MP4TrackReaderStruct { TRACK_READER_ENTRIES u32 isODTrack; -} *MP4TrackReaderPtr; +} * MP4TrackReaderPtr; MP4Err MP4CreateODTrackReader(MP4Movie theMovie, MP4Track theTrack, MP4TrackReaderPtr *outReader); MP4Err MP4CreateOrdinaryTrackReader(MP4Movie theMovie, MP4Track theTrack, From f8e2c5faea8d5480c0a71847b3124dfb155b93c3 Mon Sep 17 00:00:00 2001 From: Dimitri Podborski Date: Wed, 5 Jul 2023 13:03:26 -0700 Subject: [PATCH 07/31] tfdt version 1. Update clangformat --- .github/workflows/clang-format.yml | 2 +- IsoLib/libisomediafile/src/MP4Atoms.h | 2 +- IsoLib/libisomediafile/src/MP4Media.c | 8 ++--- IsoLib/libisomediafile/src/MP4Movies.c | 2 +- IsoLib/libisomediafile/src/MP4TrackReader.h | 2 +- IsoLib/libisomediafile/src/SampleTableAtom.c | 8 ++--- .../src/TrackFragmentDecodeTimeAtom.c | 36 +++++++++++++++++-- 7 files changed, 45 insertions(+), 15 deletions(-) diff --git a/.github/workflows/clang-format.yml b/.github/workflows/clang-format.yml index 2451056..d736978 100644 --- a/.github/workflows/clang-format.yml +++ b/.github/workflows/clang-format.yml @@ -10,5 +10,5 @@ jobs: - name: Run clang-format style check for C/C++ programs. uses: jidicula/clang-format-action@v4.4.1 with: - clang-format-version: '13' + clang-format-version: '15' check-path: 'IsoLib/libisomediafile' diff --git a/IsoLib/libisomediafile/src/MP4Atoms.h b/IsoLib/libisomediafile/src/MP4Atoms.h index 5c4500c..d42be49 100644 --- a/IsoLib/libisomediafile/src/MP4Atoms.h +++ b/IsoLib/libisomediafile/src/MP4Atoms.h @@ -1493,7 +1493,7 @@ enum typedef struct MP4TrackFragmentDecodeTimeAtom { MP4_FULL_ATOM - u32 baseMediaDecodeTime; + u64 baseMediaDecodeTime; } MP4TrackFragmentDecodeTimeAtom, *MP4TrackFragmentDecodeTimeAtomPtr; typedef struct MP4ItemPropertyContainerAtom diff --git a/IsoLib/libisomediafile/src/MP4Media.c b/IsoLib/libisomediafile/src/MP4Media.c index cdd203c..2e9212f 100644 --- a/IsoLib/libisomediafile/src/MP4Media.c +++ b/IsoLib/libisomediafile/src/MP4Media.c @@ -84,7 +84,7 @@ MP4AddMediaSampleReferencePad(MP4Media media, u64 dataOffset, u32 sampleCount, M } mdia = (MP4MediaAtomPtr)media; err = mdia->addSampleReference(mdia, dataOffset, sampleCount, durationsH, sizesH, sampleEntryH, - decodingOffsetsH, syncSamplesH, padsH); + decodingOffsetsH, syncSamplesH, padsH); bail: TEST_RETURN(err); @@ -107,7 +107,7 @@ MP4AddMediaSamplesPad(MP4Media media, MP4Handle sampleH, u32 sampleCount, MP4Han } mdia = (MP4MediaAtomPtr)media; err = mdia->addSamples(mdia, sampleH, sampleCount, durationsH, sizesH, sampleEntryH, - decodingOffsetsH, syncSamplesH, padsH); + decodingOffsetsH, syncSamplesH, padsH); bail: TEST_RETURN(err); @@ -130,7 +130,7 @@ MP4AddMediaSampleReference(MP4Media media, u64 dataOffset, u32 sampleCount, MP4H } mdia = (MP4MediaAtomPtr)media; err = mdia->addSampleReference(mdia, dataOffset, sampleCount, durationsH, sizesH, sampleEntryH, - decodingOffsetsH, syncSamplesH, NULL); + decodingOffsetsH, syncSamplesH, NULL); bail: TEST_RETURN(err); @@ -153,7 +153,7 @@ MP4AddMediaSamples(MP4Media media, MP4Handle sampleH, u32 sampleCount, MP4Handle } mdia = (MP4MediaAtomPtr)media; err = mdia->addSamples(mdia, sampleH, sampleCount, durationsH, sizesH, sampleEntryH, - decodingOffsetsH, syncSamplesH, NULL); + decodingOffsetsH, syncSamplesH, NULL); bail: TEST_RETURN(err); diff --git a/IsoLib/libisomediafile/src/MP4Movies.c b/IsoLib/libisomediafile/src/MP4Movies.c index c2bbd64..cedef18 100644 --- a/IsoLib/libisomediafile/src/MP4Movies.c +++ b/IsoLib/libisomediafile/src/MP4Movies.c @@ -378,7 +378,7 @@ MP4OpenMovieFile(MP4Movie *theMovie, const char *movieURL, int openMovieFlags) moov->prepend_handle = NULL; moov->moovAtomPtr = NULL; err = MP4CreateFileMappingObject((char *)movieURL, - (struct FileMappingObjectRecord **)&moov->fileMappingObject); + (struct FileMappingObjectRecord **)&moov->fileMappingObject); if(err) goto bail; err = MP4CreateFileMappingInputStream(moov->fileMappingObject, &moov->inputStream); if(err) goto bail; diff --git a/IsoLib/libisomediafile/src/MP4TrackReader.h b/IsoLib/libisomediafile/src/MP4TrackReader.h index b8de546..ad7c582 100644 --- a/IsoLib/libisomediafile/src/MP4TrackReader.h +++ b/IsoLib/libisomediafile/src/MP4TrackReader.h @@ -58,7 +58,7 @@ typedef struct MP4TrackReaderStruct { TRACK_READER_ENTRIES u32 isODTrack; -} * MP4TrackReaderPtr; +} *MP4TrackReaderPtr; MP4Err MP4CreateODTrackReader(MP4Movie theMovie, MP4Track theTrack, MP4TrackReaderPtr *outReader); MP4Err MP4CreateOrdinaryTrackReader(MP4Movie theMovie, MP4Track theTrack, diff --git a/IsoLib/libisomediafile/src/SampleTableAtom.c b/IsoLib/libisomediafile/src/SampleTableAtom.c index 9346b5e..4edb2e7 100644 --- a/IsoLib/libisomediafile/src/SampleTableAtom.c +++ b/IsoLib/libisomediafile/src/SampleTableAtom.c @@ -144,14 +144,14 @@ static MP4Err addAtom(MP4SampleTableAtomPtr self, MP4AtomPtr atom) static MP4Err calculateDuration(struct MP4SampleTableAtom *self, u32 *outDuration) { MP4Err err; - MP4TimeToSampleAtomPtr ctts; + MP4TimeToSampleAtomPtr stts; err = MP4NoErr; if(outDuration == NULL) BAILWITHERROR(MP4BadParamErr) - ctts = (MP4TimeToSampleAtomPtr)self->TimeToSample; - if(ctts == NULL) BAILWITHERROR(MP4InvalidMediaErr) - err = ctts->getTotalDuration(ctts, outDuration); + stts = (MP4TimeToSampleAtomPtr)self->TimeToSample; + if(stts == NULL) BAILWITHERROR(MP4InvalidMediaErr) + err = stts->getTotalDuration(stts, outDuration); if(err) goto bail; bail: diff --git a/IsoLib/libisomediafile/src/TrackFragmentDecodeTimeAtom.c b/IsoLib/libisomediafile/src/TrackFragmentDecodeTimeAtom.c index d278e5d..2325409 100644 --- a/IsoLib/libisomediafile/src/TrackFragmentDecodeTimeAtom.c +++ b/IsoLib/libisomediafile/src/TrackFragmentDecodeTimeAtom.c @@ -44,7 +44,17 @@ static MP4Err serialize(struct MP4Atom *s, char *buffer) err = MP4SerializeCommonFullAtomFields((MP4FullAtomPtr)s, buffer); if(err) goto bail; buffer += self->bytesWritten; - PUT32(baseMediaDecodeTime); + + if(self->version == 1) + { + PUT64(baseMediaDecodeTime); + } + else if(self->version == 0) + { + PUT32(baseMediaDecodeTime); + } + else + BAILWITHERROR(MP4NotImplementedErr); assert(self->bytesWritten == self->size); bail: @@ -61,7 +71,17 @@ static MP4Err calculateSize(struct MP4Atom *s) err = MP4CalculateFullAtomFieldSize((MP4FullAtomPtr)s); if(err) goto bail; - self->size += 4; + if(self->version == 1) + { + self->size += 8; + } + else if(self->version == 0) + { + self->size += 4; + } + else + BAILWITHERROR(MP4NotImplementedErr); + bail: TEST_RETURN(err); @@ -77,7 +97,17 @@ static MP4Err createFromInputStream(MP4AtomPtr s, MP4AtomPtr proto, MP4InputStre if(self == NULL) BAILWITHERROR(MP4BadParamErr) err = self->super->createFromInputStream(s, proto, (char *)inputStream); if(err) goto bail; - GET32(baseMediaDecodeTime); + if(self->version == 1) + { + GET64(baseMediaDecodeTime); + } + else if(self->version == 0) + { + GET32(baseMediaDecodeTime); + } + else + BAILWITHERROR(MP4NotImplementedErr); + assert(self->bytesRead == self->size); bail: From b6a512c0e2e87103a9ee2419af623c7146c186aa Mon Sep 17 00:00:00 2001 From: Dimitri Podborski Date: Fri, 7 Jul 2023 19:47:15 -0700 Subject: [PATCH 08/31] get dimensions for resv --- IsoLib/libisomediafile/src/ISOSampleDescriptions.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/IsoLib/libisomediafile/src/ISOSampleDescriptions.c b/IsoLib/libisomediafile/src/ISOSampleDescriptions.c index 14bf899..147fd4d 100644 --- a/IsoLib/libisomediafile/src/ISOSampleDescriptions.c +++ b/IsoLib/libisomediafile/src/ISOSampleDescriptions.c @@ -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); From dc068bac3696c0cabc68aecf67a40e3026401d6d Mon Sep 17 00:00:00 2001 From: Dimitri Podborski Date: Mon, 10 Jul 2023 22:32:03 -0700 Subject: [PATCH 09/31] 2 more functions to work with resv --- IsoLib/libisomediafile/src/ISOMovies.h | 20 +++++++++ .../src/ISOSampleDescriptions.c | 44 +++++++++++++++++++ 2 files changed, 64 insertions(+) diff --git a/IsoLib/libisomediafile/src/ISOMovies.h b/IsoLib/libisomediafile/src/ISOMovies.h index f5c369e..a393a57 100644 --- a/IsoLib/libisomediafile/src/ISOMovies.h +++ b/IsoLib/libisomediafile/src/ISOMovies.h @@ -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 diff --git a/IsoLib/libisomediafile/src/ISOSampleDescriptions.c b/IsoLib/libisomediafile/src/ISOSampleDescriptions.c index 147fd4d..24f9f1a 100644 --- a/IsoLib/libisomediafile/src/ISOSampleDescriptions.c +++ b/IsoLib/libisomediafile/src/ISOSampleDescriptions.c @@ -1408,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, From adafa15b654dfd4e45a2f18d918dd8fea7a13a9e Mon Sep 17 00:00:00 2001 From: Dimitri Podborski Date: Wed, 19 Jul 2023 20:33:37 -0700 Subject: [PATCH 10/31] when translating from compact to normal make sure that normal has flags set to 0 https://github.com/DenizUgur/FFC/actions/runs/5605954867 --- IsoLib/libisomediafile/src/SampleToGroupAtom.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/IsoLib/libisomediafile/src/SampleToGroupAtom.c b/IsoLib/libisomediafile/src/SampleToGroupAtom.c index b87501b..ba121c3 100644 --- a/IsoLib/libisomediafile/src/SampleToGroupAtom.c +++ b/IsoLib/libisomediafile/src/SampleToGroupAtom.c @@ -676,6 +676,9 @@ static MP4Err serialize(struct MP4Atom *s, char *buffer) (self->compressedGroup.index_msb_indicates_fragment_local_description ? 0x80 : 0) | (self->compressedGroup.grouping_type_parameter_present ? 0x40 : 0); } + else { + self->flags = 0; + } err = MP4SerializeCommonFullAtomFields((MP4FullAtomPtr)s, buffer); if(err) goto bail; From 9649df90f87252a6a36164eb02cb31d438a670a8 Mon Sep 17 00:00:00 2001 From: Dimitri Podborski Date: Wed, 19 Jul 2023 21:32:13 -0700 Subject: [PATCH 11/31] clangformat --- IsoLib/libisomediafile/src/SampleToGroupAtom.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/IsoLib/libisomediafile/src/SampleToGroupAtom.c b/IsoLib/libisomediafile/src/SampleToGroupAtom.c index ba121c3..340ff1d 100644 --- a/IsoLib/libisomediafile/src/SampleToGroupAtom.c +++ b/IsoLib/libisomediafile/src/SampleToGroupAtom.c @@ -676,7 +676,8 @@ static MP4Err serialize(struct MP4Atom *s, char *buffer) (self->compressedGroup.index_msb_indicates_fragment_local_description ? 0x80 : 0) | (self->compressedGroup.grouping_type_parameter_present ? 0x40 : 0); } - else { + else + { self->flags = 0; } From 71e955548f1c469227fec9c002d42e5184888758 Mon Sep 17 00:00:00 2001 From: Dimitri Podborski Date: Wed, 30 Aug 2023 10:02:35 -0700 Subject: [PATCH 12/31] set entryCount to 0 when creating a list --- IsoLib/libisomediafile/src/MP4LinkedList.c | 1 + 1 file changed, 1 insertion(+) diff --git a/IsoLib/libisomediafile/src/MP4LinkedList.c b/IsoLib/libisomediafile/src/MP4LinkedList.c index e795d9e..647762e 100644 --- a/IsoLib/libisomediafile/src/MP4LinkedList.c +++ b/IsoLib/libisomediafile/src/MP4LinkedList.c @@ -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; From be5ade7442f35155dc0dac644327651e77ba96ed Mon Sep 17 00:00:00 2001 From: Deniz Ugur Date: Wed, 30 Aug 2023 11:18:09 -0700 Subject: [PATCH 13/31] linux pipeline fix --- IsoLib/libisomediafile/src/ItemInfoEntryAtom.c | 2 +- IsoLib/libisomediafile/src/TextMetaSampleEntry.c | 2 +- IsoLib/libisomediafile/src/XMLMetaSampleEntry.c | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/IsoLib/libisomediafile/src/ItemInfoEntryAtom.c b/IsoLib/libisomediafile/src/ItemInfoEntryAtom.c index 1a71ba8..244a251 100644 --- a/IsoLib/libisomediafile/src/ItemInfoEntryAtom.c +++ b/IsoLib/libisomediafile/src/ItemInfoEntryAtom.c @@ -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; diff --git a/IsoLib/libisomediafile/src/TextMetaSampleEntry.c b/IsoLib/libisomediafile/src/TextMetaSampleEntry.c index e0be906..5fb0208 100644 --- a/IsoLib/libisomediafile/src/TextMetaSampleEntry.c +++ b/IsoLib/libisomediafile/src/TextMetaSampleEntry.c @@ -125,7 +125,7 @@ static MP4Err readstring(char **b, MP4TextMetaSampleEntryAtomPtr self, u32 byte; MP4Err err; char temp[1024]; - char msgString[200]; + char msgString[8192]; char *p; err = MP4NoErr; diff --git a/IsoLib/libisomediafile/src/XMLMetaSampleEntry.c b/IsoLib/libisomediafile/src/XMLMetaSampleEntry.c index 64ffc2a..be90621 100644 --- a/IsoLib/libisomediafile/src/XMLMetaSampleEntry.c +++ b/IsoLib/libisomediafile/src/XMLMetaSampleEntry.c @@ -140,7 +140,7 @@ static MP4Err readstring(char **b, MP4XMLMetaSampleEntryAtomPtr self, MP4InputSt u32 byte; MP4Err err; char temp[1024]; - char msgString[200]; + char msgString[8192]; char *p; err = MP4NoErr; From f5e99c4bf467606cfded6e0e557fd068755dfa59 Mon Sep 17 00:00:00 2001 From: Deniz Ugur Date: Wed, 30 Aug 2023 11:37:24 -0700 Subject: [PATCH 14/31] windows pipeline fix --- IsoLib/libisomediafile/src/MovieFragmentAtom.c | 6 ++++-- IsoLib/libisomediafile/src/RestrictedVideoSampleEntry.c | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/IsoLib/libisomediafile/src/MovieFragmentAtom.c b/IsoLib/libisomediafile/src/MovieFragmentAtom.c index 9fa48e1..9154df0 100644 --- a/IsoLib/libisomediafile/src/MovieFragmentAtom.c +++ b/IsoLib/libisomediafile/src/MovieFragmentAtom.c @@ -162,8 +162,10 @@ static MP4Err mergeFragments(struct MP4MovieFragmentAtom *self, MP4MovieAtomPtr if(tfdt->baseMediaDecodeTime < initialMediaDuration) BAILWITHERROR(MP4InvalidMediaErr); if(tfdt->baseMediaDecodeTime > initialMediaDuration) - err = mdia->extendLastSampleDuration(mdia, - tfdt->baseMediaDecodeTime - (u32)initialMediaDuration); + { + u32 duration = (tfdt->baseMediaDecodeTime - initialMediaDuration) & 0xffffffff; + err = mdia->extendLastSampleDuration(mdia, duration); + } if(err) goto bail; } diff --git a/IsoLib/libisomediafile/src/RestrictedVideoSampleEntry.c b/IsoLib/libisomediafile/src/RestrictedVideoSampleEntry.c index 610232f..5802586 100644 --- a/IsoLib/libisomediafile/src/RestrictedVideoSampleEntry.c +++ b/IsoLib/libisomediafile/src/RestrictedVideoSampleEntry.c @@ -218,7 +218,7 @@ static MP4Err untransform(struct MP4Atom *s) { MP4Err err; u32 atomListSize; - u32 index, i; + u32 i, index = 0; MP4RestrictedVideoSampleEntryAtomPtr self = (MP4RestrictedVideoSampleEntryAtomPtr)s; MP4OriginalFormatAtomPtr fmt; MP4RestrictedSchemeInfoAtomPtr rinf; From 774e98294157e42f026c2b734766ea57338dc6eb Mon Sep 17 00:00:00 2001 From: Dimitri Podborski Date: Fri, 10 Nov 2023 17:09:37 -0800 Subject: [PATCH 15/31] make sure the correct version of subs is used --- IsoLib/libisomediafile/src/SubSampleInformationAtom.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/IsoLib/libisomediafile/src/SubSampleInformationAtom.c b/IsoLib/libisomediafile/src/SubSampleInformationAtom.c index 9538e14..258a1c0 100644 --- a/IsoLib/libisomediafile/src/SubSampleInformationAtom.c +++ b/IsoLib/libisomediafile/src/SubSampleInformationAtom.c @@ -168,6 +168,10 @@ static MP4Err addEntry(MP4SubSampleInformationAtom *s, u32 sample_delta, u32 sub self->subsample_count[current_entry] = subsample_count; for(i = 0; i < subsample_count; i++) { + if(((u32 *)*subsample_size_array)[i] > 0xFFFF) + { + self->version = 1; + } self->subsample_size[current_entry][i] = ((u32 *)*subsample_size_array)[i]; self->subsample_priority[current_entry][i] = ((u32 *)*subsample_priority_array)[i]; self->discardable[current_entry][i] = ((u32 *)*subsample_discardable_array)[i]; From adf0c6f0c0bf29abcda13b0425c367d85f3e768e Mon Sep 17 00:00:00 2001 From: Dimitri Podborski Date: Fri, 10 Nov 2023 17:18:14 -0800 Subject: [PATCH 16/31] codec_specific_parameters as defined in ISOBMFF --- IsoLib/libisomediafile/src/MP4Atoms.h | 2 +- .../src/SubSampleInformationAtom.c | 52 ++++++------------- 2 files changed, 17 insertions(+), 37 deletions(-) diff --git a/IsoLib/libisomediafile/src/MP4Atoms.h b/IsoLib/libisomediafile/src/MP4Atoms.h index d42be49..901b8e2 100644 --- a/IsoLib/libisomediafile/src/MP4Atoms.h +++ b/IsoLib/libisomediafile/src/MP4Atoms.h @@ -1230,7 +1230,7 @@ typedef struct MP4SubSampleInformationAtom u32 **subsample_size; u32 **subsample_priority; u32 **discardable; - u32 **reserved; + u32 **codec_specific_parameters; } MP4SubSampleInformationAtom, *MP4SubSampleInformationAtomPtr; typedef struct MP4SyncSampleAtom diff --git a/IsoLib/libisomediafile/src/SubSampleInformationAtom.c b/IsoLib/libisomediafile/src/SubSampleInformationAtom.c index 258a1c0..5c52005 100644 --- a/IsoLib/libisomediafile/src/SubSampleInformationAtom.c +++ b/IsoLib/libisomediafile/src/SubSampleInformationAtom.c @@ -1,25 +1,6 @@ -/* -This software module was originally developed by Apple Computer, Inc. -in the course of development of MPEG-4. -This software module is an implementation of a part of one or -more MPEG-4 tools as specified by MPEG-4. -ISO/IEC gives users of MPEG-4 free license to this -software module or modifications thereof for use in hardware -or software products claiming conformance to MPEG-4. -Those intending to use this software module in hardware or software -products are advised that its use may infringe existing patents. -The original developer of this software module and his/her company, -the subsequent editors and their companies, and ISO/IEC have no -liability for use of this software module or modifications thereof -in an implementation. -Copyright is not released for non MPEG-4 conforming -products. Apple Computer, Inc. retains full right to use the code for its own -purpose, assign or donate the code to a third party and to -inhibit third parties from using the code for non -MPEG-4 conforming products. -This copyright notice must be included in all copies or -derivative works. Copyright (c) 1999. +/* This software module was originally developed by Apple Computer, Inc. in the course of development of MPEG-4. This software module is an implementation of a part of one or more MPEG-4 tools as specified by MPEG-4. ISO/IEC gives users of MPEG-4 free license to this software module or modifications thereof for use in hardware or software products claiming conformance to MPEG-4. Those intending to use this software module in hardware or software products are advised that its use may infringe existing patents. The original developer of this software module and his/her company, the subsequent editors and their companies, and ISO/IEC have no liability for use of this software module or modifications thereof in an implementation. Copyright is not released for non MPEG-4 conforming products. Apple Computer, Inc. retains full right to use the code for its own purpose, assign or donate the code to a third party and to inhibit third parties from using the code for non MPEG-4 conforming products. This copyright notice must be included in all copies or derivative works. Copyright (c) 1999. */ + /* Created for Nokia FAVS project by Tampere University of Technology */ #include "MP4Atoms.h" @@ -43,8 +24,8 @@ static void destroy(MP4AtomPtr s) self->subsample_priority[i] = NULL; free(self->discardable[i]); self->discardable[i] = NULL; - free(self->reserved[i]); - self->reserved[i] = NULL; + free(self->codec_specific_parameters[i]); + self->codec_specific_parameters[i] = NULL; } } free(self->subsample_size); @@ -53,8 +34,8 @@ static void destroy(MP4AtomPtr s) self->subsample_priority = NULL; free(self->discardable); self->discardable = NULL; - free(self->reserved); - self->reserved = NULL; + free(self->codec_specific_parameters); + self->codec_specific_parameters = NULL; free(self->subsample_count); self->subsample_count = NULL; @@ -91,7 +72,7 @@ static MP4Err serialize(struct MP4Atom *s, char *buffer) } PUT8(subsample_priority[i][j]); PUT8(discardable[i][j]); - PUT32(reserved[i][j]); + PUT32(codec_specific_parameters[i][j]); } } assert(self->bytesWritten == self->size); @@ -159,10 +140,10 @@ static MP4Err addEntry(MP4SubSampleInformationAtom *s, u32 sample_delta, u32 sub self->discardable[current_entry] = (u32 *)calloc(subsample_count, sizeof(u32)); TESTMALLOC(self->discardable[current_entry]); - self->reserved = (u32 **)realloc(self->reserved, (self->entry_count + 1) * sizeof(u32 *)); - TESTMALLOC(self->reserved); - self->reserved[current_entry] = (u32 *)calloc(subsample_count, sizeof(u32)); - TESTMALLOC(self->reserved[current_entry]); + self->codec_specific_parameters = (u32 **)realloc(self->codec_specific_parameters, (self->entry_count + 1) * sizeof(u32 *)); + TESTMALLOC(self->codec_specific_parameters); + self->codec_specific_parameters[current_entry] = (u32 *)calloc(subsample_count, sizeof(u32)); + TESTMALLOC(self->codec_specific_parameters[current_entry]); self->sample_delta[current_entry] = sample_delta; self->subsample_count[current_entry] = subsample_count; @@ -175,7 +156,7 @@ static MP4Err addEntry(MP4SubSampleInformationAtom *s, u32 sample_delta, u32 sub self->subsample_size[current_entry][i] = ((u32 *)*subsample_size_array)[i]; self->subsample_priority[current_entry][i] = ((u32 *)*subsample_priority_array)[i]; self->discardable[current_entry][i] = ((u32 *)*subsample_discardable_array)[i]; - self->reserved[current_entry][i] = 0; + self->codec_specific_parameters[current_entry][i] = 0; } self->entry_count++; @@ -209,8 +190,8 @@ static MP4Err createFromInputStream(MP4AtomPtr s, MP4AtomPtr proto, MP4InputStre TESTMALLOC(self->subsample_priority); self->discardable = (u32 **)calloc(self->entry_count, sizeof(u32 *)); TESTMALLOC(self->discardable); - self->reserved = (u32 **)calloc(self->entry_count, sizeof(u32 *)); - TESTMALLOC(self->reserved); + self->codec_specific_parameters = (u32 **)calloc(self->entry_count, sizeof(u32 *)); + TESTMALLOC(self->codec_specific_parameters); for(i = 0; i < self->entry_count; i++) { @@ -222,7 +203,7 @@ static MP4Err createFromInputStream(MP4AtomPtr s, MP4AtomPtr proto, MP4InputStre TESTMALLOC(self->subsample_count[i]); self->discardable[i] = (u32 *)calloc(self->subsample_count[i], sizeof(u32)); TESTMALLOC(self->subsample_count[i]); - self->reserved[i] = (u32 *)calloc(self->subsample_count[i], sizeof(u32)); + self->codec_specific_parameters[i] = (u32 *)calloc(self->subsample_count[i], sizeof(u32)); TESTMALLOC(self->subsample_count[i]); for(j = 0; j < self->subsample_count[i]; j++) { @@ -236,7 +217,7 @@ static MP4Err createFromInputStream(MP4AtomPtr s, MP4AtomPtr proto, MP4InputStre } GET8(subsample_priority[i][j]); GET8(discardable[i][j]); - GET32(reserved[i][j]); + GET32(codec_specific_parameters[i][j]); } } bail: @@ -267,6 +248,5 @@ MP4Err MP4CreateSubSampleInformationAtom(MP4SubSampleInformationAtomPtr *outAtom bail: TEST_RETURN(err); - return err; } From b0982228352cd835e28deea0c6d15340bc86c5c4 Mon Sep 17 00:00:00 2001 From: Dimitri Podborski Date: Fri, 10 Nov 2023 17:41:33 -0800 Subject: [PATCH 17/31] add codec_specific_parameters interface --- IsoLib/libisomediafile/src/MP4Atoms.h | 3 + IsoLib/libisomediafile/src/MP4Movies.h | 18 ++++ IsoLib/libisomediafile/src/MovieTracks.c | 21 +++++ .../src/SubSampleInformationAtom.c | 90 +++++++++++++++++-- 4 files changed, 126 insertions(+), 6 deletions(-) diff --git a/IsoLib/libisomediafile/src/MP4Atoms.h b/IsoLib/libisomediafile/src/MP4Atoms.h index 901b8e2..578683b 100644 --- a/IsoLib/libisomediafile/src/MP4Atoms.h +++ b/IsoLib/libisomediafile/src/MP4Atoms.h @@ -1224,6 +1224,9 @@ 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; diff --git a/IsoLib/libisomediafile/src/MP4Movies.h b/IsoLib/libisomediafile/src/MP4Movies.h index 72ee335..0d7d3e1 100644 --- a/IsoLib/libisomediafile/src/MP4Movies.h +++ b/IsoLib/libisomediafile/src/MP4Movies.h @@ -693,6 +693,24 @@ extern "C" MP4Handle subsample_size_array, MP4Handle subsample_priority_array, MP4Handle subsample_discardable_array); + /** + * @brief Same as MP4AddSubSampleInformationEntry but also allows to add the codec specific parameters + * + * @param subsample + * @param sample_delta + * @param subsample_count + * @param subsample_size_array + * @param subsample_priority_array + * @param subsample_discardable_array + * @param codec_specific_parameters_array + * @return MP4Err error code + */ + MP4_EXTERN(MP4Err) + MP4AddSubSampleInformationEntry2(MP4GenericAtom subsample, u32 sample_delta, u32 subsample_count, + MP4Handle subsample_size_array, + MP4Handle subsample_priority_array, + MP4Handle subsample_discardable_array, + MP4Handle codec_specific_parameters_array); /** * @brief Add track to a track group ID. * diff --git a/IsoLib/libisomediafile/src/MovieTracks.c b/IsoLib/libisomediafile/src/MovieTracks.c index 91c798c..60ab137 100644 --- a/IsoLib/libisomediafile/src/MovieTracks.c +++ b/IsoLib/libisomediafile/src/MovieTracks.c @@ -323,6 +323,27 @@ MP4AddSubSampleInformationEntry(MP4GenericAtom subsample, u32 sample_delta, u32 return err; } +MP4_EXTERN(MP4Err) +MP4AddSubSampleInformationEntry2(MP4GenericAtom subsample, u32 sample_delta, u32 subsample_count, + MP4Handle subsample_size_array, MP4Handle subsample_priority_array, + MP4Handle subsample_discardable_array, + MP4Handle codec_specific_parameters_array) +{ + MP4Err err; + MP4SubSampleInformationAtomPtr subs; + + err = MP4NoErr; + if(subsample == NULL) BAILWITHERROR(MP4BadParamErr); + subs = (MP4SubSampleInformationAtomPtr)subsample; + + err = subs->addEntry2(subs, sample_delta, subsample_count, subsample_size_array, + subsample_priority_array, subsample_discardable_array, codec_specific_parameters_array); + +bail: + TEST_RETURN(err); + return err; +} + MP4_EXTERN(MP4Err) MP4AddTrackGroup(MP4Track theTrack, u32 groupID, u32 dependencyType) { MP4Err err; diff --git a/IsoLib/libisomediafile/src/SubSampleInformationAtom.c b/IsoLib/libisomediafile/src/SubSampleInformationAtom.c index 5c52005..8933ea0 100644 --- a/IsoLib/libisomediafile/src/SubSampleInformationAtom.c +++ b/IsoLib/libisomediafile/src/SubSampleInformationAtom.c @@ -1,5 +1,16 @@ -/* This software module was originally developed by Apple Computer, Inc. in the course of development of MPEG-4. This software module is an implementation of a part of one or more MPEG-4 tools as specified by MPEG-4. ISO/IEC gives users of MPEG-4 free license to this software module or modifications thereof for use in hardware or software products claiming conformance to MPEG-4. Those intending to use this software module in hardware or software products are advised that its use may infringe existing patents. The original developer of this software module and his/her company, the subsequent editors and their companies, and ISO/IEC have no liability for use of this software module or modifications thereof in an implementation. Copyright is not released for non MPEG-4 conforming products. Apple Computer, Inc. retains full right to use the code for its own purpose, assign or donate the code to a third party and to inhibit third parties from using the code for non MPEG-4 conforming products. This copyright notice must be included in all copies or derivative works. Copyright (c) 1999. -*/ +/* This software module was originally developed by Apple Computer, Inc. in the course of + * development of MPEG-4. This software module is an implementation of a part of one or more MPEG-4 + * tools as specified by MPEG-4. ISO/IEC gives users of MPEG-4 free license to this software module + * or modifications thereof for use in hardware or software products claiming conformance to MPEG-4. + * Those intending to use this software module in hardware or software products are advised that its + * use may infringe existing patents. The original developer of this software module and his/her + * company, the subsequent editors and their companies, and ISO/IEC have no liability for use of + * this software module or modifications thereof in an implementation. Copyright is not released for + * non MPEG-4 conforming products. Apple Computer, Inc. retains full right to use the code for its + * own purpose, assign or donate the code to a third party and to inhibit third parties from using + * the code for non MPEG-4 conforming products. This copyright notice must be included in all copies + * or derivative works. Copyright (c) 1999. + */ /* Created for Nokia FAVS project by Tampere University of Technology */ @@ -140,7 +151,8 @@ static MP4Err addEntry(MP4SubSampleInformationAtom *s, u32 sample_delta, u32 sub self->discardable[current_entry] = (u32 *)calloc(subsample_count, sizeof(u32)); TESTMALLOC(self->discardable[current_entry]); - self->codec_specific_parameters = (u32 **)realloc(self->codec_specific_parameters, (self->entry_count + 1) * sizeof(u32 *)); + self->codec_specific_parameters = + (u32 **)realloc(self->codec_specific_parameters, (self->entry_count + 1) * sizeof(u32 *)); TESTMALLOC(self->codec_specific_parameters); self->codec_specific_parameters[current_entry] = (u32 *)calloc(subsample_count, sizeof(u32)); TESTMALLOC(self->codec_specific_parameters[current_entry]); @@ -153,9 +165,9 @@ static MP4Err addEntry(MP4SubSampleInformationAtom *s, u32 sample_delta, u32 sub { self->version = 1; } - self->subsample_size[current_entry][i] = ((u32 *)*subsample_size_array)[i]; - self->subsample_priority[current_entry][i] = ((u32 *)*subsample_priority_array)[i]; - self->discardable[current_entry][i] = ((u32 *)*subsample_discardable_array)[i]; + self->subsample_size[current_entry][i] = ((u32 *)*subsample_size_array)[i]; + self->subsample_priority[current_entry][i] = ((u32 *)*subsample_priority_array)[i]; + self->discardable[current_entry][i] = ((u32 *)*subsample_discardable_array)[i]; self->codec_specific_parameters[current_entry][i] = 0; } @@ -166,6 +178,71 @@ static MP4Err addEntry(MP4SubSampleInformationAtom *s, u32 sample_delta, u32 sub return err; } +static MP4Err addEntry2(MP4SubSampleInformationAtom *s, u32 sample_delta, u32 subsample_count, + MP4Handle subsample_size_array, MP4Handle subsample_priority_array, + MP4Handle subsample_discardable_array, MP4Handle codec_specific_parameters_array) +{ + MP4Err err; + MP4SubSampleInformationAtomPtr self; + u32 i; + u32 current_entry; + + err = MP4NoErr; + if(s == NULL) BAILWITHERROR(MP4BadParamErr); + self = (MP4SubSampleInformationAtomPtr)s; + current_entry = self->entry_count; + + /* re-allocate basic structures */ + self->sample_delta = (u32 *)realloc(self->sample_delta, (self->entry_count + 1) * sizeof(u32)); + TESTMALLOC(self->sample_delta); + self->subsample_count = + (u32 *)realloc(self->subsample_count, (self->entry_count + 1) * sizeof(u32)); + TESTMALLOC(self->subsample_count); + + self->subsample_size = + (u32 **)realloc(self->subsample_size, (self->entry_count + 1) * sizeof(u32 *)); + TESTMALLOC(self->subsample_size); + self->subsample_size[current_entry] = (u32 *)calloc(subsample_count, sizeof(u32)); + TESTMALLOC(self->subsample_size[current_entry]); + + self->subsample_priority = + (u32 **)realloc(self->subsample_priority, (self->entry_count + 1) * sizeof(u32 *)); + TESTMALLOC(self->subsample_priority); + self->subsample_priority[current_entry] = (u32 *)calloc(subsample_count, sizeof(u32)); + TESTMALLOC(self->subsample_priority[current_entry]); + + self->discardable = (u32 **)realloc(self->discardable, (self->entry_count + 1) * sizeof(u32 *)); + TESTMALLOC(self->discardable); + self->discardable[current_entry] = (u32 *)calloc(subsample_count, sizeof(u32)); + TESTMALLOC(self->discardable[current_entry]); + + self->codec_specific_parameters = + (u32 **)realloc(self->codec_specific_parameters, (self->entry_count + 1) * sizeof(u32 *)); + TESTMALLOC(self->codec_specific_parameters); + self->codec_specific_parameters[current_entry] = (u32 *)calloc(subsample_count, sizeof(u32)); + TESTMALLOC(self->codec_specific_parameters[current_entry]); + + self->sample_delta[current_entry] = sample_delta; + self->subsample_count[current_entry] = subsample_count; + for(i = 0; i < subsample_count; i++) + { + if(((u32 *)*subsample_size_array)[i] > 0xFFFF) + { + self->version = 1; + } + self->subsample_size[current_entry][i] = ((u32 *)*subsample_size_array)[i]; + self->subsample_priority[current_entry][i] = ((u32 *)*subsample_priority_array)[i]; + self->discardable[current_entry][i] = ((u32 *)*subsample_discardable_array)[i]; + self->codec_specific_parameters[current_entry][i] = ((u32 *)*codec_specific_parameters_array)[i]; + } + + self->entry_count++; + +bail: + TEST_RETURN(err); + return err; +} + static MP4Err createFromInputStream(MP4AtomPtr s, MP4AtomPtr proto, MP4InputStreamPtr inputStream) { MP4Err err; @@ -243,6 +320,7 @@ MP4Err MP4CreateSubSampleInformationAtom(MP4SubSampleInformationAtomPtr *outAtom self->calculateSize = calculateSize; self->serialize = serialize; self->addEntry = addEntry; + self->addEntry2 = addEntry2; *outAtom = self; self->entry_count = 0; From da4ce1b148bdde3b8b0812d5a74b066162d13bfb Mon Sep 17 00:00:00 2001 From: Dimitri Podborski Date: Fri, 10 Nov 2023 17:42:08 -0800 Subject: [PATCH 18/31] clangformat --- IsoLib/libisomediafile/src/MP4Atoms.h | 5 +++-- IsoLib/libisomediafile/src/MP4Movies.h | 11 ++++++----- IsoLib/libisomediafile/src/MovieTracks.c | 9 +++++---- .../libisomediafile/src/SubSampleInformationAtom.c | 14 ++++++++------ 4 files changed, 22 insertions(+), 17 deletions(-) diff --git a/IsoLib/libisomediafile/src/MP4Atoms.h b/IsoLib/libisomediafile/src/MP4Atoms.h index 578683b..818e905 100644 --- a/IsoLib/libisomediafile/src/MP4Atoms.h +++ b/IsoLib/libisomediafile/src/MP4Atoms.h @@ -1225,8 +1225,9 @@ typedef struct MP4SubSampleInformationAtom 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 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; diff --git a/IsoLib/libisomediafile/src/MP4Movies.h b/IsoLib/libisomediafile/src/MP4Movies.h index 0d7d3e1..34ddb46 100644 --- a/IsoLib/libisomediafile/src/MP4Movies.h +++ b/IsoLib/libisomediafile/src/MP4Movies.h @@ -694,7 +694,8 @@ extern "C" MP4Handle subsample_priority_array, MP4Handle subsample_discardable_array); /** - * @brief Same as MP4AddSubSampleInformationEntry but also allows to add the codec specific parameters + * @brief Same as MP4AddSubSampleInformationEntry but also allows to add the codec specific + * parameters * * @param subsample * @param sample_delta @@ -707,10 +708,10 @@ extern "C" */ MP4_EXTERN(MP4Err) MP4AddSubSampleInformationEntry2(MP4GenericAtom subsample, u32 sample_delta, u32 subsample_count, - MP4Handle subsample_size_array, - MP4Handle subsample_priority_array, - MP4Handle subsample_discardable_array, - MP4Handle codec_specific_parameters_array); + MP4Handle subsample_size_array, + MP4Handle subsample_priority_array, + MP4Handle subsample_discardable_array, + MP4Handle codec_specific_parameters_array); /** * @brief Add track to a track group ID. * diff --git a/IsoLib/libisomediafile/src/MovieTracks.c b/IsoLib/libisomediafile/src/MovieTracks.c index 60ab137..7b3f2fe 100644 --- a/IsoLib/libisomediafile/src/MovieTracks.c +++ b/IsoLib/libisomediafile/src/MovieTracks.c @@ -325,9 +325,9 @@ MP4AddSubSampleInformationEntry(MP4GenericAtom subsample, u32 sample_delta, u32 MP4_EXTERN(MP4Err) MP4AddSubSampleInformationEntry2(MP4GenericAtom subsample, u32 sample_delta, u32 subsample_count, - MP4Handle subsample_size_array, MP4Handle subsample_priority_array, - MP4Handle subsample_discardable_array, - MP4Handle codec_specific_parameters_array) + MP4Handle subsample_size_array, MP4Handle subsample_priority_array, + MP4Handle subsample_discardable_array, + MP4Handle codec_specific_parameters_array) { MP4Err err; MP4SubSampleInformationAtomPtr subs; @@ -337,7 +337,8 @@ MP4AddSubSampleInformationEntry2(MP4GenericAtom subsample, u32 sample_delta, u32 subs = (MP4SubSampleInformationAtomPtr)subsample; err = subs->addEntry2(subs, sample_delta, subsample_count, subsample_size_array, - subsample_priority_array, subsample_discardable_array, codec_specific_parameters_array); + subsample_priority_array, subsample_discardable_array, + codec_specific_parameters_array); bail: TEST_RETURN(err); diff --git a/IsoLib/libisomediafile/src/SubSampleInformationAtom.c b/IsoLib/libisomediafile/src/SubSampleInformationAtom.c index 8933ea0..2e430f0 100644 --- a/IsoLib/libisomediafile/src/SubSampleInformationAtom.c +++ b/IsoLib/libisomediafile/src/SubSampleInformationAtom.c @@ -179,8 +179,9 @@ static MP4Err addEntry(MP4SubSampleInformationAtom *s, u32 sample_delta, u32 sub } static MP4Err addEntry2(MP4SubSampleInformationAtom *s, u32 sample_delta, u32 subsample_count, - MP4Handle subsample_size_array, MP4Handle subsample_priority_array, - MP4Handle subsample_discardable_array, MP4Handle codec_specific_parameters_array) + MP4Handle subsample_size_array, MP4Handle subsample_priority_array, + MP4Handle subsample_discardable_array, + MP4Handle codec_specific_parameters_array) { MP4Err err; MP4SubSampleInformationAtomPtr self; @@ -230,10 +231,11 @@ static MP4Err addEntry2(MP4SubSampleInformationAtom *s, u32 sample_delta, u32 su { self->version = 1; } - self->subsample_size[current_entry][i] = ((u32 *)*subsample_size_array)[i]; - self->subsample_priority[current_entry][i] = ((u32 *)*subsample_priority_array)[i]; - self->discardable[current_entry][i] = ((u32 *)*subsample_discardable_array)[i]; - self->codec_specific_parameters[current_entry][i] = ((u32 *)*codec_specific_parameters_array)[i]; + self->subsample_size[current_entry][i] = ((u32 *)*subsample_size_array)[i]; + self->subsample_priority[current_entry][i] = ((u32 *)*subsample_priority_array)[i]; + self->discardable[current_entry][i] = ((u32 *)*subsample_discardable_array)[i]; + self->codec_specific_parameters[current_entry][i] = + ((u32 *)*codec_specific_parameters_array)[i]; } self->entry_count++; From e1b8d90086dbce038ade69cf958b9f0d45fa39ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=BF=A4=EB=8D=B0=EB=9D=BC=5F=EC=98=A4=EC=A7=80=EC=9A=B0?= Date: Fri, 24 Nov 2023 16:34:22 +0900 Subject: [PATCH 19/31] bugfix for calculating sidx box and when addreference counting referenceCount --- IsoLib/libisomediafile/src/SegmentIndexAtom.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/IsoLib/libisomediafile/src/SegmentIndexAtom.c b/IsoLib/libisomediafile/src/SegmentIndexAtom.c index 0e1f5c1..88cbc5b 100644 --- a/IsoLib/libisomediafile/src/SegmentIndexAtom.c +++ b/IsoLib/libisomediafile/src/SegmentIndexAtom.c @@ -75,7 +75,7 @@ static MP4Err addReference(struct MP4SegmentIndexAtom *self, u8 referenceType, u p->startsWithSAP = startsWithSAP; p->SAPType = SAPType; p->SAPDeltaTime = SAPDeltaTime; - + self->referenceCount++; /* add reference to linked list */ err = MP4AddListEntry(p, self->referencesList); if(err) goto bail; @@ -170,6 +170,7 @@ static MP4Err serialize(struct MP4Atom *s, char *buffer) static MP4Err calculateSize(struct MP4Atom *s) { MP4Err err; + u32 i; MP4SegmentIndexAtomPtr self = (MP4SegmentIndexAtomPtr)s; err = MP4NoErr; @@ -179,7 +180,11 @@ static MP4Err calculateSize(struct MP4Atom *s) self->size += (4 * 2) + (4 * 2) + (2 * 2); self->size += (4 * self->referenceCount); - + + for (i=0; i < self->referenceCount; i++) + { + self->size += 12; + } bail: TEST_RETURN(err); From 340b1226cae228252861fd78796b0e628fe6c454 Mon Sep 17 00:00:00 2001 From: Jinwon Lee Date: Wed, 6 Dec 2023 12:52:45 +0900 Subject: [PATCH 20/31] add a new function for buffer --- .../src/MP4FileMappingInputStream.c | 24 +++++++++++++++++++ IsoLib/libisomediafile/src/MP4Impl.h | 5 ++++ IsoLib/libisomediafile/src/MP4InputStream.h | 3 ++- .../src/MP4MemoryInputStream.c | 24 +++++++++++++++++++ 4 files changed, 55 insertions(+), 1 deletion(-) diff --git a/IsoLib/libisomediafile/src/MP4FileMappingInputStream.c b/IsoLib/libisomediafile/src/MP4FileMappingInputStream.c index 14f6ea9..225a7cd 100644 --- a/IsoLib/libisomediafile/src/MP4FileMappingInputStream.c +++ b/IsoLib/libisomediafile/src/MP4FileMappingInputStream.c @@ -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; + + err = MP4NoErr; + + CHECK_AVAIL(bytes) + 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; @@ -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; diff --git a/IsoLib/libisomediafile/src/MP4Impl.h b/IsoLib/libisomediafile/src/MP4Impl.h index 3af025f..98a7cb0 100644 --- a/IsoLib/libisomediafile/src/MP4Impl.h +++ b/IsoLib/libisomediafile/src/MP4Impl.h @@ -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) \ { \ diff --git a/IsoLib/libisomediafile/src/MP4InputStream.h b/IsoLib/libisomediafile/src/MP4InputStream.h index b4e5f77..4a01b28 100644 --- a/IsoLib/libisomediafile/src/MP4InputStream.h +++ b/IsoLib/libisomediafile/src/MP4InputStream.h @@ -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 { diff --git a/IsoLib/libisomediafile/src/MP4MemoryInputStream.c b/IsoLib/libisomediafile/src/MP4MemoryInputStream.c index d345df1..2e9cc35 100644 --- a/IsoLib/libisomediafile/src/MP4MemoryInputStream.c +++ b/IsoLib/libisomediafile/src/MP4MemoryInputStream.c @@ -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; + + err = MP4NoErr; + + CHECK_AVAIL(bytes) + 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; @@ -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; From 5a7cd5d75852d7b632512dacdff5151020ded2ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=BF=A4=EB=8D=B0=EB=9D=BC=5F=EC=98=A4=EC=A7=80=EC=9A=B0?= Date: Thu, 14 Dec 2023 14:47:12 +0900 Subject: [PATCH 21/31] formatting with clang-format --- IsoLib/libisomediafile/src/SegmentIndexAtom.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/IsoLib/libisomediafile/src/SegmentIndexAtom.c b/IsoLib/libisomediafile/src/SegmentIndexAtom.c index 88cbc5b..bec787e 100644 --- a/IsoLib/libisomediafile/src/SegmentIndexAtom.c +++ b/IsoLib/libisomediafile/src/SegmentIndexAtom.c @@ -180,8 +180,8 @@ static MP4Err calculateSize(struct MP4Atom *s) self->size += (4 * 2) + (4 * 2) + (2 * 2); self->size += (4 * self->referenceCount); - - for (i=0; i < self->referenceCount; i++) + + for(i = 0; i < self->referenceCount; i++) { self->size += 12; } From 496c81ec38c6b00221730d6aa46a09a01040e2e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=BF=A4=EB=8D=B0=EB=9D=BC=5F=EC=98=A4=EC=A7=80=EC=9A=B0?= Date: Fri, 15 Dec 2023 14:15:27 +0900 Subject: [PATCH 22/31] clang-format.yml version change --- .github/workflows/clang-format.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/clang-format.yml b/.github/workflows/clang-format.yml index 2451056..af62a10 100644 --- a/.github/workflows/clang-format.yml +++ b/.github/workflows/clang-format.yml @@ -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' check-path: 'IsoLib/libisomediafile' From c448559829b4c9f49ca9db7760d8efebc1744161 Mon Sep 17 00:00:00 2001 From: Jinwon Lee Date: Mon, 19 Feb 2024 16:09:39 +0900 Subject: [PATCH 23/31] BugFix --- IsoLib/libisomediafile/src/MP4FileMappingInputStream.c | 2 +- IsoLib/libisomediafile/src/MP4MemoryInputStream.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/IsoLib/libisomediafile/src/MP4FileMappingInputStream.c b/IsoLib/libisomediafile/src/MP4FileMappingInputStream.c index 225a7cd..0096ab6 100644 --- a/IsoLib/libisomediafile/src/MP4FileMappingInputStream.c +++ b/IsoLib/libisomediafile/src/MP4FileMappingInputStream.c @@ -165,7 +165,7 @@ static MP4Err rewindData(struct MP4InputStreamRecord *s, u64 bytes, char *msg) err = MP4NoErr; - CHECK_AVAIL(bytes) + //CHECK_AVAIL(bytes) self->available += bytes; self->current_offset -= bytes; diff --git a/IsoLib/libisomediafile/src/MP4MemoryInputStream.c b/IsoLib/libisomediafile/src/MP4MemoryInputStream.c index 2e9cc35..ea2a107 100644 --- a/IsoLib/libisomediafile/src/MP4MemoryInputStream.c +++ b/IsoLib/libisomediafile/src/MP4MemoryInputStream.c @@ -175,7 +175,7 @@ static MP4Err rewindData(struct MP4InputStreamRecord *s, u64 bytes, char *msg) err = MP4NoErr; - CHECK_AVAIL(bytes) + //CHECK_AVAIL(bytes) self->available += bytes; self->current_offset -= bytes; From 8b66602296240cd40700b59762b1849c012386c3 Mon Sep 17 00:00:00 2001 From: Dimitri Podborski Date: Tue, 20 Feb 2024 15:42:46 -0800 Subject: [PATCH 24/31] remove unnecessary comments --- IsoLib/libisomediafile/src/MP4FileMappingInputStream.c | 1 - IsoLib/libisomediafile/src/MP4MemoryInputStream.c | 1 - 2 files changed, 2 deletions(-) diff --git a/IsoLib/libisomediafile/src/MP4FileMappingInputStream.c b/IsoLib/libisomediafile/src/MP4FileMappingInputStream.c index 0096ab6..c18a526 100644 --- a/IsoLib/libisomediafile/src/MP4FileMappingInputStream.c +++ b/IsoLib/libisomediafile/src/MP4FileMappingInputStream.c @@ -165,7 +165,6 @@ static MP4Err rewindData(struct MP4InputStreamRecord *s, u64 bytes, char *msg) err = MP4NoErr; - //CHECK_AVAIL(bytes) self->available += bytes; self->current_offset -= bytes; diff --git a/IsoLib/libisomediafile/src/MP4MemoryInputStream.c b/IsoLib/libisomediafile/src/MP4MemoryInputStream.c index ea2a107..0d7597d 100644 --- a/IsoLib/libisomediafile/src/MP4MemoryInputStream.c +++ b/IsoLib/libisomediafile/src/MP4MemoryInputStream.c @@ -175,7 +175,6 @@ static MP4Err rewindData(struct MP4InputStreamRecord *s, u64 bytes, char *msg) err = MP4NoErr; - //CHECK_AVAIL(bytes) self->available += bytes; self->current_offset -= bytes; From a62daf60613f1bac25c8e14d7e57798bb2a21a02 Mon Sep 17 00:00:00 2001 From: Dimitri Podborski Date: Tue, 20 Feb 2024 16:05:24 -0800 Subject: [PATCH 25/31] add a check --- IsoLib/libisomediafile/src/MP4FileMappingInputStream.c | 1 + IsoLib/libisomediafile/src/MP4MemoryInputStream.c | 1 + 2 files changed, 2 insertions(+) diff --git a/IsoLib/libisomediafile/src/MP4FileMappingInputStream.c b/IsoLib/libisomediafile/src/MP4FileMappingInputStream.c index c18a526..53204cb 100644 --- a/IsoLib/libisomediafile/src/MP4FileMappingInputStream.c +++ b/IsoLib/libisomediafile/src/MP4FileMappingInputStream.c @@ -163,6 +163,7 @@ 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; diff --git a/IsoLib/libisomediafile/src/MP4MemoryInputStream.c b/IsoLib/libisomediafile/src/MP4MemoryInputStream.c index 0d7597d..126f4b2 100644 --- a/IsoLib/libisomediafile/src/MP4MemoryInputStream.c +++ b/IsoLib/libisomediafile/src/MP4MemoryInputStream.c @@ -173,6 +173,7 @@ 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; From 75397815509011346048b744067ad330c695dbaa Mon Sep 17 00:00:00 2001 From: Dimitri Podborski Date: Wed, 21 Feb 2024 09:49:01 -0800 Subject: [PATCH 26/31] extra safety and a couple of tests --- IsoLib/libisomediafile/src/ISOMeta.c | 11 +++++--- test/test_metadata.cpp | 40 ++++++++++++++++++++++++---- 2 files changed, 42 insertions(+), 9 deletions(-) diff --git a/IsoLib/libisomediafile/src/ISOMeta.c b/IsoLib/libisomediafile/src/ISOMeta.c index d331712..2d2b919 100644 --- a/IsoLib/libisomediafile/src/ISOMeta.c +++ b/IsoLib/libisomediafile/src/ISOMeta.c @@ -1201,11 +1201,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); + memcpy(*item_uri_type, infe->item_uri_type, sz); + } } bail: TEST_RETURN(err); diff --git a/test/test_metadata.cpp b/test/test_metadata.cpp index 9fc9b8b..4655125 100644 --- a/test/test_metadata.cpp +++ b/test/test_metadata.cpp @@ -28,7 +28,7 @@ TEST_CASE("metadata") { MP4Err err; - + char test_uri[] = "test_uri"; std::string strTestItem = "test_item.mp4"; std::string strTestEntityGroup = "test_meta_entity.mp4"; @@ -217,6 +217,7 @@ TEST_CASE("metadata") // add 2 items ISOMetaItem item1; ISOMetaItem item2; + ISOMetaItem item3; // URI item MP4Handle itemDataHandle1; MP4Handle itemDataHandle2; @@ -231,7 +232,7 @@ TEST_CASE("metadata") CHECK(err == MP4NoErr); // item 1 - ISOAddMetaItem(meta, &item1, 0, 0); + err = ISOAddMetaItem(meta, &item1, 0, 0); CHECK(err == MP4NoErr); err = ISOAddItemExtentUsingItemData(item1, itemDataHandle1); CHECK(err == MP4NoErr); @@ -247,12 +248,11 @@ TEST_CASE("metadata") err = ISOAddMetaItemProperty(item1, pTestProp, 1); CHECK(err == MP4NoErr); - ISOSetPrimaryItem(meta, item1); + err = ISOSetPrimaryItem(meta, item1); CHECK(err == MP4NoErr); // item 2 ISOAddMetaItem(meta, &item2, 0, 0); - CHECK(err == MP4NoErr); err = ISOAddItemExtentUsingItemData(item2, itemDataHandle2); CHECK(err == MP4NoErr); err = ISOSetItemInfo(item2, 0, (char *)"second item", NULL, NULL); @@ -260,6 +260,15 @@ TEST_CASE("metadata") err = ISOSetItemInfoItemType(item2, MP4_FOUR_CHAR_CODE('s', 'c', 'n', 'd'), NULL); CHECK(err == MP4NoErr); + // item 3 + ISOAddMetaItem(meta, &item3, 0, 0); + err = ISOAddItemExtentUsingItemData(item3, itemDataHandle3); + CHECK(err == MP4NoErr); + err = ISOSetItemInfo(item3, 0, (char *)"third item (URI)", NULL, NULL); + CHECK(err == MP4NoErr); + err = ISOSetItemInfoItemType(item3, MP4_FOUR_CHAR_CODE('u', 'r', 'i', ' '), test_uri); + CHECK(err == MP4NoErr); + err = ISOAddMetaItemProperty(item2, pTestProp, 0); CHECK(err == MP4NoErr); @@ -292,7 +301,12 @@ TEST_CASE("metadata") CHECK(cnt == 1); MP4GenericAtom *properties; ISOMetaItem item1 = items[0]; - err = ISOGetProperitesOfMetaItem(item1, &properties, &cnt); + + u32 item_type = 0; + err = ISOGetItemInfoItemType(item1, &item_type, NULL); + CHECK(err == MP4NoErr); + CHECK(item_type == MP4_FOUR_CHAR_CODE('f', 'r', 's', 't')); + err = ISOGetProperitesOfMetaItem(item1, &properties, &cnt); CHECK(err == MP4NoErr); CHECK(cnt == 1); MP4UnknownAtomPtr prop = (MP4UnknownAtomPtr)properties[0]; @@ -317,6 +331,22 @@ TEST_CASE("metadata") err = compareData(propHandle, TestData::DECAFCODEDOC, sizeof(TestData::DECAFCODEDOC)); CHECK(err == MP4NoErr); + // check tirhd item + err = ISOGetAllItemsWithType(meta, MP4_FOUR_CHAR_CODE('u', 'r', 'i', ' '), &items, &cnt); + CHECK(err == MP4NoErr); + CHECK(cnt == 1); + item_type = 0; + err = ISOGetItemInfoItemType(items[0], &item_type, NULL); + CHECK(err == MP4NoErr); + CHECK(item_type == MP4_FOUR_CHAR_CODE('u', 'r', 'i', ' ')); + char *item_uri_type; + item_uri_type = NULL; + err = ISOGetItemInfoItemType(items[0], &item_type, &item_uri_type); + CHECK(err == MP4NoErr); + std::string str_test_uri(test_uri); + std::string str_item_uri_type(item_uri_type); + CHECK(str_item_uri_type == str_test_uri); + // check references u16 refCnt; MP4Handle refItemIDsHandle; From a02f75de3ed7bbe761e00ad00d9d17d6bd200fd3 Mon Sep 17 00:00:00 2001 From: Dimitri Podborski Date: Wed, 21 Feb 2024 10:32:57 -0800 Subject: [PATCH 27/31] add interfaces to hide an item --- IsoLib/libisomediafile/src/ISOMeta.c | 61 ++++++++++++++++++++++++++ IsoLib/libisomediafile/src/ISOMovies.h | 11 +++++ test/test_metadata.cpp | 10 +++++ 3 files changed, 82 insertions(+) diff --git a/IsoLib/libisomediafile/src/ISOMeta.c b/IsoLib/libisomediafile/src/ISOMeta.c index 2d2b919..8e73c57 100644 --- a/IsoLib/libisomediafile/src/ISOMeta.c +++ b/IsoLib/libisomediafile/src/ISOMeta.c @@ -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; diff --git a/IsoLib/libisomediafile/src/ISOMovies.h b/IsoLib/libisomediafile/src/ISOMovies.h index a393a57..54896db 100644 --- a/IsoLib/libisomediafile/src/ISOMovies.h +++ b/IsoLib/libisomediafile/src/ISOMovies.h @@ -1101,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 ‘. diff --git a/test/test_metadata.cpp b/test/test_metadata.cpp index 4655125..69950fa 100644 --- a/test/test_metadata.cpp +++ b/test/test_metadata.cpp @@ -251,6 +251,10 @@ TEST_CASE("metadata") err = ISOSetPrimaryItem(meta, item1); CHECK(err == MP4NoErr); + // it is not allowed to hide a primary item + err = ISOHideItem(item1); + CHECK(err == MP4InvalidMediaErr); + // item 2 ISOAddMetaItem(meta, &item2, 0, 0); err = ISOAddItemExtentUsingItemData(item2, itemDataHandle2); @@ -259,6 +263,8 @@ TEST_CASE("metadata") CHECK(err == MP4NoErr); err = ISOSetItemInfoItemType(item2, MP4_FOUR_CHAR_CODE('s', 'c', 'n', 'd'), NULL); CHECK(err == MP4NoErr); + err = ISOHideItem(item2); + CHECK(err == MP4NoErr); // item 3 ISOAddMetaItem(meta, &item3, 0, 0); @@ -316,6 +322,8 @@ TEST_CASE("metadata") memcpy(*propHandle, prop->data, prop->dataSize); err = compareData(propHandle, TestData::DECAFCODEDOC, sizeof(TestData::DECAFCODEDOC)); CHECK(err == MP4NoErr); + err = ISOIsItemHidden(item1); + CHECK(err == MP4NotFoundErr); // check second item err = ISOGetAllItemsWithType(meta, MP4_FOUR_CHAR_CODE('s', 'c', 'n', 'd'), &items, &cnt); @@ -330,6 +338,8 @@ TEST_CASE("metadata") memcpy(*propHandle, prop->data, prop->dataSize); err = compareData(propHandle, TestData::DECAFCODEDOC, sizeof(TestData::DECAFCODEDOC)); CHECK(err == MP4NoErr); + err = ISOIsItemHidden(item2); + CHECK(err == MP4NoErr); // check tirhd item err = ISOGetAllItemsWithType(meta, MP4_FOUR_CHAR_CODE('u', 'r', 'i', ' '), &items, &cnt); From 4ce2678c766b95aebad6153c532595d4c9cea407 Mon Sep 17 00:00:00 2001 From: Dimitri Podborski Date: Wed, 21 Feb 2024 10:58:54 -0800 Subject: [PATCH 28/31] don't forget the /0 in utf8sring --- IsoLib/libisomediafile/src/ISOMeta.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/IsoLib/libisomediafile/src/ISOMeta.c b/IsoLib/libisomediafile/src/ISOMeta.c index 8e73c57..f352b70 100644 --- a/IsoLib/libisomediafile/src/ISOMeta.c +++ b/IsoLib/libisomediafile/src/ISOMeta.c @@ -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 From e4506e7246e61c0a308b9d94b8de2dd5600736af Mon Sep 17 00:00:00 2001 From: Dimitri Podborski Date: Wed, 21 Feb 2024 11:10:01 -0800 Subject: [PATCH 29/31] see previous commit --- IsoLib/libisomediafile/src/ISOMeta.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/IsoLib/libisomediafile/src/ISOMeta.c b/IsoLib/libisomediafile/src/ISOMeta.c index f352b70..6875d18 100644 --- a/IsoLib/libisomediafile/src/ISOMeta.c +++ b/IsoLib/libisomediafile/src/ISOMeta.c @@ -1267,7 +1267,7 @@ ISO_EXTERN(ISOErr) ISOGetItemInfoItemType(ISOMetaItem item, u32 *item_type, char if(infe->item_uri_type) { u32 sz = (u32)strlen(infe->item_uri_type); - *item_uri_type = (char *)calloc(1, sz); + *item_uri_type = (char *)calloc(1, sz + 1); memcpy(*item_uri_type, infe->item_uri_type, sz); } } From 600ec26b9a7284d4485b10adfdb05e89afff39b3 Mon Sep 17 00:00:00 2001 From: Dimitri Podborski Date: Wed, 21 Feb 2024 13:48:16 -0800 Subject: [PATCH 30/31] add a helper function to get sample entry type more easily --- IsoLib/libisomediafile/src/MP4Movies.c | 27 ++++++++++++++++++++++++++ IsoLib/libisomediafile/src/MP4Movies.h | 9 +++++++++ test/test_01_simple.cpp | 25 ++++++++++++++++++++++++ 3 files changed, 61 insertions(+) diff --git a/IsoLib/libisomediafile/src/MP4Movies.c b/IsoLib/libisomediafile/src/MP4Movies.c index cedef18..5280cd3 100644 --- a/IsoLib/libisomediafile/src/MP4Movies.c +++ b/IsoLib/libisomediafile/src/MP4Movies.c @@ -791,6 +791,33 @@ MP4GetMovieIndTrack(MP4Movie theMovie, u32 trackIndex, MP4Track *outTrack) return err; } +MP4_EXTERN(MP4Err) +MP4GetMovieIndTrackSampleEntryType(MP4Movie theMovie, u32 idx, u32* SEType) +{ + MP4Err err; + MP4Track trak; + MP4TrackReader reader; + MP4Handle sampleEntryH; + + MP4NewHandle(0, &sampleEntryH); + + err = MP4GetMovieIndTrack(theMovie, idx, &trak); + if(err) goto bail; + + err = MP4CreateTrackReader(trak, &reader); + if(err) goto bail; + + err = MP4TrackReaderGetCurrentSampleDescription(reader, sampleEntryH); + if(err) goto bail; + + err = ISOGetSampleDescriptionType(sampleEntryH, SEType); + +bail: + TEST_RETURN(err); + MP4DisposeHandle(sampleEntryH); + return err; +} + MP4_EXTERN(MP4Err) MP4GetMovieTrack(MP4Movie theMovie, u32 trackID, MP4Track *outTrack) { diff --git a/IsoLib/libisomediafile/src/MP4Movies.h b/IsoLib/libisomediafile/src/MP4Movies.h index 34ddb46..03f6fa9 100644 --- a/IsoLib/libisomediafile/src/MP4Movies.h +++ b/IsoLib/libisomediafile/src/MP4Movies.h @@ -745,6 +745,15 @@ extern "C" * @return MP4Err error code */ MP4_EXTERN(MP4Err) MP4GetMovieIndTrack(MP4Movie theMovie, u32 trackIndex, MP4Track *outTrack); + /** + * @brief Get sample entry type of a track. + * + * @note This function only returns the first sample entry type. + * @param theMovie input movie object + * @param idx index of the track ranges between 1 and the number of tracks in theMovie. + * @param SEType [out] sample entry type (4CC) + */ + MP4_EXTERN(MP4Err) MP4GetMovieIndTrackSampleEntryType(MP4Movie theMovie, u32 idx, u32* SEType); /* MP4_EXTERN ( MP4Err ) diff --git a/test/test_01_simple.cpp b/test/test_01_simple.cpp index 2f06699..9fe0968 100644 --- a/test/test_01_simple.cpp +++ b/test/test_01_simple.cpp @@ -22,6 +22,7 @@ #include #include +#include #include "testdataPath.h" #include @@ -118,6 +119,30 @@ TEST_CASE("01_simple.mp4") CHECK(err == MP4NoErr); CHECK(uiTrackCnt == 4); + for(uint32_t i=1; i<=uiTrackCnt; i++) + { + uint32_t type = 0; + err = MP4GetMovieIndTrackSampleEntryType(cMovieBox, i, &type); + CHECK(err == MP4NoErr); + switch (i) + { + case 1: + CHECK(type == MP4MPEGSampleEntryAtomType); + break; + case 2: + CHECK(type == MP4MPEGSampleEntryAtomType); + break; + case 3: + CHECK(type == MP4VisualSampleEntryAtomType); + break; + case 4: + CHECK(type == MP4AudioSampleEntryAtomType); + break; + default: + break; + } + } + // ISOGetTrackEnabled u32 outEnabled; ISOGetMovieTrack(cMovieBox, 101, &audioTrack); From f8dc4225b31d774ab096692e70b32e8a203731a6 Mon Sep 17 00:00:00 2001 From: Dimitri Podborski Date: Wed, 21 Feb 2024 13:58:14 -0800 Subject: [PATCH 31/31] clangformat --- IsoLib/libisomediafile/src/MP4Movies.c | 2 +- IsoLib/libisomediafile/src/MP4Movies.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/IsoLib/libisomediafile/src/MP4Movies.c b/IsoLib/libisomediafile/src/MP4Movies.c index 5280cd3..26f00f1 100644 --- a/IsoLib/libisomediafile/src/MP4Movies.c +++ b/IsoLib/libisomediafile/src/MP4Movies.c @@ -792,7 +792,7 @@ MP4GetMovieIndTrack(MP4Movie theMovie, u32 trackIndex, MP4Track *outTrack) } MP4_EXTERN(MP4Err) -MP4GetMovieIndTrackSampleEntryType(MP4Movie theMovie, u32 idx, u32* SEType) +MP4GetMovieIndTrackSampleEntryType(MP4Movie theMovie, u32 idx, u32 *SEType) { MP4Err err; MP4Track trak; diff --git a/IsoLib/libisomediafile/src/MP4Movies.h b/IsoLib/libisomediafile/src/MP4Movies.h index 03f6fa9..feac52c 100644 --- a/IsoLib/libisomediafile/src/MP4Movies.h +++ b/IsoLib/libisomediafile/src/MP4Movies.h @@ -753,7 +753,7 @@ extern "C" * @param idx index of the track ranges between 1 and the number of tracks in theMovie. * @param SEType [out] sample entry type (4CC) */ - MP4_EXTERN(MP4Err) MP4GetMovieIndTrackSampleEntryType(MP4Movie theMovie, u32 idx, u32* SEType); + MP4_EXTERN(MP4Err) MP4GetMovieIndTrackSampleEntryType(MP4Movie theMovie, u32 idx, u32 *SEType); /* MP4_EXTERN ( MP4Err )