Camera: patching camera service for treble

Bug: 30985004
Change-Id: Idf3ec26abb6b10a0e3839e301e84c8b05ac165c5
diff --git a/services/camera/libcameraservice/CameraService.cpp b/services/camera/libcameraservice/CameraService.cpp
index fba57aa..c92092c 100644
--- a/services/camera/libcameraservice/CameraService.cpp
+++ b/services/camera/libcameraservice/CameraService.cpp
@@ -1645,8 +1645,8 @@
 
     StatusInternal cameraStatus = state->getStatus();
     if (cameraStatus != StatusInternal::PRESENT &&
-            cameraStatus != StatusInternal::NOT_PRESENT) {
-        ALOGE("%s: camera id is invalid %s", __FUNCTION__, id.string());
+            cameraStatus != StatusInternal::NOT_AVAILABLE) {
+        ALOGE("%s: camera id is invalid %s, status %d", __FUNCTION__, id.string(), (int)cameraStatus);
         return STATUS_ERROR_FMT(ERROR_ILLEGAL_ARGUMENT,
                 "Camera ID \"%s\" is a not valid camera ID", id.string());
     }
@@ -1668,7 +1668,7 @@
         }
 
         if (status == TorchModeStatus::NOT_AVAILABLE) {
-            if (cameraStatus == StatusInternal::NOT_PRESENT) {
+            if (cameraStatus == StatusInternal::NOT_AVAILABLE) {
                 ALOGE("%s: torch mode of camera %s is not available because "
                         "camera is in use", __FUNCTION__, id.string());
                 return STATUS_ERROR_FMT(ERROR_CAMERA_IN_USE,
diff --git a/services/camera/libcameraservice/common/CameraProviderManager.cpp b/services/camera/libcameraservice/common/CameraProviderManager.cpp
index 8b27c67..cb965b6 100644
--- a/services/camera/libcameraservice/common/CameraProviderManager.cpp
+++ b/services/camera/libcameraservice/common/CameraProviderManager.cpp
@@ -427,8 +427,7 @@
 }
 
 status_t CameraProviderManager::ProviderInfo::dump(int fd, const Vector<String16>&) const {
-    dprintf(fd, "    %s: v%d.%d, %zu devices:\n", mProviderName.c_str(),
-            mInterface->version.get_major(), mInterface->version.get_minor(), mDevices.size());
+    dprintf(fd, "    %s: %zu devices:\n", mProviderName.c_str(), mDevices.size());
 
     for (auto& device : mDevices) {
         dprintf(fd, "        %s: Resource cost: %d\n", device->mName.c_str(),
@@ -450,7 +449,7 @@
     sp<StatusListener> listener;
     std::string id;
     {
-        std::lock_guard<std::mutex> lock(mManager->mInterfaceMutex);
+        std::lock_guard<std::mutex> lock(mManager->mStatusListenerMutex);
         bool known = false;
         for (auto& deviceInfo : mDevices) {
             if (deviceInfo->mName == cameraDeviceName) {
@@ -487,7 +486,7 @@
     sp<StatusListener> listener;
     std::string id;
     {
-        std::lock_guard<std::mutex> lock(mManager->mInterfaceMutex);
+        std::lock_guard<std::mutex> lock(mManager->mStatusListenerMutex);
         bool known = false;
         for (auto& deviceInfo : mDevices) {
             if (deviceInfo->mName == cameraDeviceName) {
diff --git a/services/camera/libcameraservice/common/CameraProviderManager.h b/services/camera/libcameraservice/common/CameraProviderManager.h
index 345863c..641dab4 100644
--- a/services/camera/libcameraservice/common/CameraProviderManager.h
+++ b/services/camera/libcameraservice/common/CameraProviderManager.h
@@ -194,6 +194,8 @@
     // All private members, unless otherwise noted, expect mInterfaceMutex to be locked before use
     mutable std::mutex mInterfaceMutex;
 
+    // the status listener update callbacks will lock mStatusMutex
+    mutable std::mutex mStatusListenerMutex;
     wp<StatusListener> mListener;
     ServiceInteractionProxy* mServiceProxy;
 
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;