From patchwork Mon Feb 12 08:54:09 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Amit Kale X-Patchwork-Id: 7560 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.2.150.1 with SMTP id c1csp3751926jai; Mon, 12 Feb 2018 00:54:23 -0800 (PST) X-Google-Smtp-Source: AH8x227NBJeoPfohCQRpx+zAETZOOov4eAN1niedo6UruKzMTpPNF/8G9jo2yHJAVw0AYIe1+wHv X-Received: by 10.223.153.23 with SMTP id x23mr435623wrb.134.1518425663794; Mon, 12 Feb 2018 00:54:23 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1518425663; cv=none; d=google.com; s=arc-20160816; b=rbulPxKrOhpfLU/7INIWhPA+GuZxO0OhjKyARGfCC+R3Nb3xiR45RZfdZjWO8Q1tsz lyP7iogNpDy+bjTkkOsg2ZexkbPSwHav14wfsnxGK967rkljOrvDLOS77PDl0Q/YQyaS NN9HomPcDYNJb6PPq0t02CHRR7y9IUwSajv/P3DS1jDX1W+slx/qctBQjNt9OclYnYfZ pDMBFQEEdlOvGQSyPhH3k9VaczUh52DiPkvCNLlxiLkcXjoocVbwpGqtIwE8LHi0sI2w /8YgSgh6AiZhxUW67BzwccEl4R3kRh5Ksx7DuluEANOJG6lQ/ZskJKwH1wkbjCr+roiI MYrQ== 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 :arc-authentication-results; bh=ArVdvGf50ciu48obXarH2UxUmUQiVfE/3tTe0ciQoVA=; b=vi/t2Am5iyIFxEvMWwStQZitQpF+Da6lPrhi/bPsdTEx6Ctns96FgaAimsaNxu8OhY +VKhkQ+6U6G85Q2zMZnmfFTdlQvZGezjxb/DxL/8XFXryIeVgxniGqKpXaBix0ql7rSn LgLRw0Z4IuGaQ+6uZE9n8+Px+yB58P4TQGPneNtU+Ya5rn3vZyMVX8gXq7H1amX3ulF6 nrGXqFPwjOBn62LB3c1Jz4k4E/w7UbnXobJ+3p3rZ6qbAxZLR5R+krVQ8tPrMaULQXl8 7kgm8uT4+uBkPl9e3lPyRg+41v/80frZU2ISXFObYOUS7C19sDnrwzxY5eoCtbIMFV6q jOiQ== 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=Ecv/65lj; 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 a5si3590919wrh.240.2018.02.12.00.54.22; Mon, 12 Feb 2018 00:54:23 -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=@hotstar-com.20150623.gappssmtp.com header.s=20150623 header.b=Ecv/65lj; 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 2E6F5689A03; Mon, 12 Feb 2018 10:54:11 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-io0-f193.google.com (mail-io0-f193.google.com [209.85.223.193]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 770FB68837F for ; Mon, 12 Feb 2018 10:54:04 +0200 (EET) Received: by mail-io0-f193.google.com with SMTP id d13so16495861iog.5 for ; Mon, 12 Feb 2018 00:54:15 -0800 (PST) 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-transfer-encoding:content-language; bh=GPsiutLXqaCTTyN1tcLGKtWYH1qsVKNUrrpy9t61oBw=; b=Ecv/65ljfwzc3CMu9Z+yRTaAfa6EmRS09248oQNfeMEU+NR/a7tzILOMA8RQWx24gf 5juaAC+8UeNfQ1AEVvcHPGaaWG8+sGGgS6fU32vC1opRTIt65jybXg2/mnV1XLvVK2J6 ZcQsyOZosr6jWoAdCF6hYP+wKS7SD2jRog4of6vb+dyILmaYHVsFXVNLBwKsPhminkQA Mphx8R+Gnn1A9oQvLgQOwUOLdn2Jngj/D5mjcEoT/cx7uvr/X9x+JLWw0awxHcOmZCsN 6Q77zZon6lUgvNZKjCibb6fxpcNYlc0uew/h85d+ZrkFSTQwima5z7pWGdhNM4wOu04N OZyA== 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-transfer-encoding:content-language; bh=GPsiutLXqaCTTyN1tcLGKtWYH1qsVKNUrrpy9t61oBw=; b=Mj6v3NrEe/TT3AjicOy+J9dANvBrqIXwFAi2h9Ud9iSX7N9/p9B5Gump85B4hx2BCR RjfArzj4cfolfGYdWp4WBHmuAEeqEiKFOJuEQ6iin9q+ynfgFJ8xu9r85uBG36xmd0iK mbZZpzwLwKUyR2Wxz65dcTuDY7sqeGTZfFhVwK9fJgvpsxyQGgfb1p1+B50V9br+BJCH zfn/FliqMxO9liYXOklv6HCUZ4edAuP4WtXICWO7j5NR31iXk9S0bJ2JNmfOCgMzBhhf BwEgIXa9P1GHiKHJctpViA+/sWGnvw6WH++v1e6/WUJGglJqzb0Y4IRPT3oAHEwvNd5F DHSw== X-Gm-Message-State: APf1xPDuPDnCEANmV5jAyKX2va6EKGfxlp2sCoN7wvm89Sca2jCETAXR QMMyVkOB9jIvrx17hY2wmLMmP78EQD0= X-Received: by 10.107.145.8 with SMTP id t8mr12222177iod.124.1518425653731; Mon, 12 Feb 2018 00:54:13 -0800 (PST) Received: from [192.168.1.104] ([123.201.100.24]) by smtp.gmail.com with ESMTPSA id e7sm6033932ita.17.2018.02.12.00.54.12 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 12 Feb 2018 00:54:13 -0800 (PST) To: FFmpeg development discussions and patches From: Amit Kale Message-ID: Date: Mon, 12 Feb 2018 14:24:09 +0530 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.6.0 MIME-Version: 1.0 Content-Language: en-US Subject: [FFmpeg-devel] [PATCH 2/3] 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. ---  doc/muxers.texi      |  4 ++++  libavformat/hlsenc.c | 29 +++++++++++++++++++++--------  2 files changed, 25 insertions(+), 8 deletions(-)      VariantStream *vs, *temp_vs; @@ -1185,7 +1187,7 @@ static int create_master_playlist(AVFormatContext *s,          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) @@ -1292,11 +1294,21 @@ static int create_master_playlist(AVFormatContext *s,          }          bandwidth = 0; -        if (vid_st) -            bandwidth += vid_st->codecpar->bit_rate; -        if (aud_st) -            bandwidth += aud_st->codecpar->bit_rate; -        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 += vid_st->codecpar->bit_rate; +            if (aud_st) +                bandwidth += aud_st->codecpar->bit_rate; +            bandwidth += bandwidth / 10; +        }          ccgroup = NULL;          if (vid_st && vs->ccgroup) { @@ -1437,7 +1449,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; @@ -2753,6 +2765,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"}, diff --git a/doc/muxers.texi b/doc/muxers.texi index d9a5cc03dc..e2c9cbfa2f 100644 --- a/doc/muxers.texi +++ b/doc/muxers.texi @@ -741,6 +741,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 diff --git a/libavformat/hlsenc.c b/libavformat/hlsenc.c index 9970c4c575..f40cd0b98f 100644 --- a/libavformat/hlsenc.c +++ b/libavformat/hlsenc.c @@ -98,6 +98,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 { @@ -1168,7 +1169,8 @@ static int get_relative_url(const char *master_url, const char *media_url,  }  static int create_master_playlist(AVFormatContext *s, -                                  VariantStream * const input_vs) +                                  VariantStream * const input_vs, +                                  int last)  {      HLSContext *hls = s->priv_data;