Prevent deadlock on android camera

This commit is contained in:
KOGA Mitsuhiro
2025-11-27 04:01:11 +09:00
parent 9dd6c4dbac
commit 0a68eb3d37

View File

@ -489,17 +489,21 @@ void CameraFeedAndroid::onSessionClosed(void *context, ACameraCaptureSession *se
} }
void CameraFeedAndroid::deactivate_feed() { 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) { if (session != nullptr) {
ACameraCaptureSession_stopRepeating(session); ACameraCaptureSession_stopRepeating(session);
ACameraCaptureSession_close(session); ACameraCaptureSession_close(session);
session = nullptr; session = nullptr;
} }
if (reader != nullptr) { // Now safe to acquire lock and clean up resources.
AImageReader_setImageListener(reader, nullptr); // No new callbacks will be triggered after this point.
}
{
MutexLock lock(callback_mutex); MutexLock lock(callback_mutex);
if (device != nullptr) { if (device != nullptr) {
@ -517,7 +521,6 @@ void CameraFeedAndroid::deactivate_feed() {
request = nullptr; request = nullptr;
} }
} }
}
void CameraFeedAndroid::onError(void *context, ACameraDevice *p_device, int error) { void CameraFeedAndroid::onError(void *context, ACameraDevice *p_device, int error) {
print_error(vformat("Camera error: %d", error)); print_error(vformat("Camera error: %d", error));