diff options
author | 2010-01-22 17:49:48 -0800 | |
---|---|---|
committer | 2010-01-26 11:07:07 -0800 | |
commit | d1d7706fce19a9a0cf71ff9b65f3aba9b89eeb3b (patch) | |
tree | e4945abf24f406374fcc51fec3935fe3aeb57195 | |
parent | 09ac3c3cbc6278af127cffedb9d534449e63b683 (diff) |
Add support for setting camera display orientation.
-rw-r--r-- | camera/libcameraservice/CameraService.cpp | 32 | ||||
-rw-r--r-- | core/java/android/hardware/Camera.java | 15 | ||||
-rw-r--r-- | core/jni/android_hardware_Camera.cpp | 15 | ||||
-rw-r--r-- | include/ui/Camera.h | 2 | ||||
-rw-r--r-- | include/ui/CameraParameters.h | 9 | ||||
-rw-r--r-- | libs/ui/CameraParameters.cpp | 20 |
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 ¶ms) { unflatten(params); } ~CameraParameters(); - enum { - CAMERA_ORIENTATION_UNKNOWN = 0, - CAMERA_ORIENTATION_PORTRAIT = 1, - CAMERA_ORIENTATION_LANDSCAPE = 2, - }; - String8 flatten() const; void unflatten(const String8 ¶ms); @@ -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); |