From patchwork Thu Nov 23 11:33:26 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Jeyapal, Karthick" X-Patchwork-Id: 6295 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.2.161.94 with SMTP id m30csp670060jah; Thu, 23 Nov 2017 03:33:49 -0800 (PST) X-Google-Smtp-Source: AGs4zMbMDaaP+GmTyLmPFchHhn/mLjxs9AFbOaiJBLOaRFbn38JKkl1O26UXaLuGRFMLciRhaxCB X-Received: by 10.223.163.11 with SMTP id c11mr14066140wrb.214.1511436829787; Thu, 23 Nov 2017 03:33:49 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1511436829; cv=none; d=google.com; s=arc-20160816; b=XF2Xn6AVMwvqAKuGXyucA4KsY95Z1PIPhcPd/rFJjhe8BZ8WbEv53dYqZ9MGMaVkmF HTfTkLIAX9gni0zTNGJQl3w+LoqWQoe69MPbei9Y6VW4eCdXI6ccwYsjih7CGOsHK1Ld 2XTnWAuu5f5Grx3F2TDIjV9+ZFZ9iatRohbC6XmYHHec+q0ty+mSUqx5OkX+w+ZhypN4 a+vGrgT+RG/+WUjv29nswOWobICwWUbZO8//o3VYpKff10nePlNULQxoBDaTk/Wigl5v p13+pz+vEM/6SInJOWFQ6U4tbVPCDa0kCaQbzX3wGcuq6Bz5ql0tt8+e2VjvUgwl2FFA E8zQ== 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:feedback-id:references:in-reply-to :message-id:date:to:from:dkim-signature:delivered-to :arc-authentication-results; bh=lcP84nF1apHgpU3WktnAtKiUY0+JeWJy0ScaxkPD30Y=; b=NzRQOOsRBYcksZ35cCEd+w9+R3gGi8mE+EE8NYOCjtlXE1MB8/krsd1l01ymv3ueyf /O24eRKANG5WdMr7PW5TWcHPwaucHkQS3DVDWLdxE+A1XgOfET0s+MGToKPGuB2ILcoS Hd6tQM/pUypebNkoZDT9CRKzEraEEZlPa3DwdowHojoBINkiOXqEKrvq+QAN8RrdSCOj GyvtwIQpKPzgGD1o1M0xHj2ciGzory4EJnJf9XwJijsl1OpW0EiDLVjA2n1nIM4XFUXa l17zjiNICfL1VLoTx1kLyOK0xVu+Oqb6RsZi6FaP+yiACj4z5YZfS9sOaeK/JGOvJjEe lyFg== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@smtpservice.net header.s=m78bu0.a1-4.dyn header.b=oIYwNO3S; 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=NONE dis=NONE) header.from=akamai.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id 73si5070491wmi.274.2017.11.23.03.33.49; Thu, 23 Nov 2017 03:33:49 -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=@smtpservice.net header.s=m78bu0.a1-4.dyn header.b=oIYwNO3S; 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=NONE dis=NONE) header.from=akamai.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id CF760689FF3; Thu, 23 Nov 2017 13:33:47 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from a2i831.smtp2go.com (a2i831.smtp2go.com [103.47.207.63]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 38344689C38 for ; Thu, 23 Nov 2017 13:33:41 +0200 (EET) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=smtpservice.net; s=m78bu0.a1-4.dyn; x=1511437727; h=Feedback-ID: X-Smtpcorp-Track:Message-Id:Date:Subject:To:From:Reply-To:Sender: List-Unsubscribe; bh=5+MWZFQl62KOGgWpCibyiRryn8k+/q+4lXrXz1DtLuM=; b=oIYwNO3S dGQ1ezhdYMJepp+QWkmLUd/riGFqfZ4byC95vTfGA2+EqpnfMLMQUafrOfS7jxXAf3akg6KtYHUn5 mRxC40zkn1+hTPCYNNYOoQ+jekFLd6wrOyxnL6xgdwymQ+HCV2W3gsQOgqdxulI9A4N0I0OrF4l7M aLtvWYGWHuDn3CaXgBs9UfSHD4s+q+7y8n8DM3l9NGpyKVUMURqaEcP50LFtUsoBgDlzkDoKFAo1+ /C3J2R0IUMbFtqbLIBXTbBvDSAJJxRMEAvNm5Gd98NZlpAlxTlEqrG6kt+y5mw/wPW7p5vfe7Kh36 hf0n3AoH+Crntzwc8Yh86xOsFQ==; From: Karthick J To: ffmpeg-devel@ffmpeg.org Date: Thu, 23 Nov 2017 17:03:26 +0530 Message-Id: <1511436806-12127-1-git-send-email-kjeyapal@akamai.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: References: X-Smtpcorp-Track: 1-Hp_CDII-UNl5.FvmT9CTa_ Feedback-ID: 337386m:337386asVRLGB:337386sKonGFypc_:SMTPCORP X-Report-Abuse: Please forward a copy of this message, including all headers, to Subject: [FFmpeg-devel] [PATCH v3] avformat/hlsenc: Added option to add EXT-X-INDEPENDENT-SEGMENTS tag 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: Karthick J MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" --- doc/muxers.texi | 4 ++++ libavformat/hlsenc.c | 17 +++++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/doc/muxers.texi b/doc/muxers.texi index 0bb8ad2..9d9ca31 100644 --- a/doc/muxers.texi +++ b/doc/muxers.texi @@ -737,6 +737,10 @@ The file specified by @code{hls_key_info_file} will be checked periodically and detect updates to the encryption info. Be sure to replace this file atomically, including the file containing the AES encryption key. +@item independent_segments +Add the @code{#EXT-X-INDEPENDENT-SEGMENTS} to playlists that has video segments +and when all the segments of that playlist are guaranteed to start with a Key frame. + @item split_by_time Allow segments to start on frames other than keyframes. This improves behavior on some players when the time between keyframes is inconsistent, diff --git a/libavformat/hlsenc.c b/libavformat/hlsenc.c index 3c47ced..3010714 100644 --- a/libavformat/hlsenc.c +++ b/libavformat/hlsenc.c @@ -88,6 +88,7 @@ typedef enum HLSFlags { HLS_SECOND_LEVEL_SEGMENT_SIZE = (1 << 10), // include segment size (bytes) in segment filenames when use_localtime e.g.: %%014s HLS_TEMP_FILE = (1 << 11), HLS_PERIODIC_REKEY = (1 << 12), + HLS_INDEPENDENT_SEGMENTS = (1 << 13), } HLSFlags; typedef enum { @@ -1191,6 +1192,10 @@ static int hls_window(AVFormatContext *s, int last, VariantStream *vs) sequence = 0; } + if (hls->flags & HLS_INDEPENDENT_SEGMENTS) { + hls->version = 6; + } + if (hls->segment_type == SEGMENT_TYPE_FMP4) { hls->version = 7; } @@ -1220,6 +1225,9 @@ static int hls_window(AVFormatContext *s, int last, VariantStream *vs) avio_printf(out, "#EXT-X-DISCONTINUITY\n"); vs->discontinuity_set = 1; } + if (vs->has_video && (hls->flags & HLS_INDEPENDENT_SEGMENTS)) { + avio_printf(out, "#EXT-X-INDEPENDENT-SEGMENTS\n"); + } for (en = vs->segments; en; en = en->next) { if ((hls->encrypt || hls->key_info_file) && (!key_uri || strcmp(en->key_uri, key_uri) || av_strcasecmp(en->iv_string, iv_string))) { @@ -1732,6 +1740,14 @@ static int hls_write_header(AVFormatContext *s) vs->start_pts = AV_NOPTS_VALUE; vs->current_segment_final_filename_fmt[0] = '\0'; + if (hls->flags & HLS_SPLIT_BY_TIME && hls->flags & HLS_INDEPENDENT_SEGMENTS) { + // Independent segments cannot be guaranteed when splitting by time + hls->flags &= ~HLS_INDEPENDENT_SEGMENTS; + av_log(s, AV_LOG_WARNING, + "'split_by_time' and 'independent_segments' cannot be enabled together. " + "Disabling 'independent_segments' flag\n"); + } + if (hls->flags & HLS_PROGRAM_DATE_TIME) { time_t now0; time(&now0); @@ -2323,6 +2339,7 @@ static const AVOption options[] = { {"second_level_segment_duration", "include segment duration in segment filenames when use_localtime", 0, AV_OPT_TYPE_CONST, {.i64 = HLS_SECOND_LEVEL_SEGMENT_DURATION }, 0, UINT_MAX, E, "flags"}, {"second_level_segment_size", "include segment size in segment filenames when use_localtime", 0, AV_OPT_TYPE_CONST, {.i64 = HLS_SECOND_LEVEL_SEGMENT_SIZE }, 0, UINT_MAX, E, "flags"}, {"periodic_rekey", "reload keyinfo file periodically for re-keying", 0, AV_OPT_TYPE_CONST, {.i64 = HLS_PERIODIC_REKEY }, 0, UINT_MAX, E, "flags"}, + {"independent_segments", "add EXT-X-INDEPENDENT-SEGMENTS, whenever applicable", 0, AV_OPT_TYPE_CONST, { .i64 = HLS_INDEPENDENT_SEGMENTS }, 0, UINT_MAX, E, "flags"}, {"use_localtime", "set filename expansion with strftime at segment creation", OFFSET(use_localtime), AV_OPT_TYPE_BOOL, {.i64 = 0 }, 0, 1, E }, {"use_localtime_mkdir", "create last directory component in strftime-generated filename", OFFSET(use_localtime_mkdir), AV_OPT_TYPE_BOOL, {.i64 = 0 }, 0, 1, E }, {"hls_playlist_type", "set the HLS playlist type", OFFSET(pl_type), AV_OPT_TYPE_INT, {.i64 = PLAYLIST_TYPE_NONE }, 0, PLAYLIST_TYPE_NB-1, E, "pl_type" },