Commit 7dd40481 for libheif

commit 7dd40481fdf57a2c72023a92659fe504483c0825
Author: Dirk Farin <dirk.farin@gmail.com>
Date:   Fri Apr 10 23:17:59 2026 +0200

    Fix reading uninitialized value in x265 encoder when no NALs are produced

diff --git a/libheif/plugins/encoder_x265.cc b/libheif/plugins/encoder_x265.cc
index 1c35c0a4..88538c26 100644
--- a/libheif/plugins/encoder_x265.cc
+++ b/libheif/plugins/encoder_x265.cc
@@ -1114,7 +1114,10 @@ static heif_error x265_encode_sequence_frame(void* encoder_raw, const heif_image
                       &num_nals,
                       pic,
                       &out_pic);
-  uintptr_t frameNr = reinterpret_cast<uintptr_t>(out_pic->userData);
+  if (num_nals > 0 && out_pic) {
+    uintptr_t frameNr = reinterpret_cast<uintptr_t>(out_pic->userData);
+    encoder->append_nal_packets(nals, num_nals, frameNr);
+  }
 #else
   x265_picture out_pic;
   api->encoder_encode(encoder->encoder,
@@ -1123,13 +1126,11 @@ static heif_error x265_encode_sequence_frame(void* encoder_raw, const heif_image
                       pic,
                       &out_pic);

-  uintptr_t frameNr = reinterpret_cast<uintptr_t>(out_pic.userData);
-  for (uint32_t i = 0; i < num_nals; i++) {
-    //std::cout << " dequeue frame " << encoder->out_frameNr << ": " << naltype(encoder->nals[i].type) << "\n";
+  if (num_nals > 0) {
+    uintptr_t frameNr = reinterpret_cast<uintptr_t>(out_pic.userData);
+    encoder->append_nal_packets(nals, num_nals, frameNr);
   }

-  encoder->append_nal_packets(nals, num_nals, frameNr);
-
 #endif

   api->picture_free(pic);
@@ -1154,7 +1155,6 @@ static heif_error x265_end_sequence_encoding(void* encoder_raw)
                                    &num_nals,
                                    NULL,
                                    &out_pic);
-  uintptr_t frameNr = reinterpret_cast<uintptr_t>(out_pic->userData);
 #else
   x265_picture out_pic;
   int result = api->encoder_encode(encoder->encoder,
@@ -1162,20 +1162,16 @@ static heif_error x265_end_sequence_encoding(void* encoder_raw)
                                    &num_nals,
                                    NULL,
                                    &out_pic);
-  uintptr_t frameNr = reinterpret_cast<uintptr_t>(out_pic.userData);
-
-  for (uint32_t i = 0; i < num_nals; i++) {
-    //std::cout << "EOS flush, frame " << encoder->out_frameNr << ": " << naltype(encoder->nals[i].type) << "\n";
-  }
 #endif
-  if (result <= 0) {
-    // TODO: do we need this ?
-    //*data = nullptr;
-    //*size = 0;
-
-    return heif_error_ok; // ?
+  if (result <= 0 || num_nals == 0) {
+    return heif_error_ok;
   }

+#if X265_BUILD == 212
+  uintptr_t frameNr = out_pic ? reinterpret_cast<uintptr_t>(out_pic->userData) : 0;
+#else
+  uintptr_t frameNr = reinterpret_cast<uintptr_t>(out_pic.userData);
+#endif
   encoder->append_nal_packets(nals, num_nals, frameNr);

   encoder->api->param_free(encoder->param);