From patchwork Tue Sep 1 15:03:34 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Derek Buitenhuis X-Patchwork-Id: 22050 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id 6A52D449EA5 for ; Tue, 1 Sep 2020 18:12:13 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 4F19968AD4C; Tue, 1 Sep 2020 18:12:13 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wm1-f66.google.com (mail-wm1-f66.google.com [209.85.128.66]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id E163368AD1A for ; Tue, 1 Sep 2020 18:12:06 +0300 (EEST) Received: by mail-wm1-f66.google.com with SMTP id o21so1542961wmc.0 for ; Tue, 01 Sep 2020 08:12:06 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=D7jzkJ+h8JsR5zuKxNiVLjZ+IzHltnGYcK5KKCRVt9U=; b=n8TYRrbW8mXBqOxAiHSEi/DWXibYJi9F4xfn47LN/dc+BifREAew/iSRVA13cMyMKa mSS9sRCAFN85SHnYuNC6RGVdMktVuMTld8Dzsu8MZNEoRTuD+YDiG6cHai4afXao6DVo CbWnv3OQiLLLm1q0SDQR/lxMhM2+vlHswYEdAdRWL/yOEFcjMdN2vtdi3iiqFgrDNmpD RqrjH1MxcEz3d4BZd259T7f2pQx9y/OhDHKB0HyY9L4N19zifVI4Moi06zmcDOiLzvFK weKCJcS8QEx3AAi5d3vFSEsYsYMj436l1kY0PY414igAMZcXSmRDtrqvVaZVTfNP33nC BeKg== 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:in-reply-to :references:mime-version:content-transfer-encoding; bh=D7jzkJ+h8JsR5zuKxNiVLjZ+IzHltnGYcK5KKCRVt9U=; b=KyR77y8ZxpRS0lMYMX9rNd/z4WmSAglgGWx4RJ0hCx3mU6eSWBy1jqVVPJKL2jQ03/ Pa1IZjujm6b/5yJBaiyGuebEEs2sNSbueawUe12upvLsVrwFALkM+MZ5ThvwOEpE7jy7 9DFl+MRNTVplkm6vyYf4WVvEaswpS/00cNtZO7Vl+TRMSrh9kcw0Q0M0e2ZSHfvpGDtP nhz+UFBDG6AwHsHCC+d61VM91BGccMd5kB3/M4pNXVDZgQBYHNoiRaxGaM4Zj4mnK/Ji I6gqPYQp0WFs9SnObihB7y2gSZTl+4+o6sF0a/tX9TUnf7FuwXUHA2lZ91kM2hhhMtjm 7eig== X-Gm-Message-State: AOAM532JXXBgKcwDBF7QVkImrTB+T2vWQqVKSZ19xHLFaD7zTwQPNSYn DkH8SbcRXXT6MhmnuAVlcTER6QTa8p4= X-Google-Smtp-Source: ABdhPJxCA27U7tQJhQj7YtvBJrxeCQOs7LGhXqRUjx8W0UPfZFF03Dk3tuiQlKHxwBb6gviUwa9hcQ== X-Received: by 2002:a1c:ed16:: with SMTP id l22mr2083635wmh.80.1598972629692; Tue, 01 Sep 2020 08:03:49 -0700 (PDT) Received: from localhost.localdomain ([81.2.169.31]) by smtp.gmail.com with ESMTPSA id l18sm2655252wrm.52.2020.09.01.08.03.48 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 01 Sep 2020 08:03:48 -0700 (PDT) From: Derek Buitenhuis To: ffmpeg-devel@ffmpeg.org Date: Tue, 1 Sep 2020 16:03:34 +0100 Message-Id: <20200901150335.103855-3-derek.buitenhuis@gmail.com> X-Mailer: git-send-email 2.28.0 In-Reply-To: <20200901150335.103855-1-derek.buitenhuis@gmail.com> References: <20200901150335.103855-1-derek.buitenhuis@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 3/4] avformat/mov: Only read the mfra size once during sidx parsing 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: dalecurtis@chromium.org Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" On files with more than one sidx box, like live fragmented MP4 files, it was previously re-reading and seeking on every singl sidx box, leading to extremely poor performance on larger files, especially over the network. Only do it on the first one, and stash its result. Signed-off-by: Derek Buitenhuis --- libavformat/isom.h | 2 ++ libavformat/mov.c | 16 +++++++++------- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/libavformat/isom.h b/libavformat/isom.h index 41a9c64c11..78495fd336 100644 --- a/libavformat/isom.h +++ b/libavformat/isom.h @@ -291,6 +291,8 @@ typedef struct MOVContext { int decryption_key_len; int enable_drefs; int32_t movie_display_matrix[3][3]; ///< display matrix from mvhd + int have_read_mfra_size; + uint32_t mfra_size; } MOVContext; int ff_mp4_read_descr_len(AVIOContext *pb); diff --git a/libavformat/mov.c b/libavformat/mov.c index 49c2d05d21..e33031f158 100644 --- a/libavformat/mov.c +++ b/libavformat/mov.c @@ -5097,14 +5097,16 @@ static int mov_read_sidx(MOVContext *c, AVIOContext *pb, MOVAtom atom) if (!is_complete && (pb->seekable & AVIO_SEEKABLE_NORMAL)) { int64_t ret; int64_t original_pos = avio_tell(pb); - int32_t mfra_size; - if ((ret = avio_seek(pb, stream_size - 4, SEEK_SET)) < 0) - return ret; - mfra_size = avio_rb32(pb); - if (offset + mfra_size == stream_size) + if (!c->have_read_mfra_size) { + if ((ret = avio_seek(pb, stream_size - 4, SEEK_SET)) < 0) + return ret; + c->mfra_size = avio_rb32(pb); + c->have_read_mfra_size = 1; + if ((ret = avio_seek(pb, original_pos, SEEK_SET)) < 0) + return ret; + } + if (offset + c->mfra_size == stream_size) is_complete = 1; - if ((ret = avio_seek(pb, original_pos, SEEK_SET)) < 0) - return ret; } if (is_complete) {