Add support for setting camera display orientation.

This commit is contained in:
Chih-Chung Chang
2010-01-22 17:49:48 -08:00
parent 09ac3c3cbc
commit d1d7706fce
6 changed files with 55 additions and 38 deletions

View File

@@ -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;

View File

@@ -542,6 +542,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.
*

View File

@@ -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 {

View File

@@ -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

View File

@@ -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;

View File

@@ -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);