diff --git a/bin/jni/videomanager.i b/bin/jni/videomanager.i
index cacee0bee798c0e734298f9b2532dbf15cf828e1..5f853489cbe50221ada2f6d6f8e822aa2152be9e 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 (...) {
     }