Commit e100a1ed for libheif

commit e100a1ed64fa9caba348de118f00996c8596f4e4
Author: Dirk Farin <dirk.farin@gmail.com>
Date:   Tue Mar 3 18:19:23 2026 +0100

    pass through unci compression mode to tili image generation

diff --git a/examples/heif_enc.cc b/examples/heif_enc.cc
index 8aa58ce3..73d52411 100644
--- a/examples/heif_enc.cc
+++ b/examples/heif_enc.cc
@@ -78,7 +78,7 @@ int cut_tiles = 0;
 int tiled_image_width = 0;
 int tiled_image_height = 0;
 std::string tiling_method = "grid";
-heif_unci_compression unci_compression = heif_unci_compression_brotli;
+heif_unci_compression unci_compression = heif_unci_compression_zlib;
 int add_pyramid_group = 0;

 uint16_t nclx_colour_primaries = 1;
diff --git a/libheif/api/libheif/heif_experimental.cc b/libheif/api/libheif/heif_experimental.cc
index 5f4be4b6..e83a0301 100644
--- a/libheif/api/libheif/heif_experimental.cc
+++ b/libheif/api/libheif/heif_experimental.cc
@@ -346,7 +346,7 @@ void heif_pyramid_layer_info_release(heif_pyramid_layer_info* infos)
 #if HEIF_ENABLE_EXPERIMENTAL_FEATURES
 heif_error heif_context_add_tiled_image(heif_context* ctx,
                                         const heif_tiled_image_parameters* parameters,
-                                        const heif_encoding_options* options, // TODO: do we need this?
+                                        const heif_encoding_options* options,
                                         const heif_encoder* encoder,
                                         heif_image_handle** out_grid_image_handle)
 {
@@ -355,7 +355,7 @@ heif_error heif_context_add_tiled_image(heif_context* ctx,
   }

   Result<std::shared_ptr<ImageItem_Tiled> > gridImageResult;
-  gridImageResult = ImageItem_Tiled::add_new_tiled_item(ctx->context.get(), parameters, encoder);
+  gridImageResult = ImageItem_Tiled::add_new_tiled_item(ctx->context.get(), parameters, encoder, options);

   if (!gridImageResult) {
     return gridImageResult.error_struct(ctx->context.get());
diff --git a/libheif/image-items/tiled.cc b/libheif/image-items/tiled.cc
index 25feaaf2..eaff6917 100644
--- a/libheif/image-items/tiled.cc
+++ b/libheif/image-items/tiled.cc
@@ -484,12 +484,20 @@ std::string TiledHeader::dump() const
 ImageItem_Tiled::ImageItem_Tiled(HeifContext* ctx)
         : ImageItem(ctx)
 {
+  m_encoding_options = heif_encoding_options_alloc();
 }


 ImageItem_Tiled::ImageItem_Tiled(HeifContext* ctx, heif_item_id id)
         : ImageItem(ctx, id)
 {
+  m_encoding_options = heif_encoding_options_alloc();
+}
+
+
+ImageItem_Tiled::~ImageItem_Tiled()
+{
+  heif_encoding_options_free(m_encoding_options);
 }


@@ -591,7 +599,8 @@ Error ImageItem_Tiled::initialize_decoder()

 Result<std::shared_ptr<ImageItem_Tiled>>
 ImageItem_Tiled::add_new_tiled_item(HeifContext* ctx, const heif_tiled_image_parameters* parameters,
-                                    const heif_encoder* encoder)
+                                    const heif_encoder* encoder,
+                                    const heif_encoding_options* encoding_options)
 {
   auto max_tild_tiles = ctx->get_security_limits()->max_number_of_tiles;
   if (max_tild_tiles && number_of_tiles(*parameters) > max_tild_tiles) {
@@ -614,6 +623,10 @@ ImageItem_Tiled::add_new_tiled_item(HeifContext* ctx, const heif_tiled_image_par
   tild_image->set_resolution(parameters->image_width, parameters->image_height);
   ctx->insert_image_item(tild_id, tild_image);

+  if (encoding_options) {
+    tild_image->set_encoding_options(encoding_options);
+  }
+
   // Create tilC box

   auto tilC_box = std::make_shared<Box_tilC>();
@@ -669,7 +682,7 @@ Error ImageItem_Tiled::add_image_tile(uint32_t tile_x, uint32_t tile_y,
 {
   auto item = ImageItem::alloc_for_compression_format(get_context(), encoder->plugin->compression_format);

-  heif_encoding_options* options = heif_encoding_options_alloc(); // TODO: should this be taken from heif_context_add_tiled_image() ?
+  const heif_encoding_options* options = get_encoding_options();

   Result<std::shared_ptr<HeifPixelImage>> colorConversionResult;
   colorConversionResult = item->get_encoder()->convert_colorspace_for_encoding(image, encoder,
@@ -677,14 +690,12 @@ Error ImageItem_Tiled::add_image_tile(uint32_t tile_x, uint32_t tile_y,
                                                                                &options->color_conversion_options,
                                                                                get_context()->get_security_limits());
   if (!colorConversionResult) {
-    heif_encoding_options_free(options);
     return colorConversionResult.error();
   }

   std::shared_ptr<HeifPixelImage> colorConvertedImage = *colorConversionResult;

-  Result<Encoder::CodedImageData> encodeResult = item->encode_to_bitstream_and_boxes(colorConvertedImage, encoder, *options, heif_image_input_class_normal); // TODO (other than JPEG)
-  heif_encoding_options_free(options);
+  Result<Encoder::CodedImageData> encodeResult = item->encode_to_bitstream_and_boxes(colorConvertedImage, encoder, *options, heif_image_input_class_normal);

   if (!encodeResult) {
     return encodeResult.error();
diff --git a/libheif/image-items/tiled.h b/libheif/image-items/tiled.h
index 23e0e975..05a06982 100644
--- a/libheif/image-items/tiled.h
+++ b/libheif/image-items/tiled.h
@@ -29,6 +29,7 @@
 #include <memory>
 #include <utility>
 #include "libheif/heif_experimental.h"
+#include "libheif/heif_encoding.h"
 #include <set>


@@ -146,6 +147,8 @@ public:

   ImageItem_Tiled(HeifContext* ctx);

+  ~ImageItem_Tiled() override;
+
   uint32_t get_infe_type() const override { return fourcc("tili"); }

   // TODO: nclx depends on contained format
@@ -153,8 +156,15 @@ public:

   heif_compression_format get_compression_format() const override;

+  void set_encoding_options(const heif_encoding_options* options) {
+    heif_encoding_options_copy(m_encoding_options, options);
+  }
+
+  const heif_encoding_options* get_encoding_options() const { return m_encoding_options; }
+
   static Result<std::shared_ptr<ImageItem_Tiled>> add_new_tiled_item(HeifContext* ctx, const heif_tiled_image_parameters* parameters,
-                                                                     const heif_encoder* encoder);
+                                                                     const heif_encoder* encoder,
+                                                                     const heif_encoding_options* encoding_options);

   Error add_image_tile(uint32_t tile_x, uint32_t tile_y,
                        const std::shared_ptr<HeifPixelImage>& image,
@@ -203,6 +213,7 @@ public:
 private:
   TiledHeader m_tild_header;
   uint64_t m_next_tild_position = 0;
+  heif_encoding_options* m_encoding_options = nullptr;

   uint32_t mReadChunkSize_bytes = 64*1024; // 64 kiB
   bool m_preload_offset_table = false;