From d987d634556844c0e1ac5a979054dc9a2d7494d3 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Adrien=20B=C3=A9raud?= <adrien.beraud@savoirfairelinux.com>
Date: Thu, 7 Oct 2021 17:29:29 -0400
Subject: [PATCH] jni: release buffer if window lock failed

Change-Id: I12148f354905cd888e284ab5583a80f9fe721248
---
 bin/jni/videomanager.i | 30 +++++++++++++++++++-----------
 1 file changed, 19 insertions(+), 11 deletions(-)

diff --git a/bin/jni/videomanager.i b/bin/jni/videomanager.i
index cacee0bee7..5f853489cb 100644
--- a/bin/jni/videomanager.i
+++ b/bin/jni/videomanager.i
@@ -300,9 +300,8 @@ JNIEXPORT void JNICALL Java_net_jami_daemon_JamiServiceJNI_setNativeWindowGeomet
     ANativeWindow_setBuffersGeometry(window, width, height, WINDOW_FORMAT_RGBX_8888);
 }
 
-void AndroidDisplayCb(ANativeWindow *window, std::unique_ptr<DRing::FrameBuffer> frame)
+void releaseBuffer(ANativeWindow *window, std::unique_ptr<DRing::FrameBuffer> frame)
 {
-    ANativeWindow_unlockAndPost(window);
     std::unique_lock<std::mutex> guard(windows_mutex);
     try {
         windows.at(window) = std::move(frame);
@@ -311,24 +310,33 @@ void AndroidDisplayCb(ANativeWindow *window, std::unique_ptr<DRing::FrameBuffer>
     }
 }
 
+void AndroidDisplayCb(ANativeWindow *window, std::unique_ptr<DRing::FrameBuffer> frame)
+{
+    ANativeWindow_unlockAndPost(window);
+    releaseBuffer(window, std::move(frame));
+}
+
 std::unique_ptr<DRing::FrameBuffer> sinkTargetPullCallback(ANativeWindow *window, std::size_t bytes)
 {
     try {
-        std::unique_ptr<DRing::FrameBuffer> ret;
+        std::unique_ptr<DRing::FrameBuffer> frame;
         {
             std::lock_guard<std::mutex> guard(windows_mutex);
-            ret = std::move(windows.at(window));
+            frame = std::move(windows.at(window));
         }
-        if (ret) {
+        if (frame) {
             ANativeWindow_Buffer buffer;
             if (ANativeWindow_lock(window, &buffer, nullptr) == 0) {
-                ret->avframe->format = AV_PIX_FMT_RGBA;
-                ret->avframe->width = buffer.width;
-                ret->avframe->height = buffer.height;
-                ret->avframe->data[0] = (uint8_t *) buffer.bits;
-                ret->avframe->linesize[0] = buffer.stride * 4;
+                frame->avframe->format = AV_PIX_FMT_RGBA;
+                frame->avframe->width = buffer.width;
+                frame->avframe->height = buffer.height;
+                frame->avframe->data[0] = (uint8_t *) buffer.bits;
+                frame->avframe->linesize[0] = buffer.stride * 4;
+                return frame;
+            } else {
+                __android_log_print(ANDROID_LOG_WARN, TAG, "Can't lock window");
+                releaseBuffer(window, std::move(frame));
             }
-            return ret;
         }
     } catch (...) {
     }
-- 
GitLab