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,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;
}
}