From patchwork Thu Nov 23 05:05:55 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Jeyapal, Karthick" X-Patchwork-Id: 6292 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.2.161.94 with SMTP id m30csp335209jah; Wed, 22 Nov 2017 21:06:22 -0800 (PST) X-Google-Smtp-Source: AGs4zMbaw7ALfRHVxjziPbBJ5hK0kgKrzlEnK9cuxOwHsJm+jmMv3X0yIZLjt45jALX5/xCeCLo+ X-Received: by 10.223.171.85 with SMTP id r21mr18600930wrc.182.1511413582804; Wed, 22 Nov 2017 21:06:22 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1511413582; cv=none; d=google.com; s=arc-20160816; b=lK9vNUM2XDj573Ih6foc0gDsqyDsLHbtpC8DhYPmXgT1ItuV/18LG6fkptHhhnNHSh uFqxzp5Y6Fv7//Jt92rMysvY7eXk247YmtdwQnT5/sjnvbG0taxtJ6kbB6Bc11vAhPPG lh0xwI8324mZxE6GZ6oZlPlOW7kJ7WjDyx2eh476gH9MRz3oK9Y3grQf0zVCyANL75gf ashJ084MdA9I6ps0CpgeQC4VjgsEOkDpGpo2QgcfwjHaPdzpUlxNd/t6C/4A1DNVaodw oHJ6/GhlqusiZYBk+1UqQ2O0tg2TSr1Bsi/f7gleI/FgSxFgBVmQPd0lwullQm3O9jgR X5uA== 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:message-id:date:to:from :dkim-signature:delivered-to:arc-authentication-results; bh=VU8bxlkB5gjzgpyyraQlwsg3bE/Lk/musZ6Wd5eHUhg=; b=vPlqSHKSCpCaWXalARP23LhGNUGNyvUwW0WKM6jD02s+a+VvU0ZwNxleo3a3/EUbPx YvS/RB2IV5Lo1ybn6x/RSj73jUQGi0fZWDV+aLky4p2x6wTNQ8ikW6KuSLEPBCXq8kaD 8eaWGTbmBoPQTM6UU463lQxxtqjzSgO53MBYo4Zw+4OWHZgT1iPvKyjPz22QXpz8DHVW J9s+ofpr4eJYFkMKokhD7s1+mG86g7YecL6tKJCSodrT5Y2N0PWC2Yn7hQ/wq4bT7Nux twtvfJ1J/1E7eI4zEWvhZHABdK9z9bJIc9xN0AnqrUDSayhnx5yy97yYj48RRxQ0ZShm wTjw== 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=hHxFcSho; 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 d200si4462451wmd.238.2017.11.22.21.06.22; Wed, 22 Nov 2017 21:06:22 -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=hHxFcSho; 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 2B90F689FF1; Thu, 23 Nov 2017 07:06:21 +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 380D5689FC7 for ; Thu, 23 Nov 2017 07:06:14 +0200 (EET) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=smtpservice.net; s=m78bu0.a1-4.dyn; x=1511414480; h=Feedback-ID: X-Smtpcorp-Track:Message-Id:Date:Subject:To:From:Reply-To:Sender: List-Unsubscribe; bh=1M3JVlFE8Idt0eY04sn+xf1lNRpQAnkDJd95fXNe3t4=; b=hHxFcSho ti1AUi6XApUzDZJqgTf9XUm3NfrGAGolgHB3AodQBsZqDCNab7l/Mu1Jm9J1rSI0s/oANTkQHdnhZ hd/btGJo4sfombuXzaMmSQv9VDcEyDsrpfm0eRXNNJ0MMZAKSxL31cD1yteZdtEAZ8hzPsVyzXUwp OWjLr2taShlC4IeaFa+Ubie0H9FLFTZU5n82Lb43P7h5HdHHhmaI7AHbwX5wQxFzQ9ixJ0KzBuUUM MROcjfWlBB2gxQd1EDQxSNw9sFNQmhrPjvkqwi8reNE2Ti5L1isfK+1dAVmXhiarZhM6uzKXFinOO 4fRi+8FIEy72YCVAhNTOxAa2BA==; From: Karthick J To: ffmpeg-devel@ffmpeg.org Date: Thu, 23 Nov 2017 10:35:55 +0530 Message-Id: <1511413555-6668-1-git-send-email-kjeyapal@akamai.com> X-Mailer: git-send-email 1.9.1 X-Smtpcorp-Track: 1-HMiDNmFjmSV7.FhdjQ9-zi Feedback-ID: 337386m:337386asVRLGB:337386sCEILk0yer:SMTPCORP X-Report-Abuse: Please forward a copy of this message, including all headers, to Subject: [FFmpeg-devel] [PATCH] 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 | 14 ++++++++++++++ 2 files changed, 18 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..5fc355a 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,11 @@ 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) { + // Independent segments cannot be guaranteed when splitting by time + hls->flags &= ~HLS_INDEPENDENT_SEGMENTS; + } + if (hls->flags & HLS_PROGRAM_DATE_TIME) { time_t now0; time(&now0); @@ -2323,6 +2336,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" },