From: Tim Zimmermann Date: Tue, 28 May 2024 10:15:07 +0000 (+0200) Subject: aidl: camera: Implement support for torch strength levels X-Git-Url: https://git.stricted.de/?a=commitdiff_plain;h=9f631aff74153f167050e07ea75fd7c2ee25adfb;p=GitHub%2FLineageOS%2Fandroid_hardware_samsung.git aidl: camera: Implement support for torch strength levels Change-Id: Iedd0e3acbc2dc3458366c3dec31dc3203eccf026 --- diff --git a/aidl/camera/common/Android.bp b/aidl/camera/common/Android.bp index 3a7c254..9df08fc 100644 --- a/aidl/camera/common/Android.bp +++ b/aidl/camera/common/Android.bp @@ -12,6 +12,7 @@ cc_library_static { "VendorTagDescriptor.cpp", "HandleImporter.cpp", "Exif.cpp", + "SamsungCameraModule.cpp", "SimpleThread.cpp", ], cflags: [ @@ -29,7 +30,7 @@ cc_library_static { ], include_dirs: ["system/media/private/camera/include"], header_libs: ["libhardware_headers.camera3_samsung"], - export_include_dirs: ["include"], + export_include_dirs: ["include", "include_samsung"], export_shared_lib_headers: ["libui"], } diff --git a/aidl/camera/common/SamsungCameraModule.cpp b/aidl/camera/common/SamsungCameraModule.cpp new file mode 100644 index 0000000..73f52fb --- /dev/null +++ b/aidl/camera/common/SamsungCameraModule.cpp @@ -0,0 +1,42 @@ +/* + * Copyright (C) 2024 The LineageOS Project + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#define LOG_TAG "CamComm1.0-SamsungCamModule" +#define ATRACE_TAG ATRACE_TAG_CAMERA + +#include +#include + +namespace android { +namespace hardware { +namespace camera { +namespace common { +namespace helper { + +SamsungCameraModule::SamsungCameraModule(camera_module_t* module) + : CameraModule(module), mModule(module) {} + +SamsungCameraModule::~SamsungCameraModule() {} + +bool SamsungCameraModule::isSetTorchModeStrengthSupported() { + return isSetTorchModeSupported() && mModule->set_torch_mode_strength != NULL; +} + +int SamsungCameraModule::setTorchModeStrength(const char* camera_id, bool enable, int strength) { + int res = INVALID_OPERATION; + if (mModule->set_torch_mode_strength != NULL) { + ATRACE_BEGIN("camera_module->set_torch_mode_strength"); + res = mModule->set_torch_mode_strength(camera_id, enable, strength); + ATRACE_END(); + } + return res; +} + +} // namespace helper +} // namespace common +} // namespace camera +} // namespace hardware +} // namespace android diff --git a/aidl/camera/common/include_samsung/SamsungCameraModule.h b/aidl/camera/common/include_samsung/SamsungCameraModule.h new file mode 100644 index 0000000..2ada92f --- /dev/null +++ b/aidl/camera/common/include_samsung/SamsungCameraModule.h @@ -0,0 +1,33 @@ +/* + * Copyright (C) 2024 The LineageOS Project + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#pragma once + +#include + +namespace android { +namespace hardware { +namespace camera { +namespace common { +namespace helper { + +class SamsungCameraModule : public CameraModule { + public: + explicit SamsungCameraModule(camera_module_t* module); + virtual ~SamsungCameraModule(); + + bool isSetTorchModeStrengthSupported(); + int setTorchModeStrength(const char* camera_id, bool enable, int strength); + + private: + camera_module_t* mModule; +}; + +} // namespace helper +} // namespace common +} // namespace camera +} // namespace hardware +} // namespace android diff --git a/aidl/camera/device/CameraDevice.cpp b/aidl/camera/device/CameraDevice.cpp index 96d7eed..65cba8d 100644 --- a/aidl/camera/device/CameraDevice.cpp +++ b/aidl/camera/device/CameraDevice.cpp @@ -20,7 +20,7 @@ namespace implementation { std::string CameraDevice::kDeviceVersion = "1.1"; CameraDevice::CameraDevice( - sp module, const std::string& cameraId, + sp module, const std::string& cameraId, const SortedVector>& cameraDeviceNames) : mModule(module), mCameraId(cameraId), @@ -65,8 +65,18 @@ ndk::ScopedAStatus CameraDevice::getCameraCharacteristics(CameraMetadata* _aidl_ // Module 2.1+ codepath. struct camera_info info; int ret = mModule->getCameraInfo(mCameraIdInt, &info); - if (ret == OK) { - convertToAidl(info.static_camera_characteristics, _aidl_return); + if (ret == OK && info.static_camera_characteristics != NULL) { + common::helper::CameraMetadata metadata = (camera_metadata_t*)info.static_camera_characteristics; + camera_metadata_entry_t entry = metadata.find(ANDROID_FLASH_INFO_AVAILABLE); + if (entry.count > 0 && *entry.data.u8 != 0 && mModule->isSetTorchModeStrengthSupported()) { + // Samsung always has 5 supported torch strength levels + int32_t defaultTorchStrength = 1; + int32_t torchStrengthLevels = 5; + metadata.update(ANDROID_FLASH_INFO_STRENGTH_DEFAULT_LEVEL, &defaultTorchStrength, 1); + metadata.update(ANDROID_FLASH_INFO_STRENGTH_MAXIMUM_LEVEL, &torchStrengthLevels, 1); + } + + convertToAidl(metadata.release(), _aidl_return); } else { ALOGE("%s: get camera info failed!", __FUNCTION__); status = Status::INTERNAL_ERROR; @@ -347,16 +357,36 @@ ndk::ScopedAStatus CameraDevice::setTorchMode(bool in_on) { Status status = initStatus(); if (status == Status::OK) { status = getAidlStatus(mModule->setTorchMode(mCameraId.c_str(), in_on)); + if (status == Status::OK) { + mTorchStrengthLevel = 1; + } } return fromStatus(status); } -ndk::ScopedAStatus CameraDevice::turnOnTorchWithStrengthLevel(int32_t) { - return fromStatus(Status::OPERATION_NOT_SUPPORTED); +ndk::ScopedAStatus CameraDevice::turnOnTorchWithStrengthLevel(int32_t in_torchStrength) { + if (!mModule->isSetTorchModeStrengthSupported()) { + return fromStatus(Status::OPERATION_NOT_SUPPORTED); + } + + Status status = initStatus(); + if (status == Status::OK) { + status = getAidlStatus( + mModule->setTorchModeStrength(mCameraId.c_str(), true, in_torchStrength)); + if (status == Status::OK) { + mTorchStrengthLevel = in_torchStrength; + } + } + return fromStatus(status); } -ndk::ScopedAStatus CameraDevice::getTorchStrengthLevel(int32_t*) { - return fromStatus(Status::OPERATION_NOT_SUPPORTED); +ndk::ScopedAStatus CameraDevice::getTorchStrengthLevel(int32_t* _aidl_return) { + if (!mModule->isSetTorchModeSupported()) { + return fromStatus(Status::OPERATION_NOT_SUPPORTED); + } + + *_aidl_return = mTorchStrengthLevel; + return fromStatus(Status::OK); } std::shared_ptr CameraDevice::createSession( diff --git a/aidl/camera/device/CameraDevice.h b/aidl/camera/device/CameraDevice.h index a41c496..61f4e8c 100644 --- a/aidl/camera/device/CameraDevice.h +++ b/aidl/camera/device/CameraDevice.h @@ -8,7 +8,7 @@ #include "CameraDeviceSession.h" -#include +#include #include #include @@ -26,7 +26,7 @@ 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::common::helper::CameraModule; +using ::android::hardware::camera::common::helper::SamsungCameraModule; class CameraDevice : public BnCameraDevice { public: @@ -35,7 +35,7 @@ class CameraDevice : public BnCameraDevice { // 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. - CameraDevice(sp module, const std::string& cameraId, + CameraDevice(sp module, const std::string& cameraId, const SortedVector>& cameraDeviceNames); virtual ~CameraDevice(); @@ -70,7 +70,7 @@ class CameraDevice : public BnCameraDevice { camera3_device_t*, const camera_metadata_t* deviceInfo, const std::shared_ptr&); - const sp mModule; + const sp mModule; const std::string mCameraId; // const after ctor int mCameraIdInt; @@ -79,6 +79,7 @@ class CameraDevice : public BnCameraDevice { // Set by provider (when external camera is connected/disconnected) bool mDisconnected; std::weak_ptr mSession{}; + int32_t mTorchStrengthLevel = 1; const SortedVector>& mCameraDeviceNames; diff --git a/aidl/camera/device/CameraDeviceSession.cpp b/aidl/camera/device/CameraDeviceSession.cpp index df79f28..157b6fa 100644 --- a/aidl/camera/device/CameraDeviceSession.cpp +++ b/aidl/camera/device/CameraDeviceSession.cpp @@ -9,7 +9,7 @@ #include "CameraDeviceSession.h" -#include +#include #include #include #include @@ -28,7 +28,7 @@ using ::aidl::android::hardware::camera::device::PhysicalCameraMetadata; using ::aidl::android::hardware::camera::device::ShutterMsg; using ::aidl::android::hardware::camera::device::StreamType; using ::aidl::android::hardware::graphics::common::BufferUsage; -using ::android::hardware::camera::common::helper::CameraModule; +using ::android::hardware::camera::common::helper::SamsungCameraModule; // Size of request metadata fast message queue. Change to 0 to always use hwbinder buffer. static constexpr int32_t CAMERA_REQUEST_METADATA_QUEUE_SIZE = 1 << 20 /* 1MB */; @@ -78,7 +78,7 @@ CameraDeviceSession::CameraDeviceSession(camera3_device_t* device, mDerivePostRawSensKey = true; } - (void)CameraModule::isLogicalMultiCamera(mDeviceInfo, &mPhysicalCameraIds); + (void)SamsungCameraModule::isLogicalMultiCamera(mDeviceInfo, &mPhysicalCameraIds); mInitFail = initialize(); } diff --git a/aidl/camera/libhardware_headers/include/hardware/camera_common.h b/aidl/camera/libhardware_headers/include/hardware/camera_common.h index dc0ad25..882773d 100644 --- a/aidl/camera/libhardware_headers/include/hardware/camera_common.h +++ b/aidl/camera/libhardware_headers/include/hardware/camera_common.h @@ -1241,6 +1241,14 @@ typedef struct camera_module { */ void (*notify_device_state_change)(uint64_t deviceState); + /** + * set_torch_mode_strength: + * + * Same as set_torch_mode but with support for specifying the strength level. + * + */ + int (*set_torch_mode_strength)(const char* camera_id, bool enabled, int32_t strength); + /* reserved for future use */ void* reserved[2]; } camera_module_t; diff --git a/aidl/camera/provider/CameraProvider.cpp b/aidl/camera/provider/CameraProvider.cpp index 329c34b..f81e253 100644 --- a/aidl/camera/provider/CameraProvider.cpp +++ b/aidl/camera/provider/CameraProvider.cpp @@ -189,7 +189,7 @@ bool CameraProvider::initialize() { return true; } - mModule = new CameraModule(rawModule); + mModule = new SamsungCameraModule(rawModule); err = mModule->init(); if (err != OK) { ALOGE("Could not initialize camera HAL module: %d (%s)", err, strerror(-err)); diff --git a/aidl/camera/provider/CameraProvider.h b/aidl/camera/provider/CameraProvider.h index 411b331..9fe9004 100644 --- a/aidl/camera/provider/CameraProvider.h +++ b/aidl/camera/provider/CameraProvider.h @@ -6,7 +6,7 @@ #pragma once -#include +#include #include #include #include @@ -26,7 +26,7 @@ using ::aidl::android::hardware::camera::provider::BnCameraProvider; using ::aidl::android::hardware::camera::provider::CameraIdAndStreamCombination; using ::aidl::android::hardware::camera::provider::ConcurrentCameraIdCombination; using ::aidl::android::hardware::camera::provider::ICameraProviderCallback; -using ::android::hardware::camera::common::helper::CameraModule; +using ::android::hardware::camera::common::helper::SamsungCameraModule; class CameraProvider : public BnCameraProvider, protected camera_module_callbacks_t { public: @@ -54,7 +54,7 @@ class CameraProvider : public BnCameraProvider, protected camera_module_callback Mutex mCbLock; std::shared_ptr mCallbacks = nullptr; - sp mModule; + sp mModule; int mNumberOfLegacyCameras; std::map mCameraStatusMap; // camera id -> status