From patchwork Fri Mar 3 08:38:28 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Przemys=C5=82aw_Sobala?= X-Patchwork-Id: 2744 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.103.31.14 with SMTP id f14csp149403vsf; Fri, 3 Mar 2017 00:45:59 -0800 (PST) X-Received: by 10.28.187.213 with SMTP id l204mr1801669wmf.104.1488530759588; Fri, 03 Mar 2017 00:45:59 -0800 (PST) Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id m89si2030035wmh.34.2017.03.03.00.45.59; Fri, 03 Mar 2017 00:45:59 -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=@gmail.com; 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; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=gmail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 6A600688253; Fri, 3 Mar 2017 10:45:45 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-lf0-f67.google.com (mail-lf0-f67.google.com [209.85.215.67]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 2FF21680D2C for ; Fri, 3 Mar 2017 10:45:39 +0200 (EET) Received: by mail-lf0-f67.google.com with SMTP id v2so1267780lfi.2 for ; Fri, 03 Mar 2017 00:45:50 -0800 (PST) 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=PeMzCud6ACUyl9/EoL/IPT33KbeqVCSITtt3JcMEZGI=; b=BGXTG7nlHCM7wRjTPCpgLqZQm+iESayJP8DI0SNg1NiL8s8Vd34N0z8HDCtTRZ6ty8 4ApS/QOdtNIHH/zg8RWBEp0C72QA+M/yvOUJy7hQhGFup2eTpns8Pl4SKSFNjvpmdYb7 DP11rZeDA4e+Jk6PQxBSOlv7HJ0Z/q35k2kOr9BI24CcjLiF1PqpZtC/SUQJKy24dw4D H0j6UKgNlOGD9qmVDa66XiURRA8i5Pat/zchG6sCJGlG8WM6lBmOQie6EeeSf67CH+pP FQY/Y5Dc5pgh41AvK1e7RJSJxMOwA8oDDg/O0f9VnmKJhifqOSEv/bEcofz8B6eKMWTt VfAQ== 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=PeMzCud6ACUyl9/EoL/IPT33KbeqVCSITtt3JcMEZGI=; b=E99bIYaXmTq4pa5hvP4/w1r58LBQbpoWhako7wvu6kNtoTHUlZSKVdcBtEABG1w0HH eWnJgPxLxhAbHn14afs8J1/SEKME1PztcpPBtmOVv6Rw4KNh46RrUcBfvWU1Qc7R0fYC sxz0LG7AfsLG3icfbDX/qDb/cRayq8W0NLuqrBveiqgfDlfmGkYiqqA3SuOvLRyLH0VP m4kjvF66VuOvAzlEebCu3pAPkztwgSmmGj3Pr5b1YvrWD9XdPAu93pR1cc2xCiCW2Tic jI0L0V8VA28+K6FbuUsC7AwHnE+BvGgjUHul7zEOByhfo6y3GWbt7O79FpQ+ifLdjfmi BuKg== X-Gm-Message-State: AMke39mQBzw/uyPgreICF01bFGj5mCF5gJpblnR29pbt9taWDEy7QMl0tDMceXX2LP2pmA== X-Received: by 10.46.21.13 with SMTP id s13mr535581ljd.83.1488530316994; Fri, 03 Mar 2017 00:38:36 -0800 (PST) Received: from pszemus.t1.gda.wp-sa.pl (it.wp-sa.pl. [212.77.105.136]) by smtp.gmail.com with ESMTPSA id f137sm2158818lff.21.2017.03.03.00.38.36 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 03 Mar 2017 00:38:36 -0800 (PST) From: "=?UTF-8?q?Przemys=C5=82aw=20Sobala?=" X-Google-Original-From: =?UTF-8?q?Przemys=C5=82aw=20Sobala?= To: ffmpeg-devel@ffmpeg.org Date: Fri, 3 Mar 2017 09:38:28 +0100 Message-Id: <1488530308-3488-1-git-send-email-przemyslaw.sobala@grupawp.pl> X-Mailer: git-send-email 2.7.4 In-Reply-To: <20170302225603.GJ5776@nb4> References: <20170302225603.GJ5776@nb4> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH] lavf/dashenc: update bitrates on dash_write_trailer 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=20Sobala?= Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" From: Przemysław Sobala Provides a way to change bandwidth parameter inside DASH manifest after a non-CBR H.264 encoding. Caller now is able to compute the bitrate by itself, after all packets have been written, and then set that value in AVFormatContext->streams->codecpar->bit_rate before calling av_write_trailer. As a result that value will be set in DASH manifest. --- libavformat/dashenc.c | 42 ++++++++++++++++++++++++++++++------------ 1 file changed, 30 insertions(+), 12 deletions(-) diff --git a/libavformat/dashenc.c b/libavformat/dashenc.c index fa56505..011d2ea 100644 --- a/libavformat/dashenc.c +++ b/libavformat/dashenc.c @@ -561,6 +561,30 @@ static int write_manifest(AVFormatContext *s, int final) return 0; } +static int set_bitrate(AVFormatContext *s) +{ + DASHContext *c = s->priv_data; + int i; + + for (i = 0; i < s->nb_streams; i++) { + OutputStream *os = &c->streams[i]; + + os->bit_rate = s->streams[i]->codecpar->bit_rate; + if (os->bit_rate) { + snprintf(os->bandwidth_str, sizeof(os->bandwidth_str), + " bandwidth=\"%d\"", os->bit_rate); + } else { + int level = s->strict_std_compliance >= FF_COMPLIANCE_STRICT ? + AV_LOG_ERROR : AV_LOG_WARNING; + av_log(s, level, "No bit rate set for stream %d\n", i); + if (s->strict_std_compliance >= FF_COMPLIANCE_STRICT) + return AVERROR(EINVAL); + } + } + + return 0; +} + static int dash_init(AVFormatContext *s) { DASHContext *c = s->priv_data; @@ -597,6 +621,10 @@ static int dash_init(AVFormatContext *s) if (!c->streams) return AVERROR(ENOMEM); + ret = set_bitrate(s); + if (ret < 0) + return ret; + for (i = 0; i < s->nb_streams; i++) { OutputStream *os = &c->streams[i]; AVFormatContext *ctx; @@ -604,18 +632,6 @@ static int dash_init(AVFormatContext *s) AVDictionary *opts = NULL; char filename[1024]; - os->bit_rate = s->streams[i]->codecpar->bit_rate; - if (os->bit_rate) { - snprintf(os->bandwidth_str, sizeof(os->bandwidth_str), - " bandwidth=\"%d\"", os->bit_rate); - } else { - int level = s->strict_std_compliance >= FF_COMPLIANCE_STRICT ? - AV_LOG_ERROR : AV_LOG_WARNING; - av_log(s, level, "No bit rate set for stream %d\n", i); - if (s->strict_std_compliance >= FF_COMPLIANCE_STRICT) - return AVERROR(EINVAL); - } - ctx = avformat_alloc_context(); if (!ctx) return AVERROR(ENOMEM); @@ -981,6 +997,8 @@ static int dash_write_trailer(AVFormatContext *s) { DASHContext *c = s->priv_data; + set_bitrate(s); + if (s->nb_streams > 0) { OutputStream *os = &c->streams[0]; // If no segments have been written so far, try to do a crude