From patchwork Fri Sep 28 06:03:48 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Amit Kale X-Patchwork-Id: 10508 Delivered-To: ffmpegpatchwork@gmail.com Received: by 2002:a02:1286:0:0:0:0:0 with SMTP id 6-v6csp345378jap; Thu, 27 Sep 2018 23:04:04 -0700 (PDT) X-Google-Smtp-Source: ACcGV60RT4oUKiircIN/ESRucjaqAONPaP2HEvNtEv5MtlbCcMc/5sokXAbu+jy7vW/J9cwm0tAb X-Received: by 2002:adf:f043:: with SMTP id t3-v6mr1325558wro.92.1538114644124; Thu, 27 Sep 2018 23:04:04 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1538114644; cv=none; d=google.com; s=arc-20160816; b=qu0Hxt1X+OjIBLG4KD4EI3gSjHogudSkgqt81Kwix+LZ9F6hEyRiAVSGK+hQy4eKft cjN9HBAQectycjV7au7wsnF+hgDr9vKm1GXHMO9cToyDwVrCLLQlbQTqutDiCQIWW2Wk EXnpeIepCd+iZLZf6QXTNoXz81nfG/fFmfb+yjdgPn3vh0xFGiquDN72hOWq3lOLBf57 Q1pDw6qe/hEapI4xLAKerjw5gOI0/r3cTmdUmW+lO1UlAmSNzjSWsbNLfAwLdABwlkya ygfXH4t1Y2lWoXwgLI5TFY9QLQjZbvx+cqqdjlJPLE5U//l9FyHiek7ZZ0p4Xa85g/3E IwtA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:reply-to:list-subscribe :list-help:list-post:list-archive:list-unsubscribe:list-id :precedence:subject:content-language:mime-version:user-agent:date :message-id:from:to:dkim-signature:delivered-to; bh=1cD4Ps3LPcTNMlYswtl4lt5QtIqXg2xuEThVpZ1mwO4=; b=Z1ipXSFcTgZZTZPuHagom38GEYcFkUL/vTAFuRk8T1ZOkJmZLqUHf4BdPq0tD3ChB3 oG2kuCM2Kc1y7ooEGUQtOCHaUYWPpRwJ3lpgUaa5TwkAS0SuSCOrHqDCN2QWVLisnC8O WnYJmXIMJR2+dyx46Ac3znZJ8jZUrX0CdMTHHOdeNbZomRhUfQwYS6izbCzDClmDjIY9 HUEJ4es/EGbc2zNT+KLoGGasY2hkjPPsYxc6PS1rGyAe2SuXn5LjmCQpALlhqj+U19nD WVgPItSRwlrGTlrh8sLeQMYMr9jX71Lsv9Qbe07ceEen99IiLpX1cSXBHg+5CTAA/7ZY cIGw== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@hotstar-com.20150623.gappssmtp.com header.s=20150623 header.b=ucp1CZVa; 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 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id y67-v6si926386wme.107.2018.09.27.23.04.03; Thu, 27 Sep 2018 23:04:04 -0700 (PDT) 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=@hotstar-com.20150623.gappssmtp.com header.s=20150623 header.b=ucp1CZVa; 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 Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 32B8668A562; Fri, 28 Sep 2018 09:03:45 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-pf1-f173.google.com (mail-pf1-f173.google.com [209.85.210.173]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 7445D689E1C for ; Fri, 28 Sep 2018 09:03:38 +0300 (EEST) Received: by mail-pf1-f173.google.com with SMTP id j26-v6so3533930pfi.10 for ; Thu, 27 Sep 2018 23:03:55 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=hotstar-com.20150623.gappssmtp.com; s=20150623; h=to:from:subject:message-id:date:user-agent:mime-version :content-language:content-transfer-encoding; bh=OnLuHPafdqxG2YV34OwPK69LxHHvTNtSXP77jzBtpQE=; b=ucp1CZVaboFrTd9wVyXHSrKsnyoLlkM9+5sqQOG7g8qySQ0k9cGMTWicDHhENsyl0G rh23aZg53wKQIMhHjBkR+p6epFB8KgM9YrEo5P0teTF3E8+bdz6nl7hiRZvp54awYdxZ +qJgtZnyZsMGTNS+AdZ+iTl/Q5/91G77ue+9Ike8LiMhungX6rLzGDaeJ9X4JDxSS/JK pdnznu8d1MxUmUyG6Ga3PLsWHucrEF863iyqmVot8GZcxNkPGdzREPMwDOzCgFFx9qHJ 62UqSWyzS8LCqN1iIYQrQcu1r11uR1flUeBKtHYcDOMg4vHpOcqA+1zsJ7lWMlAA4fP1 hN0A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:to:from:subject:message-id:date:user-agent :mime-version:content-language:content-transfer-encoding; bh=OnLuHPafdqxG2YV34OwPK69LxHHvTNtSXP77jzBtpQE=; b=LhZjF5H+omlBYnXfgDxhKprLhWe274QgArQuDHd+Kjmw99zbJuGH5WS7F4+r0fxKZA bNSykg2S21CO1/MZNH7pmyBbsJPg641Oo2e9FNUWYqOoTQiSVsFeqybJLJSjrmzE9kfP ZdL+gW8rM/pU0/Ha9wDKQK0Yll5OR4ROBCYXrVXAmpsKgRMrOoHPI8l+5sUB0HVaEQlh yWagkh5HyzRUuVV09F5GALglI318uz6lne9ZJ0MI4zAqPQMEOmCXcUdQoNltuTkkPWLP Nni/Wqgs7QCQsOw66iSELrL66YSvhWA18c6LVFZyiX2HPtz97sCu7wlTaWxTzR6433q0 0QAQ== X-Gm-Message-State: ABuFfojPu8QdsdDJ8PQ1vJa+9cYVE/T6EDdCxvWrd7rlUg3HMvi/QXw1 QEVxncvt9PTRSMU6iUZQHxK0LjS3XCY= X-Received: by 2002:a17:902:784a:: with SMTP id e10-v6mr14429098pln.197.1538114633763; Thu, 27 Sep 2018 23:03:53 -0700 (PDT) Received: from [10.0.2.15] ([14.143.96.254]) by smtp.gmail.com with ESMTPSA id a19-v6sm7179040pfj.38.2018.09.27.23.03.52 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 27 Sep 2018 23:03:52 -0700 (PDT) To: ffmpeg-devel@ffmpeg.org From: Amit Kale Message-ID: <56667418-bb5e-ee07-7d3c-360d9b889faf@hotstar.com> Date: Fri, 28 Sep 2018 11:33:48 +0530 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.9.1 MIME-Version: 1.0 Content-Language: en-US Subject: [FFmpeg-devel] [PATCH 2/3] Adds a new hls_flag peak_segment_bw 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" If this flag is set, BANDWIDTH value in a master playlist entry will be set to the peak segment bandwidth. This patch also delays freeing of hls stream data, so that it's available for bandwidth calculation. Signed-off-by: Amit Kale --- doc/muxers.texi | 4 ++++ libavformat/hlsenc.c | 29 +++++++++++++++++++++-------- 2 files changed, 25 insertions(+), 8 deletions(-) Index: ffmpeg/doc/muxers.texi =================================================================== --- ffmpeg.orig/doc/muxers.texi +++ ffmpeg/doc/muxers.texi @@ -789,6 +789,10 @@ subdirectories. Possible values: @table @samp +@item peak_segment_bw +If this flag is set, BANDWIDTH value in a master playlist entry will be +set to the peak segment bandwidth. + @item single_file If this flag is set, the muxer will store all segments in a single MPEG-TS file, and will use byte ranges in the playlist. HLS playlists generated with Index: ffmpeg/libavformat/hlsenc.c =================================================================== --- ffmpeg.orig/libavformat/hlsenc.c +++ ffmpeg/libavformat/hlsenc.c @@ -99,6 +99,7 @@ typedef enum HLSFlags { HLS_TEMP_FILE = (1 << 11), HLS_PERIODIC_REKEY = (1 << 12), HLS_INDEPENDENT_SEGMENTS = (1 << 13), + HLS_PEAK_SEGMENT_BW = (1 << 14), } HLSFlags; typedef enum { @@ -1174,7 +1175,8 @@ static int64_t get_stream_bit_rate(AVStr } static int create_master_playlist(AVFormatContext *s, - VariantStream * const input_vs) + VariantStream * const input_vs, + int last) { HLSContext *hls = s->priv_data; VariantStream *vs, *temp_vs; @@ -1191,13 +1193,16 @@ static int create_master_playlist(AVForm for (i = 0; i < hls->nb_varstreams; i++) if (!hls->var_streams[i].m3u8_created) return 0; - } else { + } else if (!last) { /* Keep publishing the master playlist at the configured rate */ if (&hls->var_streams[0] != input_vs || !hls->master_publish_rate || input_vs->number % hls->master_publish_rate) return 0; } + if (hls->flags & HLS_PEAK_SEGMENT_BW && hls->version < 7) + hls->version = 7; + set_http_options(s, &options, hls); ret = hlsenc_io_open(s, &hls->m3u8_out, hls->master_m3u8_url, &options); @@ -1298,11 +1303,21 @@ static int create_master_playlist(AVForm } bandwidth = 0; - if (vid_st) - bandwidth += get_stream_bit_rate(vid_st); - if (aud_st) - bandwidth += get_stream_bit_rate(aud_st); - bandwidth += bandwidth / 10; + if (last && hls->flags & HLS_PEAK_SEGMENT_BW) { + HLSSegment *hs = vs->segments; + while (hs) { + int64_t segment_bandwidth = hs->size * 8 / hs->duration; + if (bandwidth < segment_bandwidth) + bandwidth = segment_bandwidth; + hs = hs->next; + } + } else { + if (vid_st) + bandwidth += get_stream_bit_rate(vid_st); + if (aud_st) + bandwidth += get_stream_bit_rate(aud_st); + bandwidth += bandwidth / 10; + } ccgroup = NULL; if (vid_st && vs->ccgroup) { @@ -1443,7 +1458,7 @@ fail: ff_rename(temp_filename, vs->m3u8_name, s); if (ret >= 0 && hls->master_pl_name) - if (create_master_playlist(s, vs) < 0) + if (create_master_playlist(s, vs, last) < 0) av_log(s, AV_LOG_WARNING, "Master playlist creation failed\n"); return ret; @@ -2421,10 +2436,13 @@ failed: av_freep(&vs->vtt_m3u8_name); avformat_free_context(vtt_oc); } + av_free(old_filename); + } + for (i = 0; i < hls->nb_varstreams; i++) { + vs = &hls->var_streams[i]; hls_free_segments(vs->segments); hls_free_segments(vs->old_segments); - av_free(old_filename); av_freep(&vs->m3u8_name); av_freep(&vs->streams); av_freep(&vs->agroup); @@ -2819,6 +2837,7 @@ static const AVOption options[] = { {"fmp4", "make segment file to fragment mp4 files in m3u8", 0, AV_OPT_TYPE_CONST, {.i64 = SEGMENT_TYPE_FMP4 }, 0, UINT_MAX, E, "segment_type"}, {"hls_fmp4_init_filename", "set fragment mp4 file init filename", OFFSET(fmp4_init_filename), AV_OPT_TYPE_STRING, {.str = "init.mp4"}, 0, 0, E}, {"hls_flags", "set flags affecting HLS playlist and media file generation", OFFSET(flags), AV_OPT_TYPE_FLAGS, {.i64 = 0 }, 0, UINT_MAX, E, "flags"}, + {"peak_segment_bw", "sets bandwidth in master play list to peak segment bandwidth", 0, AV_OPT_TYPE_CONST, {.i64 = HLS_PEAK_SEGMENT_BW }, 0, UINT_MAX, E, "flags"}, {"single_file", "generate a single media file indexed with byte ranges", 0, AV_OPT_TYPE_CONST, {.i64 = HLS_SINGLE_FILE }, 0, UINT_MAX, E, "flags"}, {"temp_file", "write segment to temporary file and rename when complete", 0, AV_OPT_TYPE_CONST, {.i64 = HLS_TEMP_FILE }, 0, UINT_MAX, E, "flags"}, {"delete_segments", "delete segment files that are no longer part of the playlist", 0, AV_OPT_TYPE_CONST, {.i64 = HLS_DELETE_SEGMENTS }, 0, UINT_MAX, E, "flags"},