From patchwork Wed Jun 17 11:50:12 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?Przemys=C5=82aw_Sobala?= X-Patchwork-Id: 20434 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id DDF7844B4B9 for ; Wed, 17 Jun 2020 14:50:36 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id B39C368B44A; Wed, 17 Jun 2020 14:50:36 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wr1-f49.google.com (mail-wr1-f49.google.com [209.85.221.49]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id C62F568B3A2 for ; Wed, 17 Jun 2020 14:50:29 +0300 (EEST) Received: by mail-wr1-f49.google.com with SMTP id h5so2008285wrc.7 for ; Wed, 17 Jun 2020 04:50:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=yoIKfb8GYYGXrTbyGz/6kR4Da6Wt7uW9lKYtdrZHzuA=; b=CFBDEEaIk6BfLl1Fps8j0SbVk+qmYRpzwCSjgvfgJtIraws6F0YoMHsDlSgDRzAHrN vZMSY/TtAh35tGUVhRN65vI8mxLdhEu7zbvDJzIyVJoJupvrzQCEtihu1+xARaUL+MPp 6T5fqMlIv2lt25lbK2VWQD+UIdmrVevVBpt+w+rF8hY5XUomZ41wktIniTfu0FFF8AC2 4mT9TVDpnJmFxQTWV5eHhnVG9+FHUM37Meh4HsaG8Wy8rf9BQQhEv6qm5XtcnFX/gsVE pYQiGg0Yd69zIwxnXExsczYu5PdzJbxxgVZKlzSBOoZMAqrugl3JJf0LbYeaIiotguZd 3eZQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=yoIKfb8GYYGXrTbyGz/6kR4Da6Wt7uW9lKYtdrZHzuA=; b=iB5hxZaH/d5j6f7hGUtM3UzGlX2BSFDlhP0klXFq5R1bBHIbX+oruqr0e1+OGQRJA+ 8VDVVhXR5qSoo4lJar8X4eDVJAPjnwQMAi8/a51u9iT/7eToTTl1lsTu+ZAVyHkTUVDb ROa/O24yAHgyTO9eLCz/KId+sihYqaO4PRqHZr80GHPjbPisAKM43xQAHQy4o9rcFH9U DbYCL+u4jXWFvi3Xyavj9QxNVAqxzFhA8Q1n3XNI/4vxNMRLXr0hHeOsbc9FywXcreBC mwjYJke0k7pKw+KFiegtYaA5jydQQuu8odtHs2oaXUrDgg6QGDnZXa0Yi+lIgEHzz8c4 3Ylg== X-Gm-Message-State: AOAM531tvg1xe27SCnBq1VXbT6/klqPg4go6yC5+CnGR+9nxYt/EgCVB iCDFdYf4UtzlmTMsPGKj+w4gf6quDWQ= X-Google-Smtp-Source: ABdhPJxHN/e0gwe58rPP7AvDZ0mS8f0H49f0/vRlMql33cz9WrmSqDSm8IkxqzQcQiCQJ9jKLagvGQ== X-Received: by 2002:adf:a1d3:: with SMTP id v19mr8001582wrv.245.1592394628661; Wed, 17 Jun 2020 04:50:28 -0700 (PDT) Received: from pszemus-legion.localdomain (83.8.242.137.ipv4.supernova.orange.pl. [83.8.242.137]) by smtp.gmail.com with ESMTPSA id g3sm37520928wrb.46.2020.06.17.04.50.27 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 17 Jun 2020 04:50:27 -0700 (PDT) From: =?utf-8?q?Przemys=C5=82aw_Sobala?= To: ffmpeg-devel@ffmpeg.org Date: Wed, 17 Jun 2020 13:50:12 +0200 Message-Id: <20200617115012.5548-1-przemyslaw.sobala@gmail.com> X-Mailer: git-send-email 2.25.4 In-Reply-To: <5543EB3B-6F45-442D-B9EF-E3C1E7C7E3A7@akamai.com> References: <5543EB3B-6F45-442D-B9EF-E3C1E7C7E3A7@akamai.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 2/2] avformat/dashenc: Calculate average bitrate for adaptation sets in static manifest 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: =?utf-8?q?Przemys=C5=82aw_Sobala?= Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" If stream's bitrate is not specified: - for static manifest: an average bitrate will be calculated and used, - for dynamic manifest: first segment's bitrate will be calculated and used, as before, for bandwidth setting in adaptation sets. --- libavformat/dashenc.c | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/libavformat/dashenc.c b/libavformat/dashenc.c index 05deb5c1b5..62193058d7 100644 --- a/libavformat/dashenc.c +++ b/libavformat/dashenc.c @@ -115,6 +115,7 @@ typedef struct OutputStream { int64_t last_dts, last_pts; int last_flags; int bit_rate; + int first_segment_bit_rate; SegmentType segment_type; /* segment type selected for this particular stream */ const char *format_name; const char *extension_name; @@ -840,8 +841,12 @@ static int write_adaptation_set(AVFormatContext *s, AVIOContext *out, int as_ind continue; if (os->bit_rate > 0) - snprintf(bandwidth_str, sizeof(bandwidth_str), " bandwidth=\"%d\"", - os->bit_rate); + snprintf(bandwidth_str, sizeof(bandwidth_str), " bandwidth=\"%d\"", os->bit_rate); + else if (final) { + int average_bit_rate = os->pos * 8 * AV_TIME_BASE / c->total_duration; + snprintf(bandwidth_str, sizeof(bandwidth_str), " bandwidth=\"%d\"", average_bit_rate); + } else if (os->first_segment_bit_rate > 0) + snprintf(bandwidth_str, sizeof(bandwidth_str), " bandwidth=\"%d\"", os->first_segment_bit_rate); if (as->media_type == AVMEDIA_TYPE_VIDEO) { avio_printf(out, "\t\t\tstreams[i]; char *agroup = NULL; char *codec_str_ptr = NULL; - int stream_bitrate = st->codecpar->bit_rate + os->muxer_overhead; + int stream_bitrate = os->muxer_overhead; + if (os->bit_rate > 0) + stream_bitrate += os->bit_rate; + else if (final) + stream_bitrate += os->pos * 8 * AV_TIME_BASE / c->total_duration; + else if (os->first_segment_bit_rate > 0) + stream_bitrate += os->first_segment_bit_rate; if (st->codecpar->codec_type != AVMEDIA_TYPE_VIDEO) continue; if (os->segment_type != SEGMENT_TYPE_MP4) @@ -1958,11 +1969,8 @@ static int dash_flush(AVFormatContext *s, int final, int stream) os->total_pkt_size = 0; os->total_pkt_duration = 0; - if (!os->bit_rate) { - // calculate average bitrate of first segment - int64_t bitrate = (int64_t) range_length * 8 * AV_TIME_BASE / duration; - if (bitrate >= 0) - os->bit_rate = bitrate; + if (!os->bit_rate && !os->first_segment_bit_rate) { + os->first_segment_bit_rate = (int64_t) range_length * 8 * AV_TIME_BASE / duration; } add_segment(os, os->filename, os->start_pts, os->max_pts - os->start_pts, os->pos, range_length, index_length, next_exp_index); av_log(s, AV_LOG_VERBOSE, "Representation %d media segment %d written to: %s\n", i, os->segment_index, os->full_path);