Commit 034a53bd6e for ffmpeg
commit 034a53bd6e60ed47594516ef9e992f9bc3da251b
Author: James Almer <jamrial@gmail.com>
Date: Thu Oct 8 22:22:17 2026 -0300
avformat/mov: simplify the loop in mov_parse_tiles()
Use the get_heif_item() helper to query items.
Signed-off-by: James Almer <jamrial@gmail.com>
diff --git a/libavformat/mov.c b/libavformat/mov.c
index 1fb457ae1f..c7f2409137 100644
--- a/libavformat/mov.c
+++ b/libavformat/mov.c
@@ -11241,11 +11241,16 @@ static int mov_parse_tiles(AVFormatContext *s)
MOVContext *mov = s->priv_data;
for (int i = 0; i < mov->nb_heif_grid; i++) {
- AVStreamGroup *stg = avformat_stream_group_create(s, AV_STREAM_GROUP_PARAMS_TILE_GRID, NULL);
+ AVStreamGroup *stg;
AVStreamGroupTileGrid *tile_grid;
const HEIFGrid *grid = &mov->heif_grid[i];
- int err, loop = 1;
+ int err;
+
+ if (!grid->item || (grid->item->type != MKTAG('g','r','i','d') &&
+ grid->item->type != MKTAG('i','o','v','l')))
+ continue;
+ stg = avformat_stream_group_create(s, AV_STREAM_GROUP_PARAMS_TILE_GRID, NULL);
if (!stg)
return AVERROR(ENOMEM);
@@ -11254,58 +11259,48 @@ static int mov_parse_tiles(AVFormatContext *s)
for (int j = 0; j < grid->nb_tiles; j++) {
int tile_id = grid->tile_id_list[j];
- int k;
-
- for (k = 0; k < mov->nb_heif_item; k++) {
- HEIFItem *item = mov->heif_item[k];
- AVStream *st;
-
- if (!item || item->item_id != tile_id)
- continue;
- st = item->st;
- if (!st) {
- av_log(s, AV_LOG_WARNING, "HEIF item id %d from grid id %d doesn't "
- "reference a stream\n",
- tile_id, grid->item->item_id);
- ff_remove_stream_group(s, stg);
- loop = 0;
- break;
- }
-
- grid->tile_item_list[j] = item;
- grid->tile_idx_list[j] = stg->nb_entries;
+ HEIFItem *item = get_heif_item(mov, tile_id);
+ AVStream *st;
- err = avformat_stream_group_add_stream(stg, st);
- if (err < 0) {
- int l;
- if (err != AVERROR(EEXIST))
- return err;
-
- for (l = 0; l < stg->nb_entries; l++)
- if (stg->entries[l]->stream->index == st->index)
- break;
- av_assert0(l < stg->nb_entries);
- grid->tile_idx_list[j] = l;
- }
-
- if (item->item_id != mov->primary_item_id)
- st->disposition |= AV_DISPOSITION_DEPENDENT;
- break;
- }
-
- if (k == mov->nb_heif_item) {
- av_assert0(loop);
+ if (!item) {
av_log(s, AV_LOG_WARNING, "HEIF item id %d referenced by grid id %d doesn't "
"exist\n",
tile_id, grid->item->item_id);
ff_remove_stream_group(s, stg);
- loop = 0;
+ stg = NULL;
+ break;
}
- if (!loop)
+
+ st = item->st;
+ if (!st) {
+ av_log(s, AV_LOG_WARNING, "HEIF item id %d from grid id %d doesn't "
+ "reference a stream\n",
+ tile_id, grid->item->item_id);
+ ff_remove_stream_group(s, stg);
+ stg = NULL;
break;
- }
+ }
+
+ grid->tile_item_list[j] = item;
+ grid->tile_idx_list[j] = stg->nb_entries;
+
+ err = avformat_stream_group_add_stream(stg, st);
+ if (err < 0) {
+ int l;
+ if (err != AVERROR(EEXIST))
+ return err;
+
+ for (l = 0; l < stg->nb_entries; l++)
+ if (stg->entries[l]->stream->index == st->index)
+ break;
+ av_assert0(l < stg->nb_entries);
+ grid->tile_idx_list[j] = l;
+ }
- if (!loop)
+ if (item->item_id != mov->primary_item_id)
+ st->disposition |= AV_DISPOSITION_DEPENDENT;
+ }
+ if (!stg)
continue;
switch (grid->item->type) {
@@ -11330,6 +11325,8 @@ static int mov_parse_tiles(AVFormatContext *s)
av_dict_set(&stg->metadata, "title", grid->item->name, 0);
if (grid->item->item_id == mov->primary_item_id)
stg->disposition |= AV_DISPOSITION_DEFAULT;
+
+ grid->item->stg = stg;
}
return 0;