Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5a5974da authored by Treehugger Robot's avatar Treehugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Add ID argument to enable_test_camera shell cmd" into main

parents 65574a32 a8196131
Loading
Loading
Loading
Loading
+8 −6
Original line number Diff line number Diff line
@@ -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__);
@@ -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);
+2 −4
Original line number Diff line number Diff line
@@ -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);

@@ -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
+26 −6
Original line number Diff line number Diff line
@@ -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;
@@ -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);
@@ -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()));
@@ -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 {
@@ -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());
@@ -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());
+11 −1
Original line number Diff line number Diff line
@@ -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);
@@ -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);

@@ -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
+5 −4
Original line number Diff line number Diff line
@@ -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]+";

@@ -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));

@@ -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.
@@ -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()),
@@ -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