From patchwork Wed Jan 3 03:44:09 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: mymoeyard@gmail.com X-Patchwork-Id: 7096 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.2.79.195 with SMTP id r64csp15430593jad; Tue, 2 Jan 2018 19:53:15 -0800 (PST) X-Google-Smtp-Source: ACJfBosG4Sb5hsR1md8Vpxzg/vUA1iUGcZN7xTYDZSa6sTUNO9X8gUlaLrsZ9HHOcN8WDo3S6BSW X-Received: by 10.223.132.163 with SMTP id 32mr148565wrg.283.1514951595023; Tue, 02 Jan 2018 19:53:15 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1514951594; cv=none; d=google.com; s=arc-20160816; b=n9JqfY+gGtdVVZeEsVnqdOxJT/SDEBuA/bHHNsY7ZMV3QMzZTgmUMiw3Tu8294MT61 R/dLnU0Q78ozZdqqTqwrjawN86XoOKXvy7dKJTx4aQtLDbdJ4yprgByUfBkNN89/EnkZ 3OTTkdFrXscQy16QRbDrpwUAwk1cAnW8tANy3z/qygg10xbJ5T3NkvRrWZFdEiEIdROP 9grsAgzMLmLmQHqDdsLNee/T1NmJArEGRyjJJHzTpWKli0m2ZpB2MbmsK2LrUPoRuScE cNwpihEstxfL/C/9+b+txSIPoda/0xNF5OJ53XQlOypvSknV/hFCswWnKkXfjuPwZA8w DcDw== 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=k/li/cgcjIme8E0hoEymPFxuWNRbdseYHbzWy7z/uMM=; b=W/9khUUi3JUbIIhfaRXT96i3noK07eNHRq4vEsiWLWbPyChak+21ig0JlKAgB9l595 Sqr0RBUnEYrtBuipEJB6kVCyyq0h199+TJRQA8QwtWkkxW6LRwt/A4q1QLUy7h0DeBdz TilEVahys2I532KJ9GpKtPyhiNNCUd8MM6mbZfZECkOA5r9nCFYTdxxEjbNkkkG529g4 ulPUUQpcx1O4U6ADNwZOht4rsGDe+KrQ5ee6sCg0PruMQOvqSgvtO6fPl2NzExqrLnRI 7aX9WG+L3CWFn+x1N0iKXtfCfHNkm14Bni5qnh5NuKnGwQdu+Pfiruojo9aH/mExDFfu Xhxg== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=tfDw56Ng; 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; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=gmail.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id t7si226712wmd.261.2018.01.02.19.53.14; Tue, 02 Jan 2018 19:53:14 -0800 (PST) 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=@gmail.com header.s=20161025 header.b=tfDw56Ng; 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; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=gmail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 4F9446882D5; Wed, 3 Jan 2018 05:52:57 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-pg0-f67.google.com (mail-pg0-f67.google.com [74.125.83.67]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 126416882D3 for ; Wed, 3 Jan 2018 05:52:50 +0200 (EET) Received: by mail-pg0-f67.google.com with SMTP id o13so249644pgp.4 for ; Tue, 02 Jan 2018 19:53:06 -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; bh=dVF08jSEmSjQPjTeofxCxWM9eDEIJmuwpcuDRxE8Zjg=; b=tfDw56NgZcH101qe4C7dtTmf2Ied1kaQ6bGYZw+ATcksn7zt33TfJacGy6DbqNEVHW KVyV43/JLfICdPXWeaxM6cWipKhvlJNHdQNugtB1D8ER3TXhKIJCTO8gAMy2eFFQiRoM anPj+pLleJo0xMdnTP8TyviVhMPKkW+S+reTMfo8MSElxi6MIwm4cIVF9Q4NeQO2aXCY ihfydfD1E8BWCyElU4K5+6i0pRaVL8pZOLfV6Nf2Z/VrLuT3C4NbxIhV9ZQDSOu9CmV9 Q4LAaP/haDl2qCUJecwQkpJJOw73xOBboOQu6NcrgbTx1vXI9C1Id10IR/5MtVsAor86 Qcuw== 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=dVF08jSEmSjQPjTeofxCxWM9eDEIJmuwpcuDRxE8Zjg=; b=lc8cQjvv4g7tDWx7kv2mSfiFa3SjKFllK17Hcu/HzTMDSLsCM6OngVxd5WIS/WnMuR CBEbB23+t9gd54x//Mb0pJbdoIu0Rk8xpPnpvOQRFLDpOd1k3KasEXGWzU0ppbC4N36f kRwrbBGke0suNx01DhDvyrnkfrSp1qE5HjgWZYz7zPlTRj97AT4oMZsg8a+4x2G4zWZO eROAJEY2ZilLva5S9ppdzulsg4YOuxlV5ARg1Bg6eFVI2i8tkvYOI8coK5nya+Jt12c/ u3XR4z4f4bqdm0r4BrL+Q1ccr+UTtsPsUWkfYqe1US38L6LM97W1C8INLstcE0KmUJA7 tt7Q== X-Gm-Message-State: AKGB3mIxgTFPeUCG9V3BYHMg2w2hH/EcY+FC/GB2QlY7Qf3qWk8EmVBs EOjxtIjIKsZcvg7BLa852Bo3jA== X-Received: by 10.99.165.80 with SMTP id r16mr145500pgu.327.1514951155451; Tue, 02 Jan 2018 19:45:55 -0800 (PST) Received: from localhost.localdomain (172.96.202.160.16clouds.com. [172.96.202.160]) by smtp.gmail.com with ESMTPSA id e187sm251899pfg.23.2018.01.02.19.45.54 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 02 Jan 2018 19:45:54 -0800 (PST) From: mymoeyard@gmail.com To: ffmpeg-devel@ffmpeg.org Date: Tue, 2 Jan 2018 22:44:09 -0500 Message-Id: <1514951049-9330-1-git-send-email-mymoeyard@gmail.com> X-Mailer: git-send-email 1.7.1 Subject: [FFmpeg-devel] [PATCH v2, 1/2] avformat/hls: fix seek accuracy problem 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: Wu Zhiqiang MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" From: Wu Zhiqiang HLS demuxer seeking use dts instead of pts. Demuxer skip some frame when dts is before pts in special case. And it is impossible to re-seek back to start time after playing. --- libavformat/hls.c | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/libavformat/hls.c b/libavformat/hls.c index 950cc4c3bd..069e7b06e9 100644 --- a/libavformat/hls.c +++ b/libavformat/hls.c @@ -2086,6 +2086,7 @@ static int hls_read_packet(AVFormatContext *s, AVPacket *pkt) * stream */ if (pls->needed && !pls->pkt.data) { while (1) { + int64_t pkt_ts; int64_t ts_diff; AVRational tb; ret = av_read_frame(pls->ctx, &pls->pkt); @@ -2101,9 +2102,17 @@ static int hls_read_packet(AVFormatContext *s, AVPacket *pkt) fill_timing_for_id3_timestamped_stream(pls); } + if (pls->pkt.pts != AV_NOPTS_VALUE) + pkt_ts = pls->pkt.pts; + else if (pls->pkt.dts != AV_NOPTS_VALUE) + pkt_ts = pls->pkt.dts; + else + pkt_ts = AV_NOPTS_VALUE; + + if (c->first_timestamp == AV_NOPTS_VALUE && - pls->pkt.dts != AV_NOPTS_VALUE) - c->first_timestamp = av_rescale_q(pls->pkt.dts, + pkt_ts != AV_NOPTS_VALUE) + c->first_timestamp = av_rescale_q(pkt_ts, get_timebase(pls), AV_TIME_BASE_Q); } @@ -2113,15 +2122,16 @@ static int hls_read_packet(AVFormatContext *s, AVPacket *pkt) if (pls->seek_stream_index < 0 || pls->seek_stream_index == pls->pkt.stream_index) { - if (pls->pkt.dts == AV_NOPTS_VALUE) { + if (pkt_ts == AV_NOPTS_VALUE) { pls->seek_timestamp = AV_NOPTS_VALUE; break; } tb = get_timebase(pls); - ts_diff = av_rescale_rnd(pls->pkt.dts, AV_TIME_BASE, + ts_diff = av_rescale_rnd(pkt_ts, AV_TIME_BASE, tb.den, AV_ROUND_DOWN) - pls->seek_timestamp; + if (ts_diff >= 0 && (pls->seek_flags & AVSEEK_FLAG_ANY || pls->pkt.flags & AV_PKT_FLAG_KEY)) { pls->seek_timestamp = AV_NOPTS_VALUE;