On Wed, Nov 20, 2024, 7:24 PM James Almer <jamr...@gmail.com> wrote:
> From: Darren Mo <fumoboy...@me.com> > > Fixes tickets #7855 and #11312. > > Co-authored-by: James Almer <jamr...@gmail.com> > Signed-off-by: James Almer <jamr...@gmail.com> > --- > This is an alternative, better approach to the same issue. > > libavformat/isom.h | 3 + > libavformat/mov.c | 180 ++++++++++++++++-- > tests/ref/fate/copy-trac236 | 4 +- > tests/ref/fate/filter-fps | 1 + > tests/ref/fate/filter-fps-cfr | 1 + > tests/ref/fate/filter-meta-4560-rotate0 | 4 +- > tests/ref/fate/gaplessenc-itunes-to-ipod-aac | 2 +- > tests/ref/fate/matroska-dovi-write-config8 | 4 +- > .../fate/matroska-non-rotation-displaymatrix | 6 +- > tests/ref/fate/mov-aac-2048-priming | 2 +- > tests/ref/fate/mov-zombie | 4 +- > 11 files changed, 181 insertions(+), 30 deletions(-) > > diff --git a/libavformat/isom.h b/libavformat/isom.h > index ff08f2a48d..f18b15bbff 100644 > --- a/libavformat/isom.h > +++ b/libavformat/isom.h > @@ -174,6 +174,7 @@ typedef struct MOVStreamContext { > unsigned int chunk_count; > int64_t *chunk_offsets; > unsigned int stts_count; > + unsigned int stts_allocated_size; > MOVStts *stts_data; > unsigned int sdtp_count; > uint8_t *sdtp_data; > @@ -188,6 +189,8 @@ typedef struct MOVStreamContext { > unsigned *stps_data; ///< partial sync sample for mpeg-2 open gop > MOVElst *elst_data; > unsigned int elst_count; > + int stts_index; > + int stts_sample; > int ctts_index; > int ctts_sample; > unsigned int sample_size; ///< may contain value calculated from stsd > or value from stsz atom > diff --git a/libavformat/mov.c b/libavformat/mov.c > index 3e94a21418..66feea912d 100644 > --- a/libavformat/mov.c > +++ b/libavformat/mov.c > @@ -3518,7 +3518,7 @@ static int mov_read_stts(MOVContext *c, AVIOContext > *pb, MOVAtom atom) > { > AVStream *st; > MOVStreamContext *sc; > - unsigned int i, entries, alloc_size = 0; > + unsigned int i, entries; > int64_t duration = 0; > int64_t total_sample_count = 0; > int64_t current_dts = 0; > @@ -3552,7 +3552,7 @@ static int mov_read_stts(MOVContext *c, AVIOContext > *pb, MOVAtom atom) > 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, > + MOVStts *stts_data = av_fast_realloc(sc->stts_data, > &sc->stts_allocated_size, > min_entries * > sizeof(*sc->stts_data)); > if (!stts_data) { > av_freep(&sc->stts_data); > @@ -3916,11 +3916,15 @@ static int get_edit_list_entry(MOVContext *mov, > static int find_prev_closest_index(AVStream *st, > AVIndexEntry *e_old, > int nb_old, > + MOVStts* stts_data, > + int64_t stts_count, > MOVCtts* ctts_data, > int64_t ctts_count, > int64_t timestamp_pts, > int flag, > int64_t* index, > + int64_t* stts_index, > + int64_t* stts_sample, > int64_t* ctts_index, > int64_t* ctts_sample) > { > @@ -3963,6 +3967,15 @@ static int find_prev_closest_index(AVStream *st, > // Find out the ctts_index for the found frame. > *ctts_index = 0; > *ctts_sample = 0; > + > + if (stts_data) { > + av_assert0(stts_index); > + av_assert0(stts_sample); > + > + *stts_index = 0; > + *stts_sample = 0; > + } > + > for (index_ctts_count = 0; index_ctts_count < *index; > index_ctts_count++) { > if (*ctts_index < ctts_count) { > (*ctts_sample)++; > @@ -3971,6 +3984,13 @@ static int find_prev_closest_index(AVStream *st, > *ctts_sample = 0; > } > } > + if (stts_data && *stts_index < stts_count) { > + (*stts_sample)++; > + if (stts_data[*stts_index].count == *stts_sample) { > + (*stts_index)++; > + *stts_sample = 0; > + } > + } > } > > while (*index >= 0 && (*ctts_index) >= 0 && (*ctts_index) < > ctts_count) { > @@ -3990,6 +4010,16 @@ static int find_prev_closest_index(AVStream *st, > } else { > (*ctts_sample)--; > } > + if (stts_data) { > + if (*stts_sample == 0) { > + (*stts_index)--; > + if (*stts_index >= 0) { > + *stts_sample = stts_data[*stts_index].count - 1; > + } > + } else { > + (*stts_sample)--; > + } > + } > } > } > > @@ -4063,6 +4093,33 @@ static void fix_index_entry_timestamps(AVStream* > st, int end_index, int64_t end_ > } > } > > +static int64_t add_stts_entry(MOVStts** stts_data, unsigned int* > stts_count, unsigned int* allocated_size, > + int count, int duration) > +{ > + MOVStts *stts_buf_new; > + const size_t min_size_needed = (*stts_count + 1) * sizeof(MOVStts); > + const size_t requested_size = > + min_size_needed > *allocated_size ? > + FFMAX(min_size_needed, 2 * (*allocated_size)) : > + min_size_needed; > + > + if ((unsigned)(*stts_count) >= UINT_MAX / sizeof(MOVStts) - 1) > + return -1; > + > + stts_buf_new = av_fast_realloc(*stts_data, allocated_size, > requested_size); > + > + if (!stts_buf_new) > + return -1; > + > + *stts_data = stts_buf_new; > + > + stts_buf_new[*stts_count].count = count; > + stts_buf_new[*stts_count].duration = duration; > + > + *stts_count = (*stts_count) + 1; > + return *stts_count; > +} > + > /** > * Append a new ctts entry to ctts_data. > * Returns the new ctts_count if successful, else returns -1. > @@ -4211,6 +4268,10 @@ 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 *stts_data_old = msc->stts_data; > + int64_t stts_index_old = 0; > + int64_t stts_sample_old = 0; > + int64_t stts_count_old = msc->stts_count; > MOVCtts *ctts_data_old = msc->ctts_data; > int64_t ctts_index_old = 0; > int64_t ctts_sample_old = 0; > @@ -4220,6 +4281,7 @@ static void mov_fix_index(MOVContext *mov, AVStream > *st) > int64_t frame_duration = 0; > int64_t edit_list_dts_counter = 0; > int64_t edit_list_dts_entry_end = 0; > + int64_t edit_list_start_stts_sample = 0; > int64_t edit_list_start_ctts_sample = 0; > int64_t curr_cts; > int64_t curr_ctts = 0; > @@ -4256,7 +4318,12 @@ static void mov_fix_index(MOVContext *mov, AVStream > *st) > sti->index_entries_allocated_size = 0; > sti->nb_index_entries = 0; > > - // Clean ctts fields of MOVStreamContext > + // Clean time to sample fields of MOVStreamContext > + msc->stts_data = NULL; > + msc->stts_count = 0; > + msc->stts_index = 0; > + msc->stts_sample = 0; > + msc->stts_allocated_size = 0; > msc->ctts_data = NULL; > msc->ctts_count = 0; > msc->ctts_index = 0; > @@ -4314,17 +4381,19 @@ static void mov_fix_index(MOVContext *mov, > AVStream *st) > search_timestamp = FFMAX(search_timestamp - msc->time_scale, > e_old[0].timestamp); > } > > - if (find_prev_closest_index(st, e_old, nb_old, ctts_data_old, > ctts_count_old, search_timestamp, 0, > - &index, &ctts_index_old, > &ctts_sample_old) < 0) { > + if (find_prev_closest_index(st, e_old, nb_old, stts_data_old, > stts_count_old, ctts_data_old, ctts_count_old, search_timestamp, 0, > + &index, &stts_index_old, > &stts_sample_old, &ctts_index_old, &ctts_sample_old) < 0) { > av_log(mov->fc, AV_LOG_WARNING, > "st: %d edit list: %"PRId64" Missing key frame while > searching for timestamp: %"PRId64"\n", > st->index, edit_list_index, search_timestamp); > - if (find_prev_closest_index(st, e_old, nb_old, ctts_data_old, > ctts_count_old, search_timestamp, AVSEEK_FLAG_ANY, > - &index, &ctts_index_old, > &ctts_sample_old) < 0) { > + if (find_prev_closest_index(st, e_old, nb_old, stts_data_old, > stts_count_old, ctts_data_old, ctts_count_old, search_timestamp, > AVSEEK_FLAG_ANY, > + &index, &stts_index_old, > &stts_sample_old, &ctts_index_old, &ctts_sample_old) < 0) { > av_log(mov->fc, AV_LOG_WARNING, > "st: %d edit list %"PRId64" Cannot find an index > entry before timestamp: %"PRId64".\n", > st->index, edit_list_index, search_timestamp); > index = 0; > + stts_index_old = 0; > + stts_sample_old = 0; > ctts_index_old = 0; > ctts_sample_old = 0; > } > @@ -4346,6 +4415,24 @@ static void mov_fix_index(MOVContext *mov, AVStream > *st) > curr_cts = current->timestamp + msc->dts_shift; > curr_ctts = 0; > > + if (stts_data_old && stts_index_old < stts_count_old) { > + stts_sample_old++; > + if (stts_sample_old == > stts_data_old[stts_index_old].count) { > + if (add_stts_entry(&msc->stts_data, &msc->stts_count, > + &msc->stts_allocated_size, > + > stts_data_old[stts_index_old].count - edit_list_start_stts_sample, > + > stts_data_old[stts_index_old].duration) == -1) { > + av_log(mov->fc, AV_LOG_ERROR, "Cannot add STTS > entry %"PRId64" - {%"PRId64", %d}\n", > + stts_index_old, > + stts_data_old[stts_index_old].count - > edit_list_start_stts_sample, > + stts_data_old[stts_index_old].duration); > + break; > + } > + stts_index_old++; > + stts_sample_old = 0; > + edit_list_start_stts_sample = 0; > + } > + } > if (ctts_data_old && ctts_index_old < ctts_count_old) { > curr_ctts = ctts_data_old[ctts_index_old].offset; > av_log(mov->fc, AV_LOG_TRACE, "stts: %"PRId64" ctts: > %"PRId64", ctts_index: %"PRId64", ctts_count: %"PRId64"\n", > @@ -4460,6 +4547,16 @@ static void mov_fix_index(MOVContext *mov, AVStream > *st) > continue; > } > if (ctts_sample_old != 0) { > + if (stts_data_old && > + add_stts_entry(&msc->stts_data, > &msc->stts_count, > + &msc->stts_allocated_size, > + stts_sample_old - > edit_list_start_stts_sample, > + > stts_data_old[stts_index_old].duration) == -1) { > + av_log(mov->fc, AV_LOG_ERROR, "Cannot add > STTS entry %"PRId64" - {%"PRId64", %d}\n", > + stts_index_old, stts_sample_old - > edit_list_start_stts_sample, > + > stts_data_old[stts_index_old].duration); > + break; > + } > if (add_ctts_entry(&msc->ctts_data, > &msc->ctts_count, > &msc->ctts_allocated_size, > ctts_sample_old - > edit_list_start_ctts_sample, > @@ -4497,6 +4594,7 @@ static void mov_fix_index(MOVContext *mov, AVStream > *st) > > // Free the old index and the old CTTS structures > av_free(e_old); > + av_free(stts_data_old); > av_free(ctts_data_old); > av_freep(&frame_duration_buffer); > > @@ -5213,7 +5311,6 @@ static int mov_read_trak(MOVContext *c, AVIOContext > *pb, MOVAtom atom) > av_freep(&sc->chunk_offsets); > av_freep(&sc->sample_sizes); > av_freep(&sc->keyframes); > - av_freep(&sc->stts_data); > av_freep(&sc->stps_data); > av_freep(&sc->elst_data); > av_freep(&sc->rap_group); > @@ -5686,6 +5783,7 @@ static int mov_read_trun(MOVContext *c, AVIOContext > *pb, MOVAtom atom) > AVStream *st = NULL; > FFStream *sti = NULL; > MOVStreamContext *sc; > + MOVStts *stts_data; > MOVCtts *ctts_data; > uint64_t offset; > int64_t dts, pts = AV_NOPTS_VALUE; > @@ -5695,7 +5793,7 @@ static int mov_read_trun(MOVContext *c, AVIOContext > *pb, MOVAtom atom) > int64_t prev_dts = AV_NOPTS_VALUE; > int next_frag_index = -1, index_entry_pos; > size_t requested_size; > - size_t old_ctts_allocated_size; > + size_t old_allocated_size; > AVIndexEntry *new_entries; > MOVFragmentStreamInfo * frag_stream_info; > > @@ -5816,7 +5914,7 @@ static int mov_read_trun(MOVContext *c, AVIOContext > *pb, MOVAtom atom) > sti->index_entries= new_entries; > > requested_size = (sti->nb_index_entries + entries) * > sizeof(*sc->ctts_data); > - old_ctts_allocated_size = sc->ctts_allocated_size; > + old_allocated_size = sc->ctts_allocated_size; > ctts_data = av_fast_realloc(sc->ctts_data, &sc->ctts_allocated_size, > requested_size); > if (!ctts_data) > @@ -5826,8 +5924,20 @@ static int mov_read_trun(MOVContext *c, AVIOContext > *pb, MOVAtom atom) > // In case there were samples without ctts entries, ensure they get > // zero valued entries. This ensures clips which mix boxes with and > // without ctts entries don't pickup uninitialized data. > - memset((uint8_t*)(sc->ctts_data) + old_ctts_allocated_size, 0, > - sc->ctts_allocated_size - old_ctts_allocated_size); > + memset((uint8_t*)(sc->ctts_data) + old_allocated_size, 0, > + sc->ctts_allocated_size - old_allocated_size); > + > + requested_size = (sti->nb_index_entries + entries) * > sizeof(*sc->stts_data); > + old_allocated_size = sc->stts_allocated_size; > + stts_data = av_fast_realloc(sc->stts_data, &sc->stts_allocated_size, > + requested_size); > + if (!stts_data) > + return AVERROR(ENOMEM); > + sc->stts_data = stts_data; > + > + // See the comment for ctts above. > + memset((uint8_t*)(sc->stts_data) + old_allocated_size, 0, > + sc->stts_allocated_size - old_allocated_size); > > if (index_entry_pos < sti->nb_index_entries) { > // Make hole in index_entries and ctts_data for new samples > @@ -5838,6 +5948,9 @@ static int mov_read_trun(MOVContext *c, AVIOContext > *pb, MOVAtom atom) > memmove(sc->ctts_data + index_entry_pos + entries, > sc->ctts_data + index_entry_pos, > sizeof(*sc->ctts_data) * (sc->ctts_count - > index_entry_pos)); > + memmove(sc->stts_data + index_entry_pos + entries, > + sc->stts_data + index_entry_pos, > + sizeof(*sc->stts_data) * (sc->stts_count - > index_entry_pos)); > if (index_entry_pos < sc->current_sample) { > sc->current_sample += entries; > } > @@ -5845,6 +5958,7 @@ static int mov_read_trun(MOVContext *c, AVIOContext > *pb, MOVAtom atom) > > sti->nb_index_entries += entries; > sc->ctts_count = sti->nb_index_entries; > + sc->stts_count = sti->nb_index_entries; > > // Record the index_entry position in frag_index of this fragment > if (frag_stream_info) { > @@ -5911,6 +6025,8 @@ static int mov_read_trun(MOVContext *c, AVIOContext > *pb, MOVAtom atom) > > sc->ctts_data[index_entry_pos].count = 1; > sc->ctts_data[index_entry_pos].offset = ctts_duration; > + sc->stts_data[index_entry_pos].count = 1; > + sc->stts_data[index_entry_pos].duration = sample_duration; > index_entry_pos++; > > av_log(c->fc, AV_LOG_TRACE, "AVIndex stream %d, sample %d, offset > %"PRIx64", dts %"PRId64", " > @@ -5946,9 +6062,14 @@ static int mov_read_trun(MOVContext *c, AVIOContext > *pb, MOVAtom atom) > sc->ctts_data + index_entry_pos + gap, > sizeof(*sc->ctts_data) * > (sc->ctts_count - (index_entry_pos + gap))); > + memmove(sc->stts_data + index_entry_pos, > + sc->stts_data + index_entry_pos + gap, > + sizeof(*sc->stts_data) * > + (sc->stts_count - (index_entry_pos + gap))); > > sti->nb_index_entries -= gap; > sc->ctts_count -= gap; > + sc->stts_count -= gap; > if (index_entry_pos < sc->current_sample) { > sc->current_sample -= gap; > } > @@ -10720,6 +10841,17 @@ static int mov_finalize_packet(AVFormatContext > *s, AVStream *st, AVIndexEntry *s > if (sample->flags & AVINDEX_DISCARD_FRAME) { > pkt->flags |= AV_PKT_FLAG_DISCARD; > } > + if (sc->stts_data && sc->stts_index < sc->stts_count) { > + pkt->duration = sc->stts_data[sc->stts_index].duration; > + > + /* update stts context */ > + sc->stts_sample++; > + if (sc->stts_index < sc->ctts_count && > + sc->stts_data[sc->stts_index].count == sc->stts_sample) { > + sc->stts_index++; > + sc->stts_sample = 0; > + } > + } > if (sc->ctts_data && sc->ctts_index < sc->ctts_count) { > pkt->pts = av_sat_add64(pkt->dts, av_sat_add64(sc->dts_shift, > sc->ctts_data[sc->ctts_index].offset)); > > @@ -10731,11 +10863,12 @@ static int mov_finalize_packet(AVFormatContext > *s, AVStream *st, AVIndexEntry *s > sc->ctts_sample = 0; > } > } else { > - int64_t next_dts = (sc->current_sample < > ffstream(st)->nb_index_entries) ? > - ffstream(st)->index_entries[sc->current_sample].timestamp : > st->duration; > - > - if (next_dts >= pkt->dts) > - pkt->duration = next_dts - pkt->dts; > + if (pkt->duration == 0) { > + int64_t next_dts = (sc->current_sample < > ffstream(st)->nb_index_entries) ? > + ffstream(st)->index_entries[sc->current_sample].timestamp > : st->duration; > + if (next_dts >= pkt->dts) > + pkt->duration = next_dts - pkt->dts; > + } > pkt->pts = pkt->dts; > } > > @@ -11031,6 +11164,19 @@ static int mov_seek_stream(AVFormatContext *s, > AVStream *st, int64_t timestamp, > > mov_current_sample_set(sc, sample); > av_log(s, AV_LOG_TRACE, "stream %d, found sample %d\n", st->index, > sc->current_sample); > + /* adjust stts index */ > + if (sc->stts_data) { > + time_sample = 0; > + for (i = 0; i < sc->stts_count; i++) { > + int next = time_sample + sc->stts_data[i].count; > + if (next > sc->current_sample) { > + sc->stts_index = i; > + sc->stts_sample = sc->current_sample - time_sample; > + break; > + } > + time_sample = next; > + } > + } > /* adjust ctts index */ > if (sc->ctts_data) { > time_sample = 0; > diff --git a/tests/ref/fate/copy-trac236 b/tests/ref/fate/copy-trac236 > index c89649e953..1f20e9ea7e 100644 > --- a/tests/ref/fate/copy-trac236 > +++ b/tests/ref/fate/copy-trac236 > @@ -1,5 +1,5 @@ > -ca4068319c6586de757c1f6a592b31e5 *tests/data/fate/copy-trac236.mov > -630918 tests/data/fate/copy-trac236.mov > +3e3497985d54991e09f82ca3dd7eda79 *tests/data/fate/copy-trac236.mov > +630910 tests/data/fate/copy-trac236.mov > #tb 0: 100/2997 > #media_type 0: video > #codec_id 0: rawvideo > diff --git a/tests/ref/fate/filter-fps b/tests/ref/fate/filter-fps > index 242fb04e85..fa71b59cd3 100644 > --- a/tests/ref/fate/filter-fps > +++ b/tests/ref/fate/filter-fps > @@ -91,3 +91,4 @@ > 0, 85, 85, 1, 30576, 0xd4150aad > 0, 86, 86, 1, 30576, 0xd4150aad > 0, 87, 87, 1, 30576, 0xd4150aad > +0, 88, 88, 1, 30576, 0xd4150aad > diff --git a/tests/ref/fate/filter-fps-cfr b/tests/ref/fate/filter-fps-cfr > index 242fb04e85..fa71b59cd3 100644 > --- a/tests/ref/fate/filter-fps-cfr > +++ b/tests/ref/fate/filter-fps-cfr > @@ -91,3 +91,4 @@ > 0, 85, 85, 1, 30576, 0xd4150aad > 0, 86, 86, 1, 30576, 0xd4150aad > 0, 87, 87, 1, 30576, 0xd4150aad > +0, 88, 88, 1, 30576, 0xd4150aad > diff --git a/tests/ref/fate/filter-meta-4560-rotate0 > b/tests/ref/fate/filter-meta-4560-rotate0 > index c0f3b03710..b0f3d67f08 100644 > --- a/tests/ref/fate/filter-meta-4560-rotate0 > +++ b/tests/ref/fate/filter-meta-4560-rotate0 > @@ -1,5 +1,5 @@ > -dc213aee944a55af2f41950921fd62d7 > *tests/data/fate/filter-meta-4560-rotate0.mov > -347433 tests/data/fate/filter-meta-4560-rotate0.mov > +6cd6b45a88881e85dfe7ad9582ffbeff > *tests/data/fate/filter-meta-4560-rotate0.mov > +347425 tests/data/fate/filter-meta-4560-rotate0.mov > #tb 0: 1/30 > #media_type 0: video > #codec_id 0: rawvideo > diff --git a/tests/ref/fate/gaplessenc-itunes-to-ipod-aac > b/tests/ref/fate/gaplessenc-itunes-to-ipod-aac > index 41c9f03b20..a8da904c32 100644 > --- a/tests/ref/fate/gaplessenc-itunes-to-ipod-aac > +++ b/tests/ref/fate/gaplessenc-itunes-to-ipod-aac > @@ -22,7 +22,7 @@ packet|pts=98304|dts=98304|duration=1024|flags=K__ > packet|pts=99328|dts=99328|duration=1024|flags=K__ > packet|pts=100352|dts=100352|duration=1024|flags=K__ > packet|pts=101376|dts=101376|duration=1024|flags=K__ > -packet|pts=102400|dts=102400|duration=926|flags=K__ > +packet|pts=102400|dts=102400|duration=960|flags=K__ > stream|nb_read_packets=102 > frame|pts=0|pkt_dts=0|best_effort_timestamp=0|nb_samples=1024 > frame|pts=1024|pkt_dts=1024|best_effort_timestamp=1024|nb_samples=1024 > diff --git a/tests/ref/fate/matroska-dovi-write-config8 > b/tests/ref/fate/matroska-dovi-write-config8 > index 85899d5f6d..d5704c7684 100644 > --- a/tests/ref/fate/matroska-dovi-write-config8 > +++ b/tests/ref/fate/matroska-dovi-write-config8 > @@ -1,5 +1,5 @@ > -3bd4b07d5af6153516e4c0e66a71c8c9 > *tests/data/fate/matroska-dovi-write-config8.matroska > -3600607 tests/data/fate/matroska-dovi-write-config8.matroska > +593bb650a937b25b87de3079ee7d1517 > *tests/data/fate/matroska-dovi-write-config8.matroska > +3600617 tests/data/fate/matroska-dovi-write-config8.matroska > #extradata 0: 551, 0xb1ddcd66 > #extradata 1: 2, 0x00340022 > #tb 0: 1/1000 > diff --git a/tests/ref/fate/matroska-non-rotation-displaymatrix > b/tests/ref/fate/matroska-non-rotation-displaymatrix > index c48a4afa43..ad9d6e5b43 100644 > --- a/tests/ref/fate/matroska-non-rotation-displaymatrix > +++ b/tests/ref/fate/matroska-non-rotation-displaymatrix > @@ -1,12 +1,12 @@ > -3d9eac5b7551c5d644443a70451c809c > *tests/data/fate/matroska-non-rotation-displaymatrix.matroska > -7860 tests/data/fate/matroska-non-rotation-displaymatrix.matroska > +7294b73bcb1cd5059b8f413e2a4dab5b > *tests/data/fate/matroska-non-rotation-displaymatrix.matroska > +7866 tests/data/fate/matroska-non-rotation-displaymatrix.matroska > #extradata 0: 34, 0xc1d10b51 > #tb 0: 1/1000 > #media_type 0: video > #codec_id 0: h264 > #dimensions 0: 160x240 > #sar 0: 1/2 > -0, -33, 0, 33, 4133, 0xc48cf152 > +0, -33, 0, 27, 4133, 0xc48cf152 > 0, 0, 60, 33, 1077, 0x15a71a8a, F=0x0 > 0, 27, 27, 33, 355, 0x1ee8b91a, F=0x0 > 0, 60, 127, 33, 1110, 0x4e1a2b12, F=0x0 > diff --git a/tests/ref/fate/mov-aac-2048-priming > b/tests/ref/fate/mov-aac-2048-priming > index b3ab9e0d34..feea5e36eb 100644 > --- a/tests/ref/fate/mov-aac-2048-priming > +++ b/tests/ref/fate/mov-aac-2048-priming > @@ -214,4 +214,4 @@ > packet|codec_type=audio|stream_index=0|pts=215040|pts_time=4.876190|dts=215040|d > > > packet|codec_type=audio|stream_index=0|pts=216064|pts_time=4.899410|dts=216064|dts_time=4.899410|duration=1024|duration_time=0.023220|size=203|pos=42900|flags=K__ > > > packet|codec_type=audio|stream_index=0|pts=217088|pts_time=4.922630|dts=217088|dts_time=4.922630|duration=1024|duration_time=0.023220|size=198|pos=43103|flags=K__ > > > packet|codec_type=audio|stream_index=0|pts=218112|pts_time=4.945850|dts=218112|dts_time=4.945850|duration=1024|duration_time=0.023220|size=284|pos=43301|flags=K__ > > -packet|codec_type=audio|stream_index=0|pts=219136|pts_time=4.969070|dts=219136|dts_time=4.969070|duration=1364|duration_time=0.030930|size=5|pos=43585|flags=K__ > > +packet|codec_type=audio|stream_index=0|pts=219136|pts_time=4.969070|dts=219136|dts_time=4.969070|duration=340|duration_time=0.007710|size=5|pos=43585|flags=K__ > diff --git a/tests/ref/fate/mov-zombie b/tests/ref/fate/mov-zombie > index 10476bc49f..ed20e635ad 100644 > --- a/tests/ref/fate/mov-zombie > +++ b/tests/ref/fate/mov-zombie > @@ -1,6 +1,6 @@ > > -packet|codec_type=video|stream_index=0|pts=0|pts_time=0.000000|dts=-3004|dts_time=-0.033378|duration=3003|duration_time=0.033367|size=4133|pos=11309|flags=K__ > > +packet|codec_type=video|stream_index=0|pts=0|pts_time=0.000000|dts=-3004|dts_time=-0.033378|duration=2437|duration_time=0.027078|size=4133|pos=11309|flags=K__ > > > packet|codec_type=video|stream_index=0|pts=5440|pts_time=0.060444|dts=-567|dts_time=-0.006300|duration=3003|duration_time=0.033367|size=1077|pos=15442|flags=___ > -frame|media_type=video|stream_index=0|key_frame=1|pts=0|pts_time=0.000000|pkt_dts=-567|pkt_dts_time=-0.006300|best_effort_timestamp=0|best_effort_timestamp_time=0.000000|duration=3003|duration_time=0.033367|pkt_pos=11309|pkt_size=4133|width=160|height=240|crop_top=0|crop_bottom=0|crop_left=0|crop_right=0|pix_fmt=yuv420p|sample_aspect_ratio=2:1|pict_type=I|interlaced_frame=0|top_field_first=0|repeat_pict=0|color_range=tv|color_space=smpte170m|color_primaries=smpte170m|color_transfer=bt709|chroma_location=topleft|side_datum/3x3_displaymatrix:side_data_type=3x3 > displaymatrix|side_datum/3x3_displaymatrix:displaymatrix=\n00000000: > 131072 0 0\n00000001: 0 65536 > 0\n00000002: 0 0 > 1073741824\n|side_datum/3x3_displaymatrix:rotation=0|side_datum/h_26_45__user_data_unregistered_sei_message:side_data_type=H.26[45] > User Data Unregistered SEI message > +frame|media_type=video|stream_index=0|key_frame=1|pts=0|pts_time=0.000000|pkt_dts=-567|pkt_dts_time=-0.006300|best_effort_timestamp=0|best_effort_timestamp_time=0.000000|duration=2437|duration_time=0.027078|pkt_pos=11309|pkt_size=4133|width=160|height=240|crop_top=0|crop_bottom=0|crop_left=0|crop_right=0|pix_fmt=yuv420p|sample_aspect_ratio=2:1|pict_type=I|interlaced_frame=0|top_field_first=0|repeat_pict=0|color_range=tv|color_space=smpte170m|color_primaries=smpte170m|color_transfer=bt709|chroma_location=topleft|side_datum/3x3_displaymatrix:side_data_type=3x3 > displaymatrix|side_datum/3x3_displaymatrix:displaymatrix=\n00000000: > 131072 0 0\n00000001: 0 65536 > 0\n00000002: 0 0 > 1073741824\n|side_datum/3x3_displaymatrix:rotation=0|side_datum/h_26_45__user_data_unregistered_sei_message:side_data_type=H.26[45] > User Data Unregistered SEI message > > > packet|codec_type=video|stream_index=0|pts=2437|pts_time=0.027078|dts=2436|dts_time=0.027067|duration=3003|duration_time=0.033367|size=355|pos=16519|flags=___ > > frame|media_type=video|stream_index=0|key_frame=0|pts=2437|pts_time=0.027078|pkt_dts=2436|pkt_dts_time=0.027067|best_effort_timestamp=2437|best_effort_timestamp_time=0.027078|duration=3003|duration_time=0.033367|pkt_pos=16519|pkt_size=355|width=160|height=240|crop_top=0|crop_bottom=0|crop_left=0|crop_right=0|pix_fmt=yuv420p|sample_aspect_ratio=2:1|pict_type=B|interlaced_frame=0|top_field_first=0|repeat_pict=0|color_range=tv|color_space=smpte170m|color_primaries=smpte170m|color_transfer=bt709|chroma_location=topleft|side_datum/3x3_displaymatrix:side_data_type=3x3 > displaymatrix|side_datum/3x3_displaymatrix:displaymatrix=\n00000000: > 131072 0 0\n00000001: 0 65536 > 0\n00000002: 0 0 > 1073741824\n|side_datum/3x3_displaymatrix:rotation=0|side_datum/h_26_45__user_data_unregistered_sei_message:side_data_type=H.26[45] > User Data Unregistered SEI message > > > packet|codec_type=video|stream_index=0|pts=11446|pts_time=0.127178|dts=5439|dts_time=0.060433|duration=3003|duration_time=0.033367|size=1110|pos=16874|flags=___ > -- > 2.47.0 > > _______________________________________________ > ffmpeg-devel mailing list > ffmpeg-devel@ffmpeg.org > https://ffmpeg.org/mailman/listinfo/ffmpeg-devel > > To unsubscribe, visit link above, or email > ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe". > This patch also fixed #11312. However, if we decode to pcm, the last packet is not trim and we still continue to output 1024 samples while the duration is marked at 68. _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".