From patchwork Wed Jan 24 07:08:22 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: wm4 X-Patchwork-Id: 7409 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.2.156.27 with SMTP id q27csp413436jak; Tue, 23 Jan 2018 23:08:27 -0800 (PST) X-Google-Smtp-Source: AH8x227FGWQbXaGM99dlnU+YpJPVSMP/E8Y0TcMcSJjkxW5BQD7N0q0Do4e2Vw2wahy89UW/CKIU X-Received: by 10.223.159.3 with SMTP id l3mr4377524wrf.199.1516777707430; Tue, 23 Jan 2018 23:08:27 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1516777707; cv=none; d=google.com; s=arc-20160816; b=f+L3odn7t6BLhOchAjrVIEEuN5qZfUe6MllnnNWK9Ff2VHFV6XSyJ8BKNV/0TzXbJV JjQxG78OTTQVrfSK8JcQofGyjgE7tg/YovuSnEDttjeQtiSYMvHJ5TP8H9LC5NQOQokY BH7AnNG2MJAWBQGAcIurUDlMrGF5TCKsd+kPBZIrK4GGkGYvPRx4gJGZ1BQvo6lJae/J 1uSe7MxYplHnBzOTTjlchhvnNOSdEXMYpPbLjCZT0zCtPahNxDL5ZFxjVQ4ebcHtdRIv DkPpjjpL77xJdjVB41kiJ1IkQOoKofzOziUpg1MASSI0ZuU2dlvFHs8GEytBzPzgs7V5 Bjsw== 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:references:in-reply-to:message-id:date :to:from:dkim-signature:delivered-to:arc-authentication-results; bh=H4H2BsKxT0NbxkrWOA5pI67W/KJD3ZQZwPOcBI1hdT4=; b=CEKjHedZ2ZFY6vMl4BHZhhubH3HrryG1+xyaenwoMSMQ6NUpWeC86MyaretBY2iZCb 62GnPQBSmQlESGWcB50gVg/dGavVoP8GQSFZSoxW9YGi/mBSUPCWvNuuJ3cwCc24c1e6 uCLt6J7ZnzNXvKun/M628jnwvEN0oNB1tHKxtmNVpzrT/lqd/iHyuR++v6qHfPZAO3Bt ZI0D0EY9eOfjILpmtE4L70pUfJ4Podkgfws7eRC5PE4wa4E4lmrUuoA2M4YWdQ8R1Rlb uzh7qM6tBx5KECRez++SX2KmY+tfgm0/hJktM//KcuZXUPUDMqT7yeYOS6Pfo+wJelRY wbeA== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@googlemail.com header.s=20161025 header.b=Kt6cYtJ0; 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=QUARANTINE sp=QUARANTINE dis=NONE) header.from=googlemail.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id i28si1405846wrf.525.2018.01.23.23.08.27; Tue, 23 Jan 2018 23:08:27 -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=@googlemail.com header.s=20161025 header.b=Kt6cYtJ0; 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=QUARANTINE sp=QUARANTINE dis=NONE) header.from=googlemail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id A8288689B3A; Wed, 24 Jan 2018 09:08:16 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wm0-f65.google.com (mail-wm0-f65.google.com [74.125.82.65]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 1DEE3689AAC for ; Wed, 24 Jan 2018 09:08:10 +0200 (EET) Received: by mail-wm0-f65.google.com with SMTP id x4so25144355wmc.0 for ; Tue, 23 Jan 2018 23:08:12 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=googlemail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=163M0xvs49SeHuo3oUiqmjj5/IMiUDqILXLBYI35uwA=; b=Kt6cYtJ0GLSO7iQOhc+wgEq5b6m2U3kLCFoDLKZEYECVKdN769z9GCxs4VCtF7ulqc dxSNnGZ8jHoZf0h9rp1W7eK5jhy5B07kFgkfvieuCmaFY4C4W03Ba9cNrYAM9xz8mXKc V3vanRMsDuuvIxes4Cz8ixiX6QWl6XPlnw3or/9QGyRtzxM//8NFj5PZCLGr2mBBug/1 lHnwJwn1FU8cKXeSgKDhqoFJEVddkto81j8OxFZcfHs9H5y9z3ULYr888O/UMyOVJkzH +MOCA5YqkOR2hPGagIJugh7CRKUBiScP8/YXypTPnGtRSb3ULgK4JlwgbB1/V3Kq6SLE Z3WA== 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; bh=163M0xvs49SeHuo3oUiqmjj5/IMiUDqILXLBYI35uwA=; b=RWjvGeIhje/BKEQV2dZc89LeNtM+SapsFT+IIJspeaagbvy9ysQXMsX8a6HTgslfvr I+VkkKdAQFUKnVs5VGuUg4RkEMaKuxPpbJLqMLHJaGlNoy6acYQEa2FV+Vr6EgQ1mAwm UAMZ14uLvvwHv1Hvm9N3Z3sY2WuPS64sDKkTAWwuZ/oyicmpc8M0G67nIH36tNXYqv+7 PyOvFyqaDZ9polv4lfHDqnsKOUNj8/jjN/pKzji2Vo8F124cNKR13k+iREOMkNEFA0uy tW/j+w2bh8qKdR2Lt0K7li5VsMvcKE5tfgI+qlsduC9p4o8WTO16Q1MfApi4Gl0Yq6xI LjNg== X-Gm-Message-State: AKwxytfz3Z0rfvyDmuuCrvx5p3XQqeEl43y76koUa4ShJMLMJoELD99c cvHFBJSSUKej8bRK5f43w6zb/g== X-Received: by 10.80.212.154 with SMTP id s26mr22209758edi.268.1516777691846; Tue, 23 Jan 2018 23:08:11 -0800 (PST) Received: from debian.speedport.ip (p2003006CCD4EDC88CCA764404E41D15A.dip0.t-ipconnect.de. [2003:6c:cd4e:dc88:cca7:6440:4e41:d15a]) by smtp.googlemail.com with ESMTPSA id m15sm10517131edj.41.2018.01.23.23.08.10 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 23 Jan 2018 23:08:11 -0800 (PST) From: wm4 To: ffmpeg-devel@ffmpeg.org Date: Wed, 24 Jan 2018 08:08:22 +0100 Message-Id: <20180124070823.17373-2-nfxjfg@googlemail.com> X-Mailer: git-send-email 2.15.1 In-Reply-To: <20180124070823.17373-1-nfxjfg@googlemail.com> References: <20180124070823.17373-1-nfxjfg@googlemail.com> Subject: [FFmpeg-devel] [PATCH 2/3] avformat, hls: add a flag to signal unavailability of seeking 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: wm4 MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" The seek function can just return an error if seeking is unavailable, but often this is too late. Add a flag that signals that the stream is unseekable, and use it in HLS. --- Basically, this is equivalent to being a live stream. In theory, EVENT playlists can be live streams, but they have full retention of all segments, so the flag would not be set in that case. --- doc/APIchanges | 3 +++ libavformat/avformat.h | 5 +++++ libavformat/hls.c | 8 ++++++-- libavformat/version.h | 4 ++-- 4 files changed, 16 insertions(+), 4 deletions(-) diff --git a/doc/APIchanges b/doc/APIchanges index c27f104c95..59e3b20c08 100644 --- a/doc/APIchanges +++ b/doc/APIchanges @@ -15,6 +15,9 @@ libavutil: 2017-10-21 API changes, most recent first: +2018-01-xx - xxxxxxx - lavf 58.6.100 - avformat.h + Add AVFMTCTX_UNSEEKABLE (for HLS demuxer). + 2018-xx-xx - xxxxxxx - lavu 56.9.100 - aes_ctr.h Add method to set the 16-byte IV. diff --git a/libavformat/avformat.h b/libavformat/avformat.h index e5740be2b4..60ab9fbc80 100644 --- a/libavformat/avformat.h +++ b/libavformat/avformat.h @@ -1275,6 +1275,11 @@ typedef struct AVProgram { #define AVFMTCTX_NOHEADER 0x0001 /**< signal that no header is present (streams are added dynamically) */ +#define AVFMTCTX_UNSEEKABLE 0x0002 /**< signal that the stream is definitely + not seekable, and attempts to call the + seek function will fail. For some + network protocols (e.g. HLS), this can + change dynamically at runtime. */ typedef struct AVChapter { int id; ///< unique ID to identify the chapter diff --git a/libavformat/hls.c b/libavformat/hls.c index ff7bdecc93..6e1a2e3f1e 100644 --- a/libavformat/hls.c +++ b/libavformat/hls.c @@ -930,6 +930,11 @@ fail: av_free(new_url); if (close_in) ff_format_io_close(c->ctx, &in); + c->ctx->ctx_flags = c->ctx->ctx_flags & ~(unsigned)AVFMTCTX_UNSEEKABLE; + if (!c->n_variants || !c->variants[0]->n_playlists || + !(c->variants[0]->playlists[0]->finished || + c->variants[0]->playlists[0]->type == PLS_TYPE_EVENT)) + c->ctx->ctx_flags |= AVFMTCTX_UNSEEKABLE; return ret; } @@ -2213,8 +2218,7 @@ static int hls_read_seek(AVFormatContext *s, int stream_index, int stream_subdemuxer_index; int64_t first_timestamp, seek_timestamp, duration; - if ((flags & AVSEEK_FLAG_BYTE) || - !(c->variants[0]->playlists[0]->finished || c->variants[0]->playlists[0]->type == PLS_TYPE_EVENT)) + if ((flags & AVSEEK_FLAG_BYTE) || (c->ctx->ctx_flags & AVFMTCTX_UNSEEKABLE)) return AVERROR(ENOSYS); first_timestamp = c->first_timestamp == AV_NOPTS_VALUE ? diff --git a/libavformat/version.h b/libavformat/version.h index 148fc75faa..5ff8a89ae0 100644 --- a/libavformat/version.h +++ b/libavformat/version.h @@ -32,8 +32,8 @@ // Major bumping may affect Ticket5467, 5421, 5451(compatibility with Chromium) // Also please add any ticket numbers that you believe might be affected here #define LIBAVFORMAT_VERSION_MAJOR 58 -#define LIBAVFORMAT_VERSION_MINOR 5 -#define LIBAVFORMAT_VERSION_MICRO 101 +#define LIBAVFORMAT_VERSION_MINOR 6 +#define LIBAVFORMAT_VERSION_MICRO 100 #define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \ LIBAVFORMAT_VERSION_MINOR, \