From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by master.gitmailbox.com (Postfix) with ESMTP id A306448F25 for ; Thu, 29 Feb 2024 17:41:45 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 415D768D1E9; Thu, 29 Feb 2024 19:41:42 +0200 (EET) Received: from mail-pf1-f173.google.com (mail-pf1-f173.google.com [209.85.210.173]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 7E39B68D068 for ; Thu, 29 Feb 2024 19:41:36 +0200 (EET) Received: by mail-pf1-f173.google.com with SMTP id d2e1a72fcca58-6e59bbdd8c7so685628b3a.3 for ; Thu, 29 Feb 2024 09:41:36 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1709228494; x=1709833294; darn=ffmpeg.org; h=content-transfer-encoding:mime-version:message-id:date:subject:to :from:from:to:cc:subject:date:message-id:reply-to; bh=QLrzKS2NI2ul0wlz/ggcOQxe9ratRGCixIkCE+tJcpA=; b=nLTikjygvhuEo+pTjELAR//2g316YPzcdT4Ysi/9++Eycq6fNkzcYIzu7SM/RMRKIy M7ee3OwRZ+RtLsu8xVlsgJuujTaF5EwOoaPjodnvXQi5I/IqBfa/CN1f646/a5AzO1sb UbyDQ4kZ2S2YI/ZgtWZtjmBiEjdMoyY+3diem7MrBubqxjv8o7+OvVU7Rvl0op4s3ekB FvY1QWE0Y/TQGgFaHYY7x7U6mA/Ze6/GexILEFxaLGY6++Tp9KGAtXYjbzb3JDYeW5wG Mf0KbmdsXBBDtE8ycQK3fzYHdxzGvMiL+Gy3/7LlBNsL5iptgRmM1tMFbr7SMvVA2UqH Db3A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1709228494; x=1709833294; h=content-transfer-encoding:mime-version:message-id:date:subject:to :from:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=QLrzKS2NI2ul0wlz/ggcOQxe9ratRGCixIkCE+tJcpA=; b=EHfJdt90XhabOdQo9v1LV75cH3FE25xOyhYqaAXNYUG8k63xSV/nG8tOAbH8I8w83Z rYN0RG5kG+bDOAiC4PIQM7HsBT1xzbEB8BVVpMAkAyxNlJwx09vVawkLOInJ/O7JW38D OKSRMFYgxj/88cKm6MSk0qz7fUxHG6OWxiHpzRQ99EaHQ1nuDEZV4l1sPMxQTJg+Wcre jrfXFKacE/ATQVbYUYnJakN35UDVajmwO7WywTczsNnriV6uQxcxO9tjEqKBepKKhU+S zPEz3PucbTr5V+sw541zloyLEjHU4b+4j1CZmAGEJvaLfr0c0ThDSdqqv/US/OMxgT/B KVEQ== X-Gm-Message-State: AOJu0YwqeQyClPMWvVaVWVz7jKS0SGWEKeqgXExwGyUyUZvgWitc982b fIy9GxvIfj9UfX341yYBqlBtQWb43bqdjqX4jXmC7Uiqtbp9LV/TEuZpvsAV X-Google-Smtp-Source: AGHT+IEEr4mzWPqqx9t7GA8xUUps37jZsmLDaAb0ITYBeKqUtgGyAox7eMZQDiu69LnQAlDItxYpdA== X-Received: by 2002:aa7:9f0b:0:b0:6e5:696d:9eb8 with SMTP id g11-20020aa79f0b000000b006e5696d9eb8mr2750936pfr.3.1709228492719; Thu, 29 Feb 2024 09:41:32 -0800 (PST) Received: from localhost.localdomain ([190.194.169.124]) by smtp.gmail.com with ESMTPSA id jw40-20020a056a0092a800b006e563efb454sm1539060pfb.135.2024.02.29.09.41.31 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 29 Feb 2024 09:41:32 -0800 (PST) From: James Almer To: ffmpeg-devel@ffmpeg.org Date: Thu, 29 Feb 2024 14:41:21 -0300 Message-ID: <20240229174122.6696-1-jamrial@gmail.com> X-Mailer: git-send-email 2.44.0 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 1/2] avformat/iamf_writer: update extradata from packet side data 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: Some encoders, like flac, propagate updated extradata at the end of encoding as packet side data. Use it to update the relevant codec_config. Signed-off-by: James Almer --- libavformat/iamf.h | 13 +++++++++ libavformat/iamf_parse.c | 12 +-------- libavformat/iamf_writer.c | 35 ++++++++++++++++++++++--- tests/ref/fate/mov-mp4-iamf-5_1_4 | 14 +++++----- tests/ref/fate/mov-mp4-iamf-7_1_4 | 16 +++++------ tests/ref/fate/mov-mp4-iamf-ambisonic_1 | 10 +++---- tests/ref/fate/mov-mp4-iamf-stereo | 4 +-- 7 files changed, 68 insertions(+), 36 deletions(-) diff --git a/libavformat/iamf.h b/libavformat/iamf.h index d8715b7333..d662f6e76b 100644 --- a/libavformat/iamf.h +++ b/libavformat/iamf.h @@ -165,6 +165,19 @@ struct IAMFSoundSystemMap { extern const AVChannelLayout ff_iamf_scalable_ch_layouts[10]; extern const struct IAMFSoundSystemMap ff_iamf_sound_system_map[13]; +static inline IAMFCodecConfig *ff_iamf_get_codec_config(const IAMFContext *c, + unsigned int codec_config_id) +{ + IAMFCodecConfig *codec_config = NULL; + + for (int i = 0; i < c->nb_codec_configs; i++) { + if (c->codec_configs[i]->codec_config_id == codec_config_id) + codec_config = c->codec_configs[i]; + } + + return codec_config; +} + static inline IAMFParamDefinition *ff_iamf_get_param_definition(const IAMFContext *iamf, unsigned int parameter_id) { diff --git a/libavformat/iamf_parse.c b/libavformat/iamf_parse.c index 50b53aa5e9..cb49cf0a57 100644 --- a/libavformat/iamf_parse.c +++ b/libavformat/iamf_parse.c @@ -580,16 +580,6 @@ static int param_parse(void *s, IAMFContext *c, AVIOContext *pb, return 0; } -static IAMFCodecConfig *get_codec_config(IAMFContext *c, unsigned int codec_config_id) -{ - for (int i = 0; i < c->nb_codec_configs; i++) { - if (c->codec_configs[i]->codec_config_id == codec_config_id) - return c->codec_configs[i]; - } - - return NULL; -} - static int audio_element_obu(void *s, IAMFContext *c, AVIOContext *pb, int len) { const IAMFCodecConfig *codec_config; @@ -627,7 +617,7 @@ static int audio_element_obu(void *s, IAMFContext *c, AVIOContext *pb, int len) audio_element_type = avio_r8(pbc) >> 5; codec_config_id = ffio_read_leb(pbc); - codec_config = get_codec_config(c, codec_config_id); + codec_config = ff_iamf_get_codec_config(c, codec_config_id); if (!codec_config) { av_log(s, AV_LOG_ERROR, "Non existant codec config id %d referenced in an audio element\n", codec_config_id); ret = AVERROR_INVALIDDATA; diff --git a/libavformat/iamf_writer.c b/libavformat/iamf_writer.c index 9ed20fc562..dd82ba5b82 100644 --- a/libavformat/iamf_writer.c +++ b/libavformat/iamf_writer.c @@ -1013,6 +1013,21 @@ int ff_iamf_write_parameter_blocks(const IAMFContext *iamf, AVIOContext *pb, return 0; } +static IAMFAudioElement *get_audio_element(const IAMFContext *c, + unsigned int audio_substream_id) +{ + for (int i = 0; i < c->nb_audio_elements; i++) { + IAMFAudioElement *audio_element = c->audio_elements[i]; + for (int j = 0; j < audio_element->nb_substreams; j++) { + IAMFSubStream *substream = &audio_element->substreams[j]; + if (substream->audio_substream_id == audio_substream_id) + return audio_element; + } + } + + return NULL; +} + int ff_iamf_write_audio_frame(const IAMFContext *iamf, AVIOContext *pb, unsigned audio_substream_id, AVPacket *pkt) { @@ -1027,15 +1042,29 @@ int ff_iamf_write_audio_frame(const IAMFContext *iamf, AVIOContext *pb, int ret; if (!pkt->size) { + IAMFAudioElement *audio_element; + IAMFCodecConfig *codec_config; + size_t new_extradata_size; uint8_t *new_extradata = av_packet_get_side_data(pkt, AV_PKT_DATA_NEW_EXTRADATA, - NULL); + &new_extradata_size); if (!new_extradata) return AVERROR_INVALIDDATA; + audio_element = get_audio_element(iamf, audio_substream_id); + if (!audio_element) + return AVERROR(EINVAL); + codec_config = ff_iamf_get_codec_config(iamf, audio_element->codec_config_id); + if (!codec_config) + return AVERROR(EINVAL); - // TODO: update FLAC Streaminfo on seekable output - return 0; + av_free(codec_config->extradata); + codec_config->extradata = av_memdup(new_extradata, new_extradata_size); + if (!codec_config->extradata) + return AVERROR(ENOMEM); + codec_config->extradata_size = new_extradata_size; + + return update_extradata(codec_config); } side_data = av_packet_get_side_data(pkt, AV_PKT_DATA_SKIP_SAMPLES, diff --git a/tests/ref/fate/mov-mp4-iamf-5_1_4 b/tests/ref/fate/mov-mp4-iamf-5_1_4 index 2f29a83cf4..1b6db58ee2 100644 --- a/tests/ref/fate/mov-mp4-iamf-5_1_4 +++ b/tests/ref/fate/mov-mp4-iamf-5_1_4 @@ -1,11 +1,11 @@ -65421714a3fd372d2babc9c6400ff00b *tests/data/fate/mov-mp4-iamf-5_1_4.mp4 +5585ed23481b6f28437b3707a1ed632d *tests/data/fate/mov-mp4-iamf-5_1_4.mp4 86340 tests/data/fate/mov-mp4-iamf-5_1_4.mp4 -#extradata 0: 34, 0x40a802c6 -#extradata 1: 34, 0x40a802c6 -#extradata 2: 34, 0x407c02c4 -#extradata 3: 34, 0x407c02c4 -#extradata 4: 34, 0x40a802c6 -#extradata 5: 34, 0x40a802c6 +#extradata 0: 34, 0xafa70d5e +#extradata 1: 34, 0xafa70d5e +#extradata 2: 34, 0xaf7b0d5c +#extradata 3: 34, 0xaf7b0d5c +#extradata 4: 34, 0xafa70d5e +#extradata 5: 34, 0xafa70d5e #tb 0: 1/44100 #media_type 0: audio #codec_id 0: flac diff --git a/tests/ref/fate/mov-mp4-iamf-7_1_4 b/tests/ref/fate/mov-mp4-iamf-7_1_4 index 891803470a..1b88d362bd 100644 --- a/tests/ref/fate/mov-mp4-iamf-7_1_4 +++ b/tests/ref/fate/mov-mp4-iamf-7_1_4 @@ -1,12 +1,12 @@ -9a0cd5cc7ca09da36f08c6ae2aa44a73 *tests/data/fate/mov-mp4-iamf-7_1_4.mp4 +690d2b7a15b5489c59a9148fcd7975be *tests/data/fate/mov-mp4-iamf-7_1_4.mp4 100588 tests/data/fate/mov-mp4-iamf-7_1_4.mp4 -#extradata 0: 34, 0x40a802c6 -#extradata 1: 34, 0x40a802c6 -#extradata 2: 34, 0x407c02c4 -#extradata 3: 34, 0x407c02c4 -#extradata 4: 34, 0x40a802c6 -#extradata 5: 34, 0x40a802c6 -#extradata 6: 34, 0x40a802c6 +#extradata 0: 34, 0xafa70d5e +#extradata 1: 34, 0xafa70d5e +#extradata 2: 34, 0xaf7b0d5c +#extradata 3: 34, 0xaf7b0d5c +#extradata 4: 34, 0xafa70d5e +#extradata 5: 34, 0xafa70d5e +#extradata 6: 34, 0xafa70d5e #tb 0: 1/44100 #media_type 0: audio #codec_id 0: flac diff --git a/tests/ref/fate/mov-mp4-iamf-ambisonic_1 b/tests/ref/fate/mov-mp4-iamf-ambisonic_1 index c4af88ce10..30c8edb14c 100644 --- a/tests/ref/fate/mov-mp4-iamf-ambisonic_1 +++ b/tests/ref/fate/mov-mp4-iamf-ambisonic_1 @@ -1,9 +1,9 @@ -fa740a4e2b84453c4e84908190094e28 *tests/data/fate/mov-mp4-iamf-ambisonic_1.mp4 +2b3517591f7bf20e0f74f3ec1381af1e *tests/data/fate/mov-mp4-iamf-ambisonic_1.mp4 57743 tests/data/fate/mov-mp4-iamf-ambisonic_1.mp4 -#extradata 0: 34, 0x3615025b -#extradata 1: 34, 0x3615025b -#extradata 2: 34, 0x3615025b -#extradata 3: 34, 0x3615025b +#extradata 0: 34, 0xad120cfe +#extradata 1: 34, 0xad120cfe +#extradata 2: 34, 0xad120cfe +#extradata 3: 34, 0xad120cfe #tb 0: 1/44100 #media_type 0: audio #codec_id 0: flac diff --git a/tests/ref/fate/mov-mp4-iamf-stereo b/tests/ref/fate/mov-mp4-iamf-stereo index 5c66c3e188..2fdc31776b 100644 --- a/tests/ref/fate/mov-mp4-iamf-stereo +++ b/tests/ref/fate/mov-mp4-iamf-stereo @@ -1,6 +1,6 @@ -7df5cc61ee480e558389051a83040dd2 *tests/data/fate/mov-mp4-iamf-stereo.mp4 +88c2b547f069f2d4a11d24f7f922251a *tests/data/fate/mov-mp4-iamf-stereo.mp4 15163 tests/data/fate/mov-mp4-iamf-stereo.mp4 -#extradata 0: 34, 0x40a802c6 +#extradata 0: 34, 0xafa70d5e #tb 0: 1/44100 #media_type 0: audio #codec_id 0: flac -- 2.44.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".