From patchwork Sat Feb 2 07:40:26 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Charles Liu X-Patchwork-Id: 11953 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 DF3AE446269 for ; Sat, 2 Feb 2019 09:46:01 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id BA64668A879; Sat, 2 Feb 2019 09:46:01 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-pl1-f196.google.com (mail-pl1-f196.google.com [209.85.214.196]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 2A8BB68A772 for ; Sat, 2 Feb 2019 09:45:55 +0200 (EET) Received: by mail-pl1-f196.google.com with SMTP id g9so4431096plo.3 for ; Fri, 01 Feb 2019 23:45:55 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=hC/Es8ew67Z7dTpDdKUW9RC49OYM7GeQafJ1iRcSCU4=; b=jLvqgDPUnrqMVG1vgxSljG1bFcz9xsgToKZA0dZao3lenxh88iSZ9Yzut8a0SrGAhr Mc7AwB594ZZ1CrlhoxsTpoUv1JeIGgXChwXaI4UwyNrOqmrHWQBU3AtExLP4szx7Hh50 2RMDgjVznSbyPI1jAZ7ofWtW4BSA1fw6FPD0yev/kiK7yt1JTNLgP+iOTWc8nuFRqTN9 LkDlC84C4CYllxjsG2ADhgDA+HEFwT3CqGn9eIdM7DV5BpuD6tcc9gHr/AtqbglELgLp deIw4Dv5U0cTezPUN63TO8vCb6OmZMrBSHCxoTGvgboZez3MiqaoZMxJfpa5Dz+2qREe 7M9Q== 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:mime-version :content-transfer-encoding; bh=hC/Es8ew67Z7dTpDdKUW9RC49OYM7GeQafJ1iRcSCU4=; b=V2gWZPsp9CvKDVDFUDutE4+s+YFwlXPRK0dOGyJOfdUgARoMdy5GR46RinCE4uqmaE Nlor32BCSfBlgn/BF8uC9kqYw002ytUQSaeFVr8NjDkLeAfHMovxEeyNOiXUNmwnrvW1 porN3M0ZbD5ZNIUmEt4HjawAWeV+TXdwEWKqNDvv5yqJvVdaAsLk77RhJsji1N0+OAS3 Yx6a12/kotcctdZrXqb8gUSWcbp5Hk5yIKfgw3V8VV/d7zLKrjFxgGEk2ka3ltIm+eUv qffmzWxSeMbXgz9yGR8CM9HVtGKE3g8vvb/YThKN7siiRoFmYeSKFJwxx3ThUsboizgv sDKw== X-Gm-Message-State: AHQUAuaHfQ73D+5tT2PKPvGxzEXJu+IdBvXwqH54HdmFR7EZtn8tF/SB xgB8mKtwt7qphWFuG3YUy0Ff13Lh X-Google-Smtp-Source: AHgI3IbDF1hlwv3d2DdGb7mz+xPCD4rJXnQSyqC0ddSuvgAEEdGzZVVrIbddLRbQ3WVYV16eRsMh3g== X-Received: by 2002:a17:902:33c2:: with SMTP id b60mr3998274plc.211.1549093241294; Fri, 01 Feb 2019 23:40:41 -0800 (PST) Received: from localhost.localdomain (69-172-67-074.static.imsbiz.com. [69.172.67.74]) by smtp.gmail.com with ESMTPSA id d25sm18388473pfe.40.2019.02.01.23.40.38 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Fri, 01 Feb 2019 23:40:40 -0800 (PST) From: Charles Liu To: ffmpeg-devel@ffmpeg.org Date: Sat, 2 Feb 2019 15:40:26 +0800 Message-Id: <20190202074026.27434-1-liuchh83@gmail.com> X-Mailer: git-send-email 2.20.1 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH] lavf/mov: fix hang while seek on a kind of fragmented mp4. 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: Charles Liu Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Binary searching would hang if the fragment items do NOT have timestamp for the specified stream. For example, a fmp4 consists of separated 'moof' boxes for each track, and separated 'sidx' for each segment, but no 'mfra' box. Then every fragment item only have the timestamp for one of its tracks. Signed-off-by: Charles Liu --- libavformat/mov.c | 21 +++++++++------------ 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/libavformat/mov.c b/libavformat/mov.c index 9b9739f788..ce1130ad07 100644 --- a/libavformat/mov.c +++ b/libavformat/mov.c @@ -1266,9 +1266,8 @@ static int64_t get_frag_time(MOVFragmentIndex *frag_index, static int search_frag_timestamp(MOVFragmentIndex *frag_index, AVStream *st, int64_t timestamp) { - int a, b, m; int64_t frag_time; - int id = -1; + int i, frag = 0, id = -1; if (st) { // If the stream is referenced by any sidx, limit the search @@ -1278,20 +1277,18 @@ static int search_frag_timestamp(MOVFragmentIndex *frag_index, id = st->id; } - a = -1; - b = frag_index->nb_items; - - while (b - a > 1) { - m = (a + b) >> 1; - frag_time = get_frag_time(frag_index, m, id); + for (i = 0; i < frag_index->nb_items; i++) { + frag_time = get_frag_time(frag_index, i, id); if (frag_time != AV_NOPTS_VALUE) { - if (frag_time >= timestamp) - b = m; if (frag_time <= timestamp) - a = m; + frag = i; + else { + break; + } } } - return a; + + return frag; } static int update_frag_index(MOVContext *c, int64_t offset)