Camera: Exit PreviewStreamSpacer when disconnecting stream

- Call requestExit() during Camera3OutputStream disconnect.
- Remove requestExitAndWait() from the PreviewStreamSpacer
  destructor.
- Return false if exitPending() is true in threadLoop.
- Use wp<> when accessing parent from PreviewStreamSpacer.

Test: Camera CTS, and vendor testing
Bug: 232046746
Bug: 232829166
Change-Id: I136a93fee37cd6fbdb8050cacea1511170e03ee6
diff --git a/services/camera/libcameraservice/device3/Camera3OutputStream.cpp b/services/camera/libcameraservice/device3/Camera3OutputStream.cpp
index 1ce7108..4a9b259 100644
--- a/services/camera/libcameraservice/device3/Camera3OutputStream.cpp
+++ b/services/camera/libcameraservice/device3/Camera3OutputStream.cpp
@@ -689,7 +689,7 @@
             mSyncToDisplay = true;
             mTotalBufferCount += kDisplaySyncExtraBuffer;
         } else if (defaultToSpacer) {
-            mPreviewFrameSpacer = new PreviewFrameSpacer(*this, mConsumer);
+            mPreviewFrameSpacer = new PreviewFrameSpacer(this, mConsumer);
             mTotalBufferCount ++;
             res = mPreviewFrameSpacer->run(String8::format("PreviewSpacer-%d", mId).string());
             if (res != OK) {
@@ -970,6 +970,10 @@
 
     returnPrefetchedBuffersLocked();
 
+    if (mPreviewFrameSpacer != nullptr) {
+        mPreviewFrameSpacer->requestExit();
+    }
+
     ALOGV("%s: disconnecting stream %d from native window", __FUNCTION__, getId());
 
     res = native_window_api_disconnect(mConsumer.get(),