Snap for 6017365 from 07e65229beab3f3d710ab784360eb7da080693c3 to android10-tests-release

Change-Id: Ifcb937331f814971fb78d1c87e28932903fb0768
diff --git a/cameraservice/vts/functional/Android.bp b/cameraservice/vts/functional/Android.bp
index a3e3b26..b4f1eb6 100644
--- a/cameraservice/vts/functional/Android.bp
+++ b/cameraservice/vts/functional/Android.bp
@@ -20,6 +20,7 @@
 
     srcs: ["VtsHalCameraServiceV2_0TargetTest.cpp"],
     static_libs: [
+        "android.hardware.camera.common@1.0-helper",
         "android.frameworks.cameraservice.device@2.0",
         "android.frameworks.cameraservice.service@2.0",
         "android.frameworks.cameraservice.common@2.0",
diff --git a/cameraservice/vts/functional/VtsHalCameraServiceV2_0TargetTest.cpp b/cameraservice/vts/functional/VtsHalCameraServiceV2_0TargetTest.cpp
index ebd9539..7077b17 100644
--- a/cameraservice/vts/functional/VtsHalCameraServiceV2_0TargetTest.cpp
+++ b/cameraservice/vts/functional/VtsHalCameraServiceV2_0TargetTest.cpp
@@ -19,6 +19,8 @@
 
 #include <android/frameworks/cameraservice/device/2.0/ICameraDeviceUser.h>
 #include <android/frameworks/cameraservice/service/2.0/ICameraService.h>
+#include <system/camera_metadata.h>
+#include <system/graphics.h>
 
 #include <fmq/MessageQueue.h>
 #include <utils/Condition.h>
@@ -39,6 +41,7 @@
 
 #include <android/log.h>
 
+#include <CameraMetadata.h>
 #include <VtsHalHidlTargetTestBase.h>
 #include <VtsHalHidlTargetTestEnvBase.h>
 
@@ -67,12 +70,14 @@
 using android::hardware::hidl_vec;
 using android::hardware::Return;
 using android::hardware::Void;
+using android::hardware::camera::common::V1_0::helper::CameraMetadata;
+using camera_metadata_enum_android_depth_available_depth_stream_configurations::
+    ANDROID_DEPTH_AVAILABLE_DEPTH_STREAM_CONFIGURATIONS_OUTPUT;
 using RequestMetadataQueue = hardware::MessageQueue<uint8_t, hardware::kSynchronizedReadWrite>;
 
 static constexpr int kCaptureRequestCount = 10;
-static constexpr int kImageWidth = 640;
-static constexpr int kImageHeight = 480;
-static constexpr int kImageFormat = AIMAGE_FORMAT_YUV_420_888;
+static constexpr int kVGAImageWidth = 640;
+static constexpr int kVGAImageHeight = 480;
 static constexpr int kNumRequests = 4;
 
 #define ASSERT_NOT_NULL(x) ASSERT_TRUE((x) != nullptr)
@@ -217,12 +222,31 @@
     virtual void registerTestServices() override { registerTestService<ICameraService>(); }
 };
 
+static bool convertFromHidlCloned(const hidl_vec<uint8_t>& metadata, CameraMetadata* rawMetadata) {
+    const camera_metadata* buffer = (camera_metadata_t*)(metadata.data());
+    size_t expectedSize = metadata.size();
+    int ret = validate_camera_metadata_structure(buffer, &expectedSize);
+    if (ret == OK || ret == CAMERA_METADATA_VALIDATION_SHIFTED) {
+        *rawMetadata = buffer;
+    } else {
+        ALOGE("%s: Malformed camera metadata received from caller", __FUNCTION__);
+        return false;
+    }
+    return true;
+}
+
+struct StreamConfiguration {
+    int32_t width = -1;
+    int32_t height = -1;
+};
+
 class VtsHalCameraServiceV2_0TargetTest : public ::testing::Test {
    public:
     void SetUp() override {
         cs = ::testing::VtsHalHidlTargetTestBase::getService<ICameraService>(
             CameraHidlEnvironment::Instance()->getServiceName<ICameraService>());
     }
+
     void TearDown() override {}
     // creates an outputConfiguration with no deferred streams
     OutputConfiguration createOutputConfiguration(const std::vector<native_handle_t*>& nhs) {
@@ -250,6 +274,45 @@
         captureRequest->physicalCameraSettings[0].settings.fmqMetadataSize(settingsSize);
     }
 
+    bool doesCapabilityExist(const CameraMetadata& characteristics, int capability) {
+        camera_metadata_ro_entry rawEntry =
+            characteristics.find(ANDROID_REQUEST_AVAILABLE_CAPABILITIES);
+        EXPECT_TRUE(rawEntry.count > 0);
+        for (size_t i = 0; i < rawEntry.count; i++) {
+            if (rawEntry.data.u8[i] == capability) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    // Return the first advertised available depth stream sizes
+    StreamConfiguration getDepthStreamConfiguration(const CameraMetadata& characteristics) {
+        camera_metadata_ro_entry rawEntry =
+            characteristics.find(ANDROID_DEPTH_AVAILABLE_DEPTH_STREAM_CONFIGURATIONS);
+        StreamConfiguration streamConfig;
+        const size_t STREAM_FORMAT_OFFSET = 0;
+        const size_t STREAM_WIDTH_OFFSET = 1;
+        const size_t STREAM_HEIGHT_OFFSET = 2;
+        const size_t STREAM_INOUT_OFFSET = 3;
+        const size_t STREAM_CONFIG_SIZE = 4;
+        if (rawEntry.count < STREAM_CONFIG_SIZE) {
+            return streamConfig;
+        }
+        EXPECT_TRUE((rawEntry.count % STREAM_CONFIG_SIZE) == 0);
+        for (size_t i = 0; i < rawEntry.count; i += STREAM_CONFIG_SIZE) {
+            int32_t format = rawEntry.data.i32[i + STREAM_FORMAT_OFFSET];
+            int32_t use = rawEntry.data.i32[i + STREAM_INOUT_OFFSET];
+            if (format == HAL_PIXEL_FORMAT_Y16 &&
+                use == ANDROID_DEPTH_AVAILABLE_DEPTH_STREAM_CONFIGURATIONS_OUTPUT) {
+                streamConfig.width = rawEntry.data.i32[i + STREAM_WIDTH_OFFSET];
+                streamConfig.height = rawEntry.data.i32[i + STREAM_HEIGHT_OFFSET];
+                return streamConfig;
+            }
+        }
+        return streamConfig;
+    }
+
     sp<ICameraService> cs = nullptr;
 };
 
@@ -265,7 +328,7 @@
         });
     EXPECT_TRUE(remoteRet.isOk() && status == Status::NO_ERROR);
     for (const auto& it : cameraStatuses) {
-        hidl_vec<uint8_t> rawMetadata;
+        CameraMetadata rawMetadata;
         listener->onStatusChanged(it);
         if (it.deviceStatus != CameraDeviceStatus::STATUS_PRESENT) {
             continue;
@@ -273,10 +336,11 @@
         remoteRet = cs->getCameraCharacteristics(
             it.cameraId, [&status, &rawMetadata](auto s, const hidl_vec<uint8_t>& metadata) {
                 status = s;
-                rawMetadata = metadata;
+                bool cStatus = convertFromHidlCloned(metadata, &rawMetadata);
+                EXPECT_TRUE(cStatus);
             });
         EXPECT_TRUE(remoteRet.isOk() && status == Status::NO_ERROR);
-        EXPECT_TRUE(rawMetadata.size() != 0);
+        EXPECT_FALSE(rawMetadata.isEmpty());
         sp<CameraDeviceCallbacks> callbacks(new CameraDeviceCallbacks());
         sp<ICameraDeviceUser> deviceRemote = nullptr;
         remoteRet = cs->connectDevice(callbacks, it.cameraId,
@@ -294,7 +358,23 @@
         });
         EXPECT_TRUE(remoteRet.isOk());
         AImageReader* reader = nullptr;
-        auto mStatus = AImageReader_new(kImageWidth, kImageHeight, kImageFormat,
+        bool isDepthOnlyDevice =
+            !doesCapabilityExist(rawMetadata,
+                                 ANDROID_REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE) &&
+            doesCapabilityExist(rawMetadata, ANDROID_REQUEST_AVAILABLE_CAPABILITIES_DEPTH_OUTPUT);
+        int chosenImageFormat = AIMAGE_FORMAT_YUV_420_888;
+        int chosenImageWidth = kVGAImageWidth;
+        int chosenImageHeight = kVGAImageHeight;
+        if (isDepthOnlyDevice) {
+            StreamConfiguration depthStreamConfig = getDepthStreamConfiguration(rawMetadata);
+            EXPECT_TRUE(depthStreamConfig.width != -1);
+            EXPECT_TRUE(depthStreamConfig.height != -1);
+            chosenImageFormat = AIMAGE_FORMAT_DEPTH16;
+            chosenImageWidth = depthStreamConfig.width;
+            chosenImageHeight = depthStreamConfig.height;
+        }
+
+        auto mStatus = AImageReader_new(chosenImageWidth, chosenImageHeight, chosenImageFormat,
                                         kCaptureRequestCount, &reader);
         EXPECT_EQ(mStatus, AMEDIA_OK);
         native_handle_t* wh = nullptr;