From patchwork Sun Feb 3 15:09:06 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Charles Liu X-Patchwork-Id: 11961 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 1CAFE44750E for ; Sun, 3 Feb 2019 17:15:39 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id F182868A98A; Sun, 3 Feb 2019 17:15:38 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-pf1-f195.google.com (mail-pf1-f195.google.com [209.85.210.195]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 17C2668A90D for ; Sun, 3 Feb 2019 17:15:32 +0200 (EET) Received: by mail-pf1-f195.google.com with SMTP id z9so5604600pfi.2 for ; Sun, 03 Feb 2019 07:15:32 -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=nqie8WeTgPWxPlQ0AWJ06fQsnDxtKtdAYUxoZBZaKww=; b=ZSaiCQvr/i00ZWBJsl6ZxWuK2VeHE852Bc35pEsYaBxWE1RUKG8JdbOTG7b7z6pH0g 6xI0dzK27HlCKrbRkF9+aGhPjrBg/Qn2ycNW8bEwZVXprtO/AyEyU8Cd0JDeVtE3kFho TxZT3pOJAbCJoKdqFAxlTMsyw9q1Xi7ii/zfpZbF79JOtu7yFqIkJAf2J5nmDvkLPgDS ICd3wMpXMJmLArY+y66WXNcAoWe6o0alq6ndXdpnliLIxirCd4gF08yGqbGagcPYB30o Uz4lsGo+iQ1W7Zypr1I8abISvasP04eda8T3c/Dnes6sb+h4DQ83MeOrV/6/zI9X2vAz cxVw== 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=nqie8WeTgPWxPlQ0AWJ06fQsnDxtKtdAYUxoZBZaKww=; b=ZEvljg9fgnj3TAL/DFFCnRMCxJl7l6qrSq0LSIzvH+pjwjzwItsBUPmmMjDGeYX7+G UvHJLYh8gniWL+7QqSnPLbgfTqZ2wMFp0EJy29ClZkSpiXx0bfVwZl0nLqpLfvpw9x5p SN180JU0b4wSjbGOKoS1VpYrQ598ZtdupqQaWfBsUUkX6bvrKsm46o5vQLKG6tuzD0M8 78BzaebHgW0pfLl4ssMDkJY9FcEna7eh+pl+YnYa2FOGfdq4YYV/mjPuB2YV/1k9S8Nr gfqjpDHIZeJ8awVX8BGVlWQBAU5KGIe9fcezqLwTVj9dJwyr3kCeVzPA38Bw0ocymkqv t+BA== X-Gm-Message-State: AJcUukfDR4GHw1jsnRQVRt0ERcTgZ+TK76dMtJgeR57tGkPK5uRRayGy 2N7DxJCAjw+B4ON11x+uozzh/dy29XM= X-Google-Smtp-Source: ALg8bN5utgsxEGvG84ymtqgLYMOIeV36K2pFi0UCCQEWXh6p8gyrTf46pQKdph7CzB9ApGIxD8t5lg== X-Received: by 2002:a62:5b83:: with SMTP id p125mr47892335pfb.116.1549206562237; Sun, 03 Feb 2019 07:09:22 -0800 (PST) Received: from localhost.localdomain ([138.91.24.251]) by smtp.gmail.com with ESMTPSA id i8sm7460013pfj.18.2019.02.03.07.09.19 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Sun, 03 Feb 2019 07:09:21 -0800 (PST) From: Charles Liu To: ffmpeg-devel@ffmpeg.org Date: Sun, 3 Feb 2019 23:09:06 +0800 Message-Id: <20190203150906.6632-1-liuchh83@gmail.com> X-Mailer: git-send-email 2.20.1 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH] avformat/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, 12 insertions(+), 9 deletions(-) diff --git a/libavformat/mov.c b/libavformat/mov.c index 9b9739f788..35cb619e9f 100644 --- a/libavformat/mov.c +++ b/libavformat/mov.c @@ -1266,7 +1266,7 @@ 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; + int a, b, m, m0; int64_t frag_time; int id = -1; @@ -1282,15 +1282,18 @@ static int search_frag_timestamp(MOVFragmentIndex *frag_index, b = frag_index->nb_items; while (b - a > 1) { - m = (a + b) >> 1; - frag_time = get_frag_time(frag_index, m, id); - if (frag_time != AV_NOPTS_VALUE) { - if (frag_time >= timestamp) - b = m; - if (frag_time <= timestamp) - a = m; - } + m0 = m = (a + b) >> 1; + + while (m < b && + (frag_time = get_frag_time(frag_index, m, id)) == AV_NOPTS_VALUE) + m++; + + if (m < b && frag_time <= timestamp) + a = m; + else + b = m0; } + return a; }