Loading services/camera/virtualcamera/VirtualCameraProvider.cc +8 −6 Original line number Diff line number Diff line Loading @@ -42,10 +42,6 @@ using ::aidl::android::hardware::camera::provider::CameraIdAndStreamCombination; using ::aidl::android::hardware::camera::provider::ConcurrentCameraIdCombination; using ::aidl::android::hardware::camera::provider::ICameraProviderCallback; // TODO(b/301023410) Make camera id range configurable / dynamic // based on already registered devices. std::atomic_int VirtualCameraProvider::sNextId{42}; ndk::ScopedAStatus VirtualCameraProvider::setCallback( const std::shared_ptr<ICameraProviderCallback>& in_callback) { ALOGV("%s", __func__); Loading Loading @@ -154,9 +150,15 @@ ndk::ScopedAStatus VirtualCameraProvider::isConcurrentStreamCombinationSupported } std::shared_ptr<VirtualCameraDevice> VirtualCameraProvider::createCamera( const VirtualCameraConfiguration& configuration) { const VirtualCameraConfiguration& configuration, const int cameraId) { if (cameraId < 0) { ALOGE("%s: Cannot create camera with negative id. cameraId: %d", __func__, cameraId); return nullptr; } auto camera = ndk::SharedRefBase::make<VirtualCameraDevice>(sNextId++, configuration); ndk::SharedRefBase::make<VirtualCameraDevice>(cameraId, configuration); std::shared_ptr<ICameraProviderCallback> callback; { const std::lock_guard<std::mutex> lock(mLock); Loading services/camera/virtualcamera/VirtualCameraProvider.h +2 −4 Original line number Diff line number Diff line Loading @@ -76,7 +76,8 @@ class VirtualCameraProvider // Returns nullptr if creation was not successful. std::shared_ptr<VirtualCameraDevice> createCamera( const aidl::android::companion::virtualcamera::VirtualCameraConfiguration& configuration); configuration, int cameraId); std::shared_ptr<VirtualCameraDevice> getCamera(const std::string& name); Loading @@ -91,9 +92,6 @@ class VirtualCameraProvider std::map<std::string, std::shared_ptr<VirtualCameraDevice>> mCameras GUARDED_BY(mLock); // Numerical id to assign to next created camera. static std::atomic_int sNextId; }; } // namespace virtualcamera Loading services/camera/virtualcamera/VirtualCameraService.cc +26 −6 Original line number Diff line number Diff line Loading @@ -46,6 +46,10 @@ using ::aidl::android::companion::virtualcamera::SensorOrientation; using ::aidl::android::companion::virtualcamera::SupportedStreamConfiguration; using ::aidl::android::companion::virtualcamera::VirtualCameraConfiguration; // TODO(b/301023410) Make camera id range configurable / dynamic // based on already registered devices. std::atomic_int VirtualCameraService::sNextId{1000}; namespace { constexpr int kVgaWidth = 640; Loading Loading @@ -110,6 +114,13 @@ VirtualCameraService::VirtualCameraService( ndk::ScopedAStatus VirtualCameraService::registerCamera( const ::ndk::SpAIBinder& token, const VirtualCameraConfiguration& configuration, bool* _aidl_return) { return registerCamera(token, configuration, sNextId++, _aidl_return); } ndk::ScopedAStatus VirtualCameraService::registerCamera( const ::ndk::SpAIBinder& token, const VirtualCameraConfiguration& configuration, const int cameraId, bool* _aidl_return) { if (!mPermissionProxy.checkCallingPermission(kCreateVirtualDevicePermission)) { ALOGE("%s: caller (pid %d, uid %d) doesn't hold %s permission", __func__, getpid(), getuid(), kCreateVirtualDevicePermission); Loading Loading @@ -141,7 +152,7 @@ ndk::ScopedAStatus VirtualCameraService::registerCamera( } std::shared_ptr<VirtualCameraDevice> camera = mVirtualCameraProvider->createCamera(configuration); mVirtualCameraProvider->createCamera(configuration, cameraId); if (camera == nullptr) { ALOGE("Failed to create camera for binder token 0x%" PRIxPTR, reinterpret_cast<uintptr_t>(token.get())); Loading Loading @@ -236,7 +247,15 @@ binder_status_t VirtualCameraService::handleShellCommand(int in, int out, } const char* const cmd = args[0]; if (strcmp(kEnableTestCameraCmd, cmd) == 0) { enableTestCameraCmd(in, err); int cameraId = 0; if (numArgs > 1 && args[1] != nullptr) { cameraId = atoi(args[1]); } if (cameraId == 0) { cameraId = sNextId++; } enableTestCameraCmd(in, err, cameraId); } else if (strcmp(kDisableTestCameraCmd, cmd) == 0) { disableTestCameraCmd(in); } else { Loading @@ -247,7 +266,8 @@ binder_status_t VirtualCameraService::handleShellCommand(int in, int out, return STATUS_OK; } void VirtualCameraService::enableTestCameraCmd(const int out, const int err) { void VirtualCameraService::enableTestCameraCmd(const int out, const int err, const int cameraId) { if (mTestCameraToken != nullptr) { dprintf(out, "Test camera is already enabled (%s).", getCamera(mTestCameraToken)->getCameraName().c_str()); Loading @@ -264,7 +284,7 @@ void VirtualCameraService::enableTestCameraCmd(const int out, const int err) { Format::YUV_420_888, .maxFps = kMaxFps}); configuration.lensFacing = LensFacing::EXTERNAL; registerCamera(mTestCameraToken, configuration, &ret); registerCamera(mTestCameraToken, configuration, cameraId, &ret); if (ret) { dprintf(out, "Successfully registered test camera %s", getCamera(mTestCameraToken)->getCameraName().c_str()); Loading services/camera/virtualcamera/VirtualCameraService.h +11 −1 Original line number Diff line number Diff line Loading @@ -45,6 +45,13 @@ class VirtualCameraService configuration, bool* _aidl_return) override EXCLUDES(mLock); // Register camera corresponding to the binder token. ndk::ScopedAStatus registerCamera( const ::ndk::SpAIBinder& token, const ::aidl::android::companion::virtualcamera::VirtualCameraConfiguration& configuration, int cameraId, bool* _aidl_return) EXCLUDES(mLock); // Unregisters camera corresponding to the binder token. ndk::ScopedAStatus unregisterCamera(const ::ndk::SpAIBinder& token) override EXCLUDES(mLock); Loading @@ -64,7 +71,7 @@ class VirtualCameraService private: // Create and enable test camera instance if there's none. void enableTestCameraCmd(int out, int err); void enableTestCameraCmd(int out, int err, int cameraId); // Disable and destroy test camera instance if there's one. void disableTestCameraCmd(int out); Loading @@ -84,6 +91,9 @@ class VirtualCameraService // Local binder token for test camera instance, or nullptr if there's none. ::ndk::SpAIBinder mTestCameraToken; // Numerical id to assign to next created camera. static std::atomic_int sNextId; }; } // namespace virtualcamera Loading services/camera/virtualcamera/tests/VirtualCameraProviderTest.cc +5 −4 Original line number Diff line number Diff line Loading @@ -53,6 +53,7 @@ using ::testing::Return; constexpr int kVgaWidth = 640; constexpr int kVgaHeight = 480; constexpr int kMaxFps = 30; constexpr int kCameraId = 9999; constexpr char kVirtualCameraNameRegex[] = "device@[0-9]+\\.[0-9]+/virtual/[0-9]+"; Loading Loading @@ -118,7 +119,7 @@ TEST_F(VirtualCameraProviderTest, CreateCamera) { ASSERT_TRUE(mCameraProvider->setCallback(mMockCameraProviderCallback).isOk()); std::shared_ptr<VirtualCameraDevice> camera = mCameraProvider->createCamera(mInputConfig); mCameraProvider->createCamera(mInputConfig, kCameraId); EXPECT_THAT(camera, Not(IsNull())); EXPECT_THAT(camera->getCameraName(), MatchesRegex(kVirtualCameraNameRegex)); Loading @@ -136,7 +137,7 @@ TEST_F(VirtualCameraProviderTest, CreateCameraBeforeCallbackIsSet) { .WillOnce(Return(ndk::ScopedAStatus::ok())); std::shared_ptr<VirtualCameraDevice> camera = mCameraProvider->createCamera(mInputConfig); mCameraProvider->createCamera(mInputConfig, kCameraId); ASSERT_TRUE(mCameraProvider->setCallback(mMockCameraProviderCallback).isOk()); // Created camera should be in the list of cameras. Loading @@ -148,7 +149,7 @@ TEST_F(VirtualCameraProviderTest, CreateCameraBeforeCallbackIsSet) { TEST_F(VirtualCameraProviderTest, RemoveCamera) { ASSERT_TRUE(mCameraProvider->setCallback(mMockCameraProviderCallback).isOk()); std::shared_ptr<VirtualCameraDevice> camera = mCameraProvider->createCamera(mInputConfig); mCameraProvider->createCamera(mInputConfig, kCameraId); EXPECT_CALL(*mMockCameraProviderCallback, cameraDeviceStatusChange(Eq(camera->getCameraName()), Loading @@ -165,7 +166,7 @@ TEST_F(VirtualCameraProviderTest, RemoveCamera) { TEST_F(VirtualCameraProviderTest, RemoveNonExistingCamera) { ASSERT_TRUE(mCameraProvider->setCallback(mMockCameraProviderCallback).isOk()); std::shared_ptr<VirtualCameraDevice> camera = mCameraProvider->createCamera(mInputConfig); mCameraProvider->createCamera(mInputConfig, kCameraId); // Removing non-existing camera should fail. const std::string cameraName = "DefinitelyNoTCamera"; Loading Loading
services/camera/virtualcamera/VirtualCameraProvider.cc +8 −6 Original line number Diff line number Diff line Loading @@ -42,10 +42,6 @@ using ::aidl::android::hardware::camera::provider::CameraIdAndStreamCombination; using ::aidl::android::hardware::camera::provider::ConcurrentCameraIdCombination; using ::aidl::android::hardware::camera::provider::ICameraProviderCallback; // TODO(b/301023410) Make camera id range configurable / dynamic // based on already registered devices. std::atomic_int VirtualCameraProvider::sNextId{42}; ndk::ScopedAStatus VirtualCameraProvider::setCallback( const std::shared_ptr<ICameraProviderCallback>& in_callback) { ALOGV("%s", __func__); Loading Loading @@ -154,9 +150,15 @@ ndk::ScopedAStatus VirtualCameraProvider::isConcurrentStreamCombinationSupported } std::shared_ptr<VirtualCameraDevice> VirtualCameraProvider::createCamera( const VirtualCameraConfiguration& configuration) { const VirtualCameraConfiguration& configuration, const int cameraId) { if (cameraId < 0) { ALOGE("%s: Cannot create camera with negative id. cameraId: %d", __func__, cameraId); return nullptr; } auto camera = ndk::SharedRefBase::make<VirtualCameraDevice>(sNextId++, configuration); ndk::SharedRefBase::make<VirtualCameraDevice>(cameraId, configuration); std::shared_ptr<ICameraProviderCallback> callback; { const std::lock_guard<std::mutex> lock(mLock); Loading
services/camera/virtualcamera/VirtualCameraProvider.h +2 −4 Original line number Diff line number Diff line Loading @@ -76,7 +76,8 @@ class VirtualCameraProvider // Returns nullptr if creation was not successful. std::shared_ptr<VirtualCameraDevice> createCamera( const aidl::android::companion::virtualcamera::VirtualCameraConfiguration& configuration); configuration, int cameraId); std::shared_ptr<VirtualCameraDevice> getCamera(const std::string& name); Loading @@ -91,9 +92,6 @@ class VirtualCameraProvider std::map<std::string, std::shared_ptr<VirtualCameraDevice>> mCameras GUARDED_BY(mLock); // Numerical id to assign to next created camera. static std::atomic_int sNextId; }; } // namespace virtualcamera Loading
services/camera/virtualcamera/VirtualCameraService.cc +26 −6 Original line number Diff line number Diff line Loading @@ -46,6 +46,10 @@ using ::aidl::android::companion::virtualcamera::SensorOrientation; using ::aidl::android::companion::virtualcamera::SupportedStreamConfiguration; using ::aidl::android::companion::virtualcamera::VirtualCameraConfiguration; // TODO(b/301023410) Make camera id range configurable / dynamic // based on already registered devices. std::atomic_int VirtualCameraService::sNextId{1000}; namespace { constexpr int kVgaWidth = 640; Loading Loading @@ -110,6 +114,13 @@ VirtualCameraService::VirtualCameraService( ndk::ScopedAStatus VirtualCameraService::registerCamera( const ::ndk::SpAIBinder& token, const VirtualCameraConfiguration& configuration, bool* _aidl_return) { return registerCamera(token, configuration, sNextId++, _aidl_return); } ndk::ScopedAStatus VirtualCameraService::registerCamera( const ::ndk::SpAIBinder& token, const VirtualCameraConfiguration& configuration, const int cameraId, bool* _aidl_return) { if (!mPermissionProxy.checkCallingPermission(kCreateVirtualDevicePermission)) { ALOGE("%s: caller (pid %d, uid %d) doesn't hold %s permission", __func__, getpid(), getuid(), kCreateVirtualDevicePermission); Loading Loading @@ -141,7 +152,7 @@ ndk::ScopedAStatus VirtualCameraService::registerCamera( } std::shared_ptr<VirtualCameraDevice> camera = mVirtualCameraProvider->createCamera(configuration); mVirtualCameraProvider->createCamera(configuration, cameraId); if (camera == nullptr) { ALOGE("Failed to create camera for binder token 0x%" PRIxPTR, reinterpret_cast<uintptr_t>(token.get())); Loading Loading @@ -236,7 +247,15 @@ binder_status_t VirtualCameraService::handleShellCommand(int in, int out, } const char* const cmd = args[0]; if (strcmp(kEnableTestCameraCmd, cmd) == 0) { enableTestCameraCmd(in, err); int cameraId = 0; if (numArgs > 1 && args[1] != nullptr) { cameraId = atoi(args[1]); } if (cameraId == 0) { cameraId = sNextId++; } enableTestCameraCmd(in, err, cameraId); } else if (strcmp(kDisableTestCameraCmd, cmd) == 0) { disableTestCameraCmd(in); } else { Loading @@ -247,7 +266,8 @@ binder_status_t VirtualCameraService::handleShellCommand(int in, int out, return STATUS_OK; } void VirtualCameraService::enableTestCameraCmd(const int out, const int err) { void VirtualCameraService::enableTestCameraCmd(const int out, const int err, const int cameraId) { if (mTestCameraToken != nullptr) { dprintf(out, "Test camera is already enabled (%s).", getCamera(mTestCameraToken)->getCameraName().c_str()); Loading @@ -264,7 +284,7 @@ void VirtualCameraService::enableTestCameraCmd(const int out, const int err) { Format::YUV_420_888, .maxFps = kMaxFps}); configuration.lensFacing = LensFacing::EXTERNAL; registerCamera(mTestCameraToken, configuration, &ret); registerCamera(mTestCameraToken, configuration, cameraId, &ret); if (ret) { dprintf(out, "Successfully registered test camera %s", getCamera(mTestCameraToken)->getCameraName().c_str()); Loading
services/camera/virtualcamera/VirtualCameraService.h +11 −1 Original line number Diff line number Diff line Loading @@ -45,6 +45,13 @@ class VirtualCameraService configuration, bool* _aidl_return) override EXCLUDES(mLock); // Register camera corresponding to the binder token. ndk::ScopedAStatus registerCamera( const ::ndk::SpAIBinder& token, const ::aidl::android::companion::virtualcamera::VirtualCameraConfiguration& configuration, int cameraId, bool* _aidl_return) EXCLUDES(mLock); // Unregisters camera corresponding to the binder token. ndk::ScopedAStatus unregisterCamera(const ::ndk::SpAIBinder& token) override EXCLUDES(mLock); Loading @@ -64,7 +71,7 @@ class VirtualCameraService private: // Create and enable test camera instance if there's none. void enableTestCameraCmd(int out, int err); void enableTestCameraCmd(int out, int err, int cameraId); // Disable and destroy test camera instance if there's one. void disableTestCameraCmd(int out); Loading @@ -84,6 +91,9 @@ class VirtualCameraService // Local binder token for test camera instance, or nullptr if there's none. ::ndk::SpAIBinder mTestCameraToken; // Numerical id to assign to next created camera. static std::atomic_int sNextId; }; } // namespace virtualcamera Loading
services/camera/virtualcamera/tests/VirtualCameraProviderTest.cc +5 −4 Original line number Diff line number Diff line Loading @@ -53,6 +53,7 @@ using ::testing::Return; constexpr int kVgaWidth = 640; constexpr int kVgaHeight = 480; constexpr int kMaxFps = 30; constexpr int kCameraId = 9999; constexpr char kVirtualCameraNameRegex[] = "device@[0-9]+\\.[0-9]+/virtual/[0-9]+"; Loading Loading @@ -118,7 +119,7 @@ TEST_F(VirtualCameraProviderTest, CreateCamera) { ASSERT_TRUE(mCameraProvider->setCallback(mMockCameraProviderCallback).isOk()); std::shared_ptr<VirtualCameraDevice> camera = mCameraProvider->createCamera(mInputConfig); mCameraProvider->createCamera(mInputConfig, kCameraId); EXPECT_THAT(camera, Not(IsNull())); EXPECT_THAT(camera->getCameraName(), MatchesRegex(kVirtualCameraNameRegex)); Loading @@ -136,7 +137,7 @@ TEST_F(VirtualCameraProviderTest, CreateCameraBeforeCallbackIsSet) { .WillOnce(Return(ndk::ScopedAStatus::ok())); std::shared_ptr<VirtualCameraDevice> camera = mCameraProvider->createCamera(mInputConfig); mCameraProvider->createCamera(mInputConfig, kCameraId); ASSERT_TRUE(mCameraProvider->setCallback(mMockCameraProviderCallback).isOk()); // Created camera should be in the list of cameras. Loading @@ -148,7 +149,7 @@ TEST_F(VirtualCameraProviderTest, CreateCameraBeforeCallbackIsSet) { TEST_F(VirtualCameraProviderTest, RemoveCamera) { ASSERT_TRUE(mCameraProvider->setCallback(mMockCameraProviderCallback).isOk()); std::shared_ptr<VirtualCameraDevice> camera = mCameraProvider->createCamera(mInputConfig); mCameraProvider->createCamera(mInputConfig, kCameraId); EXPECT_CALL(*mMockCameraProviderCallback, cameraDeviceStatusChange(Eq(camera->getCameraName()), Loading @@ -165,7 +166,7 @@ TEST_F(VirtualCameraProviderTest, RemoveCamera) { TEST_F(VirtualCameraProviderTest, RemoveNonExistingCamera) { ASSERT_TRUE(mCameraProvider->setCallback(mMockCameraProviderCallback).isOk()); std::shared_ptr<VirtualCameraDevice> camera = mCameraProvider->createCamera(mInputConfig); mCameraProvider->createCamera(mInputConfig, kCameraId); // Removing non-existing camera should fail. const std::string cameraName = "DefinitelyNoTCamera"; Loading