@@ -489,33 +489,36 @@ void CameraFeedAndroid::onSessionClosed(void *context, ACameraCaptureSession *se
489489}
490490
491491void 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