From patchwork Thu Nov 23 11:21:47 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Jeyapal, Karthick" X-Patchwork-Id: 6294 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.2.161.94 with SMTP id m30csp658341jah; Thu, 23 Nov 2017 03:22:19 -0800 (PST) X-Google-Smtp-Source: AGs4zMboBc0+iAoT7QBnhJcLxk0QzCNdH7eOhE9ba5INWi4yim9ZDawxReN0h3KbPlIdnkKKWvtY X-Received: by 10.28.45.214 with SMTP id t205mr6814667wmt.94.1511436139785; Thu, 23 Nov 2017 03:22:19 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1511436139; cv=none; d=google.com; s=arc-20160816; b=eNBZraTcCUXAvnvcq0X+n58dirL5FgwFg7xXTaVvdaAWeSXc+O/OFRMfBm+yYz2KTa T4rg5mDlLry8wV8zh59H+YuO+3pmOqqs0bj3KIvjugEzkOizTYIdo6JZjm2Vk+W/0+yQ 8Jk0V1FuFTbqrvlV27tMRP2FCIAf4su3CKfOHGcSpxjxLqnbUV2FG4V0k2R9srJRtvrq aZcBSzqlRCGtm6pFvNqmvHyXdkHnNZTlZhI+El/fIP/BrqjfN+cyR+7F+9WhbTpdZ/A2 2tW0T8e0cxe9/5puOzBQ+x5VH39j9lZHrGlKFD3H93yyu1OVFBMIFOvUI/KTNjfYX85f HPyw== 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=5xwZgKcq8o0jgeHW4TIzRImrhp0G0qNLZe2HJOLqS+w=; b=wN3/TZAEAneO42G1XjCjd45BFHpQmfqeZGQbx/hDW+y7yk0/JjYdekbh+DLN0QF8hm HdcE3wwKLZk/JhvJd/2clWg6vJS6PjkOmHtHzJo9bpmkn3MIQk/gGaPMaEL5G7mj59bm Ix6tS8RMzYQoHuCvzcjVjHF3qnZcc57iRmQq+6fdHH9/+XqLfiOw7ni8IotG1im7QVB5 4staiQtXXIZqoy1Xfjd3gvvp3znShH9kxFqAC7mLdyETx48MIi2azGabzGpC8ffDTDMG RN6EzVX3vUnrzKyrLvX9HAimoDwoUwsxuw1v3XbD/W9PKzTayUXVargjbj8k60Yuu8c0 IQ7g== 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=rnegVRlG; 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 u10si11999473wru.237.2017.11.23.03.22.19; Thu, 23 Nov 2017 03:22:19 -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=rnegVRlG; 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 79202689FF3; Thu, 23 Nov 2017 13:22:17 +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 D7774689C1D for ; Thu, 23 Nov 2017 13:22:09 +0200 (EET) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=smtpservice.net; s=m78bu0.a1-4.dyn; x=1511437035; h=Feedback-ID: X-Smtpcorp-Track:Message-Id:Date:Subject:To:From:Reply-To:Sender: List-Unsubscribe; bh=Fhx5bsrmOQpQI64sNUn54dIKWCamF4KaG6gvWfVwEF4=; b=rnegVRlG U5T2YilW6PgL8FoUsUNVDx3E8J0LLOgSuO0y08ViGqf8CJUVTBW+2B3JuqticgHwRsYHlUfY0g625 Dvy1+5qLLeVlmpH7/lQtm4Ke5xUJ6Cc5OBWI8Wyh1h6uIsLFy+MsL0h1MOcDKCluAYiOpjnBaAGHE lsEuF3IOzHP6vOYr0uBloDKnNKxwiEwpCgVqmwnB//Jm2jBU01FX1dBsspzoWiBz0aIqSO/MI0yWC Z2mlU22ClHiPEyhi964WxRrNJv8t6/76TQ8TdWeOHW/i6OqlkWgzi0JdmbFxCNnNPz0NIi6tFKIPO uELgGk7Xosu+ed0Xu963/KXliA==; From: Karthick J To: ffmpeg-devel@ffmpeg.org Date: Thu, 23 Nov 2017 16:51:47 +0530 Message-Id: <1511436107-10199-1-git-send-email-kjeyapal@akamai.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: References: X-Smtpcorp-Track: 1-Hpa2DIIhcKVu.FI9fgu6er Feedback-ID: 337386m:337386asVRLGB:337386s38VJepMAE:SMTPCORP X-Report-Abuse: Please forward a copy of this message, including all headers, to Subject: [FFmpeg-devel] [PATCH v2] 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..bad5e14 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) { + // 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" },