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; }