Use fmq for camera capture request.

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

Change-Id: I58d7f6ef91ff45680840bf61a431a0c071ebbdfb
diff --git a/services/camera/libcameraservice/device3/Camera3Device.cpp b/services/camera/libcameraservice/device3/Camera3Device.cpp
index 7d8d61e..47c7e3f 100644
--- a/services/camera/libcameraservice/device3/Camera3Device.cpp
+++ b/services/camera/libcameraservice/device3/Camera3Device.cpp
@@ -199,10 +199,26 @@
         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 @@
 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 @@
     }
 
     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 @@
 
     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;