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

Commit 997b9435 authored by Yifan Hong's avatar Yifan Hong Committed by Android (Google) Code Review
Browse files

Merge "Use fmq for camera capture request." into oc-dev

parents a4eb0d86 f79b5548
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;