From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from ffbox0-bg.ffmpeg.org (ffbox0-bg.ffmpeg.org [79.124.17.100]) by master.gitmailbox.com (Postfix) with ESMTPS id 871DE4F450 for ; Wed, 18 Jun 2025 01:40:40 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.ffmpeg.org (Postfix) with ESMTP id A5E1968DD0E; Wed, 18 Jun 2025 04:39:38 +0300 (EEST) Received: from mail-pg1-f176.google.com (mail-pg1-f176.google.com [209.85.215.176]) by ffbox0-bg.ffmpeg.org (Postfix) with ESMTPS id F3D0B68DCDE for ; Wed, 18 Jun 2025 04:39:29 +0300 (EEST) Received: by mail-pg1-f176.google.com with SMTP id 41be03b00d2f7-b31bca0a32bso920373a12.2 for ; Tue, 17 Jun 2025 18:39:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1750210768; x=1750815568; darn=ffmpeg.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:from:to:cc:subject:date:message-id :reply-to; bh=B1A1ss9zXRr/LCpomk0qr8WdnVzWvjIlT7ge2mbHm5E=; b=OVZLjQHDzS7CfXZn4eO0nVcSuj5pNsl66XqrBW9NN1qwdGNSkOVCn96HWbPKNdEJTY kdLsTPvhRpwYronG6zOOnM27biDN/phlcyJSAKJOmPDznd4UUGm0yy+DE9/Y3FjPxluH bYYaRm1t7eHYYRMkXBVRzjK+1xmCIvE9R6ug7I1B09daQnBcSHigi0PsXqkgG9795zfM /MQYD48Sw5YPVSr/4goRtlLDkRMVrVzmT5AVdI7hCqlCQPpoTiju7CZ7LuzGCjf276nx ejMOMcXe+ArIGP2Q9sCxQVcJpRV1eXIGyq9u7fUyUfisIu/MND+d45cTbsbHSe0/cqSc 0MWQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1750210768; x=1750815568; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=B1A1ss9zXRr/LCpomk0qr8WdnVzWvjIlT7ge2mbHm5E=; b=Wf/fqF01zeuz6lguR759jhklkbuFdlRJnMCgjnaXsP9cg4AMD3T35YwhcO7QSYaNYh tB0vZG233KDN/G4g1lw8UQGExYVO7RFC5kno4NNZpEmqJr67uXzxMu4kMbBFWu0X91Mg kGsosEQ968hNK1ncPJzOgUU0OqIk7UzxO04EayaxSl2sLSsgyIMo+MAWlnluXsg5GFxM g8bx1zIYmxi1B0sGK5DeDrw1jZ8a5rEV81MNf1Oyg62jB6fxJ1ww86/Hme7A+CyULmHe VhHQZUYNop6tchU/OKaXfIEQWkAyuA7Y+uHjPr5c1bOEIzvLbkXYVeHHLwRKrRB3XqvM FY6g== X-Gm-Message-State: AOJu0YwBuKaIbdrtCpNrgF/HQMQ3gAYrJ5PzHPB0yG9f8QQwOCZvlFTM 1O/rBP77Y2SenJmtyGf86sU6RrpFA6j9mfQhQsqoLX4IMKEZBBqRSag2CsSKew== X-Gm-Gg: ASbGncuHaXpnS22SqtyrJh5O1ZZ+FcyJAYP2b2qjoFQ/FdiAz+gHcJws+RUnS7IxMy/ tH30H2XznhUquPHolTGBhuN2J+w2NZNTKalVccsw5rI9SZN93jQZwW3MwK2WXEQfv5eYXgTZnpx cZ7CPiCDjq8tT53RMcFGK1i/G93LD36aaI/Jz5cT+eUhWcTDnUL7XopfK21kDZtjOtFWDl6kS3d 7xNG2/reO4UGMZKrOAvZdopNoI4wrQRgoEfzRStE2f8Jia3mqUPZ2by5MtCJt9fjT5vnzQyyImE mZxJlOY54CihrEaEr1U+v7egc6ezqkUIqeuwVab1QICnTHwUprHPrO5C/QA= X-Google-Smtp-Source: AGHT+IFgIp7PcRcn+k45TqmjueboZwiySr6piwunn0uu9N5dyBS9BYNgf1rAie6GP6PxOq1KsfFYGw== X-Received: by 2002:a05:6a21:700c:b0:21f:39c7:2b58 with SMTP id adf61e73a8af0-21fbd8008admr24144083637.41.1750210767536; Tue, 17 Jun 2025 18:39:27 -0700 (PDT) Received: from Gryph ([2800:2121:b000:82e:746f:8b87:8ec9:3872]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-748e566bee6sm431865b3a.127.2025.06.17.18.39.26 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 17 Jun 2025 18:39:27 -0700 (PDT) From: James Almer To: ffmpeg-devel@ffmpeg.org Date: Tue, 17 Jun 2025 22:39:02 -0300 Message-ID: <20250618013904.15638-7-jamrial@gmail.com> X-Mailer: git-send-email 2.50.0 In-Reply-To: <20250618013904.15638-1-jamrial@gmail.com> References: <20250618013904.15638-1-jamrial@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 7/9] avformat/iamf_writer: add extra constrains for Parameter Sets in Audio Elements X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 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 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Archived-At: List-Archive: List-Post: Signed-off-by: James Almer --- libavformat/iamf_writer.c | 40 ++++++++++++++++++++++++++++++++------- 1 file changed, 33 insertions(+), 7 deletions(-) diff --git a/libavformat/iamf_writer.c b/libavformat/iamf_writer.c index 635d1989ef..37e75dc01a 100644 --- a/libavformat/iamf_writer.c +++ b/libavformat/iamf_writer.c @@ -248,6 +248,11 @@ int ff_iamf_add_audio_element(IAMFContext *iamf, const AVStreamGroup *stg, void } else { AVBPrint bp; + if (iamf_audio_element->nb_layers < 1) { + av_log(log_ctx, AV_LOG_ERROR, "Invalid amount of layers for CHANNEL_BASED audio element. Must be >= 1\n"); + return AVERROR(EINVAL); + } + for (int j, i = 0; i < iamf_audio_element->nb_layers; i++) { const AVIAMFLayer *layer = iamf_audio_element->layers[i]; @@ -741,13 +746,40 @@ static int iamf_write_audio_element(const IAMFContext *iamf, for (int i = 0; i < audio_element->nb_substreams; i++) ffio_write_leb(dyn_bc, audio_element->substreams[i].audio_substream_id); - if (element->nb_layers == 1) + /* When audio_element_type = 1, num_parameters SHALL be set to 0 */ + if (element->audio_element_type == AV_IAMF_AUDIO_ELEMENT_TYPE_SCENE) + param_definition_types = 0; + else { + int layout = 0, expanded_layout = 0; + get_loudspeaker_layout(element->layers[0], &layout, &expanded_layout); + /* When the loudspeaker_layout = 15, the type PARAMETER_DEFINITION_DEMIXING SHALL NOT be present. */ + if (layout == 15) + param_definition_types &= ~AV_IAMF_PARAMETER_DEFINITION_DEMIXING; + /* When the loudspeaker_layout of the (non-)scalable channel audio (i.e., num_layers = 1) is less than or equal to 3.1.2ch, + * (i.e., Mono, Stereo, or 3.1.2ch), the type PARAMETER_DEFINITION_DEMIXING SHALL NOT be present. */ + else if (element->nb_layers == 1 && (layout == 0 || layout == 1 || layout == 8)) param_definition_types &= ~AV_IAMF_PARAMETER_DEFINITION_DEMIXING; + /* When num_layers > 1, the type PARAMETER_DEFINITION_RECON_GAIN SHALL be present */ if (element->nb_layers > 1) param_definition_types |= AV_IAMF_PARAMETER_DEFINITION_RECON_GAIN; + /* When codec_id = fLaC or ipcm, the type PARAMETER_DEFINITION_RECON_GAIN SHALL NOT be present. */ if (codec_config->codec_tag == MKTAG('f','L','a','C') || codec_config->codec_tag == MKTAG('i','p','c','m')) param_definition_types &= ~AV_IAMF_PARAMETER_DEFINITION_RECON_GAIN; + if ((param_definition_types & AV_IAMF_PARAMETER_DEFINITION_DEMIXING) && !element->demixing_info) { + if (element->nb_layers > 1) { + get_loudspeaker_layout(element->layers[element->nb_layers-1], &layout, &expanded_layout); + /* When the highest loudspeaker_layout of the scalable channel audio (i.e., num_layers > 1) is greater than 3.1.2ch, + * (i.e., 5.1.2ch, 5.1.4ch, 7.1.2ch, or 7.1.4ch), type PARAMETER_DEFINITION_DEMIXING SHALL be present. */ + if (layout == 3 && layout == 4 && layout == 6 && layout == 7) { + av_log(log_ctx, AV_LOG_ERROR, "demixing_info needed but not set in Stream Group #%u\n", + audio_element->audio_element_id); + return AVERROR(EINVAL); + } + } + param_definition_types &= ~AV_IAMF_PARAMETER_DEFINITION_DEMIXING; + } + } ffio_write_leb(dyn_bc, av_popcount(param_definition_types)); // num_parameters @@ -756,12 +788,6 @@ static int iamf_write_audio_element(const IAMFContext *iamf, const IAMFParamDefinition *param_def; const AVIAMFDemixingInfo *demix; - if (!param) { - av_log(log_ctx, AV_LOG_ERROR, "demixing_info needed but not set in Stream Group #%u\n", - audio_element->audio_element_id); - return AVERROR(EINVAL); - } - demix = av_iamf_param_definition_get_subblock(param, 0); ffio_write_leb(dyn_bc, AV_IAMF_PARAMETER_DEFINITION_DEMIXING); // type -- 2.50.0 _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".