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

Commit 34469e43 authored by Jan Sebechlebsky's avatar Jan Sebechlebsky
Browse files

Make input fps of test camera configurable.

This helps to test behavior when input is too slow / too fast,
and also impact of waiting for the frames in input surface.

Bug: 342674104
Test: atest virtual_camera_tests
Test: manual
Change-Id: I0b5bd03025865ecd5535ddca4f6474f0761124f5
parent c944886e
Loading
Loading
Loading
Loading
+16 −2
Original line number Diff line number Diff line
@@ -66,7 +66,7 @@ namespace {
constexpr int kVgaWidth = 640;
constexpr int kVgaHeight = 480;
constexpr int kMaxFps = 60;
constexpr int kTestCameraInputFps = 30;
constexpr int kTestCameraDefaultInputFps = 30;
constexpr char kEnableTestCameraCmd[] = "enable_test_camera";
constexpr char kDisableTestCameraCmd[] = "disable_test_camera";
constexpr char kHelp[] = "help";
@@ -78,6 +78,7 @@ Available commands:
     Options:
       --camera_id=(ID) - override numerical ID for test camera instance
       --lens_facing=(front|back|external) - specifies lens facing for test camera instance
       --input_fps=(fps) - specify input fps for test camera, valid values are from 1 to 1000
 * disable_test_camera
)";
constexpr char kCreateVirtualDevicePermission[] =
@@ -421,6 +422,18 @@ binder_status_t VirtualCameraService::enableTestCameraCmd(
    }
  }

  std::optional<int> inputFps;
  it = options.find("input_fps");
  if (it != options.end()) {
    inputFps = parseInt(it->second);
    if (!inputFps.has_value() || inputFps.value() < 1 ||
        inputFps.value() > 1000) {
      dprintf(err, "Invalid input fps: %s\n, must be integer in <1,1000> range.",
              it->second.c_str());
      return STATUS_BAD_VALUE;
    }
  }

  sp<BBinder> token = sp<BBinder>::make();
  mTestCameraToken.set(AIBinder_fromPlatformBinder(token));

@@ -432,7 +445,8 @@ binder_status_t VirtualCameraService::enableTestCameraCmd(
                                                  .maxFps = kMaxFps});
  configuration.lensFacing = lensFacing.value_or(LensFacing::EXTERNAL);
  configuration.virtualCameraCallback =
      ndk::SharedRefBase::make<VirtualCameraTestInstance>(kTestCameraInputFps);
      ndk::SharedRefBase::make<VirtualCameraTestInstance>(
          inputFps.value_or(kTestCameraDefaultInputFps));
  registerCamera(mTestCameraToken, configuration, cameraId.value_or(sNextId++),
                 kDefaultDeviceId, &ret);
  if (ret) {
+17 −0
Original line number Diff line number Diff line
@@ -488,6 +488,23 @@ TEST_F(VirtualCameraServiceTest, TestCameraShellCmdWithInvalidLensFacing) {
              Eq(STATUS_BAD_VALUE));
}

TEST_F(VirtualCameraServiceTest, TestCameraShellCmdWithInputFps) {
  EXPECT_THAT(execute_shell_command("enable_test_camera --input_fps=15"),
              Eq(NO_ERROR));

  std::vector<std::string> cameraIds = getCameraIds();
  ASSERT_THAT(cameraIds, SizeIs(1));
}

TEST_F(VirtualCameraServiceTest, TestCameraShellCmdWithInvalidInputFps) {
  EXPECT_THAT(execute_shell_command("enable_test_camera --input_fps=1001"),
              Eq(STATUS_BAD_VALUE));
  EXPECT_THAT(execute_shell_command("enable_test_camera --input_fps=0"),
              Eq(STATUS_BAD_VALUE));
  EXPECT_THAT(execute_shell_command("enable_test_camera --input_fps=foo"),
              Eq(STATUS_BAD_VALUE));
}

}  // namespace
}  // namespace virtualcamera
}  // namespace companion