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 EA2904E4EF for ; Fri, 23 Jan 2026 17:55:09 +0000 (UTC) Authentication-Results: ffbox; dkim=fail (body hash mismatch (got b'n7/mZlEolUrXg4WNDHeu/+ZShL8xBGx7KEaUeeGmjaM=', expected b'bwmURHjFRm5Ha1uUTu0Csi9unCgz5oAs0Dy5eNbxgfM=')) header.d=ffmpeg.org header.i=@ffmpeg.org header.a=rsa-sha256 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ffmpeg.org; i=@ffmpeg.org; q=dns/txt; s=mail; t=1769190894; h=mime-version : to : date : message-id : reply-to : subject : list-id : list-archive : list-archive : list-help : list-owner : list-post : list-subscribe : list-unsubscribe : from : cc : content-type : content-transfer-encoding : from; bh=n7/mZlEolUrXg4WNDHeu/+ZShL8xBGx7KEaUeeGmjaM=; b=gPjSB0JMh9V/TG2r1+c/LDlxdfF6FWete2TmOtWOnnEDWzZWiOfH0j9YRoHhuSJcagjZ8 76HA0V/kvWfsssTQ5ipvUH8NaPFrrdHQwyoQCCyaY8O0Bu6gTTX2Zi/Gba+r+KSPqSzMQqS +P/NGqcjCWU6HJWukWCRs/agKQAajlpro+jOfQjMNOArlMwGu2pAYA1rldF4b+CEv1ButNt Kyj7JUDp29vVqwZ3aKcoqC03quacQwjEjFRIwku92+H+UUKvxKM4BPnmBkNaWndAmskb87D KY1iXUj/Qir6XkOf3y/JEvrV6ViulyVfqjtwR3D/oOFLt/dYS9YesmFZBpgw== Received: from [172.20.0.4] (unknown [172.20.0.4]) by ffbox0-bg.ffmpeg.org (Postfix) with ESMTP id 1C31769170E; Fri, 23 Jan 2026 19:54:54 +0200 (EET) ARC-Seal: i=1; cv=none; a=rsa-sha256; d=ffmpeg.org; s=arc; t=1769190875; b=eCylVCKgpAt72rRi1TZrTKSh2FjKV18pmYIHMMX7QNvcgucYse9lFa4f/zOV6ySbPJCeg NKLTntagLFecBAckoMUK9IkoRIXcr6PB/JYmtdEEJeUjkwOTfTVCY/Uh3mHJq11dozqjK8Q gSzah3FrPtPmAVwXIA0goj/WeAYWLXRYTZAGlZQSRyfbOINlUx5TeHyyhWxrDY6K5KZHKhC Eoiwtx+cK/tMZzpJniEcaZcxLMRBZbVyNlASvz7yIBmtGVzvYIl9bOWoniRQIpJc9ZnBXDP i++ZJmPvePqJBcs6imnPIuuIE/0Tn6frXbypEfw9HetzDbdbwMJQvW99eziQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=ffmpeg.org; s=arc; t=1769190875; h=from : sender : reply-to : subject : date : message-id : to : cc : mime-version : content-type : content-transfer-encoding : content-id : content-description : resent-date : resent-from : resent-sender : resent-to : resent-cc : resent-message-id : in-reply-to : references : list-id : list-help : list-unsubscribe : list-subscribe : list-post : list-owner : list-archive; bh=AyM9IDlQsoceGZciLd+03UTkrBcIK0c78bN0Jc9inj4=; b=QJvDKAJd9B/SwIH1P6beFmC7pZ3oQciFQIJx/k0h5KoxgzHR6OpGwVs+zJzzoN5M88Vdu ZtFmh6Skh3mU5unSoYR7ep0WC8qB2thIqbUeqGy9YzvDQVK2vS8zultwpNuXjjbpoS3SPQz +2DeYzBKV9DKx+ITcFe/xCELHKulJkXxf81oKxMDtHwvt0TZbK46Jy+lPoT+PKYWpvaZz9I hbeF1k8OEHOSzNNixvGWgTFPRGmApXIDq/hPipWGhHaKpiPEymjYPc0dwjtLdpY6zT/oD7J 7UO186e0Cq1X9xDnr6IIrDGtcTqh3+63x40Qp/M6jYTqUrcW8MZKFZ/RQQ5g== ARC-Authentication-Results: i=1; ffmpeg.org; dkim=pass header.d=ffmpeg.org header.i=@ffmpeg.org; arc=none; dmarc=pass header.from=ffmpeg.org policy.dmarc=quarantine Authentication-Results: ffmpeg.org; dkim=pass header.d=ffmpeg.org header.i=@ffmpeg.org; arc=none (Message is not ARC signed); dmarc=pass (Used From Domain Record) header.from=ffmpeg.org policy.dmarc=quarantine DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ffmpeg.org; i=@ffmpeg.org; q=dns/txt; s=mail; t=1769190865; h=content-type : mime-version : content-transfer-encoding : from : to : reply-to : subject : date : from; bh=bwmURHjFRm5Ha1uUTu0Csi9unCgz5oAs0Dy5eNbxgfM=; b=iwI/ZfFkQIh6boT3KgDthVAWJvvkZBRBFMmSxHTf0MEtd7RsCs8ckppad0vRE1NvuL50a zfIjN+tsyyJ8UAVOFhOciKgssRFpGGmZBScN11O/AhKjGsVLhGQqM2iDTRAWsPJWMHPDyvy NkGANpnAmwMBg9C0a0OdtDSHcsHg0cIAS23T9xKUBduqUMZ/YhxT4ygzpyPDCPw/H1O7VLp Fg2uAPeMPysBGlxRjZejpHdxgHB/iIDt6soZ19OZB4goLOFsUleJhl+ZkXKXlX5v7aNgqD5 o0J3nYvvrSN7npQy97H+t0x98ynxLoxehsjmy36H3Ilb/fyFLSae3zdHf4fQ== Received: from 69dab402ede7 (code.ffmpeg.org [188.245.149.3]) by ffbox0-bg.ffmpeg.org (Postfix) with ESMTPS id 4C2B469166E for ; Fri, 23 Jan 2026 19:54:25 +0200 (EET) MIME-Version: 1.0 To: ffmpeg-devel@ffmpeg.org Date: Fri, 23 Jan 2026 17:54:24 -0000 Message-ID: <176919086547.25.2803378446575066971@4457048688e7> Message-ID-Hash: YVTYEZA3YFSHSCCFEDQ3SNRY3RILT5WT X-Message-ID-Hash: YVTYEZA3YFSHSCCFEDQ3SNRY3RILT5WT X-MailFrom: code@ffmpeg.org X-Mailman-Rule-Hits: nonmember-moderation X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; loop; banned-address; header-match-ffmpeg-devel.ffmpeg.org-0; header-match-ffmpeg-devel.ffmpeg.org-1; header-match-ffmpeg-devel.ffmpeg.org-2; header-match-ffmpeg-devel.ffmpeg.org-3; emergency; member-moderation X-Mailman-Version: 3.3.10 Precedence: list Reply-To: FFmpeg development discussions and patches Subject: [FFmpeg-devel] [PR] [release/7.1] Backport "avformat/mov: add an offset to IAMF streams" (PR #21563) List-Id: FFmpeg development discussions and patches Archived-At: Archived-At: List-Archive: List-Archive: List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: From: James Almer via ffmpeg-devel Cc: James Almer Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Archived-At: List-Archive: List-Post: PR #21563 opened by James Almer (jamrial) URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/21563 Patch URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/21563.patch 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. >>From 419cdf9dccaa726402e3e8d8a28a6b5df177aa12 Mon Sep 17 00:00:00 2001 From: James Almer Date: Fri, 20 Dec 2024 12:57:48 -0300 Subject: [PATCH] avformat/mov: add an offset to IAMF streams 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 (cherry picked from commit a8f23745074acd8a1934e3653caebd5a0ba05c6f) --- libavformat/iamf_reader.c | 12 +++--- libavformat/iamf_reader.h | 2 +- libavformat/iamfdec.c | 2 +- libavformat/isom.h | 1 + libavformat/mov.c | 29 +++++++++++++- libavformat/version.h | 2 +- tests/ref/fate/mov-mp4-iamf-7_1_4-video-last | 42 ++++++++++---------- 7 files changed, 59 insertions(+), 31 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 ce6d4aa064..8feb06d9e6 100644 --- a/libavformat/iamfdec.c +++ b/libavformat/iamfdec.c @@ -165,7 +165,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 ffabc01a2d..f18fe541c6 100644 --- a/libavformat/isom.h +++ b/libavformat/isom.h @@ -273,6 +273,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 15631f6848..7c7aced6ca 100644 --- a/libavformat/mov.c +++ b/libavformat/mov.c @@ -10180,6 +10180,30 @@ static AVStream *mov_find_reference_track(AVFormatContext *s, AVStream *st, return NULL; } +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; @@ -10427,6 +10451,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++) @@ -10717,7 +10744,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/libavformat/version.h b/libavformat/version.h index 70c554c19c..7db373e8dd 100644 --- a/libavformat/version.h +++ b/libavformat/version.h @@ -32,7 +32,7 @@ #include "version_major.h" #define LIBAVFORMAT_VERSION_MINOR 7 -#define LIBAVFORMAT_VERSION_MICRO 100 +#define LIBAVFORMAT_VERSION_MICRO 101 #define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \ LIBAVFORMAT_VERSION_MINOR, \ 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.52.0 _______________________________________________ ffmpeg-devel mailing list -- ffmpeg-devel@ffmpeg.org To unsubscribe send an email to ffmpeg-devel-leave@ffmpeg.org