Commit cad7186c for libheif
commit cad7186cb2736e146e8b27dd92a8e4d20f7b0578
Author: Dirk Farin <dirk.farin@gmail.com>
Date: Mon Apr 13 16:20:25 2026 +0200
also dump grid and overlay item data
diff --git a/libheif/api/libheif/heif_context.cc b/libheif/api/libheif/heif_context.cc
index 91649e92..862195be 100644
--- a/libheif/api/libheif/heif_context.cc
+++ b/libheif/api/libheif/heif_context.cc
@@ -215,6 +215,13 @@ void heif_context_debug_dump_boxes_to_file(heif_context* ctx, int fd)
}
std::string dump = ctx->context->debug_dump_boxes();
+
+ std::string item_dump = ctx->context->debug_dump_item_data();
+ if (!item_dump.empty()) {
+ dump += "\n";
+ dump += item_dump;
+ }
+
// TODO(fancycode): Should we return an error if writing fails?
#ifdef _WIN32
auto written = _write(fd, dump.c_str(), static_cast<unsigned int>(dump.size()));
diff --git a/libheif/context.cc b/libheif/context.cc
index fd6d949d..99165691 100644
--- a/libheif/context.cc
+++ b/libheif/context.cc
@@ -511,6 +511,11 @@ std::string HeifContext::debug_dump_boxes() const
return m_heif_file->debug_dump_boxes();
}
+std::string HeifContext::debug_dump_item_data() const
+{
+ return m_heif_file->debug_dump_item_data();
+}
+
#if ENABLE_EXPERIMENTAL_MINI_FORMAT
void HeifContext::set_write_mini_format(bool enable)
diff --git a/libheif/context.h b/libheif/context.h
index fbfd408f..18c3aa4b 100644
--- a/libheif/context.h
+++ b/libheif/context.h
@@ -133,6 +133,8 @@ public:
std::string debug_dump_boxes() const;
+ std::string debug_dump_item_data() const;
+
// === writing ===
diff --git a/libheif/file.cc b/libheif/file.cc
index b7372ef2..d7786ef3 100644
--- a/libheif/file.cc
+++ b/libheif/file.cc
@@ -23,8 +23,10 @@
#include "libheif/heif.h"
#include "libheif/heif_properties.h"
#include "compression.h"
+#include "image-items/grid.h"
#include "image-items/jpeg2000.h"
#include "image-items/jpeg.h"
+#include "image-items/overlay.h"
#include "image-items/vvc.h"
#include "codecs/avif_boxes.h"
#include "codecs/hevc_boxes.h"
@@ -349,6 +351,74 @@ std::string HeifFile::debug_dump_boxes() const
}
+std::string HeifFile::debug_dump_item_data() const
+{
+ std::stringstream sstr;
+ bool has_output = false;
+
+ sstr << "=== Item Data ===\n";
+
+ for (const auto& [id, infe] : m_infe_boxes) {
+ uint32_t item_type = infe->get_item_type_4cc();
+
+ if (item_type == fourcc("grid")) {
+ auto dataResult = get_uncompressed_item_data(id);
+ if (!dataResult) {
+ continue;
+ }
+
+ ImageGrid grid;
+ Error err = grid.parse(*dataResult);
+ if (err) {
+ continue;
+ }
+
+ has_output = true;
+ sstr << "\nitem ID " << id << " (grid):\n";
+
+ std::istringstream lines(grid.dump());
+ std::string line;
+ while (std::getline(lines, line)) {
+ sstr << " " << line << "\n";
+ }
+ }
+ else if (item_type == fourcc("iovl")) {
+ if (!m_iref_box) {
+ continue;
+ }
+
+ auto refs = m_iref_box->get_references(id, fourcc("dimg"));
+
+ auto dataResult = get_uncompressed_item_data(id);
+ if (!dataResult) {
+ continue;
+ }
+
+ ImageOverlay overlay;
+ Error err = overlay.parse(refs.size(), *dataResult);
+ if (err) {
+ continue;
+ }
+
+ has_output = true;
+ sstr << "\nitem ID " << id << " (iovl):\n";
+
+ std::istringstream lines(overlay.dump());
+ std::string line;
+ while (std::getline(lines, line)) {
+ sstr << " " << line << "\n";
+ }
+ }
+ }
+
+ if (has_output) {
+ return sstr.str();
+ }
+
+ return {};
+}
+
+
Error HeifFile::parse_heif_file()
{
// --- read all top-level boxes
diff --git a/libheif/file.h b/libheif/file.h
index 304c6a6b..87e8b95a 100644
--- a/libheif/file.h
+++ b/libheif/file.h
@@ -188,6 +188,8 @@ public:
std::string debug_dump_boxes() const;
+ std::string debug_dump_item_data() const;
+
// --- writing ---