Commit 56cc0d28 for libheif
commit 56cc0d2829800a2e847dd2ab6577e4965a26a5d5
Author: Dirk Farin <dirk.farin@gmail.com>
Date: Sun Jan 11 16:47:47 2026 +0100
write and read SAIs with less samples than frames in sequences (#1661)
diff --git a/libheif/sequences/seq_boxes.cc b/libheif/sequences/seq_boxes.cc
index 91a050b8..e7e4c646 100644
--- a/libheif/sequences/seq_boxes.cc
+++ b/libheif/sequences/seq_boxes.cc
@@ -1898,14 +1898,23 @@ Error Box_saiz::write(StreamWriter& writer) const
}
writer.write8(m_default_sample_info_size);
- writer.write32(m_num_samples);
if (m_default_sample_info_size == 0) {
assert(m_num_samples == m_sample_sizes.size());
- for (uint8_t size : m_sample_sizes) {
- writer.write8(size);
+ uint32_t num_nonnull_samples = static_cast<uint32_t>(m_sample_sizes.size());
+ while (num_nonnull_samples > 0 && m_sample_sizes[num_nonnull_samples-1] == 0) {
+ num_nonnull_samples--;
}
+
+ writer.write32(num_nonnull_samples);
+
+ for (size_t i = 0; i < num_nonnull_samples; i++) {
+ writer.write8(m_sample_sizes[i]);
+ }
+ }
+ else {
+ writer.write32(m_num_samples);
}
prepend_header(writer, box_start);
diff --git a/libheif/sequences/track.cc b/libheif/sequences/track.cc
index caa8cec1..2166157d 100644
--- a/libheif/sequences/track.cc
+++ b/libheif/sequences/track.cc
@@ -168,14 +168,20 @@ Result<std::vector<uint8_t> > SampleAuxInfoReader::get_sample_info(const HeifFil
offset = m_singleChunk_offset + sample_idx * size;
}
else {
- offset = m_sample_offsets[sample_idx];
size = m_saiz->get_sample_size(sample_idx);
+ if (size > 0) {
+ assert(sample_idx < m_sample_offsets.size());
+ offset = m_sample_offsets[sample_idx];
+ }
}
std::vector<uint8_t> data;
- Error err = file->append_data_from_file_range(data, offset, size);
- if (err) {
- return err;
+
+ if (size > 0) {
+ Error err = file->append_data_from_file_range(data, offset, size);
+ if (err) {
+ return err;
+ }
}
return data;