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

Commit 288900f9 authored by Jan Sebechlebsky's avatar Jan Sebechlebsky
Browse files

Remove test mode from VirtualCameraRenderThread.

Instead of rendering the input in the render thread of virtual camera
connect the test client with dedicated thread for input rendering
when creating a test camera.

Rendering input in test mode was slowing down the virtual camera render
thread, causing it to fail tests requiring high fps on some targets.

This cl also moves test pattern rendering to be done on GPU and cleans
up corresponding shader.

Bug: 338251124
Test: atest virtual_camera_tests
Test: manual with OpenCamera
Test: atest CtsVirtualDevicesCameraCtsTestCases
Change-Id: I4bcefd91701f2f9e195eb71c0189efbb674e58f8
parent 3fe770c5
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -50,7 +50,6 @@ cc_library_static {
        "util/JpegUtil.cc",
        "util/MetadataUtil.cc",
        "util/Util.cc",
        "util/TestPatternHelper.cc",
        "util/EglDisplayContext.cc",
        "util/EglFramebuffer.cc",
        "util/EglProgram.cc",
@@ -72,6 +71,7 @@ cc_library_static {
        "VirtualCameraStream.cc",
        "VirtualCameraService.cc",
        "VirtualCameraSessionContext.cc",
        "VirtualCameraTestInstance.cc",
        "VirtualCameraRenderThread.cc",
    ],
    defaults: [
+1 −13
Original line number Diff line number Diff line
@@ -51,7 +51,6 @@
#include "util/EglFramebuffer.h"
#include "util/JpegUtil.h"
#include "util/MetadataUtil.h"
#include "util/TestPatternHelper.h"
#include "util/Util.h"
#include "utils/Errors.h"

@@ -300,11 +299,10 @@ sp<Fence> CaptureRequestBuffer::getFence() const {
VirtualCameraRenderThread::VirtualCameraRenderThread(
    VirtualCameraSessionContext& sessionContext,
    const Resolution inputSurfaceSize, const Resolution reportedSensorSize,
    std::shared_ptr<ICameraDeviceCallback> cameraDeviceCallback, bool testMode)
    std::shared_ptr<ICameraDeviceCallback> cameraDeviceCallback)
    : mCameraDeviceCallback(cameraDeviceCallback),
      mInputSurfaceSize(inputSurfaceSize),
      mReportedSensorSize(reportedSensorSize),
      mTestMode(testMode),
      mSessionContext(sessionContext) {
}

@@ -401,10 +399,6 @@ void VirtualCameraRenderThread::threadLoop() {
  mEglSurfaceTexture = std::make_unique<EglSurfaceTexture>(
      mInputSurfaceSize.width, mInputSurfaceSize.height);

  sp<Surface> inputSurface = mEglSurfaceTexture->getSurface();
  if (mTestMode) {
    inputSurface->connect(NATIVE_WINDOW_API_CPU, false, nullptr);
  }
  mInputSurfacePromise.set_value(mEglSurfaceTexture->getSurface());

  while (std::unique_ptr<ProcessCaptureRequestTask> task = dequeueTask()) {
@@ -422,12 +416,6 @@ void VirtualCameraRenderThread::threadLoop() {

void VirtualCameraRenderThread::processCaptureRequest(
    const ProcessCaptureRequestTask& request) {
  if (mTestMode) {
    // In test mode let's just render something to the Surface ourselves.
    renderTestPatternYCbCr420(mEglSurfaceTexture->getSurface(),
                              request.getFrameNumber());
  }

  std::chrono::nanoseconds timestamp =
      std::chrono::duration_cast<std::chrono::nanoseconds>(
          std::chrono::steady_clock::now().time_since_epoch());
+1 −3
Original line number Diff line number Diff line
@@ -111,8 +111,7 @@ class VirtualCameraRenderThread {
      Resolution reportedSensorSize,
      std::shared_ptr<
          ::aidl::android::hardware::camera::device::ICameraDeviceCallback>
          cameraDeviceCallback,
      bool testMode = false);
          cameraDeviceCallback);

  ~VirtualCameraRenderThread();

@@ -184,7 +183,6 @@ class VirtualCameraRenderThread {

  const Resolution mInputSurfaceSize;
  const Resolution mReportedSensorSize;
  const int mTestMode;

  VirtualCameraSessionContext& mSessionContext;

+13 −1
Original line number Diff line number Diff line
@@ -30,10 +30,12 @@

#include "VirtualCameraDevice.h"
#include "VirtualCameraProvider.h"
#include "VirtualCameraTestInstance.h"
#include "aidl/android/companion/virtualcamera/Format.h"
#include "aidl/android/companion/virtualcamera/LensFacing.h"
#include "aidl/android/companion/virtualcamera/VirtualCameraConfiguration.h"
#include "android/binder_auto_utils.h"
#include "android/binder_interface_utils.h"
#include "android/binder_libbinder.h"
#include "android/binder_status.h"
#include "binder/Status.h"
@@ -64,6 +66,7 @@ namespace {
constexpr int kVgaWidth = 640;
constexpr int kVgaHeight = 480;
constexpr int kMaxFps = 60;
constexpr int kTestCameraInputFps = 30;
constexpr char kEnableTestCameraCmd[] = "enable_test_camera";
constexpr char kDisableTestCameraCmd[] = "disable_test_camera";
constexpr char kHelp[] = "help";
@@ -94,6 +97,13 @@ ndk::ScopedAStatus validateConfiguration(
        Status::EX_ILLEGAL_ARGUMENT);
  }

  if (configuration.virtualCameraCallback == nullptr) {
    ALOGE("%s: Input configuration is missing virtual camera callback",
          __func__);
    return ndk::ScopedAStatus::fromServiceSpecificError(
        Status::EX_ILLEGAL_ARGUMENT);
  }

  for (const SupportedStreamConfiguration& config :
       configuration.supportedStreamConfigs) {
    if (!isFormatSupportedForInput(config.width, config.height,
@@ -418,9 +428,11 @@ binder_status_t VirtualCameraService::enableTestCameraCmd(
  VirtualCameraConfiguration configuration;
  configuration.supportedStreamConfigs.push_back({.width = kVgaWidth,
                                                  .height = kVgaHeight,
                                                  Format::YUV_420_888,
                                                  Format::RGBA_8888,
                                                  .maxFps = kMaxFps});
  configuration.lensFacing = lensFacing.value_or(LensFacing::EXTERNAL);
  configuration.virtualCameraCallback =
      ndk::SharedRefBase::make<VirtualCameraTestInstance>(kTestCameraInputFps);
  registerCamera(mTestCameraToken, configuration, cameraId.value_or(sNextId++),
                 kDefaultDeviceId, &ret);
  if (ret) {
+1 −5
Original line number Diff line number Diff line
@@ -66,7 +66,6 @@
#include "util/EglProgram.h"
#include "util/JpegUtil.h"
#include "util/MetadataUtil.h"
#include "util/TestPatternHelper.h"
#include "util/Util.h"

namespace android {
@@ -360,12 +359,9 @@ ndk::ScopedAStatus VirtualCameraSession::configureStreams(
      return cameraStatus(Status::ILLEGAL_ARGUMENT);
    }
    if (mRenderThread == nullptr) {
      // If there's no client callback, start camera in test mode.
      const bool testMode = mVirtualCameraClientCallback == nullptr;
      mRenderThread = std::make_unique<VirtualCameraRenderThread>(
          mSessionContext, resolutionFromInputConfig(*inputConfig),
          virtualCamera->getMaxInputResolution(), mCameraDeviceCallback,
          testMode);
          virtualCamera->getMaxInputResolution(), mCameraDeviceCallback);
      mRenderThread->start();
      inputSurface = mRenderThread->getInputSurface();
    }
Loading