Loading services/camera/libcameraservice/Android.mk +2 −1 Original line number Diff line number Diff line Loading @@ -67,6 +67,7 @@ LOCAL_SHARED_LIBRARIES:= \ libmediautils \ libcamera_client \ libcamera_metadata \ libfmq \ libgui \ libhardware \ libhidlbase \ Loading @@ -79,7 +80,7 @@ LOCAL_SHARED_LIBRARIES:= \ android.hardware.camera.device@3.2 \ android.hidl.manager@1.0 LOCAL_EXPORT_SHARED_LIBRARY_HEADERS := libbinder libcamera_client LOCAL_EXPORT_SHARED_LIBRARY_HEADERS := libbinder libcamera_client libfmq LOCAL_C_INCLUDES += \ system/media/private/camera/include \ Loading services/camera/libcameraservice/device3/Camera3Device.cpp +53 −10 Original line number Diff line number Diff line Loading @@ -199,10 +199,26 @@ status_t Camera3Device::initialize(sp<CameraProviderManager> manager) { return res; } std::shared_ptr<RequestMetadataQueue> queue; auto getQueueRet = session->getCaptureRequestMetadataQueue([&queue](const auto& descriptor) { queue = std::make_shared<RequestMetadataQueue>(descriptor); if (!queue->isValid() || queue->availableToWrite() <= 0) { ALOGW("HAL returns empty request metadata fmq, not use it"); queue = nullptr; // don't use the queue onwards. } }); if (!getQueueRet.isOk()) { ALOGW("Transaction error when getting request metadata fmq: %s, not use it", getQueueRet.description().c_str()); queue = nullptr; // Don't use the queue onwards. } // TODO: camera service will absorb 3_2/3_3/3_4 differences in the future // for now use 3_4 to keep legacy devices working mDeviceVersion = CAMERA_DEVICE_API_VERSION_3_4; mInterface = std::make_unique<HalInterface>(session); mInterface = std::make_unique<HalInterface>(session, queue); std::string providerType; mVendorTagId = manager->getProviderTagIdLocked(mId.string()); Loading Loading @@ -3035,16 +3051,20 @@ void Camera3Device::monitorMetadata(TagMonitor::eventSource source, Camera3Device::HalInterface::HalInterface(camera3_device_t *device) : mHal3Device(device) {} Camera3Device::HalInterface::HalInterface(sp<ICameraDeviceSession> &session) : Camera3Device::HalInterface::HalInterface( sp<ICameraDeviceSession> &session, std::shared_ptr<RequestMetadataQueue> queue) : mHal3Device(nullptr), mHidlSession(session) {} mHidlSession(session), mRequestMetadataQueue(queue) {} Camera3Device::HalInterface::HalInterface() : mHal3Device(nullptr) {} Camera3Device::HalInterface::HalInterface(const HalInterface& other) : mHal3Device(other.mHal3Device), mHidlSession(other.mHidlSession) {} mHidlSession(other.mHidlSession), mRequestMetadataQueue(other.mRequestMetadataQueue) {} bool Camera3Device::HalInterface::valid() { return (mHal3Device != nullptr) || (mHidlSession != nullptr); Loading Loading @@ -3276,12 +3296,8 @@ void Camera3Device::HalInterface::wrapAsHidlRequest(camera3_capture_request_t* r } captureRequest->frameNumber = request->frame_number; // A null request settings maps to a size-0 CameraMetadata if (request->settings != nullptr) { captureRequest->settings.setToExternal( reinterpret_cast<uint8_t*>(const_cast<camera_metadata_t*>(request->settings)), get_camera_metadata_size(request->settings)); } captureRequest->fmqSettingsSize = 0; { std::lock_guard<std::mutex> lock(mInflightLock); Loading Loading @@ -3367,6 +3383,33 @@ status_t Camera3Device::HalInterface::processBatchCaptureRequests( common::V1_0::Status status = common::V1_0::Status::INTERNAL_ERROR; *numRequestProcessed = 0; // Write metadata to FMQ. for (size_t i = 0; i < batchSize; i++) { camera3_capture_request_t* request = requests[i]; device::V3_2::CaptureRequest* captureRequest = &captureRequests[i]; if (request->settings != nullptr) { size_t settingsSize = get_camera_metadata_size(request->settings); if (mRequestMetadataQueue != nullptr && mRequestMetadataQueue->write( reinterpret_cast<const uint8_t*>(request->settings), settingsSize)) { captureRequest->settings.resize(0); captureRequest->fmqSettingsSize = settingsSize; } else { if (mRequestMetadataQueue != nullptr) { ALOGW("%s: couldn't utilize fmq, fallback to hwbinder", __FUNCTION__); } captureRequest->settings.setToExternal( reinterpret_cast<uint8_t*>(const_cast<camera_metadata_t*>(request->settings)), get_camera_metadata_size(request->settings)); captureRequest->fmqSettingsSize = 0u; } } else { // A null request settings maps to a size-0 CameraMetadata captureRequest->settings.resize(0); captureRequest->fmqSettingsSize = 0u; } } mHidlSession->processCaptureRequest(captureRequests, cachesToRemove, [&status, &numRequestProcessed] (auto s, uint32_t n) { status = s; Loading services/camera/libcameraservice/device3/Camera3Device.h +8 −1 Original line number Diff line number Diff line Loading @@ -31,6 +31,7 @@ #include <android/hardware/camera/device/3.2/ICameraDevice.h> #include <android/hardware/camera/device/3.2/ICameraDeviceSession.h> #include <android/hardware/camera/device/3.2/ICameraDeviceCallback.h> #include <fmq/MessageQueue.h> #include <hardware/camera3.h> #include <camera/CaptureResult.h> Loading Loading @@ -181,6 +182,10 @@ class Camera3Device : status_t setConsumerSurfaces(int streamId, const std::vector<sp<Surface>>& consumers) override; private: // internal typedefs using RequestMetadataQueue = hardware::MessageQueue<uint8_t, hardware::kSynchronizedReadWrite>; static const size_t kDumpLockAttempts = 10; static const size_t kDumpSleepDuration = 100000; // 0.10 sec static const nsecs_t kShutdownTimeout = 5000000000; // 5 sec Loading Loading @@ -227,7 +232,8 @@ class Camera3Device : class HalInterface : public camera3::Camera3StreamBufferFreedListener { public: HalInterface(camera3_device_t *device); HalInterface(sp<hardware::camera::device::V3_2::ICameraDeviceSession> &session); HalInterface(sp<hardware::camera::device::V3_2::ICameraDeviceSession> &session, std::shared_ptr<RequestMetadataQueue> queue); HalInterface(const HalInterface &other); HalInterface(); Loading Loading @@ -261,6 +267,7 @@ class Camera3Device : private: camera3_device_t *mHal3Device; sp<hardware::camera::device::V3_2::ICameraDeviceSession> mHidlSession; std::shared_ptr<RequestMetadataQueue> mRequestMetadataQueue; std::mutex mInflightLock; Loading Loading
services/camera/libcameraservice/Android.mk +2 −1 Original line number Diff line number Diff line Loading @@ -67,6 +67,7 @@ LOCAL_SHARED_LIBRARIES:= \ libmediautils \ libcamera_client \ libcamera_metadata \ libfmq \ libgui \ libhardware \ libhidlbase \ Loading @@ -79,7 +80,7 @@ LOCAL_SHARED_LIBRARIES:= \ android.hardware.camera.device@3.2 \ android.hidl.manager@1.0 LOCAL_EXPORT_SHARED_LIBRARY_HEADERS := libbinder libcamera_client LOCAL_EXPORT_SHARED_LIBRARY_HEADERS := libbinder libcamera_client libfmq LOCAL_C_INCLUDES += \ system/media/private/camera/include \ Loading
services/camera/libcameraservice/device3/Camera3Device.cpp +53 −10 Original line number Diff line number Diff line Loading @@ -199,10 +199,26 @@ status_t Camera3Device::initialize(sp<CameraProviderManager> manager) { return res; } std::shared_ptr<RequestMetadataQueue> queue; auto getQueueRet = session->getCaptureRequestMetadataQueue([&queue](const auto& descriptor) { queue = std::make_shared<RequestMetadataQueue>(descriptor); if (!queue->isValid() || queue->availableToWrite() <= 0) { ALOGW("HAL returns empty request metadata fmq, not use it"); queue = nullptr; // don't use the queue onwards. } }); if (!getQueueRet.isOk()) { ALOGW("Transaction error when getting request metadata fmq: %s, not use it", getQueueRet.description().c_str()); queue = nullptr; // Don't use the queue onwards. } // TODO: camera service will absorb 3_2/3_3/3_4 differences in the future // for now use 3_4 to keep legacy devices working mDeviceVersion = CAMERA_DEVICE_API_VERSION_3_4; mInterface = std::make_unique<HalInterface>(session); mInterface = std::make_unique<HalInterface>(session, queue); std::string providerType; mVendorTagId = manager->getProviderTagIdLocked(mId.string()); Loading Loading @@ -3035,16 +3051,20 @@ void Camera3Device::monitorMetadata(TagMonitor::eventSource source, Camera3Device::HalInterface::HalInterface(camera3_device_t *device) : mHal3Device(device) {} Camera3Device::HalInterface::HalInterface(sp<ICameraDeviceSession> &session) : Camera3Device::HalInterface::HalInterface( sp<ICameraDeviceSession> &session, std::shared_ptr<RequestMetadataQueue> queue) : mHal3Device(nullptr), mHidlSession(session) {} mHidlSession(session), mRequestMetadataQueue(queue) {} Camera3Device::HalInterface::HalInterface() : mHal3Device(nullptr) {} Camera3Device::HalInterface::HalInterface(const HalInterface& other) : mHal3Device(other.mHal3Device), mHidlSession(other.mHidlSession) {} mHidlSession(other.mHidlSession), mRequestMetadataQueue(other.mRequestMetadataQueue) {} bool Camera3Device::HalInterface::valid() { return (mHal3Device != nullptr) || (mHidlSession != nullptr); Loading Loading @@ -3276,12 +3296,8 @@ void Camera3Device::HalInterface::wrapAsHidlRequest(camera3_capture_request_t* r } captureRequest->frameNumber = request->frame_number; // A null request settings maps to a size-0 CameraMetadata if (request->settings != nullptr) { captureRequest->settings.setToExternal( reinterpret_cast<uint8_t*>(const_cast<camera_metadata_t*>(request->settings)), get_camera_metadata_size(request->settings)); } captureRequest->fmqSettingsSize = 0; { std::lock_guard<std::mutex> lock(mInflightLock); Loading Loading @@ -3367,6 +3383,33 @@ status_t Camera3Device::HalInterface::processBatchCaptureRequests( common::V1_0::Status status = common::V1_0::Status::INTERNAL_ERROR; *numRequestProcessed = 0; // Write metadata to FMQ. for (size_t i = 0; i < batchSize; i++) { camera3_capture_request_t* request = requests[i]; device::V3_2::CaptureRequest* captureRequest = &captureRequests[i]; if (request->settings != nullptr) { size_t settingsSize = get_camera_metadata_size(request->settings); if (mRequestMetadataQueue != nullptr && mRequestMetadataQueue->write( reinterpret_cast<const uint8_t*>(request->settings), settingsSize)) { captureRequest->settings.resize(0); captureRequest->fmqSettingsSize = settingsSize; } else { if (mRequestMetadataQueue != nullptr) { ALOGW("%s: couldn't utilize fmq, fallback to hwbinder", __FUNCTION__); } captureRequest->settings.setToExternal( reinterpret_cast<uint8_t*>(const_cast<camera_metadata_t*>(request->settings)), get_camera_metadata_size(request->settings)); captureRequest->fmqSettingsSize = 0u; } } else { // A null request settings maps to a size-0 CameraMetadata captureRequest->settings.resize(0); captureRequest->fmqSettingsSize = 0u; } } mHidlSession->processCaptureRequest(captureRequests, cachesToRemove, [&status, &numRequestProcessed] (auto s, uint32_t n) { status = s; Loading
services/camera/libcameraservice/device3/Camera3Device.h +8 −1 Original line number Diff line number Diff line Loading @@ -31,6 +31,7 @@ #include <android/hardware/camera/device/3.2/ICameraDevice.h> #include <android/hardware/camera/device/3.2/ICameraDeviceSession.h> #include <android/hardware/camera/device/3.2/ICameraDeviceCallback.h> #include <fmq/MessageQueue.h> #include <hardware/camera3.h> #include <camera/CaptureResult.h> Loading Loading @@ -181,6 +182,10 @@ class Camera3Device : status_t setConsumerSurfaces(int streamId, const std::vector<sp<Surface>>& consumers) override; private: // internal typedefs using RequestMetadataQueue = hardware::MessageQueue<uint8_t, hardware::kSynchronizedReadWrite>; static const size_t kDumpLockAttempts = 10; static const size_t kDumpSleepDuration = 100000; // 0.10 sec static const nsecs_t kShutdownTimeout = 5000000000; // 5 sec Loading Loading @@ -227,7 +232,8 @@ class Camera3Device : class HalInterface : public camera3::Camera3StreamBufferFreedListener { public: HalInterface(camera3_device_t *device); HalInterface(sp<hardware::camera::device::V3_2::ICameraDeviceSession> &session); HalInterface(sp<hardware::camera::device::V3_2::ICameraDeviceSession> &session, std::shared_ptr<RequestMetadataQueue> queue); HalInterface(const HalInterface &other); HalInterface(); Loading Loading @@ -261,6 +267,7 @@ class Camera3Device : private: camera3_device_t *mHal3Device; sp<hardware::camera::device::V3_2::ICameraDeviceSession> mHidlSession; std::shared_ptr<RequestMetadataQueue> mRequestMetadataQueue; std::mutex mInflightLock; Loading