Commit 0665e35b for libheif
commit 0665e35b60d151c989610c361a646058181f6b1c
Author: Dirk Farin <dirk.farin@gmail.com>
Date: Mon May 18 01:10:45 2026 +0200
add defensive checks that a plugin encoder is not reused (#1732)
diff --git a/libheif/plugins/encoder_aom.cc b/libheif/plugins/encoder_aom.cc
index 0fa47fb6..166c9529 100644
--- a/libheif/plugins/encoder_aom.cc
+++ b/libheif/plugins/encoder_aom.cc
@@ -877,6 +877,9 @@ static heif_error aom_start_sequence_encoding_intern(void* encoder_raw, const he
{
encoder_struct_aom* encoder = (encoder_struct_aom*) encoder_raw;
+ // an encoder instance must only be used once
+ assert(encoder->codec.iface == nullptr);
+
heif_error err;
const int source_width = heif_image_get_width(image, heif_channel_Y);
diff --git a/libheif/plugins/encoder_kvazaar.cc b/libheif/plugins/encoder_kvazaar.cc
index 9248f296..94d75310 100644
--- a/libheif/plugins/encoder_kvazaar.cc
+++ b/libheif/plugins/encoder_kvazaar.cc
@@ -463,6 +463,10 @@ static heif_error kvazaar_start_sequence_encoding_intern(void* encoder_raw, cons
{
encoder_struct_kvazaar* encoder = (encoder_struct_kvazaar*) encoder_raw;
+ // an encoder instance must only be used once
+ assert(encoder->kvzencoder == nullptr);
+ assert(encoder->config == nullptr);
+
int bit_depth = heif_image_get_bits_per_pixel_range(image, heif_channel_Y);
// Kvazaar uses a hard-coded bit depth (https://github.com/ultravideo/kvazaar/issues/399).
diff --git a/libheif/plugins/encoder_rav1e.cc b/libheif/plugins/encoder_rav1e.cc
index 641618b7..ba0ae9b6 100644
--- a/libheif/plugins/encoder_rav1e.cc
+++ b/libheif/plugins/encoder_rav1e.cc
@@ -509,6 +509,9 @@ heif_error rav1e_start_sequence_encoding_intern(void* encoder_raw, const heif_im
{
auto* encoder = (encoder_struct_rav1e*) encoder_raw;
+ // an encoder instance must only be used once
+ assert(encoder->rav1eContextRaw == nullptr);
+
const heif_chroma chroma = heif_image_get_chroma_format(image);
RaChromaSampling chromaSampling;
diff --git a/libheif/plugins/encoder_svt.cc b/libheif/plugins/encoder_svt.cc
index 2c9b7a00..6aa01f59 100644
--- a/libheif/plugins/encoder_svt.cc
+++ b/libheif/plugins/encoder_svt.cc
@@ -696,6 +696,10 @@ static heif_error svt_start_sequence_encoding_intern(void* encoder_raw, const he
bool image_sequence)
{
auto* encoder = (encoder_struct_svt*) encoder_raw;
+
+ // an encoder instance must only be used once
+ assert(encoder->svt_encoder == nullptr);
+
encoder->input_class = input_class;
EbErrorType res = EB_ErrorNone;
heif_error err;
diff --git a/libheif/plugins/encoder_uvg266.cc b/libheif/plugins/encoder_uvg266.cc
index 360fad3d..22bfb77a 100644
--- a/libheif/plugins/encoder_uvg266.cc
+++ b/libheif/plugins/encoder_uvg266.cc
@@ -465,6 +465,10 @@ static heif_error uvg266_start_sequence_encoding_intern(void* encoder_raw, const
{
encoder_struct_uvg266* encoder = (encoder_struct_uvg266*) encoder_raw;
+ // an encoder instance must only be used once
+ assert(encoder->kvzencoder == nullptr);
+ assert(encoder->config == nullptr);
+
int bit_depth = heif_image_get_bits_per_pixel_range(image, heif_channel_Y);
const uvg_api* api = uvg_api_get(bit_depth);
diff --git a/libheif/plugins/encoder_vvenc.cc b/libheif/plugins/encoder_vvenc.cc
index 4367d6e1..8a29b512 100644
--- a/libheif/plugins/encoder_vvenc.cc
+++ b/libheif/plugins/encoder_vvenc.cc
@@ -434,6 +434,9 @@ static heif_error vvenc_start_sequence_encoding_intern(void* encoder_raw, const
{
encoder_struct_vvenc* encoder = (encoder_struct_vvenc*) encoder_raw;
+ // an encoder instance must only be used once
+ assert(encoder->vvencoder == nullptr);
+
vvenc_config params;
int bit_depth = heif_image_get_bits_per_pixel_range(image, heif_channel_Y);