| /* |
| * Copyright (C) 2022 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| #ifndef HARDWARE_INTERFACES_CAMERA_DEVICE_DEFAULT_EXTERNALCAMERADEVICE_H_ |
| #define HARDWARE_INTERFACES_CAMERA_DEVICE_DEFAULT_EXTERNALCAMERADEVICE_H_ |
| |
| #include <ExternalCameraDeviceSession.h> |
| #include <ExternalCameraUtils.h> |
| #include <aidl/android/hardware/camera/device/BnCameraDevice.h> |
| |
| namespace android { |
| namespace hardware { |
| namespace camera { |
| namespace device { |
| namespace implementation { |
| |
| using ::aidl::android::hardware::camera::common::CameraResourceCost; |
| using ::aidl::android::hardware::camera::device::BnCameraDevice; |
| using ::aidl::android::hardware::camera::device::CameraMetadata; |
| using ::aidl::android::hardware::camera::device::ICameraDeviceCallback; |
| using ::aidl::android::hardware::camera::device::ICameraDeviceSession; |
| using ::aidl::android::hardware::camera::device::ICameraInjectionSession; |
| using ::aidl::android::hardware::camera::device::StreamConfiguration; |
| using ::android::hardware::camera::external::common::ExternalCameraConfig; |
| |
| class ExternalCameraDevice : public BnCameraDevice { |
| public: |
| // Called by external camera provider HAL. |
| // Provider HAL must ensure the uniqueness of CameraDevice object per cameraId, or there could |
| // be multiple CameraDevice trying to access the same physical camera. Also, provider will have |
| // to keep track of all CameraDevice objects in order to notify CameraDevice when the underlying |
| // camera is detached. |
| ExternalCameraDevice(const std::string& devicePath, const ExternalCameraConfig& config); |
| ~ExternalCameraDevice() override; |
| |
| ndk::ScopedAStatus getCameraCharacteristics(CameraMetadata* _aidl_return) override; |
| ndk::ScopedAStatus getPhysicalCameraCharacteristics(const std::string& in_physicalCameraId, |
| CameraMetadata* _aidl_return) override; |
| ndk::ScopedAStatus getResourceCost(CameraResourceCost* _aidl_return) override; |
| ndk::ScopedAStatus isStreamCombinationSupported(const StreamConfiguration& in_streams, |
| bool* _aidl_return) override; |
| ndk::ScopedAStatus open(const std::shared_ptr<ICameraDeviceCallback>& in_callback, |
| std::shared_ptr<ICameraDeviceSession>* _aidl_return) override; |
| ndk::ScopedAStatus openInjectionSession( |
| const std::shared_ptr<ICameraDeviceCallback>& in_callback, |
| std::shared_ptr<ICameraInjectionSession>* _aidl_return) override; |
| ndk::ScopedAStatus setTorchMode(bool in_on) override; |
| ndk::ScopedAStatus turnOnTorchWithStrengthLevel(int32_t in_torchStrength) override; |
| ndk::ScopedAStatus getTorchStrengthLevel(int32_t* _aidl_return) override; |
| |
| binder_status_t dump(int fd, const char** args, uint32_t numArgs) override; |
| |
| // Caller must use this method to check if CameraDevice ctor failed |
| bool isInitFailed(); |
| |
| // Device version to be used by the external camera provider. |
| // Should be of the form <major>.<minor> |
| static std::string kDeviceVersion; |
| |
| private: |
| virtual std::shared_ptr<ExternalCameraDeviceSession> createSession( |
| const std::shared_ptr<ICameraDeviceCallback>&, const ExternalCameraConfig& cfg, |
| const std::vector<SupportedV4L2Format>& sortedFormats, const CroppingType& croppingType, |
| const common::V1_0::helper::CameraMetadata& chars, const std::string& cameraId, |
| unique_fd v4l2Fd); |
| |
| bool isInitFailedLocked(); |
| |
| // Init supported w/h/format/fps in mSupportedFormats. Caller still owns fd |
| void initSupportedFormatsLocked(int fd); |
| |
| // Calls into virtual member function. Do not use it in constructor |
| status_t initCameraCharacteristics(); |
| // Init available capabilities keys |
| virtual status_t initAvailableCapabilities( |
| ::android::hardware::camera::common::V1_0::helper::CameraMetadata*); |
| // Init non-device dependent keys |
| virtual status_t initDefaultCharsKeys( |
| ::android::hardware::camera::common::V1_0::helper::CameraMetadata*); |
| // Init camera control chars keys. Caller still owns fd |
| status_t initCameraControlsCharsKeys( |
| int fd, ::android::hardware::camera::common::V1_0::helper::CameraMetadata*); |
| // Init camera output configuration related keys. Caller still owns fd |
| status_t initOutputCharsKeys( |
| int fd, ::android::hardware::camera::common::V1_0::helper::CameraMetadata*); |
| |
| // Helper function for initOutputCharskeys |
| template <size_t SIZE> |
| status_t initOutputCharsKeysByFormat( |
| ::android::hardware::camera::common::V1_0::helper::CameraMetadata* metadata, |
| uint32_t fourcc, const std::array<int, SIZE>& halFormats, int streamConfigTag, |
| int streamConfiguration, int minFrameDuration, int stallDuration); |
| |
| status_t calculateMinFps(::android::hardware::camera::common::V1_0::helper::CameraMetadata*); |
| |
| static void getFrameRateList(int fd, double fpsUpperBound, SupportedV4L2Format* format); |
| |
| static void updateFpsBounds(int fd, CroppingType cropType, |
| const std::vector<ExternalCameraConfig::FpsLimitation>& fpsLimits, |
| SupportedV4L2Format format, |
| std::vector<SupportedV4L2Format>& outFmts); |
| |
| // Get candidate supported formats list of input cropping type. |
| static std::vector<SupportedV4L2Format> getCandidateSupportedFormatsLocked( |
| int fd, CroppingType cropType, |
| const std::vector<ExternalCameraConfig::FpsLimitation>& fpsLimits, |
| const std::vector<ExternalCameraConfig::FpsLimitation>& depthFpsLimits, |
| const Size& minStreamSize, bool depthEnabled); |
| // Trim supported format list by the cropping type. Also sort output formats by width/height |
| static void trimSupportedFormats(CroppingType cropType, |
| /*inout*/ std::vector<SupportedV4L2Format>* pFmts); |
| |
| Mutex mLock; |
| bool mInitialized = false; |
| bool mInitFailed = false; |
| std::string mCameraId; |
| std::string mDevicePath; |
| const ExternalCameraConfig& mCfg; |
| std::vector<SupportedV4L2Format> mSupportedFormats; |
| CroppingType mCroppingType; |
| |
| std::weak_ptr<ExternalCameraDeviceSession> mSession = |
| std::weak_ptr<ExternalCameraDeviceSession>(); |
| |
| ::android::hardware::camera::common::V1_0::helper::CameraMetadata mCameraCharacteristics; |
| |
| const std::vector<int32_t> AVAILABLE_CHARACTERISTICS_KEYS = { |
| ANDROID_COLOR_CORRECTION_AVAILABLE_ABERRATION_MODES, |
| ANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES, |
| ANDROID_CONTROL_AE_AVAILABLE_MODES, |
| ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES, |
| ANDROID_CONTROL_AE_COMPENSATION_RANGE, |
| ANDROID_CONTROL_AE_COMPENSATION_STEP, |
| ANDROID_CONTROL_AE_LOCK_AVAILABLE, |
| ANDROID_CONTROL_AF_AVAILABLE_MODES, |
| ANDROID_CONTROL_AVAILABLE_EFFECTS, |
| ANDROID_CONTROL_AVAILABLE_MODES, |
| ANDROID_CONTROL_AVAILABLE_SCENE_MODES, |
| ANDROID_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES, |
| ANDROID_CONTROL_AWB_AVAILABLE_MODES, |
| ANDROID_CONTROL_AWB_LOCK_AVAILABLE, |
| ANDROID_CONTROL_MAX_REGIONS, |
| ANDROID_FLASH_INFO_AVAILABLE, |
| ANDROID_INFO_SUPPORTED_HARDWARE_LEVEL, |
| ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES, |
| ANDROID_LENS_FACING, |
| ANDROID_LENS_INFO_AVAILABLE_OPTICAL_STABILIZATION, |
| ANDROID_LENS_INFO_FOCUS_DISTANCE_CALIBRATION, |
| ANDROID_NOISE_REDUCTION_AVAILABLE_NOISE_REDUCTION_MODES, |
| ANDROID_REQUEST_AVAILABLE_CAPABILITIES, |
| ANDROID_REQUEST_MAX_NUM_INPUT_STREAMS, |
| ANDROID_REQUEST_MAX_NUM_OUTPUT_STREAMS, |
| ANDROID_REQUEST_PARTIAL_RESULT_COUNT, |
| ANDROID_REQUEST_PIPELINE_MAX_DEPTH, |
| ANDROID_SCALER_AVAILABLE_MAX_DIGITAL_ZOOM, |
| ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS, |
| ANDROID_SCALER_CROPPING_TYPE, |
| ANDROID_SENSOR_INFO_ACTIVE_ARRAY_SIZE, |
| ANDROID_SENSOR_INFO_MAX_FRAME_DURATION, |
| ANDROID_SENSOR_INFO_PIXEL_ARRAY_SIZE, |
| ANDROID_SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE, |
| ANDROID_SENSOR_INFO_TIMESTAMP_SOURCE, |
| ANDROID_SENSOR_ORIENTATION, |
| ANDROID_SHADING_AVAILABLE_MODES, |
| ANDROID_STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES, |
| ANDROID_STATISTICS_INFO_AVAILABLE_HOT_PIXEL_MAP_MODES, |
| ANDROID_STATISTICS_INFO_AVAILABLE_LENS_SHADING_MAP_MODES, |
| ANDROID_STATISTICS_INFO_MAX_FACE_COUNT, |
| ANDROID_SYNC_MAX_LATENCY}; |
| }; |
| |
| } // namespace implementation |
| } // namespace device |
| } // namespace camera |
| } // namespace hardware |
| } // namespace android |
| |
| #endif // HARDWARE_INTERFACES_CAMERA_DEVICE_DEFAULT_EXTERNALCAMERADEVICE_H_ |