Skip to content

Commit 3a97723

Browse files
committed
Merge pull request #113209 from shiena/fix/prevent_freeze_android_camera
Prevent deadlock on Android camera
2 parents b22d153 + 0a68eb3 commit 3a97723

File tree

1 file changed

+21
-18
lines changed

1 file changed

+21
-18
lines changed

modules/camera/camera_android.cpp

Lines changed: 21 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -489,33 +489,36 @@ void CameraFeedAndroid::onSessionClosed(void *context, ACameraCaptureSession *se
489489
}
490490

491491
void CameraFeedAndroid::deactivate_feed() {
492+
// First, remove image listener to prevent new callbacks.
493+
if (reader != nullptr) {
494+
AImageReader_setImageListener(reader, nullptr);
495+
}
496+
497+
// Stop and close capture session.
498+
// These calls may wait for pending callbacks to complete.
492499
if (session != nullptr) {
493500
ACameraCaptureSession_stopRepeating(session);
494501
ACameraCaptureSession_close(session);
495502
session = nullptr;
496503
}
497504

498-
if (reader != nullptr) {
499-
AImageReader_setImageListener(reader, nullptr);
500-
}
501-
502-
{
503-
MutexLock lock(callback_mutex);
505+
// Now safe to acquire lock and clean up resources.
506+
// No new callbacks will be triggered after this point.
507+
MutexLock lock(callback_mutex);
504508

505-
if (device != nullptr) {
506-
ACameraDevice_close(device);
507-
device = nullptr;
508-
}
509+
if (device != nullptr) {
510+
ACameraDevice_close(device);
511+
device = nullptr;
512+
}
509513

510-
if (reader != nullptr) {
511-
AImageReader_delete(reader);
512-
reader = nullptr;
513-
}
514+
if (reader != nullptr) {
515+
AImageReader_delete(reader);
516+
reader = nullptr;
517+
}
514518

515-
if (request != nullptr) {
516-
ACaptureRequest_free(request);
517-
request = nullptr;
518-
}
519+
if (request != nullptr) {
520+
ACaptureRequest_free(request);
521+
request = nullptr;
519522
}
520523
}
521524

0 commit comments

Comments
 (0)