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 ||