Fix few issues in virtual camera service:

  * Fix incorrect flush implementation (do not try to fetch element from
    empty queue).
  * Gracefully handle flush call even if render thread is not running.
  * Make sure thread is terminated when close is called on session.
  * Remove metadata from CaptureResult send when processing flush
    request.
  * Set streamId to -1 in ErrorRequest NotifyMsg (required, otherwise
    it NotifyMsg fails validation in framework).

Bug: 301023410
Test: atest virtual_camera_tests
Test: OpenCamera
Change-Id: I899a9eaed0b69eed93945391c2d0a25120136267
diff --git a/services/camera/virtualcamera/VirtualCameraSession.cc b/services/camera/virtualcamera/VirtualCameraSession.cc
index ff6235f..34d9932 100644
--- a/services/camera/virtualcamera/VirtualCameraSession.cc
+++ b/services/camera/virtualcamera/VirtualCameraSession.cc
@@ -179,6 +179,14 @@
     mVirtualCameraClientCallback->onStreamClosed(/*streamId=*/0);
   }
 
+  {
+    std::lock_guard<std::mutex> lock(mLock);
+    if (mRenderThread != nullptr) {
+      mRenderThread->stop();
+      mRenderThread = nullptr;
+    }
+  }
+
   mSessionContext.closeAllStreams();
   return ndk::ScopedAStatus::ok();
 }
@@ -275,7 +283,9 @@
 ndk::ScopedAStatus VirtualCameraSession::flush() {
   ALOGV("%s", __func__);
   std::lock_guard<std::mutex> lock(mLock);
-  mRenderThread->flush();
+  if (mRenderThread != nullptr) {
+    mRenderThread->flush();
+  }
   return ndk::ScopedAStatus::ok();
 }