From patchwork Wed Sep 26 05:56:53 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Amit Kale X-Patchwork-Id: 10483 Delivered-To: ffmpegpatchwork@gmail.com Received: by 2002:a02:1286:0:0:0:0:0 with SMTP id 6-v6csp326069jap; Tue, 25 Sep 2018 22:57:09 -0700 (PDT) X-Google-Smtp-Source: ACcGV61axlRzBMyERzoruM5VEM0wyuA/tJDNZXvKYA/0dq3+a+W7Lfy7YeONgJTQe47bM661lywI X-Received: by 2002:adf:f681:: with SMTP id v1-v6mr3522106wrp.201.1537941429321; Tue, 25 Sep 2018 22:57:09 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1537941429; cv=none; d=google.com; s=arc-20160816; b=H4a5WUB9rpxSrywgWSEDynKPXnuTxBT+KSRyOQm5QNch12jcxbdZ00pTN9R2KfohuE Y99JAUKIQeJ4hSQoTvtklt4nzH/oimc456xwoT8SS3a2nwfduCSs9ZzJ19Ww9Tq4jLYc cTmJAgY7e687MnFFZD2Bn3uPp8rW+TUT/mP7UzuEj/9q//JsgDd9k867SrWw8kLRLdV/ dXcQ4Rfh1E4jgYF9pxPQ1wKcFRjJerf5CVXsJKP2cXqWu1GeYo6zkKASiiauVUZv6xQJ b6GkMmAn0tNmbbldeqjUUpvgIFvEHxEINcsqcKBOWTEaMiA7PLKbqkH3ilBtZW4zoEaa l5Xg== 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=dnRu3k67OwpGSqPJShxRFpMEQz8WRHytmdaCkmK1nNI=; b=bs3Tzg/5ZOh994+sPNHEeyg0jPHdfEqschc3q0ibY2fEj07CHZHnYR3PBuAXz2NBK/ 5XlVkvn4PIRrUIDeoW+QPTEJgnCBFIweY9EF1FhNXM2YXNUC13zGZ4QWm5vRjBPaPX0X 9tL7Y9Fa/w41zBWGckTr4kL55ZYXkrQvbOTspvSWFwVUzXRDHwY2N2CqwMeS5NQm7cfO hNhDHZgBD9IbWTUWUYEoimU5itXSdRxabwx3Ifl9DwBu3b3Acp7fp3rKcMak3N0K7zUG +EPqaKj0pR1u2FgtWRj9iZL+EDW2+XyI65YEr2oV4Yp4p7Gr5JQW7ORp+/wjV7V053j3 xzgw== 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=jV6naKeH; 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 j20-v6si3669169wmj.144.2018.09.25.22.57.08; Tue, 25 Sep 2018 22:57:09 -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=jV6naKeH; 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 1CB2C68A491; Wed, 26 Sep 2018 08:56:51 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-pg1-f177.google.com (mail-pg1-f177.google.com [209.85.215.177]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 2513968A2C1 for ; Wed, 26 Sep 2018 08:56:44 +0300 (EEST) Received: by mail-pg1-f177.google.com with SMTP id z3-v6so8336534pgv.8 for ; Tue, 25 Sep 2018 22:57:00 -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=DM4w50u95ZXm9C7z/sXG1fuqblXPpuxRQqraIGYQXJA=; b=jV6naKeHDQIb7Wbi7qaZ8RasspAppbxte03OktP+e3d/2SHPFJ6UVItyddDEWauROv AO18GjDymXDEEu4+NAqtqH03XvOZFAjhldOoS4B8pMcLp+zYL7bgp5tqqB+MVVcc5VsG aIna9lGf4AWVfXxJtkv7dMaqjDyuYOFICb5++3kADz0jf7359syZ6k8UnBrXB9LA/IyU nhRyX+6nKjV3djxoEZKDhDBwKVyOonbC5Edy3D/zwcgV/aT/I1Trb+uwBFoOHbfdIy76 P9ITNFtlfBGn+t2LaAToMQuVd93cNlpYAwEitEW1zm7fiw8UzffwzXJLjInxA5STgyxd h+YA== 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=DM4w50u95ZXm9C7z/sXG1fuqblXPpuxRQqraIGYQXJA=; b=bgP9X8s63FbaCROiyoQGmZ2xngr1kFE95AAmB0R/5OEX9FN+oUALfwvKDRsLt/1h4T tJqAvfnhaCXXUub+QiYKDoYwl5uQpP1bMX0r64jG7gKoaat7STRCxeWUWeg8AKOtRpUe Gl+JCJwoPHJh/rInQckvgglPFbLQiD1FqLKq5lQSCTGxlBovfhsm3/OSCn9HUijZDd2E UfWx9JvX3cWOx3aRsHm3SmPNaKebKuyHunyfZk2VWNaN4MuH5hXTcVxNMYp2SrD8IFSl CswO6OTA3hq0bUaoFW84GAnJv+NfYiaRXoHLuiWRgGh+RPKgOkRjuckz3ktxLNu0z+IC oxzg== X-Gm-Message-State: ABuFfogBTk9xhZ3/wvnl30uJciqTB0Fj/bj15UD7e7qAZegYXv8df+mx CRy99S4WecH5gnp7DAuljQ4LRss0mSQ= X-Received: by 2002:a63:eb0e:: with SMTP id t14-v6mr4122985pgh.198.1537941418748; Tue, 25 Sep 2018 22:56:58 -0700 (PDT) Received: from [10.0.2.15] ([14.142.189.250]) by smtp.gmail.com with ESMTPSA id u11-v6sm6477203pfd.117.2018.09.25.22.56.57 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 25 Sep 2018 22:56:58 -0700 (PDT) To: ffmpeg-devel@ffmpeg.org From: Amit Kale Message-ID: Date: Wed, 26 Sep 2018 11:26:53 +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/4] Add 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. 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; @@ -2819,6 +2834,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"},