From patchwork Tue Jan 2 10:28:25 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: 7076 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.2.79.195 with SMTP id r64csp14531525jad; Tue, 2 Jan 2018 02:36:26 -0800 (PST) X-Google-Smtp-Source: ACJfBouNJJDNJ6Z/18B71k7zyIO5MLiC4cTklK8AXRa5np+ok5eNJbicNTuOc9iUqkUvCyLAZrap X-Received: by 10.28.212.12 with SMTP id l12mr26134093wmg.66.1514889386299; Tue, 02 Jan 2018 02:36:26 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1514889386; cv=none; d=google.com; s=arc-20160816; b=qMtMaKSm8KK0ZWDI4w7WRnQ3pjARdRqqg2N/k7uuZZ/rhvy5F0Ss3nMRLdjJmEcwrK 7bynoKNN2IKdmzbgxEucjMWIdsuf5L3/FGLS1S4brKwVsooYuzSLYkXunj9j3lirJtoT /P5l1D83e2s+wiuBUxU1laPSr6V9URaUJC3v2W5s13DjbHnpoB54pqS106bvvcu4lSmR oNuG6QYYukizvy0FVznIUNB2JGCzPiS06dAgOYQBGb9q5udvTWgZsSKZQw3tbyllHlXu TMv8PYsgpqpyWpCAfe+y+Zh0u3bqgt4Wonec1qnqeTVSPSsASNQG+k5jQaGB6lACcBxZ 8fnw== 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=H451YClAlXxX4uPEKuyTplef36ekBG+8Gl4O5YAMULsbswFxeBo/bKKPJpQF4/YtXj htxOvrLfYigUaqDLUFEcSQyOcwOgFdr7aMZa7cc6GH9lMc/JMw1shy3MFuNTWMlLuLce j6bms/dQiQm8nGELN7dcNrkPe6Se9XF7j4FCy9I2kq3LXgm2q+w0+I0eAxAoz3sc2IG/ DPQPpEiTbyw/ushjdxdfIYfsfm22saYl3FTYWiaxgm0QLLqKcp/XVju9xnDS1/BbR+PB FEFdQ0oOYBMoyYwA94jIgZ50FGGT8Bg0Ek8/fZUTQzn7YinbsOhNaUQ66Yqkn6HUC3Lo AVkQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=ZnAsNgny; 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 b134si5821841wme.35.2018.01.02.02.36.24; Tue, 02 Jan 2018 02:36:26 -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=ZnAsNgny; 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 BE5B8680D52; Tue, 2 Jan 2018 12:36:07 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-pl0-f65.google.com (mail-pl0-f65.google.com [209.85.160.65]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 06BF3680CA1 for ; Tue, 2 Jan 2018 12:36:02 +0200 (EET) Received: by mail-pl0-f65.google.com with SMTP id d21so28426167pll.1 for ; Tue, 02 Jan 2018 02:36:18 -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=ZnAsNgnyjlg16Aa4QmiZYG0G6ybw2+X4pLmfLeLZXgjnApLksAPtrrxPLr0YNyAYFR Fd8InXlMZuSgndS5P/YgRMJK22slO3SVsaPtp9GUOa+UCkoY7wJZ6ZqZlszuOdkoO7vG LcZqFYpzKTi7+5O3EdbBt0SKCNEMWFSVf75t+PKJ59XJtSCHSfiWhNA85Am2s7Vm2/3q xnE6QKF2sUA6ohsEu+tUNvPkSMsll54lssHkba4SHBRad/8uLv+fpr83PDt+bYbYLBkC BUfAq+na9PGNwRcgv3CfCVnhX5dURlRE90xgCMNh1RWF03KnnQlGfhkOK5KK8Aa0t5/Q NpwQ== 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=C+bJMcfZNpm29MbWUcqDf9ew1Bic3sBzXcHveZkZL29Jd8xXuz5d6OVWUHxkTJ2GbW NQIpAeY9WBhyr/2+tKV97egeFeIIq4N38L2pHL4aESwDwWmP9kqidd8RT7EqRqlbJnPO YLfUX2iBP5PnqNK67KVYVccc2BB1EF9gKB6uB9fDtiTqavt4jucyUjHK6MHRSqIYfKwr 5h1vVP5T/CQhwoWRos5TXIT+BjSxaAgi1jQ/F/myiMEAM/O8DslaBkVsZAfLly8GIUhd Xz5CMuUgtlmBYrEJerCJuw/Y30rzl3HTC67F9WMk3wqI4t2mRaG0msGWMYJX6OAI4Z2g bUKA== X-Gm-Message-State: AKGB3mL9N9xXXc92R3xgL9YMDy7CNF9lwrUfSbxO1Yu2ZcDljgSjig/W 7JuqSEfnsQkGU2k0HO9AufvbYA== X-Received: by 10.84.130.109 with SMTP id 100mr46006353plc.329.1514889010235; Tue, 02 Jan 2018 02:30:10 -0800 (PST) Received: from localhost.localdomain (172.96.202.160.16clouds.com. [172.96.202.160]) by smtp.gmail.com with ESMTPSA id k2sm80714514pff.150.2018.01.02.02.30.09 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 02 Jan 2018 02:30:09 -0800 (PST) From: mymoeyard@gmail.com To: ffmpeg-devel@ffmpeg.org Date: Tue, 2 Jan 2018 05:28:25 -0500 Message-Id: <1514888905-30126-1-git-send-email-mymoeyard@gmail.com> X-Mailer: git-send-email 1.7.1 Subject: [FFmpeg-devel] [PATCH] 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;