From 0678f9d40940d1807160e511dd59d73fd23b347d Mon Sep 17 00:00:00 2001
From: Pawit Pornkitprasan
Date: Sat, 31 Dec 2011 17:21:04 +0700
Subject: aries-common: Implement touch to focus (original implementation by
havlenapetr)
---
libcamera/Android.mk | 4 ++-
libcamera/SecCamera.cpp | 3 --
libcamera/SecCameraHWInterface.cpp | 33 +++++++++++++++++
libcamera/SecCameraUtils.cpp | 72 ++++++++++++++++++++++++++++++++++++++
libcamera/SecCameraUtils.h | 44 +++++++++++++++++++++++
5 files changed, 152 insertions(+), 4 deletions(-)
create mode 100644 libcamera/SecCameraUtils.cpp
create mode 100644 libcamera/SecCameraUtils.h
(limited to 'libcamera')
diff --git a/libcamera/Android.mk b/libcamera/Android.mk
index 19a1237..728ceca 100644
--- a/libcamera/Android.mk
+++ b/libcamera/Android.mk
@@ -9,7 +9,9 @@ LOCAL_C_INCLUDES += $(LOCAL_PATH)/../include
LOCAL_C_INCLUDES += $(LOCAL_PATH)/../libs3cjpeg
LOCAL_SRC_FILES:= \
- SecCamera.cpp SecCameraHWInterface.cpp
+ SecCamera.cpp \
+ SecCameraHWInterface.cpp \
+ SecCameraUtils.cpp \
LOCAL_SHARED_LIBRARIES:= libutils libcutils libbinder liblog libcamera_client libhardware
LOCAL_SHARED_LIBRARIES+= libs3cjpeg
diff --git a/libcamera/SecCamera.cpp b/libcamera/SecCamera.cpp
index 3fd7081..fb3775d 100755
--- a/libcamera/SecCamera.cpp
+++ b/libcamera/SecCamera.cpp
@@ -2586,9 +2586,6 @@ int SecCamera::setObjectPosition(int x, int y)
{
LOGV("%s(setObjectPosition(x=%d, y=%d))", __func__, x, y);
- if (m_preview_width ==640)
- x = x - 80;
-
if (fimc_v4l2_s_ctrl(m_cam_fd, V4L2_CID_CAMERA_OBJECT_POSITION_X, x) < 0) {
LOGE("ERR(%s):Fail on V4L2_CID_CAMERA_OBJECT_POSITION_X", __func__);
return -1;
diff --git a/libcamera/SecCameraHWInterface.cpp b/libcamera/SecCameraHWInterface.cpp
index ca2bedd..f5e0a7a 100755
--- a/libcamera/SecCameraHWInterface.cpp
+++ b/libcamera/SecCameraHWInterface.cpp
@@ -22,6 +22,8 @@
#include
#include "SecCameraHWInterface.h"
+#include "SecCameraUtils.h"
+
#include
#include
#include
@@ -286,6 +288,10 @@ void CameraHardwareSec::initDefaultParameters(int cameraId)
p.set(CameraParameters::KEY_PREVIEW_FPS_RANGE, "15000,30000");
p.set(CameraParameters::KEY_FOCAL_LENGTH, "3.43");
+
+ // touch focus
+ p.set(CameraParameters::KEY_MAX_NUM_FOCUS_AREAS, "1");
+ p.set(CameraParameters::KEY_FOCUS_AREAS, "(0,0,0,0,0)");
} else {
p.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FPS_RANGE, "(7500,30000)");
p.set(CameraParameters::KEY_PREVIEW_FPS_RANGE, "7500,30000");
@@ -1788,6 +1794,33 @@ status_t CameraHardwareSec::setParameters(const CameraParameters& params)
mParameters.set(CameraParameters::KEY_SCENE_MODE, new_scene_mode_str);
}
}
+
+ // touch to focus
+ const char *new_focus_area = params.get(CameraParameters::KEY_FOCUS_AREAS);
+ if (new_focus_area != NULL) {
+ LOGI("focus area: %s", new_focus_area);
+ SecCameraArea area(new_focus_area);
+
+ if (!area.isDummy()) {
+ int width, height, frame_size;
+ mSecCamera->getPreviewSize(&width, &height, &frame_size);
+
+ int x = area.getX(width);
+ int y = area.getY(height);
+
+ LOGI("area=%s, x=%i, y=%i", area.toString8().string(), x, y);
+ if (mSecCamera->setObjectPosition(x, y) < 0) {
+ LOGE("ERR(%s):Fail on mSecCamera->setObjectPosition(%s)", __func__, new_focus_area);
+ ret = UNKNOWN_ERROR;
+ }
+ }
+
+ int val = area.isDummy() ? 0 : 1;
+ if (mSecCamera->setTouchAFStartStop(val) < 0) {
+ LOGE("ERR(%s):Fail on mSecCamera->setTouchAFStartStop(%d)", __func__, val);
+ ret = UNKNOWN_ERROR;
+ }
+ }
} else {
if (!isSupportedParameter(new_focus_mode_str,
mParameters.get(CameraParameters::KEY_SUPPORTED_FOCUS_MODES))) {
diff --git a/libcamera/SecCameraUtils.cpp b/libcamera/SecCameraUtils.cpp
new file mode 100644
index 0000000..c8dc8ee
--- /dev/null
+++ b/libcamera/SecCameraUtils.cpp
@@ -0,0 +1,72 @@
+/*
+**
+** Copyright 2011, Havlena Petr
+** Copyright 2011, The CyanogenMod Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+
+#include "SecCameraUtils.h"
+#include
+
+namespace android {
+
+SecCameraArea::SecCameraArea(int left, int top, int right, int bottom, int weight) :
+ m_left(left),
+ m_top(top),
+ m_right(right),
+ m_bottom(bottom),
+ m_weight(weight)
+{
+}
+
+SecCameraArea::SecCameraArea(const char* str) {
+ char* end;
+
+ if (str != NULL && str[0] == '(') {
+ m_left = (int)strtol(str+1, &end, 10);
+ if (*end != ',') goto error;
+ m_top = (int)strtol(end+1, &end, 10);
+ if (*end != ',') goto error;
+ m_right = (int)strtol(end+1, &end, 10);
+ if (*end != ',') goto error;
+ m_bottom = (int)strtol(end+1, &end, 10);
+ if (*end != ',') goto error;
+ m_weight = (int)strtol(end+1, &end, 10);
+ if (*end != ')') goto error;
+ }
+
+ return;
+
+error:
+ m_left = m_top = m_right = m_bottom = m_weight = 0;
+}
+
+int SecCameraArea::getX(int width) {
+ return (((m_left + m_right) / 2) + 1000) * width / 2000;
+}
+
+int SecCameraArea::getY(int height) {
+ return (((m_top + m_bottom) / 2) + 1000) * height / 2000;
+}
+
+bool SecCameraArea::isDummy() {
+ return m_left == 0 && m_top == 0 && m_right == 0 && m_bottom == 0;
+}
+
+String8 SecCameraArea::toString8() {
+ return String8::format("(%d,%d,%d,%d,%d)",
+ m_left, m_top, m_right, m_bottom, m_weight);
+}
+
+}
\ No newline at end of file
diff --git a/libcamera/SecCameraUtils.h b/libcamera/SecCameraUtils.h
new file mode 100644
index 0000000..ea7896f
--- /dev/null
+++ b/libcamera/SecCameraUtils.h
@@ -0,0 +1,44 @@
+/*
+**
+** Copyright 2011, Havlena Petr
+** Copyright 2011, The CyanogenMod Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+
+#ifndef ANDROID_HARDWARE_CAMERA_SEC_UTILS_H
+#define ANDROID_HARDWARE_CAMERA_SEC_UTILS_H
+
+#include
+
+namespace android {
+
+struct SecCameraArea {
+ int m_left;
+ int m_top;
+ int m_right;
+ int m_bottom;
+ int m_weight;
+
+ SecCameraArea(int left = 0, int top = 0, int right = 0, int bottom = 0, int weight = 0);
+ SecCameraArea(const char* str);
+
+ int getX(int width);
+ int getY(int height);
+ bool isDummy();
+ String8 toString8();
+};
+
+}; // namespace android
+
+#endif // ANDROID_HARDWARE_CAMERA_SEC_UTILS_H
\ No newline at end of file
--
cgit v1.1