Commit b36db101 for libheif

commit b36db101c7cea4cb472ac4449d9363473d2f1cf8
Author: Dirk Farin <dirk.farin@gmail.com>
Date:   Sun May 17 19:34:13 2026 +0200

    use heif_unci_image_parameters* in heif_encoding_options instead of just unci compression type

diff --git a/examples/heif_enc.cc b/examples/heif_enc.cc
index e1c3cb79..d94d667e 100644
--- a/examples/heif_enc.cc
+++ b/examples/heif_enc.cc
@@ -2116,7 +2116,13 @@ int main(int argc, char** argv)
     options->color_conversion_options.only_use_preferred_chroma_algorithm = true;
   }

-  options->unci_compression = unci_compression;
+  // Stash unci compression in a parameters struct that 'options' will point at.
+  // Geometry fields are ignored on the heif_context_encode_image() path; only
+  // 'compression' is consulted there.
+  heif_unci_image_parameters unci_params_for_encode_image{};
+  unci_params_for_encode_image.version = 1;
+  unci_params_for_encode_image.compression = unci_compression;
+  options->unci_parameters = &unci_params_for_encode_image;

   // --- if no output filename was given, synthesize one from the first input image filename

diff --git a/libheif/api/libheif/heif_encoding.cc b/libheif/api/libheif/heif_encoding.cc
index 77afd379..0d0a49a2 100644
--- a/libheif/api/libheif/heif_encoding.cc
+++ b/libheif/api/libheif/heif_encoding.cc
@@ -618,7 +618,7 @@ static void set_default_encoding_options(heif_encoding_options& options)

   options.prefer_uncC_short_form = true;

-  options.unci_compression = heif_unci_compression_off;
+  options.unci_parameters = nullptr;
 }


@@ -642,7 +642,7 @@ void heif_encoding_options_copy(heif_encoding_options* dst, const heif_encoding_

   switch (min_version) {
     case 8:
-      dst->unci_compression = src->unci_compression;
+      dst->unci_parameters = src->unci_parameters;
       [[fallthrough]];
     case 7:
       dst->prefer_uncC_short_form = src->prefer_uncC_short_form;
diff --git a/libheif/api/libheif/heif_encoding.h b/libheif/api/libheif/heif_encoding.h
index 7e6bb165..2906e491 100644
--- a/libheif/api/libheif/heif_encoding.h
+++ b/libheif/api/libheif/heif_encoding.h
@@ -270,7 +270,6 @@ typedef enum heif_orientation
 } heif_orientation;


-//NEWAPI
 LIBHEIF_API
 heif_orientation heif_orientation_concat(heif_orientation first, heif_orientation second);

@@ -316,10 +315,11 @@ typedef struct heif_encoding_options

   // version 8 options

-  //NEWAPI
-  // Set this to enable compression for 'unci' images encoded through heif_context_encode_image().
-  // Default: heif_unci_compression_off
-  heif_unci_compression unci_compression;
+  // Optional 'unci'-specific encoding parameters (compression method, and future fields
+  // such as interleave type and padding).
+  //
+  // Default: nullptr
+  const heif_unci_image_parameters* unci_parameters;

   // TODO: we should add a flag to force MIAF compatible outputs. E.g. this will put restrictions on grid tile sizes and
   //       might add a clap box when the grid output size does not match the color subsampling factors.
diff --git a/libheif/api/libheif/heif_security.h b/libheif/api/libheif/heif_security.h
index 0db94037..76ca958b 100644
--- a/libheif/api/libheif/heif_security.h
+++ b/libheif/api/libheif/heif_security.h
@@ -72,10 +72,8 @@ typedef struct heif_security_limits

   // --- version 4 (v1.22.0)

-  //NEWAPI
   uint32_t max_bad_pixels;

-  //NEWAPI
   // Internal: when libheif derives a limits struct from another one (e.g. to
   // tighten the maximum image size for a specific decode), this points back to
   // the registered context whose total-memory budget the allocation should be
diff --git a/libheif/api/libheif/heif_sequences.h b/libheif/api/libheif/heif_sequences.h
index 85480ff2..3637cba4 100644
--- a/libheif/api/libheif/heif_sequences.h
+++ b/libheif/api/libheif/heif_sequences.h
@@ -159,7 +159,6 @@ int heif_track_has_alpha_channel(const heif_track*);
 LIBHEIF_API
 uint32_t heif_track_get_timescale(const heif_track*);

-//NEWAPI
 /**
  * Special return value of `heif_track_get_number_of_repetitions()` indicating that
  * the editlist requests indefinite repetition (the mvhd duration is the ISOBMFF
@@ -192,7 +191,6 @@ uint32_t heif_track_get_timescale(const heif_track*);
  * timeline exactly once. Use the value returned by this function to decide how often
  * to replay the track at the application level.
  */
-//NEWAPI
 LIBHEIF_API
 uint32_t heif_track_get_number_of_repetitions(const heif_track*);

diff --git a/libheif/api/libheif/heif_uncompressed.h b/libheif/api/libheif/heif_uncompressed.h
index e8489745..1e0f2298 100644
--- a/libheif/api/libheif/heif_uncompressed.h
+++ b/libheif/api/libheif/heif_uncompressed.h
@@ -287,9 +287,17 @@ void heif_unci_image_parameters_release(heif_unci_image_parameters*);
  * However, this will by default disable any compression and any control about
  * the data layout.
  *
+ * The function also accepts a direct heif_unci_image_parameters argument and
+ * indirectly through encoding_options. At least one of the two must be non-null.
+ * If both are non-null and differ, the direct argument takes precedence.
+ *
  * @param ctx The file context
- * @param parameters The parameters for the image, must not be NULL.
- * @param encoding_options Optional, may be NULL.
+ * @param parameters The parameters for the image. May be NULL if
+ *                  heif_encoding_options::unci_parameters is set instead. If both this
+ *                  argument and encoding_options->unci_parameters are non-null and
+ *                  differ, this argument takes precedence.
+ * @param encoding_options Optional, may be NULL. If non-null and unci_parameters is set,
+ *                  it may carry the unci parameters in place of the direct argument.
  * @param prototype An image with the same channel configuration as the image data
  *                  that will be later inserted. The image size need not match this.
  *                  Must not be NULL.
diff --git a/libheif/codecs/uncompressed/unc_encoder.cc b/libheif/codecs/uncompressed/unc_encoder.cc
index 1e2682bc..2cf50a81 100644
--- a/libheif/codecs/uncompressed/unc_encoder.cc
+++ b/libheif/codecs/uncompressed/unc_encoder.cc
@@ -245,7 +245,10 @@ Result<Encoder::CodedImageData> unc_encoder::encode(const std::shared_ptr<const

   // --- optionally compress

-  heif_unci_compression compression = (in_options.version >= 8) ? in_options.unci_compression : heif_unci_compression_off;
+  heif_unci_compression compression = heif_unci_compression_off;
+  if (in_options.version >= 8 && in_options.unci_parameters != nullptr) {
+    compression = in_options.unci_parameters->compression;
+  }

   if (compression != heif_unci_compression_off) {
     uint32_t compr_fourcc = unci_compression_to_fourcc(compression);
diff --git a/libheif/image-items/unc_image.cc b/libheif/image-items/unc_image.cc
index 05c4a734..22bbbbf5 100644
--- a/libheif/image-items/unc_image.cc
+++ b/libheif/image-items/unc_image.cc
@@ -193,6 +193,21 @@ Result<std::shared_ptr<ImageItem_uncompressed>> ImageItem_uncompressed::add_unci
 {
   assert(encoding_options != nullptr);

+  // Resolve effective unci parameters: the direct argument takes precedence; otherwise
+  // fall back to encoding_options->unci_parameters. At least one must be non-null.
+
+  if (parameters == nullptr &&
+      (encoding_options->version < 8 || encoding_options->unci_parameters == nullptr)) {
+    return Error{heif_error_Usage_error,
+                 heif_suberror_Invalid_parameter_value,
+                 "heif_context_add_empty_unci_image: either the 'parameters' argument or "
+                 "heif_encoding_options::unci_parameters must be non-null."};
+  }
+
+  if (parameters == nullptr) {
+    parameters = encoding_options->unci_parameters;
+  }
+
   // Check input parameters

   if (parameters->image_width % parameters->tile_width != 0 ||