Prevent deadlock on android camera
This commit is contained in:
@ -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));
|
||||||
|
|||||||
Reference in New Issue
Block a user