Skip to content

Commit

Permalink
add codec_specific_parameters interface
Browse files Browse the repository at this point in the history
  • Loading branch information
podborski committed Nov 11, 2023
1 parent adf0c6f commit b098222
Show file tree
Hide file tree
Showing 4 changed files with 126 additions and 6 deletions.
3 changes: 3 additions & 0 deletions IsoLib/libisomediafile/src/MP4Atoms.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
18 changes: 18 additions & 0 deletions IsoLib/libisomediafile/src/MP4Movies.h
Original file line number Diff line number Diff line change
Expand Up @@ -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.
*
Expand Down
21 changes: 21 additions & 0 deletions IsoLib/libisomediafile/src/MovieTracks.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
90 changes: 84 additions & 6 deletions IsoLib/libisomediafile/src/SubSampleInformationAtom.c
Original file line number Diff line number Diff line change
@@ -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 */

Expand Down Expand Up @@ -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]);
Expand All @@ -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;
}

Expand All @@ -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;
Expand Down Expand Up @@ -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;

Expand Down

0 comments on commit b098222

Please sign in to comment.