From 23ce2f833b0dfa8df423195a63877f9565a96d24 Mon Sep 17 00:00:00 2001 From: Jeong-Seok Yang Date: Mon, 14 Feb 2011 22:55:21 +0900 Subject: libcamera: Add checking of preview sizes on setting parameters bug fix: If it try to set invalid preview sizes, driver will be stuck in an unrecoverable state. Thus, It is fixed to return error when setting parameters bug:3429909 Change-Id: If51b47439c140410fa03e3a0b66492633f194e53 Signed-off-by: Jeong-Seok Yang --- libcamera/SecCameraHWInterface.cpp | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) (limited to 'libcamera/SecCameraHWInterface.cpp') diff --git a/libcamera/SecCameraHWInterface.cpp b/libcamera/SecCameraHWInterface.cpp index 50d43a0..137653a 100644 --- a/libcamera/SecCameraHWInterface.cpp +++ b/libcamera/SecCameraHWInterface.cpp @@ -170,6 +170,8 @@ void CameraHardwareSec::initDefaultParameters(int cameraId) "640x480"); } + p.getSupportedPreviewSizes(mSupportedPreviewSizes); + // If these fail, then we are using an invalid cameraId and we'll leave the // sizes at zero to catch the error. if (mSecCamera->getPreviewMaxSize(&preview_max_width, @@ -1401,6 +1403,20 @@ status_t CameraHardwareSec::dump(int fd, const Vector& args) const return NO_ERROR; } +bool CameraHardwareSec::isSupportedPreviewSize(const int width, + const int height) const +{ + unsigned int i; + + for (i = 0; i < mSupportedPreviewSizes.size(); i++) { + if (mSupportedPreviewSizes[i].width == width && + mSupportedPreviewSizes[i].height == height) + return true; + } + + return false; +} + status_t CameraHardwareSec::setParameters(const CameraParameters& params) { LOGV("%s :", __func__); @@ -1427,7 +1443,9 @@ status_t CameraHardwareSec::setParameters(const CameraParameters& params) LOGV("%s : new_preview_width x new_preview_height = %dx%d, format = %s", __func__, new_preview_width, new_preview_height, new_str_preview_format); - if (0 < new_preview_width && 0 < new_preview_height && new_str_preview_format != NULL) { + if (0 < new_preview_width && 0 < new_preview_height && + new_str_preview_format != NULL && + isSupportedPreviewSize(new_preview_width, new_preview_height)) { int new_preview_format = 0; if (!strcmp(new_str_preview_format, @@ -1463,6 +1481,11 @@ status_t CameraHardwareSec::setParameters(const CameraParameters& params) } } #endif + } else { + LOGE("%s: Invalid preview size(%dx%d)", + __func__, new_preview_width, new_preview_height); + + ret = INVALID_OPERATION; } int new_picture_width = 0; -- cgit v1.1