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;