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;