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/VirtualCameraRenderThread.cc b/services/camera/virtualcamera/VirtualCameraRenderThread.cc
index 5756797..8a2db1c 100644
--- a/services/camera/virtualcamera/VirtualCameraRenderThread.cc
+++ b/services/camera/virtualcamera/VirtualCameraRenderThread.cc
@@ -100,7 +100,11 @@
 NotifyMsg createRequestErrorNotifyMsg(int frameNumber) {
   NotifyMsg msg;
   msg.set<NotifyMsg::Tag::error>(ErrorMsg{
-      .frameNumber = frameNumber, .errorCode = ErrorCode::ERROR_REQUEST});
+      .frameNumber = frameNumber,
+      // errorStreamId needs to be set to -1 for ERROR_REQUEST
+      // (not tied to specific stream).
+      .errorStreamId = -1,
+      .errorCode = ErrorCode::ERROR_REQUEST});
   return msg;
 }
 
@@ -164,8 +168,9 @@
 
 void VirtualCameraRenderThread::flush() {
   std::lock_guard<std::mutex> lock(mLock);
-  for (auto task = std::move(mQueue.front()); !mQueue.empty();
-       mQueue.pop_front()) {
+  while (!mQueue.empty()) {
+    std::unique_ptr<ProcessCaptureRequestTask> task = std::move(mQueue.front());
+    mQueue.pop_front();
     flushCaptureRequest(*task);
   }
 }
@@ -233,6 +238,7 @@
   CaptureResult captureResult;
   captureResult.fmqResultSize = 0;
   captureResult.frameNumber = request.getFrameNumber();
+  // Partial result needs to be set to 1 when metadata are present.
   captureResult.partialResult = 1;
   captureResult.inputBuffer.streamId = -1;
   captureResult.physicalCameraMetadata.resize(0);
@@ -308,15 +314,10 @@
 
 void VirtualCameraRenderThread::flushCaptureRequest(
     const ProcessCaptureRequestTask& request) {
-  const std::chrono::nanoseconds timestamp =
-      std::chrono::duration_cast<std::chrono::nanoseconds>(
-          std::chrono::steady_clock::now().time_since_epoch());
-
   CaptureResult captureResult;
   captureResult.fmqResultSize = 0;
   captureResult.frameNumber = request.getFrameNumber();
   captureResult.inputBuffer.streamId = -1;
-  captureResult.result = createCaptureResultMetadata(timestamp);
 
   const std::vector<CaptureRequestBuffer>& buffers = request.getBuffers();
   captureResult.outputBuffers.resize(buffers.size());