summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Chih-Chung Chang <chihchung@google.com> 2010-01-22 17:49:48 -0800
committer Chih-Chung Chang <chihchung@google.com> 2010-01-26 11:07:07 -0800
commitd1d7706fce19a9a0cf71ff9b65f3aba9b89eeb3b (patch)
treee4945abf24f406374fcc51fec3935fe3aeb57195
parent09ac3c3cbc6278af127cffedb9d534449e63b683 (diff)
Add support for setting camera display orientation.
-rw-r--r--camera/libcameraservice/CameraService.cpp32
-rw-r--r--core/java/android/hardware/Camera.java15
-rw-r--r--core/jni/android_hardware_Camera.cpp15
-rw-r--r--include/ui/Camera.h2
-rw-r--r--include/ui/CameraParameters.h9
-rw-r--r--libs/ui/CameraParameters.cpp20
6 files changed, 55 insertions, 38 deletions
diff --git a/camera/libcameraservice/CameraService.cpp b/camera/libcameraservice/CameraService.cpp
index a8e217e4e510..81d60dc5da39 100644
--- a/camera/libcameraservice/CameraService.cpp
+++ b/camera/libcameraservice/CameraService.cpp
@@ -1191,14 +1191,6 @@ status_t CameraService::Client::setParameters(const String8& params)
CameraParameters p(params);
- // The orientation parameter is actually for CameraService, not for the camera driver.
- if (p.getOrientation() == CameraParameters::CAMERA_ORIENTATION_PORTRAIT) {
- LOGV("portrait mode");
- mOrientation = ISurface::BufferHeap::ROT_90;
- } else {
- mOrientation = 0;
- }
-
return mHardware->setParameters(p);
}
@@ -1224,6 +1216,30 @@ status_t CameraService::Client::sendCommand(int32_t cmd, int32_t arg1, int32_t a
status_t result = checkPid();
if (result != NO_ERROR) return result;
+ if (cmd == CAMERA_CMD_SET_DISPLAY_ORIENTATION) {
+ // The orientation cannot be set during preview.
+ if (mHardware->previewEnabled()) {
+ return INVALID_OPERATION;
+ }
+ switch (arg1) {
+ case 0:
+ mOrientation = ISurface::BufferHeap::ROT_0;
+ break;
+ case 90:
+ mOrientation = ISurface::BufferHeap::ROT_90;
+ break;
+ case 180:
+ mOrientation = ISurface::BufferHeap::ROT_180;
+ break;
+ case 270:
+ mOrientation = ISurface::BufferHeap::ROT_270;
+ break;
+ default:
+ return BAD_VALUE;
+ }
+ return OK;
+ }
+
if (mHardware == 0) {
LOGE("mHardware is NULL, returning.");
return INVALID_OPERATION;
diff --git a/core/java/android/hardware/Camera.java b/core/java/android/hardware/Camera.java
index d90536ca97e4..4c4455a4c516 100644
--- a/core/java/android/hardware/Camera.java
+++ b/core/java/android/hardware/Camera.java
@@ -543,6 +543,21 @@ public class Camera {
public native final void stopSmoothZoom();
/**
+ * Set the display orientation. This affects the preview frames and the
+ * picture displayed after snapshot. This method is useful for portrait
+ * mode applications.
+ *
+ * This does not affect the order of byte array passed in
+ * {@link PreviewCallback#onPreviewFrame}. This method is not allowed to
+ * be called during preview.
+ *
+ * @param degrees the angle that the picture will be rotated clockwise.
+ * Valid values are 0, 90, 180, and 270.
+ * @hide
+ */
+ public native final void setDisplayOrientation(int degrees);
+
+ /**
* Handles the zoom callback.
*
* @hide
diff --git a/core/jni/android_hardware_Camera.cpp b/core/jni/android_hardware_Camera.cpp
index 64ee4f0c9881..1a5987cc3c65 100644
--- a/core/jni/android_hardware_Camera.cpp
+++ b/core/jni/android_hardware_Camera.cpp
@@ -546,6 +546,18 @@ static void android_hardware_Camera_stopSmoothZoom(JNIEnv *env, jobject thiz)
}
}
+static void android_hardware_Camera_setDisplayOrientation(JNIEnv *env, jobject thiz,
+ jint value)
+{
+ LOGV("setDisplayOrientation");
+ sp<Camera> camera = get_native_camera(env, thiz, NULL);
+ if (camera == 0) return;
+
+ if (camera->sendCommand(CAMERA_CMD_SET_DISPLAY_ORIENTATION, value, 0) != NO_ERROR) {
+ jniThrowException(env, "java/lang/RuntimeException", "set display orientation failed");
+ }
+}
+
//-------------------------------------------------
static JNINativeMethod camMethods[] = {
@@ -603,6 +615,9 @@ static JNINativeMethod camMethods[] = {
{ "stopSmoothZoom",
"()V",
(void *)android_hardware_Camera_stopSmoothZoom },
+ { "setDisplayOrientation",
+ "(I)V",
+ (void *)android_hardware_Camera_setDisplayOrientation },
};
struct field {
diff --git a/include/ui/Camera.h b/include/ui/Camera.h
index 5219772a1a1f..c506fb89582c 100644
--- a/include/ui/Camera.h
+++ b/include/ui/Camera.h
@@ -82,6 +82,7 @@ enum {
enum {
CAMERA_CMD_START_SMOOTH_ZOOM = 1,
CAMERA_CMD_STOP_SMOOTH_ZOOM = 2,
+ CAMERA_CMD_SET_DISPLAY_ORIENTATION = 3,
};
// camera fatal errors
@@ -209,4 +210,3 @@ private:
}; // namespace android
#endif
-
diff --git a/include/ui/CameraParameters.h b/include/ui/CameraParameters.h
index a5ea133be324..cae06761abe5 100644
--- a/include/ui/CameraParameters.h
+++ b/include/ui/CameraParameters.h
@@ -29,12 +29,6 @@ public:
CameraParameters(const String8 &params) { unflatten(params); }
~CameraParameters();
- enum {
- CAMERA_ORIENTATION_UNKNOWN = 0,
- CAMERA_ORIENTATION_PORTRAIT = 1,
- CAMERA_ORIENTATION_LANDSCAPE = 2,
- };
-
String8 flatten() const;
void unflatten(const String8 &params);
@@ -63,9 +57,6 @@ public:
void setPictureFormat(const char *format);
const char *getPictureFormat() const;
- int getOrientation() const;
- void setOrientation(int orientation);
-
void dump() const;
status_t dump(int fd, const Vector<String16>& args) const;
diff --git a/libs/ui/CameraParameters.cpp b/libs/ui/CameraParameters.cpp
index 2e0409bc688c..a94f6b9e435c 100644
--- a/libs/ui/CameraParameters.cpp
+++ b/libs/ui/CameraParameters.cpp
@@ -121,9 +121,6 @@ const char CameraParameters::FOCUS_MODE_INFINITY[] = "infinity";
const char CameraParameters::FOCUS_MODE_MACRO[] = "macro";
const char CameraParameters::FOCUS_MODE_FIXED[] = "fixed";
-static const char* portrait = "portrait";
-static const char* landscape = "landscape";
-
CameraParameters::CameraParameters()
: mMap()
{
@@ -282,23 +279,6 @@ void CameraParameters::setPreviewFormat(const char *format)
set(KEY_PREVIEW_FORMAT, format);
}
-int CameraParameters::getOrientation() const
-{
- const char* orientation = get("orientation");
- if (orientation && !strcmp(orientation, portrait))
- return CAMERA_ORIENTATION_PORTRAIT;
- return CAMERA_ORIENTATION_LANDSCAPE;
-}
-
-void CameraParameters::setOrientation(int orientation)
-{
- if (orientation == CAMERA_ORIENTATION_PORTRAIT) {
- set("orientation", portrait);
- } else {
- set("orientation", landscape);
- }
-}
-
const char *CameraParameters::getPreviewFormat() const
{
return get(KEY_PREVIEW_FORMAT);