Camera: Vts test for manual flash control.
Test to verify configurations for manual flash strength level
control feature.
Test: Tested on an emulator with flag enabled/disabled.
Bug: 238348881
Change-Id: Iba492fe626c2fb74aa2107cec3969a04ea52eac0
diff --git a/camera/provider/aidl/vts/Android.bp b/camera/provider/aidl/vts/Android.bp
index 59f6c66..cfcaec5 100644
--- a/camera/provider/aidl/vts/Android.bp
+++ b/camera/provider/aidl/vts/Android.bp
@@ -53,6 +53,7 @@
"android.hardware.graphics.mapper@2.0",
"android.hardware.graphics.mapper@3.0",
"android.hardware.graphics.mapper@4.0",
+ "camera_platform_flags_c_lib",
],
// Statically link to libs not guaranteed to be present on the device.
@@ -67,6 +68,7 @@
"libhidlmemory",
"libgralloctypes",
"libaidlcommonsupport",
+ "libgtest",
],
require_root: true,
diff --git a/camera/provider/aidl/vts/VtsAidlHalCameraProvider_TargetTest.cpp b/camera/provider/aidl/vts/VtsAidlHalCameraProvider_TargetTest.cpp
index b6b5206..def6233 100644
--- a/camera/provider/aidl/vts/VtsAidlHalCameraProvider_TargetTest.cpp
+++ b/camera/provider/aidl/vts/VtsAidlHalCameraProvider_TargetTest.cpp
@@ -13,6 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+#include <gtest/gtest.h>
#include <aidl/Vintf.h>
#include <aidl/android/hardware/camera/common/VendorTagSection.h>
@@ -29,6 +30,7 @@
#include <hidl/GtestPrinter.h>
#include <hidl/HidlSupport.h>
#include <torch_provider_cb.h>
+#include <com_android_internal_camera_flags.h>
#include <list>
using ::aidl::android::hardware::camera::common::CameraDeviceStatus;
@@ -50,6 +52,7 @@
const uint32_t kMaxStillHeight = 1536;
const int64_t kEmptyFlushTimeoutMSec = 200;
+namespace flags = com::android::internal::camera::flags;
const static std::vector<int64_t> kMandatoryUseCases = {
ANDROID_SCALER_AVAILABLE_STREAM_USE_CASES_DEFAULT,
@@ -159,6 +162,28 @@
}
}
+// Validate the integrity of manual flash strength control metadata
+TEST_P(CameraAidlTest, validateManualFlashStrengthControlKeys) {
+ if (flags::camera_manual_flash_strength_control()) {
+ std::vector<std::string> cameraDeviceNames = getCameraDeviceNames(mProvider);
+ for (const auto& name : cameraDeviceNames) {
+ ALOGI("validateManualFlashStrengthControlKeys: Testing camera device %s", name.c_str());
+ CameraMetadata meta;
+ std::shared_ptr<ICameraDevice> cameraDevice;
+ openEmptyDeviceSession(name, mProvider, &mSession /*out*/, &meta /*out*/,
+ &cameraDevice /*out*/);
+ ndk::ScopedAStatus ret = cameraDevice->getCameraCharacteristics(&meta);
+ ASSERT_TRUE(ret.isOk());
+ const camera_metadata_t* staticMeta =
+ reinterpret_cast<const camera_metadata_t*>(meta.metadata.data());
+ verifyManualFlashStrengthControlCharacteristics(staticMeta);
+ }
+ } else {
+ ALOGI("validateManualFlashStrengthControlKeys: Test skipped.\n");
+ GTEST_SKIP();
+ }
+}
+
TEST_P(CameraAidlTest, systemCameraTest) {
std::vector<std::string> cameraDeviceNames = getCameraDeviceNames(mProvider);
std::map<std::string, std::vector<SystemCameraKind>> hiddenPhysicalIdToLogicalMap;
diff --git a/camera/provider/aidl/vts/camera_aidl_test.cpp b/camera/provider/aidl/vts/camera_aidl_test.cpp
index 6a17453..e5bf637 100644
--- a/camera/provider/aidl/vts/camera_aidl_test.cpp
+++ b/camera/provider/aidl/vts/camera_aidl_test.cpp
@@ -1152,6 +1152,58 @@
}
}
+void CameraAidlTest::verifyManualFlashStrengthControlCharacteristics(
+ const camera_metadata_t* staticMeta) {
+ camera_metadata_ro_entry singleMaxEntry;
+ camera_metadata_ro_entry singleDefEntry;
+ camera_metadata_ro_entry torchMaxEntry;
+ camera_metadata_ro_entry torchDefEntry;
+ bool torch_supported = false;
+ int32_t singleMaxLevel = 0;
+ int32_t singleDefLevel = 0;
+ int32_t torchMaxLevel = 0;
+ int32_t torchDefLevel = 0;
+
+ // determine whether the device supports torch or not
+ torch_supported = isTorchSupported(staticMeta);
+
+ int singleMaxRetCode = find_camera_metadata_ro_entry(staticMeta,
+ ANDROID_FLASH_SINGLE_STRENGTH_MAX_LEVEL, &singleMaxEntry);
+ int singleDefRetCode = find_camera_metadata_ro_entry(staticMeta,
+ ANDROID_FLASH_SINGLE_STRENGTH_DEFAULT_LEVEL, &singleDefEntry);
+ int torchMaxRetCode = find_camera_metadata_ro_entry(staticMeta,
+ ANDROID_FLASH_TORCH_STRENGTH_MAX_LEVEL, &torchMaxEntry);
+ int torchDefRetCode = find_camera_metadata_ro_entry(staticMeta,
+ ANDROID_FLASH_TORCH_STRENGTH_DEFAULT_LEVEL, &torchDefEntry);
+ if (torch_supported) {
+ if(singleMaxRetCode == 0 && singleDefRetCode == 0 && torchMaxRetCode == 0 &&
+ torchDefRetCode == 0) {
+ singleMaxLevel = *singleMaxEntry.data.i32;
+ singleDefLevel = *singleDefEntry.data.i32;
+ torchMaxLevel = *torchMaxEntry.data.i32;
+ torchDefLevel = *torchDefEntry.data.i32;
+ ASSERT_TRUE((singleMaxEntry.count == singleDefEntry.count == torchMaxEntry.count
+ == torchDefEntry.count == 1));
+ } else {
+ ASSERT_TRUE((singleMaxEntry.count == singleDefEntry.count == torchMaxEntry.count
+ == torchDefEntry.count == 0));
+ }
+ // if the device supports this feature default levels should be greater than 0
+ if (singleMaxLevel > 1) {
+ ASSERT_GT(torchMaxLevel, 1);
+ ASSERT_GT(torchDefLevel, 0);
+ ASSERT_GT(singleDefLevel, 0);
+ ASSERT_TRUE(torchDefLevel <= torchMaxLevel); // default levels should be <= max levels
+ ASSERT_TRUE(singleDefLevel <= singleMaxLevel);
+ }
+ } else {
+ ASSERT_TRUE(singleMaxRetCode != 0);
+ ASSERT_TRUE(singleDefRetCode != 0);
+ ASSERT_TRUE(torchMaxRetCode != 0);
+ ASSERT_TRUE(torchDefRetCode != 0);
+ }
+}
+
void CameraAidlTest::verifyRecommendedConfigs(const CameraMetadata& chars) {
size_t CONFIG_ENTRY_SIZE = 5;
size_t CONFIG_ENTRY_TYPE_OFFSET = 3;
diff --git a/camera/provider/aidl/vts/camera_aidl_test.h b/camera/provider/aidl/vts/camera_aidl_test.h
index 3018d5a..0ebd4ef 100644
--- a/camera/provider/aidl/vts/camera_aidl_test.h
+++ b/camera/provider/aidl/vts/camera_aidl_test.h
@@ -262,6 +262,9 @@
static void verifyMonochromeCharacteristics(const CameraMetadata& chars);
+ static void verifyManualFlashStrengthControlCharacteristics(
+ const camera_metadata_t* staticMeta);
+
static void verifyMonochromeCameraResult(
const ::android::hardware::camera::common::V1_0::helper::CameraMetadata& metadata);