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;