Camera: patching camera service for treble

Bug: 30985004
Change-Id: Idf3ec26abb6b10a0e3839e301e84c8b05ac165c5
diff --git a/services/camera/libcameraservice/device3/Camera3Device.cpp b/services/camera/libcameraservice/device3/Camera3Device.cpp
index a357be1..6f64dc3 100644
--- a/services/camera/libcameraservice/device3/Camera3Device.cpp
+++ b/services/camera/libcameraservice/device3/Camera3Device.cpp
@@ -196,8 +196,10 @@
         session->close();
         return res;
     }
-    hardware::hidl_version version = session->getInterfaceVersion();
-    mDeviceVersion = HARDWARE_DEVICE_API_VERSION(version.get_major(), version.get_minor());
+
+    // 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);
 
     return initializeCommonLocked();
@@ -247,8 +249,7 @@
     // Determine whether we need to derive sensitivity boost values for older devices.
     // If post-RAW sensitivity boost range is listed, so should post-raw sensitivity control
     // be listed (as the default value 100)
-    if (mDeviceVersion < CAMERA_DEVICE_API_VERSION_3_4 &&
-            mDeviceInfo.exists(ANDROID_CONTROL_POST_RAW_SENSITIVITY_BOOST_RANGE)) {
+    if (mDeviceInfo.exists(ANDROID_CONTROL_POST_RAW_SENSITIVITY_BOOST_RANGE)) {
         mDerivePostRawSensKey = true;
     }
 
@@ -899,12 +900,16 @@
     camera3_capture_result r;
     status_t res;
     r.frame_number = result.frameNumber;
-    r.result = reinterpret_cast<const camera_metadata_t*>(result.result.data());
-    size_t expected_metadata_size = result.result.size();
-    if ((res = validate_camera_metadata_structure(r.result, &expected_metadata_size)) != OK) {
-        ALOGE("%s: Frame %d: Invalid camera metadata received by camera service from HAL: %s (%d)",
-                __FUNCTION__, result.frameNumber, strerror(-res), res);
-        return hardware::Void();
+    if (result.result.size() != 0) {
+        r.result = reinterpret_cast<const camera_metadata_t*>(result.result.data());
+        size_t expected_metadata_size = result.result.size();
+        if ((res = validate_camera_metadata_structure(r.result, &expected_metadata_size)) != OK) {
+            ALOGE("%s: Frame %d: Invalid camera metadata received by camera service from HAL: %s (%d)",
+                    __FUNCTION__, result.frameNumber, strerror(-res), res);
+            return hardware::Void();
+        }
+    } else {
+        r.result = nullptr;
     }
 
     std::vector<camera3_stream_buffer_t> outputBuffers(result.outputBuffers.size());
@@ -946,7 +951,7 @@
     r.output_buffers = outputBuffers.data();
 
     camera3_stream_buffer_t inputBuffer;
-    if (result.inputBuffer.buffer == nullptr) {
+    if (result.inputBuffer.streamId == -1) {
         r.input_buffer = nullptr;
     } else {
         if (mInputStream->getId() != result.inputBuffer.streamId) {
@@ -3214,7 +3219,6 @@
 status_t Camera3Device::HalInterface::processCaptureRequest(
         camera3_capture_request_t *request) {
     ATRACE_NAME("CameraHal::processCaptureRequest");
-    (void) request;
     if (!valid()) return INVALID_OPERATION;
     status_t res = OK;
 
@@ -3230,51 +3234,53 @@
                     reinterpret_cast<uint8_t*>(const_cast<camera_metadata_t*>(request->settings)),
                     get_camera_metadata_size(request->settings));
         }
-        std::lock_guard<std::mutex> lock(mInflightLock);
-        if (request->input_buffer != nullptr) {
-            int32_t streamId = Camera3Stream::cast(request->input_buffer->stream)->getId();
-            captureRequest.inputBuffer.streamId = streamId;
-            captureRequest.inputBuffer.buffer = *(request->input_buffer->buffer);
-            captureRequest.inputBuffer.status = BufferStatus::OK;
-            native_handle_t *acquireFence = nullptr;
-            if (request->input_buffer->acquire_fence != -1) {
-                acquireFence = native_handle_create(1,0);
-                acquireFence->data[0] = request->input_buffer->acquire_fence;
-                handlesCreated.push_back(acquireFence);
+
+        {
+            std::lock_guard<std::mutex> lock(mInflightLock);
+            if (request->input_buffer != nullptr) {
+                int32_t streamId = Camera3Stream::cast(request->input_buffer->stream)->getId();
+                captureRequest.inputBuffer.streamId = streamId;
+                captureRequest.inputBuffer.buffer = *(request->input_buffer->buffer);
+                captureRequest.inputBuffer.status = BufferStatus::OK;
+                native_handle_t *acquireFence = nullptr;
+                if (request->input_buffer->acquire_fence != -1) {
+                    acquireFence = native_handle_create(1,0);
+                    acquireFence->data[0] = request->input_buffer->acquire_fence;
+                    handlesCreated.push_back(acquireFence);
+                }
+                captureRequest.inputBuffer.acquireFence = acquireFence;
+                captureRequest.inputBuffer.releaseFence = nullptr;
+
+                pushInflightBufferLocked(captureRequest.frameNumber, streamId,
+                        request->input_buffer->buffer);
             }
-            captureRequest.inputBuffer.acquireFence = acquireFence;
-            captureRequest.inputBuffer.releaseFence = nullptr;
 
-            pushInflightBufferLocked(captureRequest.frameNumber, streamId,
-                    request->input_buffer->buffer);
-        }
-        captureRequest.outputBuffers.resize(request->num_output_buffers);
-        for (size_t i = 0; i < request->num_output_buffers; i++) {
-            const camera3_stream_buffer_t *src = request->output_buffers + i;
-            StreamBuffer &dst = captureRequest.outputBuffers[i];
-            int32_t streamId = Camera3Stream::cast(src->stream)->getId();
-            dst.streamId = streamId;
-            dst.buffer = *(src->buffer);
-            dst.status = BufferStatus::OK;
-            native_handle_t *acquireFence = nullptr;
-            if (src->acquire_fence != -1) {
-                acquireFence = native_handle_create(1,0);
-                acquireFence->data[0] = src->acquire_fence;
-                handlesCreated.push_back(acquireFence);
+            captureRequest.outputBuffers.resize(request->num_output_buffers);
+            for (size_t i = 0; i < request->num_output_buffers; i++) {
+                const camera3_stream_buffer_t *src = request->output_buffers + i;
+                StreamBuffer &dst = captureRequest.outputBuffers[i];
+                int32_t streamId = Camera3Stream::cast(src->stream)->getId();
+                dst.streamId = streamId;
+                dst.buffer = *(src->buffer);
+                dst.status = BufferStatus::OK;
+                native_handle_t *acquireFence = nullptr;
+                if (src->acquire_fence != -1) {
+                    acquireFence = native_handle_create(1,0);
+                    acquireFence->data[0] = src->acquire_fence;
+                    handlesCreated.push_back(acquireFence);
+                }
+                dst.acquireFence = acquireFence;
+                dst.releaseFence = nullptr;
+
+                pushInflightBufferLocked(captureRequest.frameNumber, streamId,
+                        src->buffer);
             }
-            dst.acquireFence = acquireFence;
-            dst.releaseFence = nullptr;
-
-            pushInflightBufferLocked(captureRequest.frameNumber, streamId,
-                    src->buffer);
         }
-
         common::V1_0::Status status = mHidlSession->processCaptureRequest(captureRequest);
 
         for (auto& handle : handlesCreated) {
             native_handle_delete(handle);
         }
-
         res = CameraProviderManager::mapToStatusT(status);
     }
     return res;