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 ESMTPS id 3ED9B4BCC1 for ; Sun, 2 Feb 2025 19:06:55 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 63AD468B1AC; Sun, 2 Feb 2025 21:06:53 +0200 (EET) Received: from mail-pl1-f180.google.com (mail-pl1-f180.google.com [209.85.214.180]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id A7B2468B1AC for ; Sun, 2 Feb 2025 21:06:46 +0200 (EET) Received: by mail-pl1-f180.google.com with SMTP id d9443c01a7336-2161eb95317so61088815ad.1 for ; Sun, 02 Feb 2025 11:06:46 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1738523204; x=1739128004; 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=+ef+/CfNeidOeXmH5FcOZhV8BdtHRgdLljy/dYfxoHQ=; b=Uw4FsSP6SyWd6B1QwOqDA/6HMX3XJ4qyFAzcy4BUaIO8+fPVj6MhvZeQ2/sKV6v0dL vbCnTB9cdkokSoKG1PhV+G3iPaNczMuVnJ45nc/01RPygaBDGcxTt04W1PiY+KvvKHKL HTWmOuhlIdDK1iFWJFEtIHHR8ySMJNvVsdIL5YyLJvWQ3l0s3ZF76QVY/t8dbkpnbpj/ /mjb/fr8p26Qd4eoq1NRxjILDgzBJDRjX2bFJ/L2jAKK60A3sfnctCxKaaEWt/JF7EGI ccU7Kat4J9+yrjUp4LRx49H5bkVZkO3/Q4MU5HkbBK6h/zhj+q+ZFqG2CWqb5qDpyX6M 4Asw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1738523204; x=1739128004; 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=+ef+/CfNeidOeXmH5FcOZhV8BdtHRgdLljy/dYfxoHQ=; b=NeLBaZLQ1IiGCG2dTprO9YW2LFcfnUmLyR5TSAflUnxDttA1kHv/Sx0K5eWpQHhFQJ xYFyjQJ3zvOlcjZhb98GbV0OdByJwR71xfoDCsHJletVUiZztokadgj3m7wri/2VaYRg BT9MlXdkzdvlJk7okwT1sUjjc+4LfdOv4/5HGJXbOoc95DwS25J2xkK6hmlxg6U5z9z7 LhvNgXl6f4m32Yl3NKc9vq8syzOlXTVV5tVUqH+yh0gORhElipeuC83I09hFiPDKFSFf gnyyZxFh+QpIeRxkbHbcIOzAcQDAakiSICUeX8EkW2xmqY2Smhsl43Jo1nt7T1tZhVFe rI3g== X-Gm-Message-State: AOJu0Yyit2aIXEoGQ1AvB2cnyPZKJ9xRRDcqU3SDfbJLdfx/k23pxSel 3n3IZGXKGevkndxTwLmf4ZrLsucemtump350/38fFW5xJHkED20qt1VAU5t/ X-Gm-Gg: ASbGncss/zAxgXpq7gfgcBh/80K1UVVnIKeiEh3JfhFnX9UMYvMTHf29upm6qSJLjnF cs3h3PcMI/5aq0UPS05In2NXtmUaHFex0iMXQ8O3Pem8M5VnmvGru1G2hkukJeQ+QSllbj3YNa3 yTzHhr9Cgrj7KbQTZOeF331eqxfrYEC1sa88L5u7ug9cck71ID3UEhbjwInpphPI28tnz05b6SQ bWFX/qq999XN3yCCHL04XGj5402qCVAvvgAQNEmxLiigbVwTGq69/SfAtManBo74nXRAOkUsuNx VT1Y/eUc4GT+Xxg2P9Ri/+TbaPAtmr4= X-Google-Smtp-Source: AGHT+IE8fgMoBnQj3wbjtAOiOnBDxmSeFjyZsiW0lRRuBxrCa4HC3zFX+IZ2BKghkI2R2hfnhFRMww== X-Received: by 2002:a05:6a21:3396:b0:1e0:da90:5f1f with SMTP id adf61e73a8af0-1ed7a4c0bafmr29651672637.16.1738523204152; Sun, 02 Feb 2025 11:06:44 -0800 (PST) Received: from localhost.localdomain ([2800:2121:b040:c:511c:7b61:5388:930d]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-72fe6a1ab45sm7002109b3a.171.2025.02.02.11.06.43 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 02 Feb 2025 11:06:43 -0800 (PST) From: James Almer To: ffmpeg-devel@ffmpeg.org Date: Sun, 2 Feb 2025 16:06:20 -0300 Message-ID: <20250202190620.4960-1-jamrial@gmail.com> X-Mailer: git-send-email 2.48.1 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH] avformat/mov: add an offset to IAMF streams 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: Using audio_substream_id for AVStream ids is not ideal give that in containers like mp4, the IAMF structure is opaque to the outside and other streams may share such id values. Signed-off-by: James Almer --- libavformat/iamf_reader.c | 12 +++--- libavformat/iamf_reader.h | 2 +- libavformat/iamfdec.c | 2 +- libavformat/isom.h | 1 + libavformat/mov.c | 29 +++++++++++++- tests/ref/fate/mov-mp4-iamf-7_1_4-video-last | 42 ++++++++++---------- 6 files changed, 58 insertions(+), 30 deletions(-) diff --git a/libavformat/iamf_reader.c b/libavformat/iamf_reader.c index d331e1315e..5cbe89ca68 100644 --- a/libavformat/iamf_reader.c +++ b/libavformat/iamf_reader.c @@ -31,10 +31,10 @@ #include "iamf_parse.h" #include "iamf_reader.h" -static AVStream *find_stream_by_id(AVFormatContext *s, int id) +static AVStream *find_stream_by_id(AVFormatContext *s, int id, int stream_id_offset) { for (int i = 0; i < s->nb_streams; i++) - if (s->streams[i]->id == id) + if (s->streams[i]->id == id + stream_id_offset) return s->streams[i]; av_log(s, AV_LOG_ERROR, "Invalid stream id %d\n", id); @@ -45,7 +45,7 @@ static int audio_frame_obu(AVFormatContext *s, const IAMFDemuxContext *c, AVIOContext *pb, AVPacket *pkt, int len, enum IAMF_OBU_Type type, unsigned skip_samples, unsigned discard_padding, - int id_in_bitstream) + int stream_id_offset, int id_in_bitstream) { AVStream *st; int ret, audio_substream_id; @@ -59,7 +59,7 @@ static int audio_frame_obu(AVFormatContext *s, const IAMFDemuxContext *c, } else audio_substream_id = type - IAMF_OBU_IA_AUDIO_FRAME_ID0; - st = find_stream_by_id(s, audio_substream_id); + st = find_stream_by_id(s, audio_substream_id, stream_id_offset); if (!st) return AVERROR_INVALIDDATA; @@ -277,7 +277,7 @@ fail: } int ff_iamf_read_packet(AVFormatContext *s, IAMFDemuxContext *c, - AVIOContext *pb, int max_size, AVPacket *pkt) + AVIOContext *pb, int max_size, int stream_id_offset, AVPacket *pkt) { int read = 0; @@ -308,7 +308,7 @@ int ff_iamf_read_packet(AVFormatContext *s, IAMFDemuxContext *c, read += len; if (type >= IAMF_OBU_IA_AUDIO_FRAME && type <= IAMF_OBU_IA_AUDIO_FRAME_ID17) { ret = audio_frame_obu(s, c, pb, pkt, obu_size, type, - skip_samples, discard_padding, + skip_samples, discard_padding, stream_id_offset, type == IAMF_OBU_IA_AUDIO_FRAME); if (ret < 0) return ret; diff --git a/libavformat/iamf_reader.h b/libavformat/iamf_reader.h index ecb92d485a..279739cde9 100644 --- a/libavformat/iamf_reader.h +++ b/libavformat/iamf_reader.h @@ -42,7 +42,7 @@ typedef struct IAMFDemuxContext { } IAMFDemuxContext; int ff_iamf_read_packet(AVFormatContext *s, IAMFDemuxContext *c, - AVIOContext *pb, int max_size, AVPacket *pkt); + AVIOContext *pb, int max_size, int stream_id_offset, AVPacket *pkt); void ff_iamf_read_deinit(IAMFDemuxContext *c); diff --git a/libavformat/iamfdec.c b/libavformat/iamfdec.c index e1a913dd1c..0f273bdd43 100644 --- a/libavformat/iamfdec.c +++ b/libavformat/iamfdec.c @@ -187,7 +187,7 @@ static int iamf_read_packet(AVFormatContext *s, AVPacket *pkt) IAMFDemuxContext *const c = s->priv_data; int ret; - ret = ff_iamf_read_packet(s, c, s->pb, INT_MAX, pkt); + ret = ff_iamf_read_packet(s, c, s->pb, INT_MAX, 0, pkt); if (ret < 0) return ret; diff --git a/libavformat/isom.h b/libavformat/isom.h index ccdead7192..10f882806e 100644 --- a/libavformat/isom.h +++ b/libavformat/isom.h @@ -283,6 +283,7 @@ typedef struct MOVStreamContext { } cenc; struct IAMFDemuxContext *iamf; + int iamf_stream_offset; } MOVStreamContext; typedef struct HEIFItem { diff --git a/libavformat/mov.c b/libavformat/mov.c index 2c8be51063..168a4332cb 100644 --- a/libavformat/mov.c +++ b/libavformat/mov.c @@ -10426,6 +10426,30 @@ static int mov_parse_lcevc_streams(AVFormatContext *s) return 0; } +static void fix_stream_ids(AVFormatContext *s) +{ + int highest_id = 0; + + for (int i = 0; i < s->nb_streams; i++) { + const AVStream *st = s->streams[i]; + const MOVStreamContext *sc = st->priv_data; + if (!sc->iamf) + highest_id = FFMAX(highest_id, st->id); + } + highest_id += !highest_id; + for (int i = 0; highest_id > 1 && i < s->nb_stream_groups; i++) { + AVStreamGroup *stg = s->stream_groups[i]; + if (stg->type != AV_STREAM_GROUP_PARAMS_IAMF_AUDIO_ELEMENT) + continue; + for (int j = 0; j < stg->nb_streams; j++) { + AVStream *st = stg->streams[j]; + MOVStreamContext *sc = st->priv_data; + st->id += highest_id; + sc->iamf_stream_offset = highest_id; + } + } +} + static int mov_read_header(AVFormatContext *s) { MOVContext *mov = s->priv_data; @@ -10649,6 +10673,9 @@ static int mov_read_header(AVFormatContext *s) break; } } + + fix_stream_ids(s); + ff_configure_buffers_for_index(s, AV_TIME_BASE); for (i = 0; i < mov->frag_index.nb_items; i++) @@ -10933,7 +10960,7 @@ static int mov_read_packet(AVFormatContext *s, AVPacket *pkt) pos = pkt->pos; flags = pkt->flags; duration = pkt->duration; while (!ret && size > 0) { - ret = ff_iamf_read_packet(s, sc->iamf, sc->pb, size, pkt); + ret = ff_iamf_read_packet(s, sc->iamf, sc->pb, size, sc->iamf_stream_offset, pkt); if (ret < 0) { if (should_retry(sc->pb, ret)) mov_current_sample_dec(sc); diff --git a/tests/ref/fate/mov-mp4-iamf-7_1_4-video-last b/tests/ref/fate/mov-mp4-iamf-7_1_4-video-last index 35e8b9b0ab..ede4a40025 100644 --- a/tests/ref/fate/mov-mp4-iamf-7_1_4-video-last +++ b/tests/ref/fate/mov-mp4-iamf-7_1_4-video-last @@ -210,7 +210,7 @@ TAG:handler_name=SoundHandler TAG:vendor_id=[0][0][0][0] [STREAM] index=0 -id=0x1 +id=0x9 DISPOSITION:default=1 DISPOSITION:dub=0 DISPOSITION:original=0 @@ -233,7 +233,7 @@ DISPOSITION:multilayer=0 [/STREAM] [STREAM] index=1 -id=0x2 +id=0xa DISPOSITION:default=0 DISPOSITION:dub=0 DISPOSITION:original=0 @@ -256,7 +256,7 @@ DISPOSITION:multilayer=0 [/STREAM] [STREAM] index=2 -id=0x3 +id=0xb DISPOSITION:default=0 DISPOSITION:dub=0 DISPOSITION:original=0 @@ -279,7 +279,7 @@ DISPOSITION:multilayer=0 [/STREAM] [STREAM] index=3 -id=0x4 +id=0xc DISPOSITION:default=0 DISPOSITION:dub=0 DISPOSITION:original=0 @@ -302,7 +302,7 @@ DISPOSITION:multilayer=0 [/STREAM] [STREAM] index=4 -id=0x5 +id=0xd DISPOSITION:default=0 DISPOSITION:dub=0 DISPOSITION:original=0 @@ -325,7 +325,7 @@ DISPOSITION:multilayer=0 [/STREAM] [STREAM] index=5 -id=0x6 +id=0xe DISPOSITION:default=0 DISPOSITION:dub=0 DISPOSITION:original=0 @@ -348,7 +348,7 @@ DISPOSITION:multilayer=0 [/STREAM] [STREAM] index=6 -id=0x7 +id=0xf DISPOSITION:default=0 DISPOSITION:dub=0 DISPOSITION:original=0 @@ -468,7 +468,7 @@ TAG:handler_name=SoundHandler TAG:vendor_id=[0][0][0][0] [STREAM] index=0 -id=0x1 +id=0x9 DISPOSITION:default=1 DISPOSITION:dub=0 DISPOSITION:original=0 @@ -491,7 +491,7 @@ DISPOSITION:multilayer=0 [/STREAM] [STREAM] index=1 -id=0x2 +id=0xa DISPOSITION:default=0 DISPOSITION:dub=0 DISPOSITION:original=0 @@ -514,7 +514,7 @@ DISPOSITION:multilayer=0 [/STREAM] [STREAM] index=2 -id=0x3 +id=0xb DISPOSITION:default=0 DISPOSITION:dub=0 DISPOSITION:original=0 @@ -537,7 +537,7 @@ DISPOSITION:multilayer=0 [/STREAM] [STREAM] index=3 -id=0x4 +id=0xc DISPOSITION:default=0 DISPOSITION:dub=0 DISPOSITION:original=0 @@ -560,7 +560,7 @@ DISPOSITION:multilayer=0 [/STREAM] [STREAM] index=4 -id=0x5 +id=0xd DISPOSITION:default=0 DISPOSITION:dub=0 DISPOSITION:original=0 @@ -583,7 +583,7 @@ DISPOSITION:multilayer=0 [/STREAM] [STREAM] index=5 -id=0x6 +id=0xe DISPOSITION:default=0 DISPOSITION:dub=0 DISPOSITION:original=0 @@ -606,7 +606,7 @@ DISPOSITION:multilayer=0 [/STREAM] [STREAM] index=6 -id=0x7 +id=0xf DISPOSITION:default=0 DISPOSITION:dub=0 DISPOSITION:original=0 @@ -630,31 +630,31 @@ DISPOSITION:multilayer=0 [/STREAM_GROUP] [STREAM] index=0 -id=0x1 +id=0x9 [/STREAM] [STREAM] index=1 -id=0x2 +id=0xa [/STREAM] [STREAM] index=2 -id=0x3 +id=0xb [/STREAM] [STREAM] index=3 -id=0x4 +id=0xc [/STREAM] [STREAM] index=4 -id=0x5 +id=0xd [/STREAM] [STREAM] index=5 -id=0x6 +id=0xe [/STREAM] [STREAM] index=6 -id=0x7 +id=0xf [/STREAM] [STREAM] index=7 -- 2.48.1 _______________________________________________ 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".