[FFmpeg-devel] [PATCH] lavf/mov.c: Parse upto 2 keyframes after the edit list end in mov_fix_index.
Sasi Inguva
isasi at google.com
Wed Nov 1 23:26:04 EET 2017
Forgot to attach the FATE ref file. sending the patch again.
On Wed, Nov 1, 2017 at 2:23 PM, Sasi Inguva <isasi at 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
>
>
More information about the ffmpeg-devel
mailing list