Remove incorrect menu support from metadata factory
The partial_metadata_factory method to create V4L2 controls
incorrectly used V4L2_CTRL_TYPE_MENU - it assumed that all
values between min and max were supported. Actually, each value
must be queried using QUERY_MENU to confirm support.
BUG: b/30921166
TEST: unit tests pass, android.hardware.camera2.cts.CaptureRequestTest#testSceneModes now passes.
Change-Id: I763eb767e21c082a629d0ba91fdaaa0d6ce162f5
diff --git a/modules/camera/3_4/metadata/partial_metadata_factory.h b/modules/camera/3_4/metadata/partial_metadata_factory.h
index 6b6dbd8..63bf2f5 100644
--- a/modules/camera/3_4/metadata/partial_metadata_factory.h
+++ b/modules/camera/3_4/metadata/partial_metadata_factory.h
@@ -216,8 +216,7 @@
std::shared_ptr<ConverterInterface<T, int32_t>> result_converter(converter);
std::unique_ptr<ControlOptionsInterface<T>> result_options;
switch (control_query.type) {
- case V4L2_CTRL_TYPE_BOOLEAN: // Fall-through.
- case V4L2_CTRL_TYPE_MENU:
+ case V4L2_CTRL_TYPE_BOOLEAN:
if (type != ControlType::kMenu) {
HAL_LOGE(
"V4L2 control %d is of type %d, which isn't compatible with "
diff --git a/modules/camera/3_4/metadata/partial_metadata_factory_test.cpp b/modules/camera/3_4/metadata/partial_metadata_factory_test.cpp
index 4c4a1b1..9ca3a38 100644
--- a/modules/camera/3_4/metadata/partial_metadata_factory_test.cpp
+++ b/modules/camera/3_4/metadata/partial_metadata_factory_test.cpp
@@ -77,6 +77,9 @@
ANDROID_COLOR_CORRECTION_AVAILABLE_ABERRATION_MODES;
};
+class DISABLED_PartialMetadataFactoryTest : public PartialMetadataFactoryTest {
+};
+
TEST_F(PartialMetadataFactoryTest, FixedState) {
uint8_t value = 13;
std::unique_ptr<State<uint8_t>> state = FixedState(delegate_tag_, value);
@@ -246,7 +249,8 @@
ASSERT_EQ(control_, nullptr);
}
-TEST_F(PartialMetadataFactoryTest, V4L2FactoryMenu) {
+TEST_F(DISABLED_PartialMetadataFactoryTest, V4L2FactoryMenu) {
+ // TODO(b/30921166): Correct Menu support so this can be re-enabled.
int control_id = 55;
v4l2_query_ext_ctrl query_result;
query_result.type = V4L2_CTRL_TYPE_MENU;
@@ -281,7 +285,8 @@
ExpectControlOptions(expected_options);
}
-TEST_F(PartialMetadataFactoryTest, V4L2FactoryMenuConversionFail) {
+TEST_F(DISABLED_PartialMetadataFactoryTest, V4L2FactoryMenuConversionFail) {
+ // TODO(b/30921166): Correct Menu support so this can be re-enabled.
int control_id = 55;
v4l2_query_ext_ctrl query_result;
query_result.type = V4L2_CTRL_TYPE_MENU;
@@ -304,7 +309,8 @@
ASSERT_EQ(control_, nullptr);
}
-TEST_F(PartialMetadataFactoryTest, V4L2FactoryMenuNoConversions) {
+TEST_F(DISABLED_PartialMetadataFactoryTest, V4L2FactoryMenuNoConversions) {
+ // TODO(b/30921166): Correct Menu support so this can be re-enabled.
int control_id = 55;
v4l2_query_ext_ctrl query_result;
query_result.type = V4L2_CTRL_TYPE_MENU;
diff --git a/modules/camera/3_4/v4l2_metadata_factory.cpp b/modules/camera/3_4/v4l2_metadata_factory.cpp
index 0216d7c..55cc755 100644
--- a/modules/camera/3_4/v4l2_metadata_factory.cpp
+++ b/modules/camera/3_4/v4l2_metadata_factory.cpp
@@ -273,10 +273,11 @@
{V4L2_COLORFX_AQUA, ANDROID_CONTROL_EFFECT_MODE_AQUA}})),
ANDROID_CONTROL_EFFECT_MODE_OFF));
// TODO(b/31021654): This should behave as a top level switch, not no effect.
- components.insert(
- NoEffectMenuControl<uint8_t>(ANDROID_CONTROL_MODE,
- ANDROID_CONTROL_AVAILABLE_MODES,
- {ANDROID_CONTROL_MODE_AUTO}));
+ // Should enforce being set to USE_SCENE_MODE when a scene mode is requested.
+ components.insert(NoEffectMenuControl<uint8_t>(
+ ANDROID_CONTROL_MODE,
+ ANDROID_CONTROL_AVAILABLE_MODES,
+ {ANDROID_CONTROL_MODE_AUTO, ANDROID_CONTROL_MODE_USE_SCENE_MODE}));
// Not sure if V4L2 does or doesn't do this, but HAL documentation says
// all devices must support FAST, and FAST can be equivalent to OFF, so