Jan Sebechlebsky | 5cb3996 | 2023-11-22 17:33:07 +0100 | [diff] [blame] | 1 | /* |
| 2 | * Copyright (C) 2023 The Android Open Source Project |
| 3 | * |
| 4 | * Licensed under the Apache License, Version 2.0 (the "License"); |
| 5 | * you may not use this file except in compliance with the License. |
| 6 | * You may obtain a copy of the License at |
| 7 | * |
| 8 | * http://www.apache.org/licenses/LICENSE-2.0 |
| 9 | * |
| 10 | * Unless required by applicable law or agreed to in writing, software |
| 11 | * distributed under the License is distributed on an "AS IS" BASIS, |
| 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| 13 | * See the License for the specific language governing permissions and |
| 14 | * limitations under the License. |
| 15 | */ |
| 16 | |
| 17 | #ifndef ANDROID_COMPANION_VIRTUALCAMERA_VIRTUALCAMERASERVICE_H |
| 18 | #define ANDROID_COMPANION_VIRTUALCAMERA_VIRTUALCAMERASERVICE_H |
| 19 | |
| 20 | #include <memory> |
| 21 | #include <mutex> |
| 22 | #include <unordered_map> |
| 23 | |
| 24 | #include "VirtualCameraDevice.h" |
| 25 | #include "VirtualCameraProvider.h" |
| 26 | #include "aidl/android/companion/virtualcamera/BnVirtualCameraService.h" |
Jan Sebechlebsky | de6f16f | 2023-11-29 09:27:36 +0100 | [diff] [blame] | 27 | #include "util/Permissions.h" |
Jan Sebechlebsky | 5cb3996 | 2023-11-22 17:33:07 +0100 | [diff] [blame] | 28 | |
| 29 | namespace android { |
| 30 | namespace companion { |
| 31 | namespace virtualcamera { |
| 32 | |
| 33 | // Implementation of Virtual Camera Service for managing virtual camera devices. |
| 34 | class VirtualCameraService |
| 35 | : public aidl::android::companion::virtualcamera::BnVirtualCameraService { |
| 36 | public: |
| 37 | VirtualCameraService( |
Jan Sebechlebsky | de6f16f | 2023-11-29 09:27:36 +0100 | [diff] [blame] | 38 | std::shared_ptr<VirtualCameraProvider> virtualCameraProvider, |
| 39 | const PermissionsProxy& permissionProxy = PermissionsProxy::get()); |
Jan Sebechlebsky | 5cb3996 | 2023-11-22 17:33:07 +0100 | [diff] [blame] | 40 | |
| 41 | // Register camera corresponding to the binder token. |
| 42 | ndk::ScopedAStatus registerCamera( |
| 43 | const ::ndk::SpAIBinder& token, |
| 44 | const ::aidl::android::companion::virtualcamera::VirtualCameraConfiguration& |
| 45 | configuration, |
Biswarup Pal | 37a7518 | 2024-01-16 15:53:35 +0000 | [diff] [blame] | 46 | int32_t deviceId, bool* _aidl_return) override EXCLUDES(mLock); |
Jan Sebechlebsky | 5cb3996 | 2023-11-22 17:33:07 +0100 | [diff] [blame] | 47 | |
Marvin Ramin | a819613 | 2024-03-15 15:55:22 +0000 | [diff] [blame] | 48 | // Register camera corresponding to the binder token. |
| 49 | ndk::ScopedAStatus registerCamera( |
| 50 | const ::ndk::SpAIBinder& token, |
| 51 | const ::aidl::android::companion::virtualcamera::VirtualCameraConfiguration& |
| 52 | configuration, |
Biswarup Pal | 15dcd13 | 2024-06-02 14:02:03 +0000 | [diff] [blame] | 53 | const std::string& cameraId, int32_t deviceId, bool* _aidl_return) |
| 54 | EXCLUDES(mLock); |
Marvin Ramin | a819613 | 2024-03-15 15:55:22 +0000 | [diff] [blame] | 55 | |
Jan Sebechlebsky | 5cb3996 | 2023-11-22 17:33:07 +0100 | [diff] [blame] | 56 | // Unregisters camera corresponding to the binder token. |
| 57 | ndk::ScopedAStatus unregisterCamera(const ::ndk::SpAIBinder& token) override |
| 58 | EXCLUDES(mLock); |
| 59 | |
Biswarup Pal | 68137fc | 2023-11-24 18:06:54 +0000 | [diff] [blame] | 60 | // Returns the camera id corresponding to the binder token. |
Biswarup Pal | 15dcd13 | 2024-06-02 14:02:03 +0000 | [diff] [blame] | 61 | ndk::ScopedAStatus getCameraId(const ::ndk::SpAIBinder& token, |
| 62 | std::string* _aidl_return) override |
| 63 | EXCLUDES(mLock); |
Biswarup Pal | 68137fc | 2023-11-24 18:06:54 +0000 | [diff] [blame] | 64 | |
Jan Sebechlebsky | 5cb3996 | 2023-11-22 17:33:07 +0100 | [diff] [blame] | 65 | // Returns VirtualCameraDevice corresponding to binder token or nullptr if |
| 66 | // there's no camera asociated with the token. |
| 67 | std::shared_ptr<VirtualCameraDevice> getCamera(const ::ndk::SpAIBinder& token) |
| 68 | EXCLUDES(mLock); |
| 69 | |
| 70 | // Handle cmd shell commands `adb shell cmd virtual_camera_service` [args]. |
| 71 | binder_status_t handleShellCommand(int in, int out, int err, const char** args, |
| 72 | uint32_t numArgs) override; |
| 73 | |
Jan Sebechlebsky | b36090e | 2024-04-11 09:19:33 +0200 | [diff] [blame] | 74 | // Do not verify presence on required EGL extensions when registering virtual |
| 75 | // camera. Only to be used by unit tests. |
| 76 | void disableEglVerificationForTest() { |
| 77 | mVerifyEglExtensions = false; |
| 78 | } |
| 79 | |
Vadim Caen | 918e6dc | 2024-04-08 11:14:50 +0200 | [diff] [blame] | 80 | // Default virtual device id (the host device id) |
| 81 | static constexpr int kDefaultDeviceId = 0; |
| 82 | |
Jan Sebechlebsky | 5cb3996 | 2023-11-22 17:33:07 +0100 | [diff] [blame] | 83 | private: |
| 84 | // Create and enable test camera instance if there's none. |
Jan Sebechlebsky | 773c014 | 2024-03-25 12:17:05 +0100 | [diff] [blame] | 85 | binder_status_t enableTestCameraCmd( |
| 86 | int out, int err, const std::map<std::string, std::string>& options); |
Jan Sebechlebsky | 5cb3996 | 2023-11-22 17:33:07 +0100 | [diff] [blame] | 87 | // Disable and destroy test camera instance if there's one. |
| 88 | void disableTestCameraCmd(int out); |
| 89 | |
| 90 | std::shared_ptr<VirtualCameraProvider> mVirtualCameraProvider; |
Jan Sebechlebsky | b36090e | 2024-04-11 09:19:33 +0200 | [diff] [blame] | 91 | bool mVerifyEglExtensions = true; |
Jan Sebechlebsky | de6f16f | 2023-11-29 09:27:36 +0100 | [diff] [blame] | 92 | const PermissionsProxy& mPermissionProxy; |
| 93 | |
Jan Sebechlebsky | 5cb3996 | 2023-11-22 17:33:07 +0100 | [diff] [blame] | 94 | std::mutex mLock; |
| 95 | struct BinderTokenHash { |
| 96 | std::size_t operator()(const ::ndk::SpAIBinder& key) const { |
| 97 | return std::hash<void*>{}(reinterpret_cast<void*>(key.get())); |
| 98 | } |
| 99 | }; |
| 100 | // Map Binder tokens to names of cameras managed by camera provider. |
| 101 | std::unordered_map<::ndk::SpAIBinder, std::string, BinderTokenHash> |
| 102 | mTokenToCameraName GUARDED_BY(mLock); |
| 103 | |
| 104 | // Local binder token for test camera instance, or nullptr if there's none. |
| 105 | ::ndk::SpAIBinder mTestCameraToken; |
Jan Sebechlebsky | 5cb3996 | 2023-11-22 17:33:07 +0100 | [diff] [blame] | 106 | }; |
| 107 | |
| 108 | } // namespace virtualcamera |
| 109 | } // namespace companion |
| 110 | } // namespace android |
| 111 | |
| 112 | #endif // ANDROID_COMPANION_VIRTUALCAMERA_VIRTUALCAMERASERVICE_H |