From patchwork Wed Nov 1 21:23:32 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sasi Inguva X-Patchwork-Id: 5825 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.2.161.90 with SMTP id m26csp1278699jah; Wed, 1 Nov 2017 14:50:41 -0700 (PDT) X-Google-Smtp-Source: ABhQp+T0EmbKibpwt7GkUhitQWE5/V0UvUhLOXLJr7Fg4xB8F/Pbivvih1e5UerPsh3e0jk3UGbs X-Received: by 10.28.236.216 with SMTP id h85mr1331165wmi.100.1509573041388; Wed, 01 Nov 2017 14:50:41 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1509573041; cv=none; d=google.com; s=arc-20160816; b=1BW1XmhsU0vgE6/a9e12W38d83LEBLbtBb2yZoHR7E1j5z584WAisRPz2QKj3vPcRt 4rDUUK/4Eu2vNcrgcINCIeydzdbVYM8zVW+UrUYamKiJ289qUNtlnGAccsXDayOHE4nM RNFx8ZMy4hOIhZj7CLlOQY0e00Asm1is9P52XvhihD6GLpwFbTSpI9Z8AnHR9vXDafn0 po1BXhraCKpxetoLqA5x0svJaCpu8zbopbW/lkbWYkZK4eLAyGayiQ47vYVew2uQpZkN OoHScDPBpRer0z0Vc6hgEXN7T25UpOgmn0VfYd9/tYvt1oSzCFFstpc7ZMN0ia4gNVtu HwSw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:mime-version:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:message-id:date:to:from:dkim-signature :delivered-to:arc-authentication-results; bh=VHUVZbhFuy+QbeSyDgoZFTxlqsyG4mevVA5foXAYgKU=; b=Go9+0g9nAjDas+tyKjBQ+TmKjySfcFxfCf8o+n9a6JBd0EC4bQLZI4M9Wr1pRiimEV nDnaUo6qMSXhQZry2nlE3edl97rx91FjpDJv/MisaBH0EGHH08PNv9Rhyt+4lMVPtcIt HO+HlcLRMv/PDBccoI3Q3kezgZDRV0z17+aKORfXeV0eMQb0p/7HKBCqdvDZZeNM19JB HG7ZP+IUreUYf0k9AoWsZP/LDV2Br0zjRkHvX4BtSn6JZetST7auicDgGJ5xANgywmnB bhInDsUaWExuNrBpLhgvvNBPRzzIhOACVHO/BW1S18WWWbNVGPrHaH9C4SiNbihPNbZe oO6g== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@google.com header.s=20161025 header.b=XMZAmB54; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id d9si1451883wrh.118.2017.11.01.14.50.41; Wed, 01 Nov 2017 14:50:41 -0700 (PDT) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@google.com header.s=20161025 header.b=XMZAmB54; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 5B32F68A12E; Wed, 1 Nov 2017 23:50:29 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-pf0-f195.google.com (mail-pf0-f195.google.com [209.85.192.195]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id CFEB0689DFE for ; Wed, 1 Nov 2017 23:50:22 +0200 (EET) Received: by mail-pf0-f195.google.com with SMTP id z11so2955334pfk.4 for ; Wed, 01 Nov 2017 14:50:33 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=from:to:cc:subject:date:message-id; bh=wf0ey3mgwHoZOWtN9+XNzV8oyzyi73NL2geHUppbqFc=; b=XMZAmB54BO+AF7TzfAn34lJAlIfsE5BAFdglHiztjImyICb4tXghn3ryhCovK1GVCb oYXrvURIPVUthWQJ8wdi75/CBDo+ved6uevvEa8Bd8yU2X3EbpjwBvEFH8waTcrvlLTE T/NAj+dmQt0oJp6s3htVFgonj2/OuwJU3h83lw/OZk8xHGctbx13P9PGXaY+jgOzKXtD LdSTxPEMqXmzIwbWFesRYwl/rxdASAUtENjNdBZ+WayZqBGImxPEUFug9ZWksf2S74Bc fG+yccntuOpF43fX4MRoc42Co8MhNmBnyuE/LbPZWXKWgv/nx98zQewA1C/66DhlTMTe VkHA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=wf0ey3mgwHoZOWtN9+XNzV8oyzyi73NL2geHUppbqFc=; b=cAFmlEI6MC+nGQm50wYOVUqoyoLCl/jMuVJsR9aIB5dmOdcqPTal3U9aaELw7YycrK MdhOYyO5Sl2TpBNis/tFlESsyko+pVG6MAAENHVTvFYnCmA0KCDQS+j7g+O1Y0RnKKYJ I1FBBWnRP3a9jrHZ/MzNTnaSq9TSpirBpxLqwk3JqVGC/4+qqeznfkAi4uzRGKoH96gD jP+yUrvHdx0zN2aQ6g9dXpA5tdwXoAbOUrX/fq/3/L1i0VbngPEHdbRgSmvTb3zWyFAi kCrRO4JAR1bRwdAiphkBUHckH5axlIsliO3SD0dtXY3jQLzmdIIB/sNljd+0vD6EPm6o qSMA== X-Gm-Message-State: AMCzsaXRnroLIyxEdATyril0fm71IckD7rioYJXPjq6iScpIBnn2O7dH 7Wd7zLapuY4VIolcXPPHpcNdKQWmy4k= X-Received: by 10.98.79.80 with SMTP id d77mr1241533pfb.238.1509571445432; Wed, 01 Nov 2017 14:24:05 -0700 (PDT) Received: from isasi.mtv.corp.google.com ([172.27.82.28]) by smtp.gmail.com with ESMTPSA id y197sm2573586pfg.103.2017.11.01.14.24.04 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 01 Nov 2017 14:24:04 -0700 (PDT) From: Sasi Inguva To: ffmpeg-devel@ffmpeg.org Date: Wed, 1 Nov 2017 14:23:32 -0700 Message-Id: <20171101212332.11664-1-isasi@google.com> X-Mailer: git-send-email 2.15.0.403.gc27cc4dac6-goog Subject: [FFmpeg-devel] [PATCH] lavf/mov.c: Parse upto 2 keyframes after the edit list end in mov_fix_index. X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Cc: Sasi Inguva MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" 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