Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f79b5548 authored by Yifan Hong's avatar Yifan Hong
Browse files

Use fmq for camera capture request.

Test: camera works.
Bug: 35788245 [Treble] Pass camera metadata using shared memory

Change-Id: I58d7f6ef91ff45680840bf61a431a0c071ebbdfb
parent 7faba5ea
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -67,6 +67,7 @@ LOCAL_SHARED_LIBRARIES:= \
    libmediautils \
    libcamera_client \
    libcamera_metadata \
    libfmq \
    libgui \
    libhardware \
    libhidlbase \
@@ -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 \
+53 −10
Original line number Diff line number Diff line
@@ -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());

@@ -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);
@@ -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);
@@ -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;
+8 −1
Original line number Diff line number Diff line
@@ -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>
@@ -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
@@ -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();

@@ -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;