This is an automated email from the git hooks/post-receive script.

Git pushed a commit to branch release/7.0
in repository ffmpeg.

commit 3157e62866c2c20bcefa30236a73eff50a05ab92
Author:     James Almer <[email protected]>
AuthorDate: Fri Dec 20 12:57:48 2024 -0300
Commit:     James Almer <[email protected]>
CommitDate: Fri Feb 27 12:17:16 2026 -0300

    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 <[email protected]>
    (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 02e8b694d7..6b6360d314 100644
--- a/libavformat/iamf_reader.c
+++ b/libavformat/iamf_reader.c
@@ -30,10 +30,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);
@@ -44,7 +44,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;
@@ -58,7 +58,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;
 
@@ -276,7 +276,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;
 
@@ -306,7 +306,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 ad47c5e5f7..08d12f59d3 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 b7ccc9994b..bdb7555d9c 100644
--- a/libavformat/isom.h
+++ b/libavformat/isom.h
@@ -267,6 +267,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 68b46184e4..f2f1bb96e6 100644
--- a/libavformat/mov.c
+++ b/libavformat/mov.c
@@ -9551,6 +9551,30 @@ static int mov_parse_tiles(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;
@@ -9812,6 +9836,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++)
@@ -10101,7 +10128,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 a7c80dc564..b32ddb3617 100644
--- a/libavformat/version.h
+++ b/libavformat/version.h
@@ -32,7 +32,7 @@
 #include "version_major.h"
 
 #define LIBAVFORMAT_VERSION_MINOR   1
-#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 4f70fedf5b..e4b690e9a3 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
@@ -209,7 +209,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
@@ -231,7 +231,7 @@ DISPOSITION:still_image=0
 [/STREAM]
 [STREAM]
 index=1
-id=0x2
+id=0xa
 DISPOSITION:default=0
 DISPOSITION:dub=0
 DISPOSITION:original=0
@@ -253,7 +253,7 @@ DISPOSITION:still_image=0
 [/STREAM]
 [STREAM]
 index=2
-id=0x3
+id=0xb
 DISPOSITION:default=0
 DISPOSITION:dub=0
 DISPOSITION:original=0
@@ -275,7 +275,7 @@ DISPOSITION:still_image=0
 [/STREAM]
 [STREAM]
 index=3
-id=0x4
+id=0xc
 DISPOSITION:default=0
 DISPOSITION:dub=0
 DISPOSITION:original=0
@@ -297,7 +297,7 @@ DISPOSITION:still_image=0
 [/STREAM]
 [STREAM]
 index=4
-id=0x5
+id=0xd
 DISPOSITION:default=0
 DISPOSITION:dub=0
 DISPOSITION:original=0
@@ -319,7 +319,7 @@ DISPOSITION:still_image=0
 [/STREAM]
 [STREAM]
 index=5
-id=0x6
+id=0xe
 DISPOSITION:default=0
 DISPOSITION:dub=0
 DISPOSITION:original=0
@@ -341,7 +341,7 @@ DISPOSITION:still_image=0
 [/STREAM]
 [STREAM]
 index=6
-id=0x7
+id=0xf
 DISPOSITION:default=0
 DISPOSITION:dub=0
 DISPOSITION:original=0
@@ -459,7 +459,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
@@ -481,7 +481,7 @@ DISPOSITION:still_image=0
 [/STREAM]
 [STREAM]
 index=1
-id=0x2
+id=0xa
 DISPOSITION:default=0
 DISPOSITION:dub=0
 DISPOSITION:original=0
@@ -503,7 +503,7 @@ DISPOSITION:still_image=0
 [/STREAM]
 [STREAM]
 index=2
-id=0x3
+id=0xb
 DISPOSITION:default=0
 DISPOSITION:dub=0
 DISPOSITION:original=0
@@ -525,7 +525,7 @@ DISPOSITION:still_image=0
 [/STREAM]
 [STREAM]
 index=3
-id=0x4
+id=0xc
 DISPOSITION:default=0
 DISPOSITION:dub=0
 DISPOSITION:original=0
@@ -547,7 +547,7 @@ DISPOSITION:still_image=0
 [/STREAM]
 [STREAM]
 index=4
-id=0x5
+id=0xd
 DISPOSITION:default=0
 DISPOSITION:dub=0
 DISPOSITION:original=0
@@ -569,7 +569,7 @@ DISPOSITION:still_image=0
 [/STREAM]
 [STREAM]
 index=5
-id=0x6
+id=0xe
 DISPOSITION:default=0
 DISPOSITION:dub=0
 DISPOSITION:original=0
@@ -591,7 +591,7 @@ DISPOSITION:still_image=0
 [/STREAM]
 [STREAM]
 index=6
-id=0x7
+id=0xf
 DISPOSITION:default=0
 DISPOSITION:dub=0
 DISPOSITION:original=0
@@ -614,31 +614,31 @@ DISPOSITION:still_image=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

_______________________________________________
ffmpeg-cvslog mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to