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>
This commit is contained in:
Sasi Inguva 2017-11-09 16:11:22 -08:00 committed by Michael Niedermayer
parent 85af60df89
commit bc50961731
3 changed files with 58 additions and 11 deletions

View File

@ -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;

View File

@ -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

View File

@ -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