Forgot to attach the FATE ref file. sending the patch again. On Wed, Nov 1, 2017 at 2:23 PM, Sasi Inguva <is...@google.com> wrote:
> Partially fixes t/6699. > --- > libavformat/mov.c | 32 +++++++++++++++++++++----------- > tests/fate/mov.mak | 4 ++++ > 2 files changed, 25 insertions(+), 11 deletions(-) > > diff --git a/libavformat/mov.c b/libavformat/mov.c > index 60f0228e2d..e716e5ba9e 100644 > --- a/libavformat/mov.c > +++ b/libavformat/mov.c > @@ -3232,6 +3232,7 @@ static void mov_fix_index(MOVContext *mov, AVStream > *st) > int packet_skip_samples = 0; > MOVIndexRange *current_index_range; > int i; > + int found_keyframe_after_edit = 0; > > if (!msc->elst_data || msc->elst_count <= 0 || nb_old <= 0) { > return; > @@ -3347,6 +3348,7 @@ static void mov_fix_index(MOVContext *mov, AVStream > *st) > > // Iterate over index and arrange it according to edit list > edit_list_start_encountered = 0; > + found_keyframe_after_edit = 0; > for (; current < e_old_end; current++, index++) { > // check if frame outside edit list mark it for discard > frame_duration = (current + 1 < e_old_end) ? > @@ -3459,18 +3461,26 @@ static void mov_fix_index(MOVContext *mov, > AVStream *st) > } > > // Break when found first key frame after edit entry > completion > - if (((curr_cts + frame_duration) >= (edit_list_duration + > edit_list_media_time)) && > + if ((curr_cts + frame_duration >= (edit_list_duration + > edit_list_media_time)) && > ((flags & AVINDEX_KEYFRAME) || ((st->codecpar->codec_type > == AVMEDIA_TYPE_AUDIO)))) { > - > - if (ctts_data_old && ctts_sample_old != 0) { > - if (add_ctts_entry(&msc->ctts_data, &msc->ctts_count, > - &msc->ctts_allocated_size, > - ctts_sample_old - > edit_list_start_ctts_sample, > - > ctts_data_old[ctts_index_old].duration) > == -1) { > - av_log(mov->fc, AV_LOG_ERROR, "Cannot add CTTS > entry %"PRId64" - {%"PRId64", %d}\n", > - ctts_index_old, ctts_sample_old - > edit_list_start_ctts_sample, > - ctts_data_old[ctts_index_old].duration); > - break; > + if (ctts_data_old) { > + // If we have CTTS and this is the the first keyframe > after edit elist, > + // wait for one more, because there might be trailing > B-frames after this I-frame > + // that do belong to the edit. > + if (st->codecpar->codec_type != AVMEDIA_TYPE_AUDIO && > found_keyframe_after_edit == 0) { > + found_keyframe_after_edit = 1; > + continue; > + } > + if (ctts_sample_old != 0) { > + if (add_ctts_entry(&msc->ctts_data, > &msc->ctts_count, > + &msc->ctts_allocated_size, > + ctts_sample_old - > edit_list_start_ctts_sample, > + > ctts_data_old[ctts_index_old].duration) > == -1) { > + av_log(mov->fc, AV_LOG_ERROR, "Cannot add > CTTS entry %"PRId64" - {%"PRId64", %d}\n", > + ctts_index_old, ctts_sample_old - > edit_list_start_ctts_sample, > + ctts_data_old[ctts_index_old]. > duration); > + break; > + } > } > } > break; > diff --git a/tests/fate/mov.mak b/tests/fate/mov.mak > index 6815e4feca..e444b1459d 100644 > --- a/tests/fate/mov.mak > +++ b/tests/fate/mov.mak > @@ -9,6 +9,7 @@ FATE_MOV = fate-mov-3elist \ > fate-mov-invalid-elst-entry-count \ > fate-mov-gpmf-remux \ > fate-mov-440hz-10ms \ > + fate-mov-elst-ends-betn-b-and-i \ > > FATE_MOV_FFPROBE = fate-mov-aac-2048-priming \ > fate-mov-zombie \ > @@ -41,6 +42,9 @@ fate-mov-1elist-ends-last-bframe: CMD = framemd5 -i > $(TARGET_SAMPLES)/mov/mov-1e > # Makes sure that we handle timestamps of packets in case of multiple > edit lists with one of them ending on a B-frame correctly. > fate-mov-2elist-elist1-ends-bframe: CMD = framemd5 -i > $(TARGET_SAMPLES)/mov/mov-2elist-elist1-ends-bframe.mov > > +# Makes sure that if edit list ends on a B-frame but before the I-frame, > then we output the B-frame but discard the I-frame. > +fate-mov-elst-ends-betn-b-and-i: CMD = framemd5 -i > $(TARGET_SAMPLES)/mov/elst_ends_betn_b_and_i.mp4 > + > # Makes sure that we handle edit lists and start padding correctly. > fate-mov-440hz-10ms: CMD = framemd5 -i $(TARGET_SAMPLES)/mov/440hz- > 10ms.m4a > > -- > 2.15.0.403.gc27cc4dac6-goog > > _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel