From patchwork Mon Sep 21 17:29:44 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?Jan_Ekstr=C3=B6m?= X-Patchwork-Id: 22553 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 EE9CF44B573 for ; Mon, 21 Sep 2020 20:29:59 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id D299268B61F; Mon, 21 Sep 2020 20:29:59 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-lf1-f65.google.com (mail-lf1-f65.google.com [209.85.167.65]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 43BBD68064D for ; Mon, 21 Sep 2020 20:29:52 +0300 (EEST) Received: by mail-lf1-f65.google.com with SMTP id x69so14940329lff.3 for ; Mon, 21 Sep 2020 10:29:52 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=DEXiqXooOAS8jz5XKvaW01v4iMQIK/uJ6loczLv632E=; b=Wbjee+BDlGNDUXi9RjNi+IfoySnnBaJlY0k6DFUEOorwW+v7C+AVhjCfbCRz5m8azk brk+XqaW8MJkOxUyO9Y5e27+yPdTeVBQSUqcyAW3hZLEQNm/UUoPViBB5gv1uumWmIZ+ gMwie31wf+YM3DvddtQ4zHUN7rP2QkHGg1VWJQgubGcn0OX8c2IALUTzBbjkef2YvaF4 uvLpJjYYhdg1ipcsxSAtwmTheNR8hOsYXqeMXHSQV5FwdMVsfaTpnR2rvLFhIU80pwdl pFlVL1wS778eR8neoC9VpyxEojGRnyOkBo8SLBrov10EkP2pPpQa/UOC22UX18izTXPC ZJ4w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=DEXiqXooOAS8jz5XKvaW01v4iMQIK/uJ6loczLv632E=; b=kzjFjytSAN0ryaTM9rsf7tSu4bkGFOK2aiZIlN5yeKMug7rp2IVg4EOKGnlwesXMK9 XB+VZup+8edeWcqYX8qgGNtGmCSWZDDF5Vw5AbM6oSevhZZmcRnCU1KqDOjuWCn7Wvdg vpCPjw6UJ9WbGtqJGqNNWgYnf4WYVbg+YqXrK5HAJ+Ae6YFBjy2tLnzjI4IRc15YI4HA WBPsH3OUVQ+oup4lLKcKzL0ifjMaL7a92EGR6w+lvJrmyTtf5FI0B/cs+39pKMRgcRK5 1DQlbHlRANAPWbufdK/6DsnS0wBTMpQBYtdTjL4Ud4KlyQH4d0LdDe/Ti2DfiarAtTcC dWsg== X-Gm-Message-State: AOAM5319W0lubhHVo7TrRKcpacwVCCGTL8koG/FRxCv0fsqzDgjKg954 BpViiTsUQaHxJJ5KaueFJXvWQpIkew4= X-Google-Smtp-Source: ABdhPJwoas2+P0aJref0abOKKgWVnwdPLV4D+BJ/K+oIwepV5v9jlgK7U3UneEKejk7ErgYU8Inz5w== X-Received: by 2002:a19:9cc:: with SMTP id 195mr299976lfj.444.1600709391102; Mon, 21 Sep 2020 10:29:51 -0700 (PDT) Received: from localhost.localdomain (91-159-194-103.elisa-laajakaista.fi. [91.159.194.103]) by smtp.gmail.com with ESMTPSA id f27sm2711928lfh.45.2020.09.21.10.29.50 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 21 Sep 2020 10:29:50 -0700 (PDT) From: =?utf-8?q?Jan_Ekstr=C3=B6m?= To: ffmpeg-devel@ffmpeg.org Date: Mon, 21 Sep 2020 20:29:44 +0300 Message-Id: <20200921172948.32440-2-jeebjp@gmail.com> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20200921172948.32440-1-jeebjp@gmail.com> References: <20200920170629.26504-1-jeebjp@gmail.com> <20200921172948.32440-1-jeebjp@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v2 1/5] avformat/movenc: split MPEG-4 bit rate value calculation 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" This can now be re-utilized in other places. --- libavformat/movenc.c | 44 ++++++++++++++++++++++++++++++++++---------- 1 file changed, 34 insertions(+), 10 deletions(-) diff --git a/libavformat/movenc.c b/libavformat/movenc.c index 12471c7d68..5888d10770 100644 --- a/libavformat/movenc.c +++ b/libavformat/movenc.c @@ -633,12 +633,41 @@ static unsigned compute_avg_bitrate(MOVTrack *track) return size * 8 * track->timescale / track->track_duration; } +struct mpeg4_bit_rate_values { + uint32_t buffer_size; ///< Size of the decoding buffer for the elementary stream in bytes. + uint32_t max_bit_rate; ///< Maximum rate in bits/second over any window of one second. + uint32_t avg_bit_rate; ///< Average rate in bits/second over the entire presentation. +}; + +static struct mpeg4_bit_rate_values calculate_mpeg4_bit_rates(MOVTrack *track) +{ + AVCPBProperties *props = + (AVCPBProperties*)av_stream_get_side_data(track->st, + AV_PKT_DATA_CPB_PROPERTIES, + NULL); + struct mpeg4_bit_rate_values bit_rates = { 0 }; + + bit_rates.avg_bit_rate = compute_avg_bitrate(track); + + // (FIXME should be max rate in any 1 sec window) + bit_rates.max_bit_rate = FFMAX(track->par->bit_rate, + bit_rates.avg_bit_rate); + + // utilize values from properties if we have them available + if (props) { + bit_rates.max_bit_rate = FFMAX(bit_rates.max_bit_rate, + props->max_bitrate); + bit_rates.buffer_size = props->buffer_size / 8; + } + + return bit_rates; +} + static int mov_write_esds_tag(AVIOContext *pb, MOVTrack *track) // Basic { - AVCPBProperties *props; + struct mpeg4_bit_rate_values bit_rates = calculate_mpeg4_bit_rates(track); int64_t pos = avio_tell(pb); int decoder_specific_info_len = track->vos_len ? 5 + track->vos_len : 0; - unsigned avg_bitrate; avio_wb32(pb, 0); // size ffio_wfourcc(pb, "esds"); @@ -669,14 +698,9 @@ static int mov_write_esds_tag(AVIOContext *pb, MOVTrack *track) // Basic else avio_w8(pb, 0x11); // flags (= Visualstream) - props = (AVCPBProperties*)av_stream_get_side_data(track->st, AV_PKT_DATA_CPB_PROPERTIES, - NULL); - - avio_wb24(pb, props ? props->buffer_size / 8 : 0); // Buffersize DB - - avg_bitrate = compute_avg_bitrate(track); - avio_wb32(pb, props ? FFMAX3(props->max_bitrate, props->avg_bitrate, avg_bitrate) : FFMAX(track->par->bit_rate, avg_bitrate)); // maxbitrate (FIXME should be max rate in any 1 sec window) - avio_wb32(pb, avg_bitrate); + avio_wb24(pb, bit_rates.buffer_size); // Buffersize DB + avio_wb32(pb, bit_rates.max_bit_rate); // maxbitrate + avio_wb32(pb, bit_rates.avg_bit_rate); if (track->vos_len) { // DecoderSpecific info descriptor