Make handling input surface in test camera more robust.
Bug: 301023410
Test: Manual with OpenCamera and test camera instance
Change-Id: I59a27c1ba2a1074d38650e58cce61c5587a1c1d3
diff --git a/services/camera/virtualcamera/VirtualCameraTestInstance.cc b/services/camera/virtualcamera/VirtualCameraTestInstance.cc
index 1eac4fe..ff4a2d8 100644
--- a/services/camera/virtualcamera/VirtualCameraTestInstance.cc
+++ b/services/camera/virtualcamera/VirtualCameraTestInstance.cc
@@ -125,10 +125,18 @@
ALOGV("%s: streamId %d, %dx%d pixFmt=%s", __func__, streamId, width, height,
toString(pixelFormat).c_str());
- std::lock_guard<std::mutex> lock(mLock);
- mRenderer = std::make_shared<TestPatternRenderer>(
+ auto renderer = std::make_shared<TestPatternRenderer>(
nativeWindowFromSurface(surface), mFps);
- mRenderer->start();
+
+ std::lock_guard<std::mutex> lock(mLock);
+ if (mInputRenderers.try_emplace(streamId, renderer).second) {
+ renderer->start();
+ } else {
+ ALOGE(
+ "%s: Input stream with id %d is already active, ignoring "
+ "onStreamConfigured call",
+ __func__, streamId);
+ }
return ScopedAStatus::ok();
}
@@ -141,10 +149,17 @@
ScopedAStatus VirtualCameraTestInstance::onStreamClosed(const int32_t streamId) {
ALOGV("%s: streamId %d", __func__, streamId);
- std::lock_guard<std::mutex> lock(mLock);
- if (mRenderer != nullptr) {
- mRenderer->stop();
- mRenderer.reset();
+ std::shared_ptr<TestPatternRenderer> renderer;
+ {
+ std::lock_guard<std::mutex> lock(mLock);
+ auto it = mInputRenderers.find(streamId);
+ if (it != mInputRenderers.end()) {
+ renderer = std::move(it->second);
+ mInputRenderers.erase(it);
+ }
+ }
+ if (renderer != nullptr) {
+ renderer->stop();
}
return ScopedAStatus::ok();
}
diff --git a/services/camera/virtualcamera/VirtualCameraTestInstance.h b/services/camera/virtualcamera/VirtualCameraTestInstance.h
index 43e33d5..c130645 100644
--- a/services/camera/virtualcamera/VirtualCameraTestInstance.h
+++ b/services/camera/virtualcamera/VirtualCameraTestInstance.h
@@ -17,7 +17,7 @@
#define ANDROID_COMPANION_VIRTUALCAMERA_VIRTUALCAMERATESTINSTANCE_H
#include <atomic>
-#include <condition_variable>
+#include <map>
#include <memory>
#include <thread>
@@ -80,7 +80,10 @@
const int mFps;
std::mutex mLock;
- std::shared_ptr<TestPatternRenderer> mRenderer GUARDED_BY(mLock);
+ // Map maintaining streamId -> TestPatternRenderer mapping for active
+ // input streams.
+ std::map<int, std::shared_ptr<TestPatternRenderer>> mInputRenderers
+ GUARDED_BY(mLock);
};
} // namespace virtualcamera