1*ec779b8eSAndroid Build Coastguard Worker /* 2*ec779b8eSAndroid Build Coastguard Worker * Copyright 2023 The Android Open Source Project 3*ec779b8eSAndroid Build Coastguard Worker * 4*ec779b8eSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*ec779b8eSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*ec779b8eSAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*ec779b8eSAndroid Build Coastguard Worker * 8*ec779b8eSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*ec779b8eSAndroid Build Coastguard Worker * 10*ec779b8eSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*ec779b8eSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*ec779b8eSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*ec779b8eSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*ec779b8eSAndroid Build Coastguard Worker * limitations under the License. 15*ec779b8eSAndroid Build Coastguard Worker */ 16*ec779b8eSAndroid Build Coastguard Worker 17*ec779b8eSAndroid Build Coastguard Worker #ifndef ANDROID_COMPANION_VIRTUALCAMERA_VIRTUALCAMERADEVICE_H 18*ec779b8eSAndroid Build Coastguard Worker #define ANDROID_COMPANION_VIRTUALCAMERA_VIRTUALCAMERADEVICE_H 19*ec779b8eSAndroid Build Coastguard Worker 20*ec779b8eSAndroid Build Coastguard Worker #include <cstdint> 21*ec779b8eSAndroid Build Coastguard Worker #include <memory> 22*ec779b8eSAndroid Build Coastguard Worker 23*ec779b8eSAndroid Build Coastguard Worker #include "aidl/android/companion/virtualcamera/IVirtualCameraCallback.h" 24*ec779b8eSAndroid Build Coastguard Worker #include "aidl/android/companion/virtualcamera/SupportedStreamConfiguration.h" 25*ec779b8eSAndroid Build Coastguard Worker #include "aidl/android/companion/virtualcamera/VirtualCameraConfiguration.h" 26*ec779b8eSAndroid Build Coastguard Worker #include "aidl/android/hardware/camera/device/BnCameraDevice.h" 27*ec779b8eSAndroid Build Coastguard Worker #include "system/camera_metadata.h" 28*ec779b8eSAndroid Build Coastguard Worker #include "util/Util.h" 29*ec779b8eSAndroid Build Coastguard Worker 30*ec779b8eSAndroid Build Coastguard Worker namespace android { 31*ec779b8eSAndroid Build Coastguard Worker namespace companion { 32*ec779b8eSAndroid Build Coastguard Worker namespace virtualcamera { 33*ec779b8eSAndroid Build Coastguard Worker 34*ec779b8eSAndroid Build Coastguard Worker // Representation of single virtual camera device, implements 35*ec779b8eSAndroid Build Coastguard Worker // ICameraDevice AIDL to expose camera to camera framework. 36*ec779b8eSAndroid Build Coastguard Worker class VirtualCameraDevice 37*ec779b8eSAndroid Build Coastguard Worker : public ::aidl::android::hardware::camera::device::BnCameraDevice { 38*ec779b8eSAndroid Build Coastguard Worker public: 39*ec779b8eSAndroid Build Coastguard Worker explicit VirtualCameraDevice( 40*ec779b8eSAndroid Build Coastguard Worker const std::string& cameraId, 41*ec779b8eSAndroid Build Coastguard Worker const aidl::android::companion::virtualcamera::VirtualCameraConfiguration& 42*ec779b8eSAndroid Build Coastguard Worker configuration, 43*ec779b8eSAndroid Build Coastguard Worker int32_t deviceId); 44*ec779b8eSAndroid Build Coastguard Worker 45*ec779b8eSAndroid Build Coastguard Worker virtual ~VirtualCameraDevice() override = default; 46*ec779b8eSAndroid Build Coastguard Worker 47*ec779b8eSAndroid Build Coastguard Worker ndk::ScopedAStatus getCameraCharacteristics( 48*ec779b8eSAndroid Build Coastguard Worker ::aidl::android::hardware::camera::device::CameraMetadata* _aidl_return) 49*ec779b8eSAndroid Build Coastguard Worker override; 50*ec779b8eSAndroid Build Coastguard Worker 51*ec779b8eSAndroid Build Coastguard Worker ndk::ScopedAStatus getPhysicalCameraCharacteristics( 52*ec779b8eSAndroid Build Coastguard Worker const std::string& in_physicalCameraId, 53*ec779b8eSAndroid Build Coastguard Worker ::aidl::android::hardware::camera::device::CameraMetadata* _aidl_return) 54*ec779b8eSAndroid Build Coastguard Worker override; 55*ec779b8eSAndroid Build Coastguard Worker 56*ec779b8eSAndroid Build Coastguard Worker ndk::ScopedAStatus getResourceCost( 57*ec779b8eSAndroid Build Coastguard Worker ::aidl::android::hardware::camera::common::CameraResourceCost* 58*ec779b8eSAndroid Build Coastguard Worker _aidl_return) override; 59*ec779b8eSAndroid Build Coastguard Worker 60*ec779b8eSAndroid Build Coastguard Worker ndk::ScopedAStatus isStreamCombinationSupported( 61*ec779b8eSAndroid Build Coastguard Worker const ::aidl::android::hardware::camera::device::StreamConfiguration& 62*ec779b8eSAndroid Build Coastguard Worker in_streams, 63*ec779b8eSAndroid Build Coastguard Worker bool* _aidl_return) override; 64*ec779b8eSAndroid Build Coastguard Worker 65*ec779b8eSAndroid Build Coastguard Worker bool isStreamCombinationSupported( 66*ec779b8eSAndroid Build Coastguard Worker const ::aidl::android::hardware::camera::device::StreamConfiguration& 67*ec779b8eSAndroid Build Coastguard Worker in_streams) const; 68*ec779b8eSAndroid Build Coastguard Worker 69*ec779b8eSAndroid Build Coastguard Worker ndk::ScopedAStatus open( 70*ec779b8eSAndroid Build Coastguard Worker const std::shared_ptr< 71*ec779b8eSAndroid Build Coastguard Worker ::aidl::android::hardware::camera::device::ICameraDeviceCallback>& 72*ec779b8eSAndroid Build Coastguard Worker in_callback, 73*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr< 74*ec779b8eSAndroid Build Coastguard Worker ::aidl::android::hardware::camera::device::ICameraDeviceSession>* 75*ec779b8eSAndroid Build Coastguard Worker _aidl_return) override; 76*ec779b8eSAndroid Build Coastguard Worker 77*ec779b8eSAndroid Build Coastguard Worker ndk::ScopedAStatus openInjectionSession( 78*ec779b8eSAndroid Build Coastguard Worker const std::shared_ptr< 79*ec779b8eSAndroid Build Coastguard Worker ::aidl::android::hardware::camera::device::ICameraDeviceCallback>& 80*ec779b8eSAndroid Build Coastguard Worker in_callback, 81*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr< 82*ec779b8eSAndroid Build Coastguard Worker ::aidl::android::hardware::camera::device::ICameraInjectionSession>* 83*ec779b8eSAndroid Build Coastguard Worker _aidl_return) override; 84*ec779b8eSAndroid Build Coastguard Worker 85*ec779b8eSAndroid Build Coastguard Worker ndk::ScopedAStatus setTorchMode(bool in_on) override; 86*ec779b8eSAndroid Build Coastguard Worker 87*ec779b8eSAndroid Build Coastguard Worker ndk::ScopedAStatus turnOnTorchWithStrengthLevel( 88*ec779b8eSAndroid Build Coastguard Worker int32_t in_torchStrength) override; 89*ec779b8eSAndroid Build Coastguard Worker 90*ec779b8eSAndroid Build Coastguard Worker ndk::ScopedAStatus getTorchStrengthLevel(int32_t* _aidl_return) override; 91*ec779b8eSAndroid Build Coastguard Worker 92*ec779b8eSAndroid Build Coastguard Worker binder_status_t dump(int fd, const char** args, uint32_t numArgs) override; 93*ec779b8eSAndroid Build Coastguard Worker 94*ec779b8eSAndroid Build Coastguard Worker // Returns unique virtual camera name in form 95*ec779b8eSAndroid Build Coastguard Worker // "device@{major}.{minor}/virtual/{camera_id}" 96*ec779b8eSAndroid Build Coastguard Worker std::string getCameraName() const; 97*ec779b8eSAndroid Build Coastguard Worker getCameraId()98*ec779b8eSAndroid Build Coastguard Worker const std::string& getCameraId() const { 99*ec779b8eSAndroid Build Coastguard Worker return mCameraId; 100*ec779b8eSAndroid Build Coastguard Worker } 101*ec779b8eSAndroid Build Coastguard Worker 102*ec779b8eSAndroid Build Coastguard Worker const std::vector< 103*ec779b8eSAndroid Build Coastguard Worker aidl::android::companion::virtualcamera::SupportedStreamConfiguration>& 104*ec779b8eSAndroid Build Coastguard Worker getInputConfigs() const; 105*ec779b8eSAndroid Build Coastguard Worker 106*ec779b8eSAndroid Build Coastguard Worker // Returns largest supported input resolution. 107*ec779b8eSAndroid Build Coastguard Worker Resolution getMaxInputResolution() const; 108*ec779b8eSAndroid Build Coastguard Worker 109*ec779b8eSAndroid Build Coastguard Worker // Allocate and return next id for input stream (input surface). 110*ec779b8eSAndroid Build Coastguard Worker int allocateInputStreamId(); 111*ec779b8eSAndroid Build Coastguard Worker 112*ec779b8eSAndroid Build Coastguard Worker // Maximal number of RAW streams - virtual camera doesn't support RAW streams. 113*ec779b8eSAndroid Build Coastguard Worker static constexpr int32_t kMaxNumberOfRawStreams = 0; 114*ec779b8eSAndroid Build Coastguard Worker 115*ec779b8eSAndroid Build Coastguard Worker // Maximal number of non-jpeg streams configured concurrently in single 116*ec779b8eSAndroid Build Coastguard Worker // session. This should be at least 3 and can be increased at the potential 117*ec779b8eSAndroid Build Coastguard Worker // cost of more CPU/GPU load if there are many concurrent streams. 118*ec779b8eSAndroid Build Coastguard Worker static constexpr int32_t kMaxNumberOfProcessedStreams = 3; 119*ec779b8eSAndroid Build Coastguard Worker 120*ec779b8eSAndroid Build Coastguard Worker // Maximal number of stalling (in case of virtual camera only jpeg for now) 121*ec779b8eSAndroid Build Coastguard Worker // streams. Can be increaed at the cost of potential cost of more GPU/CPU 122*ec779b8eSAndroid Build Coastguard Worker // load. 123*ec779b8eSAndroid Build Coastguard Worker static constexpr int32_t kMaxNumberOfStallStreams = 1; 124*ec779b8eSAndroid Build Coastguard Worker 125*ec779b8eSAndroid Build Coastguard Worker // Focal length for full frame sensor. 126*ec779b8eSAndroid Build Coastguard Worker static constexpr float kFocalLength = 43.0; 127*ec779b8eSAndroid Build Coastguard Worker 128*ec779b8eSAndroid Build Coastguard Worker // Default JPEG compression quality. 129*ec779b8eSAndroid Build Coastguard Worker static constexpr uint8_t kDefaultJpegQuality = 80; 130*ec779b8eSAndroid Build Coastguard Worker 131*ec779b8eSAndroid Build Coastguard Worker // Default JPEG orientation. 132*ec779b8eSAndroid Build Coastguard Worker static constexpr uint8_t kDefaultJpegOrientation = 0; 133*ec779b8eSAndroid Build Coastguard Worker 134*ec779b8eSAndroid Build Coastguard Worker // Lowest min fps advertised in supported fps ranges. 135*ec779b8eSAndroid Build Coastguard Worker static constexpr int kMinFps = 1; 136*ec779b8eSAndroid Build Coastguard Worker 137*ec779b8eSAndroid Build Coastguard Worker // Default Make and Model for Exif 138*ec779b8eSAndroid Build Coastguard Worker static constexpr char kDefaultMakeAndModel[] = "Android Virtual Camera"; 139*ec779b8eSAndroid Build Coastguard Worker 140*ec779b8eSAndroid Build Coastguard Worker static constexpr camera_metadata_enum_android_control_capture_intent_t 141*ec779b8eSAndroid Build Coastguard Worker kDefaultCaptureIntent = ANDROID_CONTROL_CAPTURE_INTENT_PREVIEW; 142*ec779b8eSAndroid Build Coastguard Worker 143*ec779b8eSAndroid Build Coastguard Worker private: 144*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<VirtualCameraDevice> sharedFromThis(); 145*ec779b8eSAndroid Build Coastguard Worker 146*ec779b8eSAndroid Build Coastguard Worker const std::string mCameraId; 147*ec779b8eSAndroid Build Coastguard Worker const std::shared_ptr< 148*ec779b8eSAndroid Build Coastguard Worker ::aidl::android::companion::virtualcamera::IVirtualCameraCallback> 149*ec779b8eSAndroid Build Coastguard Worker mVirtualCameraClientCallback; 150*ec779b8eSAndroid Build Coastguard Worker 151*ec779b8eSAndroid Build Coastguard Worker ::aidl::android::hardware::camera::device::CameraMetadata mCameraCharacteristics; 152*ec779b8eSAndroid Build Coastguard Worker 153*ec779b8eSAndroid Build Coastguard Worker const std::vector< 154*ec779b8eSAndroid Build Coastguard Worker aidl::android::companion::virtualcamera::SupportedStreamConfiguration> 155*ec779b8eSAndroid Build Coastguard Worker mSupportedInputConfigurations; 156*ec779b8eSAndroid Build Coastguard Worker 157*ec779b8eSAndroid Build Coastguard Worker std::atomic_int mNextInputStreamId; 158*ec779b8eSAndroid Build Coastguard Worker }; 159*ec779b8eSAndroid Build Coastguard Worker 160*ec779b8eSAndroid Build Coastguard Worker } // namespace virtualcamera 161*ec779b8eSAndroid Build Coastguard Worker } // namespace companion 162*ec779b8eSAndroid Build Coastguard Worker } // namespace android 163*ec779b8eSAndroid Build Coastguard Worker 164*ec779b8eSAndroid Build Coastguard Worker #endif // ANDROID_COMPANION_VIRTUALCAMERA_VIRTUALCAMERADEVICE_H 165