[FFmpeg-devel] [PATCH] avformat/mov: make STTS duration unsigned int
Gyan Doshi
ffmpeg at gyani.pro
Mon Nov 22 11:49:54 EET 2021
On 2021-11-19 09:32 pm, Gyan Doshi wrote:
> Plan to push Monday afternoon.
Pushed as 203b0e3561dea1ec459be226d805abe73e7535e5
Regards,
Gyan
>
> On 2021-11-16 07:45 pm, Gyan Doshi wrote:
>> As per 8.6.1.2.2 of ISO/IEC 14496-12:2015(E), STTS sample offsets
>> are to be always stored as uint32_t. So far, they have been signed ints
>> which led to desync in files with very large offsets.
>>
>> The MOVStts struct was used to store CTTS offsets as well. These can be
>> negative in version 1. So a new struct MOVCtts was created and all
>> declarations for CTTS usage changed to MOVCtts.
>> ---
>> The muxer should be adjusted to be able to write larger durations in the
>> stts but that's a larger undertaking which I'll do later.
>>
>> libavformat/isom.h | 9 +++++++--
>> libavformat/mov.c | 20 ++++++++++----------
>> libavformat/movenc.c | 2 +-
>> 3 files changed, 18 insertions(+), 13 deletions(-)
>>
>> diff --git a/libavformat/isom.h b/libavformat/isom.h
>> index f3c18c95be..ef8f19b18c 100644
>> --- a/libavformat/isom.h
>> +++ b/libavformat/isom.h
>> @@ -55,9 +55,14 @@ struct AVAESCTR;
>> typedef struct MOVStts {
>> unsigned int count;
>> - int duration;
>> + unsigned int duration;
>> } MOVStts;
>> +typedef struct MOVCtts {
>> + unsigned int count;
>> + int duration;
>> +} MOVCtts;
>> +
>> typedef struct MOVStsc {
>> int first;
>> int count;
>> @@ -168,7 +173,7 @@ typedef struct MOVStreamContext {
>> uint8_t *sdtp_data;
>> unsigned int ctts_count;
>> unsigned int ctts_allocated_size;
>> - MOVStts *ctts_data;
>> + MOVCtts *ctts_data;
>> unsigned int stsc_count;
>> MOVStsc *stsc_data;
>> unsigned int stsc_index;
>> diff --git a/libavformat/mov.c b/libavformat/mov.c
>> index 8a910a3165..451cb78bbf 100644
>> --- a/libavformat/mov.c
>> +++ b/libavformat/mov.c
>> @@ -77,7 +77,7 @@ typedef struct MOVParseTableEntry {
>> static int mov_read_default(MOVContext *c, AVIOContext *pb,
>> MOVAtom atom);
>> static int mov_read_mfra(MOVContext *c, AVIOContext *f);
>> -static int64_t add_ctts_entry(MOVStts** ctts_data, unsigned int*
>> ctts_count, unsigned int* allocated_size,
>> +static int64_t add_ctts_entry(MOVCtts** ctts_data, unsigned int*
>> ctts_count, unsigned int* allocated_size,
>> int count, int duration);
>> static int mov_metadata_track_or_disc_number(MOVContext *c,
>> AVIOContext *pb,
>> @@ -2938,7 +2938,7 @@ static int mov_read_stts(MOVContext *c,
>> AVIOContext *pb, MOVAtom atom)
>> return AVERROR(ENOMEM);
>> for (i = 0; i < entries && !pb->eof_reached; i++) {
>> - int sample_duration;
>> + unsigned int sample_duration;
>> unsigned int sample_count;
>> unsigned int min_entries = FFMIN(FFMAX(i + 1, 1024 * 1024),
>> entries);
>> MOVStts *stts_data = av_fast_realloc(sc->stts_data,
>> &alloc_size,
>> @@ -3191,7 +3191,7 @@ static int get_edit_list_entry(MOVContext *mov,
>> static int find_prev_closest_index(AVStream *st,
>> AVIndexEntry *e_old,
>> int nb_old,
>> - MOVStts* ctts_data,
>> + MOVCtts* ctts_data,
>> int64_t ctts_count,
>> int64_t timestamp_pts,
>> int flag,
>> @@ -3342,17 +3342,17 @@ static void
>> fix_index_entry_timestamps(AVStream* st, int end_index, int64_t end_
>> * Append a new ctts entry to ctts_data.
>> * Returns the new ctts_count if successful, else returns -1.
>> */
>> -static int64_t add_ctts_entry(MOVStts** ctts_data, unsigned int*
>> ctts_count, unsigned int* allocated_size,
>> +static int64_t add_ctts_entry(MOVCtts** ctts_data, unsigned int*
>> ctts_count, unsigned int* allocated_size,
>> int count, int duration)
>> {
>> - MOVStts *ctts_buf_new;
>> - const size_t min_size_needed = (*ctts_count + 1) * sizeof(MOVStts);
>> + MOVCtts *ctts_buf_new;
>> + const size_t min_size_needed = (*ctts_count + 1) * sizeof(MOVCtts);
>> const size_t requested_size =
>> min_size_needed > *allocated_size ?
>> FFMAX(min_size_needed, 2 * (*allocated_size)) :
>> min_size_needed;
>> - if ((unsigned)(*ctts_count) >= UINT_MAX / sizeof(MOVStts) - 1)
>> + if ((unsigned)(*ctts_count) >= UINT_MAX / sizeof(MOVCtts) - 1)
>> return -1;
>> ctts_buf_new = av_fast_realloc(*ctts_data, allocated_size,
>> requested_size);
>> @@ -3486,7 +3486,7 @@ static void mov_fix_index(MOVContext *mov,
>> AVStream *st)
>> int nb_old = sti->nb_index_entries;
>> const AVIndexEntry *e_old_end = e_old + nb_old;
>> const AVIndexEntry *current = NULL;
>> - MOVStts *ctts_data_old = msc->ctts_data;
>> + MOVCtts *ctts_data_old = msc->ctts_data;
>> int64_t ctts_index_old = 0;
>> int64_t ctts_sample_old = 0;
>> int64_t ctts_count_old = msc->ctts_count;
>> @@ -3793,7 +3793,7 @@ static void mov_build_index(MOVContext *mov,
>> AVStream *st)
>> unsigned int stps_index = 0;
>> unsigned int i, j;
>> uint64_t stream_size = 0;
>> - MOVStts *ctts_data_old = sc->ctts_data;
>> + MOVCtts *ctts_data_old = sc->ctts_data;
>> unsigned int ctts_count_old = sc->ctts_count;
>> if (sc->elst_count) {
>> @@ -4754,7 +4754,7 @@ static int mov_read_trun(MOVContext *c,
>> AVIOContext *pb, MOVAtom atom)
>> AVStream *st = NULL;
>> FFStream *sti = NULL;
>> MOVStreamContext *sc;
>> - MOVStts *ctts_data;
>> + MOVCtts *ctts_data;
>> uint64_t offset;
>> int64_t dts, pts = AV_NOPTS_VALUE;
>> int data_offset = 0;
>> diff --git a/libavformat/movenc.c b/libavformat/movenc.c
>> index 37d4403f7a..233aee62d4 100644
>> --- a/libavformat/movenc.c
>> +++ b/libavformat/movenc.c
>> @@ -2434,7 +2434,7 @@ static int mov_write_stsd_tag(AVFormatContext
>> *s, AVIOContext *pb, MOVMuxContext
>> static int mov_write_ctts_tag(AVFormatContext *s, AVIOContext *pb,
>> MOVTrack *track)
>> {
>> MOVMuxContext *mov = s->priv_data;
>> - MOVStts *ctts_entries;
>> + MOVCtts *ctts_entries;
>> uint32_t entries = 0;
>> uint32_t atom_size;
>> int i;
>
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
> To unsubscribe, visit link above, or email
> ffmpeg-devel-request at ffmpeg.org with subject "unsubscribe".
More information about the ffmpeg-devel
mailing list