From 53eea85dcbdd3377c4c34e5f5b0eba8dbf6b5b29 Mon Sep 17 00:00:00 2001 From: Emilian Peev Date: Wed, 20 Jun 2018 14:13:14 +0100 Subject: [PATCH] Camera: Use face priority scene as default Clients using the legacy API translation layer will default to face priority scene in case this mode is supported by the camera device. Bug: 110259811 Test: Manual using application, Camera CTS Change-Id: I370f222c73ea6e133bb6cb334ced2e33a26bb8c5 --- .../libcameraservice/api1/Camera2Client.cpp | 1 + .../api1/client2/Parameters.cpp | 19 ++++++++++++------- .../api1/client2/Parameters.h | 3 ++- 3 files changed, 15 insertions(+), 8 deletions(-) diff --git a/services/camera/libcameraservice/api1/Camera2Client.cpp b/services/camera/libcameraservice/api1/Camera2Client.cpp index 65faac94bd..0b2d1b0f1e 100644 --- a/services/camera/libcameraservice/api1/Camera2Client.cpp +++ b/services/camera/libcameraservice/api1/Camera2Client.cpp @@ -250,6 +250,7 @@ status_t Camera2Client::dumpClient(int fd, const Vector& args) { switch (p.sceneMode) { case ANDROID_CONTROL_SCENE_MODE_DISABLED: result.append("AUTO\n"); break; + CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_FACE_PRIORITY) CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_ACTION) CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_PORTRAIT) CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_LANDSCAPE) diff --git a/services/camera/libcameraservice/api1/client2/Parameters.cpp b/services/camera/libcameraservice/api1/client2/Parameters.cpp index d66dec49e8..8829ebeae6 100644 --- a/services/camera/libcameraservice/api1/client2/Parameters.cpp +++ b/services/camera/libcameraservice/api1/client2/Parameters.cpp @@ -41,7 +41,8 @@ Parameters::Parameters(int cameraId, int cameraFacing) : cameraId(cameraId), cameraFacing(cameraFacing), - info(NULL) { + info(NULL), + mDefaultSceneMode(ANDROID_CONTROL_SCENE_MODE_DISABLED) { } Parameters::~Parameters() { @@ -557,6 +558,10 @@ status_t Parameters::initialize(const CameraMetadata *info, int deviceVersion) { noSceneModes = true; break; case ANDROID_CONTROL_SCENE_MODE_FACE_PRIORITY: + // Face priority can be used as alternate default if supported. + // Per API contract it shouldn't override the user set flash, + // white balance and focus modes. + mDefaultSceneMode = availableSceneModes.data.u8[i]; // Not in old API addComma = false; break; @@ -1760,7 +1765,7 @@ status_t Parameters::set(const String8& paramString) { // SCENE_MODE validatedParams.sceneMode = sceneModeStringToEnum( - newParams.get(CameraParameters::KEY_SCENE_MODE) ); + newParams.get(CameraParameters::KEY_SCENE_MODE), mDefaultSceneMode); if (validatedParams.sceneMode != sceneMode && validatedParams.sceneMode != ANDROID_CONTROL_SCENE_MODE_DISABLED) { @@ -1778,7 +1783,7 @@ status_t Parameters::set(const String8& paramString) { } } bool sceneModeSet = - validatedParams.sceneMode != ANDROID_CONTROL_SCENE_MODE_DISABLED; + validatedParams.sceneMode != mDefaultSceneMode; // FLASH_MODE if (sceneModeSet) { @@ -2157,7 +2162,7 @@ status_t Parameters::updateRequest(CameraMetadata *request) const { uint8_t reqSceneMode = sceneModeActive ? sceneMode : enableFaceDetect ? (uint8_t)ANDROID_CONTROL_SCENE_MODE_FACE_PRIORITY : - (uint8_t)ANDROID_CONTROL_SCENE_MODE_DISABLED; + mDefaultSceneMode; res = request->update(ANDROID_CONTROL_SCENE_MODE, &reqSceneMode, 1); if (res != OK) return res; @@ -2589,12 +2594,12 @@ int Parameters::abModeStringToEnum(const char *abMode) { -1; } -int Parameters::sceneModeStringToEnum(const char *sceneMode) { +int Parameters::sceneModeStringToEnum(const char *sceneMode, uint8_t defaultSceneMode) { return !sceneMode ? - ANDROID_CONTROL_SCENE_MODE_DISABLED : + defaultSceneMode : !strcmp(sceneMode, CameraParameters::SCENE_MODE_AUTO) ? - ANDROID_CONTROL_SCENE_MODE_DISABLED : + defaultSceneMode : !strcmp(sceneMode, CameraParameters::SCENE_MODE_ACTION) ? ANDROID_CONTROL_SCENE_MODE_ACTION : !strcmp(sceneMode, CameraParameters::SCENE_MODE_PORTRAIT) ? diff --git a/services/camera/libcameraservice/api1/client2/Parameters.h b/services/camera/libcameraservice/api1/client2/Parameters.h index 97f8ea7f37..94821679bb 100644 --- a/services/camera/libcameraservice/api1/client2/Parameters.h +++ b/services/camera/libcameraservice/api1/client2/Parameters.h @@ -326,7 +326,7 @@ struct Parameters { static const char* wbModeEnumToString(uint8_t wbMode); static int effectModeStringToEnum(const char *effectMode); static int abModeStringToEnum(const char *abMode); - static int sceneModeStringToEnum(const char *sceneMode); + static int sceneModeStringToEnum(const char *sceneMode, uint8_t defaultScene); static flashMode_t flashModeStringToEnum(const char *flashMode); static const char* flashModeEnumToString(flashMode_t flashMode); static focusMode_t focusModeStringToEnum(const char *focusMode); @@ -434,6 +434,7 @@ private: Size getMaxSize(const Vector& sizes); int mDeviceVersion; + uint8_t mDefaultSceneMode; }; // This class encapsulates the Parameters class so that it can only be accessed