mirror of
https://github.com/xenia-project/FFmpeg.git
synced 2024-11-28 05:50:43 +00:00
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:
parent
85af60df89
commit
bc50961731
@ -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
|
||||
|
||||
|
33
tests/ref/fate/mov-elst-ends-betn-b-and-i
Normal file
33
tests/ref/fate/mov-elst-ends-betn-b-and-i
Normal 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
|
Loading…
Reference in New Issue
Block a user