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 From patchwork Mon Sep 21 17:29:47 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: 22554 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 AA7DB44B844 for ; Mon, 21 Sep 2020 20:30:04 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 8E7F468B6CB; Mon, 21 Sep 2020 20:30:04 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-lj1-f194.google.com (mail-lj1-f194.google.com [209.85.208.194]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 1E0B768B678 for ; Mon, 21 Sep 2020 20:29:56 +0300 (EEST) Received: by mail-lj1-f194.google.com with SMTP id k25so11820999ljk.0 for ; Mon, 21 Sep 2020 10:29:56 -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=/qU3kCa9r3awczLoT+kojtbCg8QJ2pRZY4kABNzYfp4=; b=SN7jbyTAMo3FhBA4fM8wOGtptVuzfhpwK6lMw8iAKDQE5TantANJLtGq+mRdBOObwg G4YPmAga/TF5mnNi9cZpR5zD+H/cszErco6Pk2n2hb4JpFax9W6VkhJkm1A7JnYAAKAl bggyGTboYdZg57A5G/+qv2WqORisSOVF1d91qS3hqXBIQWuo+uI3vpC6CJ0gvOwXfN35 LWqZuaWMBVKecYsrxtmMBJ1sVw2s7huXFvEFQajYEB+KYCPDlTSMCy6l8gouJNKbB5Ud JsvYTGPEYo34fb22j71iS1iNmIVnvD5UlbFtqfTMTD8EqhfTrp/lMRBE8YC4sXckKoJx M6KQ== 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=/qU3kCa9r3awczLoT+kojtbCg8QJ2pRZY4kABNzYfp4=; b=BmXx5ny3lWpyhPb5SL+bHr41ny2KFtpa5Y2DBwAXD33sJyhz8HzRDQxncx+4gYwsZz 7Ntm3n9zuoHYblsLzluFRrOQpy5qMAhzwErMO9lhJXhBobOiHyt/b2oXc74+R7mW+akQ DvWyLI7EDl6/nHBqHXb9r9RGnzR/8yTjZupPTsu7MXn/aPxB6wWIOiHx8n9TdbWDUXho i1iDeN9ckmjT9JXZd1j5NTRLJDCJO2Na7pUWfaeAU0g9lzANuLoSjzcLuZurtNyn/yGJ HhhyUROmF1a5cmmD8G12IYq6Qs/dkpufgd16z1ooX4M9+48X1duBnX1fCrPCi0ZX7WdH PU7w== X-Gm-Message-State: AOAM531PElfzDa7gWzIEXqjpCNO1pbHJGg8k4rVmG4xhPjlMvNUGLl1J AitgJv/i7/srugzwqb+azCNwFO2RGxY= X-Google-Smtp-Source: ABdhPJyT7PintVZtYeXoodgqS4pzdVZ8dy2elPOhwX0GIRFOcthqJtS97LcqUmHDsLSzwFhIIOPv/A== X-Received: by 2002:a05:651c:1128:: with SMTP id e8mr244226ljo.436.1600709394531; Mon, 21 Sep 2020 10:29:54 -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.53 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 21 Sep 2020 10:29:53 -0700 (PDT) From: =?utf-8?q?Jan_Ekstr=C3=B6m?= To: ffmpeg-devel@ffmpeg.org Date: Mon, 21 Sep 2020 20:29:47 +0300 Message-Id: <20200921172948.32440-5-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 4/5] avformat/movenc: use more fall-back values for average bit rate fields 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 the average bit rate cannot be calculated, such as in the case of streamed fragmented mp4, utilize various available parameters in priority order. Tests are updated where the esds or btrt or ISML manifest boxes' output changes. --- libavformat/movenc.c | 17 +++++++++++++++++ tests/ref/lavf/ismv | 6 +++--- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/libavformat/movenc.c b/libavformat/movenc.c index 76fb251fa8..860e331b19 100644 --- a/libavformat/movenc.c +++ b/libavformat/movenc.c @@ -648,6 +648,23 @@ static struct mpeg4_bit_rate_values calculate_mpeg4_bit_rates(MOVTrack *track) struct mpeg4_bit_rate_values bit_rates = { 0 }; bit_rates.avg_bit_rate = compute_avg_bitrate(track); + if (!bit_rates.avg_bit_rate) { + // if the average bit rate cannot be calculated at this point, such as + // in the case of fragmented MP4, utilize the following values as + // fall-back in priority order: + // + // 1. average bit rate property + // 2. bit rate (usually average over the whole clip) + // 3. maximum bit rate property + + if (props && props->avg_bitrate) { + bit_rates.avg_bit_rate = props->avg_bitrate; + } else if (track->par->bit_rate) { + bit_rates.avg_bit_rate = track->par->bit_rate; + } else if (props && props->max_bitrate) { + bit_rates.avg_bit_rate = props->max_bitrate; + } + } // (FIXME should be max rate in any 1 sec window) bit_rates.max_bit_rate = FFMAX(track->par->bit_rate, diff --git a/tests/ref/lavf/ismv b/tests/ref/lavf/ismv index e7361705fa..ac7f72ba33 100644 --- a/tests/ref/lavf/ismv +++ b/tests/ref/lavf/ismv @@ -1,9 +1,9 @@ -4c6bc5ac805a76bbbd886a69d2e61554 *tests/data/lavf/lavf.ismv +48fb8d7a5d19bd60f3a49ccf4b7d6593 *tests/data/lavf/lavf.ismv 313169 tests/data/lavf/lavf.ismv tests/data/lavf/lavf.ismv CRC=0x9d9a638a -18678627921460328ea3fed238d0d57d *tests/data/lavf/lavf.ismv +d19cd8e310a2e94fe0a0d11c5dc29217 *tests/data/lavf/lavf.ismv 322075 tests/data/lavf/lavf.ismv tests/data/lavf/lavf.ismv CRC=0xe8130120 -b9a858caf55b1eff2273e746e9f72dc4 *tests/data/lavf/lavf.ismv +3b6023766845b51b075aed474c00f73c *tests/data/lavf/lavf.ismv 312546 tests/data/lavf/lavf.ismv tests/data/lavf/lavf.ismv CRC=0x9d9a638a From patchwork Mon Sep 21 17:29:48 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: 22555 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 79C6544BA07 for ; Mon, 21 Sep 2020 20:30:05 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 60C5D68B74D; Mon, 21 Sep 2020 20:30:05 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-lf1-f68.google.com (mail-lf1-f68.google.com [209.85.167.68]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 8563668B678 for ; Mon, 21 Sep 2020 20:29:56 +0300 (EEST) Received: by mail-lf1-f68.google.com with SMTP id m5so14943058lfp.7 for ; Mon, 21 Sep 2020 10:29:56 -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=qmLl33Q5QRvoJdGRlXJ2eqq4aqH3AqC61oIb4VpuTkk=; b=pVWh9eqCYyrX+HktAes/UjszodQORRWZpXx36XgjXhogDBJSigAVYmgQxYKdi+7Beu Pwqvh9bMX8cxdLUiHyD2pIZBCJf6v+sD31Hq684tmfZTy29d9TZKfko/dMSnB9UofxNf 4uhqYDZaMcR8XF3K/IkWW2IT4fAiy2jS+TJ7IS3JBlih8DxhcrW3rjDqmWqfn7lEwrTm eby2DsdS0H3VokAyttpHd7G+caTTXL5sX9FhpQ2fNGy7wfaKbeIF57XlbNnkqQ0qsUXv l5QvSlLztwE4P3802Tq66JZBcmb3rr18gYWheLXqv/vqnx/EgJGEWLlpsl8X321Pbk6/ 7qrw== 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=qmLl33Q5QRvoJdGRlXJ2eqq4aqH3AqC61oIb4VpuTkk=; b=lj2JYm5HpAezC8qZXMv3FYL67iB113TibVFMa9Uj8WOhv5XOr/H2i4mVXhXmXbtoJ5 eHhxRUpuaX4XuAsKI4yPFFw6INvsWZaMTOMj0+RhicAXgU8oU2vYu5NwG+B7SOA8Pv2R JbeF2/ugGnVPLkiqi3RoFRsh2HSdH7pSpcqTPbqrUZfkyUdrrAnvy32vB3Cc0Gtxrj1c MguuhwQco4iuks6b0zRRwXo4brkmmmMSnf8zkXirJhRv5uP0P/Y+l5AVpdTmnM/G10F9 daLdOJOiy8pApZ7D7B4jspAf4uD6Xy3Q5tTJLElJwdXsh9WaOKVN0xaJSVuTbICePm6D Jipw== X-Gm-Message-State: AOAM532mKhm0XaPdnOI3NJKU22Nfy6juE1F+ggPx9/kMiAZs6IaU+31C pkYSDpcFjCJ93jfmn/9Auiu5j5QiJ1o= X-Google-Smtp-Source: ABdhPJwpKvT6DN+3oB8NfrsgHLi9Vp/vVf7XdMnc0/3fE/JXDG9CVKkILr3cKM30eRihVD13PJQngw== X-Received: by 2002:a19:494b:: with SMTP id l11mr366727lfj.462.1600709395478; Mon, 21 Sep 2020 10:29:55 -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.54 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 21 Sep 2020 10:29:54 -0700 (PDT) From: =?utf-8?q?Jan_Ekstr=C3=B6m?= To: ffmpeg-devel@ffmpeg.org Date: Mon, 21 Sep 2020 20:29:48 +0300 Message-Id: <20200921172948.32440-6-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 5/5] avformat/movenc: simplify ISML manifest bit rate logic 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" The newly calculated average bit rate value is pretty much what is being done here. --- libavformat/movenc.c | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/libavformat/movenc.c b/libavformat/movenc.c index 860e331b19..20768cd45f 100644 --- a/libavformat/movenc.c +++ b/libavformat/movenc.c @@ -4209,7 +4209,6 @@ static int mov_write_isml_manifest(AVIOContext *pb, MOVMuxContext *mov, AVFormat { int64_t pos = avio_tell(pb); int i; - int64_t manifest_bit_rate = 0; static const uint8_t uuid[] = { 0xa5, 0xd4, 0x0b, 0x30, 0xe8, 0x14, 0x11, 0xdd, @@ -4252,15 +4251,9 @@ static int mov_write_isml_manifest(AVIOContext *pb, MOVMuxContext *mov, AVFormat continue; } - if (track->par->bit_rate) { - manifest_bit_rate = track->par->bit_rate; - } else { - manifest_bit_rate = bit_rates.max_bit_rate; - } - - avio_printf(pb, "<%s systemBitrate=\"%"PRId64"\">\n", type, - manifest_bit_rate); - param_write_int(pb, "systemBitrate", manifest_bit_rate); + avio_printf(pb, "<%s systemBitrate=\"%"PRIu32"\">\n", type, + bit_rates.avg_bit_rate); + param_write_int(pb, "systemBitrate", bit_rates.avg_bit_rate); param_write_int(pb, "trackID", track_id); param_write_string(pb, "systemLanguage", lang ? lang->value : "und");