camera: Fix sensor pixel modes unparcelling in OutputConfiguration.
Also fix a corner case in checkAndOverrideSensorPixelModes
Bug: 184396641
Test: atest RobustnessTest.java#testConfigureInvalidSensorPixelModes
Change-Id: I990a8e4c16a6442a146b1d6c867d4e8132954a70
Signed-off-by: Jayant Chowdhary <jchowdhary@google.com>
diff --git a/camera/camera2/OutputConfiguration.cpp b/camera/camera2/OutputConfiguration.cpp
index d6642f3..2bccd87 100644
--- a/camera/camera2/OutputConfiguration.cpp
+++ b/camera/camera2/OutputConfiguration.cpp
@@ -161,7 +161,7 @@
}
std::vector<int32_t> sensorPixelModesUsed;
- if ((err = parcel->readParcelableVector(&sensorPixelModesUsed)) != OK) {
+ if ((err = parcel->readInt32Vector(&sensorPixelModesUsed)) != OK) {
ALOGE("%s: Failed to read sensor pixel mode(s) from parcel", __FUNCTION__);
return err;
}
diff --git a/services/camera/libcameraservice/utils/SessionConfigurationUtils.cpp b/services/camera/libcameraservice/utils/SessionConfigurationUtils.cpp
index 6dcf440..5afdfb9 100644
--- a/services/camera/libcameraservice/utils/SessionConfigurationUtils.cpp
+++ b/services/camera/libcameraservice/utils/SessionConfigurationUtils.cpp
@@ -669,15 +669,22 @@
const std::vector<int32_t> &sensorPixelModesUsed, int format, int width, int height,
const CameraMetadata &staticInfo, bool flexibleConsumer,
std::unordered_set<int32_t> *overriddenSensorPixelModesUsed) {
+
+ const std::unordered_set<int32_t> &sensorPixelModesUsedSet =
+ convertToSet(sensorPixelModesUsed);
if (!isUltraHighResolutionSensor(staticInfo)) {
+ if (sensorPixelModesUsedSet.find(ANDROID_SENSOR_PIXEL_MODE_MAXIMUM_RESOLUTION) !=
+ sensorPixelModesUsedSet.end()) {
+ // invalid value for non ultra high res sensors
+ return BAD_VALUE;
+ }
overriddenSensorPixelModesUsed->clear();
overriddenSensorPixelModesUsed->insert(ANDROID_SENSOR_PIXEL_MODE_DEFAULT);
return OK;
}
StreamConfigurationPair streamConfigurationPair = getStreamConfigurationPair(staticInfo);
- const std::unordered_set<int32_t> &sensorPixelModesUsedSet =
- convertToSet(sensorPixelModesUsed);
+
bool isInDefaultStreamConfigurationMap =
inStreamConfigurationMap(format, width, height,
streamConfigurationPair.mDefaultStreamConfigurationMap);