Commit 434d96c5 for libheif

commit 434d96c53b86c82a598aeb960be32035a7cea742
Author: Dirk Farin <dirk.farin@gmail.com>
Date:   Mon Apr 13 22:44:58 2026 +0200

    release decoder immediately after decoding image (might fix #1755)

diff --git a/libheif/codecs/decoder.cc b/libheif/codecs/decoder.cc
index 4a734d43..33690fec 100644
--- a/libheif/codecs/decoder.cc
+++ b/libheif/codecs/decoder.cc
@@ -269,13 +269,18 @@ Result<std::vector<uint8_t>> Decoder::get_compressed_data(bool with_configuratio


 Decoder::~Decoder()
+{
+  release_decoder();
+}
+
+
+void Decoder::release_decoder()
 {
   if (m_decoder) {
     assert(m_decoder_plugin);
     m_decoder_plugin->free_decoder(m_decoder);
+    m_decoder = nullptr;
   }
-
-  //std::unique_ptr<void, void (*)(void*)> decoderSmartPtr(m_decoder, m_decoder_plugin->free_decoder);
 }


@@ -453,6 +458,7 @@ Decoder::decode_single_frame_from_compressed_data(const heif_decoding_options& o
 {
   Error decodeError = decode_sequence_frame_from_compressed_data(true, options, 0, limits);
   if (decodeError) {
+    release_decoder();
     return decodeError;
   }

@@ -467,15 +473,19 @@ Decoder::decode_single_frame_from_compressed_data(const heif_decoding_options& o
     Result<std::shared_ptr<HeifPixelImage>> imgResult;
     imgResult = get_decoded_frame(options, nullptr, limits);
     if (imgResult.error()) {
+      release_decoder();
       return imgResult.error();
     }

     if (*imgResult != nullptr) {
+      release_decoder();
       return imgResult;
     }
   }

-  // We did not receive and image from the decoder. We give up.
+  // We did not receive an image from the decoder. We give up.
+
+  release_decoder();

   return Error{
     heif_error_Decoder_plugin_error,
diff --git a/libheif/codecs/decoder.h b/libheif/codecs/decoder.h
index ea351d6b..e76958b8 100644
--- a/libheif/codecs/decoder.h
+++ b/libheif/codecs/decoder.h
@@ -115,6 +115,10 @@ public:
                                                                      uintptr_t* out_user_data,
                                                                      const heif_security_limits* limits);

+  // Release the codec plugin decoder context (frees worker threads).
+  // Safe to call multiple times. The decoder will be re-created on next use.
+  void release_decoder();
+
 private:
   DataExtent m_data_extent;