From patchwork Wed Jun 17 10:53:59 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: 20433 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 D78B4444EC4 for ; Wed, 17 Jun 2020 14:02:29 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id A682D68B319; Wed, 17 Jun 2020 14:02:29 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wm1-f46.google.com (mail-wm1-f46.google.com [209.85.128.46]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 083D368B08F for ; Wed, 17 Jun 2020 14:02:23 +0300 (EEST) Received: by mail-wm1-f46.google.com with SMTP id t194so1512323wmt.4 for ; Wed, 17 Jun 2020 04:02:23 -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=O6KNQtF122Prprvbi0dmUbySksxVaqwGnFJJ7YCa98E=; b=jrW8CcXl8KlT1FhpQGMLFnm0wQE9ZH4tIksi5Jdb6EYnQDgPDrRrvJPumXS6atukp/ ozxDWcJ0zjcJ24f0KzLYmJqDahj7Dg3+hEfaJc4rsYT0I5b29UXwMJUsQB/3E6wdJ2CD zZbJw5TJMOvQwPxoCPgjG9a74ms9DzJufZ8WDI0jAHfVx+Ze4So7mdoISl1ENOd+eYkY rKgMPvUfeZXTWCJvN1r7b5sFTMDQ9qnLmBIvjqDx0Ie1zFDPnqv3Dw8Acb5ZIVejhVV+ v6YtjSXLL4m7co6swPuHRl68CrvrEVe/WHHrvAAhkCWid5efQENpJhgUXuIi3nZ1PJse 2xKA== 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=O6KNQtF122Prprvbi0dmUbySksxVaqwGnFJJ7YCa98E=; b=gLBABGJ2Vag/VxupRhVCRye2WrH6eyX4cehq9JWwuk4hLc5IP/AVmc4v2PkW4faY6m ibjed/lri8dR22m6mvcaIR+NVzF7TZVLaRX4sXFzB8t0UcRLzLLgOV9oaxie9/uTxjs0 d6DXaku/cJBVrYQCxfxa85IhrRIIH5k06poiaWZ14ornDqk3IzSwsfgQ8BHbHHIaFMKR g08UVRdX1Gw+EAUXnlxLyP2dY4J9kwpyy/Z0YusAwLZOZy0sR1cAKsEZw52OqZRvykL7 ClDPErKXQ3+xSbXYZpkbeLQ0aelucq32LfVoRC000PldHf6h3Tpe+fnCpCySjUEqAPye hjzQ== X-Gm-Message-State: AOAM530qTSYNYESqDTsD2GEsxKDRJcjlsCfNXyxi4IRqMenhJxvJPabs fbLIOBavylG0zzo6R582gw4huYmnSUg= X-Google-Smtp-Source: ABdhPJyVEvuNNmApn+9jm7Drz31joe9tyzAYDDwTe47E4UoH5IKJ76aqCJ12j/nDaIcKPDUhyaAImQ== X-Received: by 2002:a1c:7215:: with SMTP id n21mr7830253wmc.10.1592391247195; Wed, 17 Jun 2020 03:54:07 -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 t8sm7578843wmi.46.2020.06.17.03.54.06 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 17 Jun 2020 03:54:06 -0700 (PDT) From: =?utf-8?q?Przemys=C5=82aw_Sobala?= To: ffmpeg-devel@ffmpeg.org Date: Wed, 17 Jun 2020 12:53:59 +0200 Message-Id: <20200617105359.4418-1-przemyslaw.sobala@gmail.com> X-Mailer: git-send-email 2.25.4 In-Reply-To: References: 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 | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/libavformat/dashenc.c b/libavformat/dashenc.c index 05deb5c1b5..20edc9779c 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) @@ -1959,10 +1970,10 @@ static int dash_flush(AVFormatContext *s, int final, int stream) 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; + // calculate average bitrate + int64_t segment_bitrate = (int64_t) range_length * 8 * AV_TIME_BASE / duration; + if (!os->first_segment_bit_rate && segment_bitrate) + os->first_segment_bit_rate = segment_bitrate; } 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);