Commit 3c6d0799 for libheif

commit 3c6d07992c723b5bab4100d27c1236b121812e6e
Author: Dirk Farin <dirk.farin@gmail.com>
Date:   Fri Dec 26 01:01:00 2025 +0100

    check for missing 'tref' box for auxiliary track

diff --git a/libheif/context.cc b/libheif/context.cc
index a9b3143b..6a960453 100644
--- a/libheif/context.cc
+++ b/libheif/context.cc
@@ -1912,7 +1912,10 @@ Error HeifContext::interpret_heif_file_sequences()
   }

   for (auto& track : m_tracks) {
-    track.second->initialize_after_parsing(this, all_tracks);
+    Error err = track.second->initialize_after_parsing(this, all_tracks);
+    if (err) {
+      return err;
+    }
   }

   return Error::Ok;
diff --git a/libheif/sequences/track.h b/libheif/sequences/track.h
index d58dd614..250e12b8 100644
--- a/libheif/sequences/track.h
+++ b/libheif/sequences/track.h
@@ -141,7 +141,7 @@ public:

   // This is called after creating all Track objects when reading a HEIF file.
   // We can now do initializations that require access to all tracks.
-  virtual void initialize_after_parsing(HeifContext*, const std::vector<std::shared_ptr<Track>>& all_tracks) { }
+  [[nodiscard]] virtual Error initialize_after_parsing(HeifContext*, const std::vector<std::shared_ptr<Track>>& all_tracks) { return {}; }

   heif_item_id get_id() const { return m_id; }

diff --git a/libheif/sequences/track_visual.cc b/libheif/sequences/track_visual.cc
index a8a238ed..9e558219 100644
--- a/libheif/sequences/track_visual.cc
+++ b/libheif/sequences/track_visual.cc
@@ -94,7 +94,7 @@ Error Track_Visual::load(const std::shared_ptr<Box_trak>& trak)
 }


-void Track_Visual::initialize_after_parsing(HeifContext* ctx, const std::vector<std::shared_ptr<Track> >& all_tracks)
+Error Track_Visual::initialize_after_parsing(HeifContext* ctx, const std::vector<std::shared_ptr<Track> >& all_tracks)
 {
   // --- check whether there is an auxiliary alpha track assigned to this track

@@ -110,6 +110,14 @@ void Track_Visual::initialize_after_parsing(HeifContext* ctx, const std::vector<
             track->get_auxiliary_info_type() == heif_auxiliary_track_info_type_alpha) {
           // Is it assigned to the current track
           auto tref = track->get_tref_box();
+          if (!tref) {
+            return {
+              heif_error_Invalid_input,
+              heif_suberror_Unspecified,
+              "Auxiliary track without 'tref'"
+            };
+          }
+
           auto references = tref->get_references(fourcc("auxl"));
           if (std::any_of(references.begin(), references.end(), [this](uint32_t id) { return id == get_id(); })) {
             // Assign it
@@ -120,6 +128,8 @@ void Track_Visual::initialize_after_parsing(HeifContext* ctx, const std::vector<
       }
     }
   }
+
+  return {};
 }


diff --git a/libheif/sequences/track_visual.h b/libheif/sequences/track_visual.h
index b9674e0f..94890d4c 100644
--- a/libheif/sequences/track_visual.h
+++ b/libheif/sequences/track_visual.h
@@ -42,7 +42,7 @@ public:
   // load track from file
   Error load(const std::shared_ptr<Box_trak>&) override;

-  void initialize_after_parsing(HeifContext* ctx, const std::vector<std::shared_ptr<Track>>& all_tracks) override;
+  [[nodiscard]] Error initialize_after_parsing(HeifContext* ctx, const std::vector<std::shared_ptr<Track>>& all_tracks) override;

   uint16_t get_width() const { return m_width; }