/* * 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 #include #include 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& in_callback, std::shared_ptr* _aidl_return) override; ndk::ScopedAStatus openInjectionSession( const std::shared_ptr& in_callback, std::shared_ptr* _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 . static std::string kDeviceVersion; private: virtual std::shared_ptr createSession( const std::shared_ptr&, const ExternalCameraConfig& cfg, const std::vector& 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 status_t initOutputCharsKeysByFormat( ::android::hardware::camera::common::V1_0::helper::CameraMetadata* metadata, uint32_t fourcc, const std::array& 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& fpsLimits, SupportedV4L2Format format, std::vector& outFmts); // Get candidate supported formats list of input cropping type. static std::vector getCandidateSupportedFormatsLocked( int fd, CroppingType cropType, const std::vector& fpsLimits, const std::vector& 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* pFmts); Mutex mLock; bool mInitialized = false; bool mInitFailed = false; std::string mCameraId; std::string mDevicePath; const ExternalCameraConfig& mCfg; std::vector mSupportedFormats; CroppingType mCroppingType; std::weak_ptr mSession = std::weak_ptr(); ::android::hardware::camera::common::V1_0::helper::CameraMetadata mCameraCharacteristics; const std::vector 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_