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();
}