lavf/mov.c: Parse upto 2 keyframes after the edit list end in mov_fix_index.

Partially fixes t/6699.

Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
pull/272/head
Sasi Inguva 7 years ago committed by Michael Niedermayer
parent 85af60df89
commit bc50961731
  1. 32
      libavformat/mov.c
  2. 4
      tests/fate/mov.mak
  3. 33
      tests/ref/fate/mov-elst-ends-betn-b-and-i

@ -3298,6 +3298,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;
@ -3393,6 +3394,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) ?
@ -3505,18 +3507,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;

@ -10,6 +10,7 @@ FATE_MOV = fate-mov-3elist \
fate-mov-gpmf-remux \
fate-mov-440hz-10ms \
fate-mov-ibi-elst-starts-b \
fate-mov-elst-ends-betn-b-and-i \
FATE_MOV_FFPROBE = fate-mov-aac-2048-priming \
fate-mov-zombie \
@ -42,6 +43,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

@ -0,0 +1,33 @@
#format: frame checksums
#version: 2
#hash: MD5
#tb 0: 1/25
#media_type 0: video
#codec_id 0: rawvideo
#dimensions 0: 320x240
#sar 0: 1/1
#stream#, dts, pts, duration, size, hash
0, 0, 0, 1, 115200, e10741e5457e9326d5e992e6c05c3e32
0, 1, 1, 1, 115200, 7e20f8729b6b53dc11791927bf4a5aec
0, 2, 2, 1, 115200, 4e5dc2b806e394cd666c968f736fecd0
0, 3, 3, 1, 115200, 7a3c7473d44c5f60c07655f6fc0c2ac3
0, 4, 4, 1, 115200, 038254422a603a3270c09cdcd149707b
0, 5, 5, 1, 115200, 7553b6b4547cb23ef8f0392ed5a5d4b0
0, 6, 6, 1, 115200, 6d017ede7f446124af7308667cb0dc41
0, 7, 7, 1, 115200, 77752f0288ae64f857732b8e62e47457
0, 8, 8, 1, 115200, d656833951af99330625f7c6de7685c4
0, 9, 9, 1, 115200, 14338b833e431e566ac98da841600bfe
0, 10, 10, 1, 115200, 07ea95d1659f3c4424a470a546d0df6e
0, 11, 11, 1, 115200, fd05b8cc83072f813e89d394d1f6efc6
0, 12, 12, 1, 115200, 750b82ca5c7e901545e7b1aa69692426
0, 13, 13, 1, 115200, 7347679ab09bc936047368b8caebcaff
0, 14, 14, 1, 115200, 63a23fdd57ac8462b9ffbcb12ab717b3
0, 15, 15, 1, 115200, 705257a1c99693db233e2a3ee027adcf
0, 16, 16, 1, 115200, df861a2ec7a4ef70e82b1c28025e5a48
0, 17, 17, 1, 115200, 2a8b403c077b6b43aa71eaf7d1537713
0, 18, 18, 1, 115200, 973b5cd3ce473e3970dfa96045553172
0, 19, 19, 1, 115200, fc612c0afeae3b6576b5ee2f3f119832
0, 20, 20, 1, 115200, 97074fe5a0b6e7e8470729654092e56c
0, 21, 21, 1, 115200, 8cf9337201065335b3aa4da21dc9b37a
0, 22, 22, 1, 115200, 93ff3589294cc0673af3daee1e7fe42a
0, 23, 23, 1, 115200, c0b6fd870a022f374f9d6c697e8e293d
Loading…
Cancel
Save