From 0a68eb3d37682b31bf5374d2dbd3745ce8a53f59 Mon Sep 17 00:00:00 2001 From: KOGA Mitsuhiro Date: Thu, 27 Nov 2025 04:01:11 +0900 Subject: [PATCH] Prevent deadlock on android camera --- modules/camera/camera_android.cpp | 39 +++++++++++++++++-------------- 1 file changed, 21 insertions(+), 18 deletions(-) diff --git a/modules/camera/camera_android.cpp b/modules/camera/camera_android.cpp index 1798078c1f4..5fd5a4081f0 100644 --- a/modules/camera/camera_android.cpp +++ b/modules/camera/camera_android.cpp @@ -489,33 +489,36 @@ void CameraFeedAndroid::onSessionClosed(void *context, ACameraCaptureSession *se } void CameraFeedAndroid::deactivate_feed() { + // First, remove image listener to prevent new callbacks. + if (reader != nullptr) { + AImageReader_setImageListener(reader, nullptr); + } + + // Stop and close capture session. + // These calls may wait for pending callbacks to complete. if (session != nullptr) { ACameraCaptureSession_stopRepeating(session); ACameraCaptureSession_close(session); session = nullptr; } - if (reader != nullptr) { - AImageReader_setImageListener(reader, nullptr); + // Now safe to acquire lock and clean up resources. + // No new callbacks will be triggered after this point. + MutexLock lock(callback_mutex); + + if (device != nullptr) { + ACameraDevice_close(device); + device = nullptr; } - { - MutexLock lock(callback_mutex); + if (reader != nullptr) { + AImageReader_delete(reader); + reader = nullptr; + } - if (device != nullptr) { - ACameraDevice_close(device); - device = nullptr; - } - - if (reader != nullptr) { - AImageReader_delete(reader); - reader = nullptr; - } - - if (request != nullptr) { - ACaptureRequest_free(request); - request = nullptr; - } + if (request != nullptr) { + ACaptureRequest_free(request); + request = nullptr; } }