Commit a0979b646b for ffmpeg

commit a0979b646bce52eb93a675697841288ce738c152
Author: James Almer <jamrial@gmail.com>
Date:   Mon Oct 5 18:58:19 2026 -0300

    fftools/ffmpeg: stop using deprecated AVStreamGroup fields

    Signed-off-by: James Almer <jamrial@gmail.com>

diff --git a/fftools/cmdutils.c b/fftools/cmdutils.c
index c535f578a7..116988e5a9 100644
--- a/fftools/cmdutils.c
+++ b/fftools/cmdutils.c
@@ -1278,13 +1278,16 @@ unsigned stream_specifier_match(const StreamSpecifier *ss,
                    ss->list_id);
             return 0;
         }
-        nb_streams = g->nb_streams;
+        nb_streams = g->nb_entries;
         break;
     default: av_assert0(0);
     }

     for (int i = start_stream; i < nb_streams; i++) {
-        const AVStream *candidate = s->streams[g ? g->streams[i]->index :
+        if (g && g->entries[i]->type != AV_STREAM_GROUP_ENTRY_STREAM)
+            continue;
+
+        const AVStream *candidate = s->streams[g ? g->entries[i]->stream->index :
                                                p ? p->stream_index[i]   : i];

         if (ss->media_type != AVMEDIA_TYPE_UNKNOWN &&
diff --git a/fftools/ffmpeg_demux.c b/fftools/ffmpeg_demux.c
index 7cf93cb927..f460d38b30 100644
--- a/fftools/ffmpeg_demux.c
+++ b/fftools/ffmpeg_demux.c
@@ -617,7 +617,7 @@ static int do_bsf_graph(Demuxer *d, DemuxThreadContext *dt, DemuxStreamGroup *ds
 {
     const AVStreamGroup *stg = dsg->istg.stg;
     const AVStreamGroupLayeredVideo *lcevc = stg->params.layered_video;
-    const int enhancement = ds->ist.index == stg->streams[lcevc->el_index]->index;
+    const int enhancement = ds->ist.index == stg->entries[lcevc->el_index]->stream->index;
     AVBitStreamFilterContext *source = dsg->lcevc[enhancement];
     int ret, flags = AV_BSF_SOURCE_FLAG_PUSH;

@@ -1097,7 +1097,7 @@ int ist_use(InputStream *ist, int decoding_needed,
         if (!dsg->graph || istg->stg->type != AV_STREAM_GROUP_PARAMS_LCEVC)
             continue;
         const AVStreamGroupLayeredVideo *lcevc = istg->stg->params.layered_video;
-        if (ist->st->index == istg->stg->streams[lcevc->el_index]->index)
+        if (ist->st->index == istg->stg->entries[lcevc->el_index]->stream->index)
             break;

         AVBitStreamFilterContext *lcevc_merge = av_bsf_graph_get_filter(dsg->graph, "lcevc_merge");
@@ -1129,7 +1129,7 @@ int ist_use(InputStream *ist, int decoding_needed,
         if (ret < 0)
             return ret;

-        InputStream *lcevc_ist = d->f.streams[istg->stg->streams[lcevc->el_index]->index];
+        InputStream *lcevc_ist = d->f.streams[istg->stg->entries[lcevc->el_index]->stream->index];
         lcevc_ist->st->discard = 0;

         dsg->graph_enabled = 1;
@@ -2003,8 +2003,8 @@ static int istg_parse_tile_grid(const OptionsContext *o, Demuxer *d, InputStream
         opts.crop_right  = tg->coded_width - tg->width - tg->horizontal_offset;
     }

-    for (int i = 0; i < tg->nb_coded_side_data; i++) {
-        const AVPacketSideData *sd = &tg->coded_side_data[i];
+    for (int i = 0; i < stg->nb_coded_side_data; i++) {
+        const AVPacketSideData *sd = &stg->coded_side_data[i];

         ret = av_packet_side_data_to_frame(&opts.side_data, &opts.nb_side_data, sd, 0);
         if (ret < 0 && ret != AVERROR(EINVAL))
@@ -2032,11 +2032,11 @@ static int istg_parse_lcevc(const OptionsContext *o, Demuxer *d, DemuxStreamGrou
     const AVStreamGroup *stg = dsg->istg.stg;
     const AVStreamGroupLayeredVideo *lcevc = stg->params.layered_video;
     const AVBitStreamFilter *filter, *lcevc_filter = av_bsf_get_by_name("lcevc_merge");
-    const InputStream *lcevc_ist = f->streams[stg->streams[lcevc->el_index]->index];
-    const InputStream *base_ist = f->streams[stg->streams[!lcevc->el_index]->index];
+    const InputStream *lcevc_ist = f->streams[stg->entries[lcevc->el_index]->stream->index];
+    const InputStream *base_ist = f->streams[stg->entries[!lcevc->el_index]->stream->index];
     int ret;

-    if (!lcevc_filter || stg->nb_streams != 2)
+    if (!lcevc_filter || stg->nb_entries != 2)
         return 0;

     dsg->graph = av_bsf_graph_alloc();
@@ -2092,13 +2092,23 @@ static int istg_add(const OptionsContext *o, Demuxer *d, AVStreamGroup *stg)

     switch (stg->type) {
     case AV_STREAM_GROUP_PARAMS_LCEVC:
-        for (int i = 0; i < istg->stg->nb_streams; i++) {
-            DemuxStream *ds = ds_from_ist(f->streams[istg->stg->streams[i]->index]);
+        for (int i = 0; i < istg->stg->nb_entries; i++) {
+            AVStreamGroupEntry *entry = istg->stg->entries[i];
+            if (entry->type != AV_STREAM_GROUP_ENTRY_STREAM)
+                return AVERROR_BUG;
+            DemuxStream *ds = ds_from_ist(f->streams[entry->stream->index]);
             ret = av_dynarray_add_nofree(&ds->dsg, &ds->nb_dsg, dsg);
             if (ret < 0)
                 return ret;
         }
         break;
+    case AV_STREAM_GROUP_PARAMS_TILE_GRID:
+        for (int i = 0; i < istg->stg->nb_entries; i++) {
+            AVStreamGroupEntry *entry = istg->stg->entries[i];
+            if (entry->type != AV_STREAM_GROUP_ENTRY_STREAM)
+                return AVERROR_BUG;
+        }
+        break;
     default:
         break;
     }
diff --git a/fftools/ffmpeg_mux_init.c b/fftools/ffmpeg_mux_init.c
index 027d80ef71..27d6492388 100644
--- a/fftools/ffmpeg_mux_init.c
+++ b/fftools/ffmpeg_mux_init.c
@@ -1688,8 +1688,11 @@ static int map_auto_video(Muxer *mux, const OptionsContext *o)
             if (!istg->fg)
                 continue;

-            for (int j = 0; j < istg->stg->nb_streams; j++) {
-                AVStream *st = istg->stg->streams[j];
+            for (int j = 0; j < istg->stg->nb_entries; j++) {
+                if (istg->stg->entries[j]->type != AV_STREAM_GROUP_ENTRY_STREAM)
+                    continue;
+
+                AVStream *st = istg->stg->entries[j]->stream;

                 if (st->event_flags & AVSTREAM_EVENT_FLAG_NEW_PACKETS) {
                     score = 100000000;
@@ -2739,8 +2742,8 @@ static int of_parse_group_token(Muxer *mux, const char *token, char *ptr)
             ret = AVERROR(EINVAL);
             goto end;
         }
-        for (unsigned i = 0; i < oc->stream_groups[idx]->nb_streams; i++) {
-            ret = avformat_stream_group_add_stream(stg, oc->stream_groups[idx]->streams[i]);
+        for (unsigned i = 0; i < oc->stream_groups[idx]->nb_entries; i++) {
+            ret = avformat_stream_group_add_stream(stg, oc->stream_groups[idx]->entries[i]->stream);
             if (ret < 0)
                 goto end;
         }