Loading services/camera/virtualcamera/VirtualCameraService.cc +35 −3 Original line number Diff line number Diff line Loading @@ -19,10 +19,9 @@ #include "VirtualCameraService.h" #include <algorithm> #include <array> #include <cinttypes> #include <cstdint> #include <cstdio> #include <iterator> #include <memory> #include <mutex> #include <optional> Loading @@ -38,6 +37,9 @@ #include "android/binder_libbinder.h" #include "android/binder_status.h" #include "binder/Status.h" #include "fmt/format.h" #include "util/EglDisplayContext.h" #include "util/EglUtil.h" #include "util/Permissions.h" #include "util/Util.h" Loading Loading @@ -79,6 +81,12 @@ Available commands: constexpr char kCreateVirtualDevicePermission[] = "android.permission.CREATE_VIRTUAL_DEVICE"; constexpr std::array<const char*, 3> kRequiredEglExtensions = { "GL_OES_EGL_image_external", "GL_OES_EGL_image_external_essl3", "GL_EXT_YUV_target", }; ndk::ScopedAStatus validateConfiguration( const VirtualCameraConfiguration& configuration) { if (configuration.supportedStreamConfigs.empty()) { Loading Loading @@ -176,6 +184,23 @@ std::variant<CommandWithOptions, std::string> parseCommand( return cmd; }; ndk::ScopedAStatus verifyRequiredEglExtensions() { EglDisplayContext context; for (const char* eglExtension : kRequiredEglExtensions) { if (!isGlExtensionSupported(eglExtension)) { ALOGE("%s not supported", eglExtension); return ndk::ScopedAStatus::fromExceptionCodeWithMessage( EX_UNSUPPORTED_OPERATION, fmt::format( "Cannot create virtual camera, because required EGL extension {} " "is not supported on this system", eglExtension) .c_str()); } } return ndk::ScopedAStatus::ok(); } } // namespace VirtualCameraService::VirtualCameraService( Loading Loading @@ -207,7 +232,13 @@ ndk::ScopedAStatus VirtualCameraService::registerCamera( Status::EX_ILLEGAL_ARGUMENT); } *_aidl_return = true; if (mVerifyEglExtensions) { auto status = verifyRequiredEglExtensions(); if (!status.isOk()) { *_aidl_return = false; return status; } } auto status = validateConfiguration(configuration); if (!status.isOk()) { Loading Loading @@ -237,6 +268,7 @@ ndk::ScopedAStatus VirtualCameraService::registerCamera( } mTokenToCameraName[token] = camera->getCameraName(); *_aidl_return = true; return ndk::ScopedAStatus::ok(); } Loading services/camera/virtualcamera/VirtualCameraService.h +7 −1 Original line number Diff line number Diff line Loading @@ -69,6 +69,12 @@ class VirtualCameraService binder_status_t handleShellCommand(int in, int out, int err, const char** args, uint32_t numArgs) override; // Do not verify presence on required EGL extensions when registering virtual // camera. Only to be used by unit tests. void disableEglVerificationForTest() { mVerifyEglExtensions = false; } private: // Create and enable test camera instance if there's none. binder_status_t enableTestCameraCmd( Loading @@ -77,7 +83,7 @@ class VirtualCameraService void disableTestCameraCmd(int out); std::shared_ptr<VirtualCameraProvider> mVirtualCameraProvider; bool mVerifyEglExtensions = true; const PermissionsProxy& mPermissionProxy; std::mutex mLock; Loading services/camera/virtualcamera/tests/VirtualCameraServiceTest.cc +1 −0 Original line number Diff line number Diff line Loading @@ -118,6 +118,7 @@ class VirtualCameraServiceTest : public ::testing::Test { mCameraProvider->setCallback(mMockCameraProviderCallback); mCameraService = ndk::SharedRefBase::make<VirtualCameraService>( mCameraProvider, mMockPermissionsProxy); mCameraService->disableEglVerificationForTest(); ON_CALL(mMockPermissionsProxy, checkCallingPermission) .WillByDefault(Return(true)); Loading Loading
services/camera/virtualcamera/VirtualCameraService.cc +35 −3 Original line number Diff line number Diff line Loading @@ -19,10 +19,9 @@ #include "VirtualCameraService.h" #include <algorithm> #include <array> #include <cinttypes> #include <cstdint> #include <cstdio> #include <iterator> #include <memory> #include <mutex> #include <optional> Loading @@ -38,6 +37,9 @@ #include "android/binder_libbinder.h" #include "android/binder_status.h" #include "binder/Status.h" #include "fmt/format.h" #include "util/EglDisplayContext.h" #include "util/EglUtil.h" #include "util/Permissions.h" #include "util/Util.h" Loading Loading @@ -79,6 +81,12 @@ Available commands: constexpr char kCreateVirtualDevicePermission[] = "android.permission.CREATE_VIRTUAL_DEVICE"; constexpr std::array<const char*, 3> kRequiredEglExtensions = { "GL_OES_EGL_image_external", "GL_OES_EGL_image_external_essl3", "GL_EXT_YUV_target", }; ndk::ScopedAStatus validateConfiguration( const VirtualCameraConfiguration& configuration) { if (configuration.supportedStreamConfigs.empty()) { Loading Loading @@ -176,6 +184,23 @@ std::variant<CommandWithOptions, std::string> parseCommand( return cmd; }; ndk::ScopedAStatus verifyRequiredEglExtensions() { EglDisplayContext context; for (const char* eglExtension : kRequiredEglExtensions) { if (!isGlExtensionSupported(eglExtension)) { ALOGE("%s not supported", eglExtension); return ndk::ScopedAStatus::fromExceptionCodeWithMessage( EX_UNSUPPORTED_OPERATION, fmt::format( "Cannot create virtual camera, because required EGL extension {} " "is not supported on this system", eglExtension) .c_str()); } } return ndk::ScopedAStatus::ok(); } } // namespace VirtualCameraService::VirtualCameraService( Loading Loading @@ -207,7 +232,13 @@ ndk::ScopedAStatus VirtualCameraService::registerCamera( Status::EX_ILLEGAL_ARGUMENT); } *_aidl_return = true; if (mVerifyEglExtensions) { auto status = verifyRequiredEglExtensions(); if (!status.isOk()) { *_aidl_return = false; return status; } } auto status = validateConfiguration(configuration); if (!status.isOk()) { Loading Loading @@ -237,6 +268,7 @@ ndk::ScopedAStatus VirtualCameraService::registerCamera( } mTokenToCameraName[token] = camera->getCameraName(); *_aidl_return = true; return ndk::ScopedAStatus::ok(); } Loading
services/camera/virtualcamera/VirtualCameraService.h +7 −1 Original line number Diff line number Diff line Loading @@ -69,6 +69,12 @@ class VirtualCameraService binder_status_t handleShellCommand(int in, int out, int err, const char** args, uint32_t numArgs) override; // Do not verify presence on required EGL extensions when registering virtual // camera. Only to be used by unit tests. void disableEglVerificationForTest() { mVerifyEglExtensions = false; } private: // Create and enable test camera instance if there's none. binder_status_t enableTestCameraCmd( Loading @@ -77,7 +83,7 @@ class VirtualCameraService void disableTestCameraCmd(int out); std::shared_ptr<VirtualCameraProvider> mVirtualCameraProvider; bool mVerifyEglExtensions = true; const PermissionsProxy& mPermissionProxy; std::mutex mLock; Loading
services/camera/virtualcamera/tests/VirtualCameraServiceTest.cc +1 −0 Original line number Diff line number Diff line Loading @@ -118,6 +118,7 @@ class VirtualCameraServiceTest : public ::testing::Test { mCameraProvider->setCallback(mMockCameraProviderCallback); mCameraService = ndk::SharedRefBase::make<VirtualCameraService>( mCameraProvider, mMockPermissionsProxy); mCameraService->disableEglVerificationForTest(); ON_CALL(mMockPermissionsProxy, checkCallingPermission) .WillByDefault(Return(true)); Loading