Commit 9e6b79ee for libheif
commit 9e6b79ee7acf91d5d888779eb53404180f00c3d1
Author: Dirk Farin <dirk.farin@gmail.com>
Date: Tue Jan 13 01:13:46 2026 +0100
openh264 decoder: output fake framenumbers, assuming no input reordering (#1661)
diff --git a/libheif/plugins/decoder_openh264.cc b/libheif/plugins/decoder_openh264.cc
index bcd0a6b9..e6ae11ed 100644
--- a/libheif/plugins/decoder_openh264.cc
+++ b/libheif/plugins/decoder_openh264.cc
@@ -52,6 +52,7 @@ struct openh264_decoder
// --- decoder
ISVCDecoder* decoder = nullptr;
+ int fake_output_framenumber = 0;
~openh264_decoder()
{
@@ -408,11 +409,23 @@ heif_error openh264_decode_next_image2(void* decoder_raw, heif_image** out_img,
uintptr_t* out_user_data,
const heif_security_limits* limits)
{
- if (out_user_data) {
- *out_user_data = 0; // TODO: not supported by openH264
+ auto* decoder = (struct openh264_decoder*) decoder_raw;
+
+ heif_error err = openh264_decode_next_image(decoder_raw, out_img, limits);
+
+ if (!err.code && out_user_data) {
+
+ // TODO: openH264 does not support passing through frame numbers. Assume that there is no frame reordering.
+
+ if (*out_img) {
+ *out_user_data = decoder->fake_output_framenumber++;
+ }
+ else {
+ *out_user_data = 0;
+ }
}
- return openh264_decode_next_image(decoder_raw, out_img, limits);
+ return err;
}
heif_error openh264_decode_image(void* decoder_raw, heif_image** out_img)
diff --git a/libheif/sequences/track.cc b/libheif/sequences/track.cc
index 57050b1e..d28343fa 100644
--- a/libheif/sequences/track.cc
+++ b/libheif/sequences/track.cc
@@ -170,7 +170,10 @@ Result<std::vector<uint8_t> > SampleAuxInfoReader::get_sample_info(const HeifFil
else {
size = m_saiz->get_sample_size(sample_idx);
if (size > 0) {
- assert(sample_idx < m_sample_offsets.size());
+ if (sample_idx >= m_sample_offsets.size()) {
+ return {};
+ }
+
offset = m_sample_offsets[sample_idx];
}
}