diff options
author | Wu-cheng Li <wuchengli@google.com> | 2010-10-08 22:04:43 +0800 |
---|---|---|
committer | Wu-cheng Li <wuchengli@google.com> | 2010-10-12 15:52:44 +0800 |
commit | 012716a857641a977afd16ff6be4bf66fc403884 (patch) | |
tree | 99310083065ae33d75b6b5c87a45a9b2dab096fc | |
parent | 23d2071ab44d7b5e3b16e8a81e11884faf01092f (diff) | |
download | frameworks_av-012716a857641a977afd16ff6be4bf66fc403884.zip frameworks_av-012716a857641a977afd16ff6be4bf66fc403884.tar.gz frameworks_av-012716a857641a977afd16ff6be4bf66fc403884.tar.bz2 |
Fix camera display orientation.
bug:3036262
Change-Id: I6fc3dc381fcfaceba09fd5bd14afb85045b3d676
-rw-r--r-- | services/camera/libcameraservice/CameraService.cpp | 12 | ||||
-rw-r--r-- | services/camera/libcameraservice/CameraService.h | 2 |
2 files changed, 13 insertions, 1 deletions
diff --git a/services/camera/libcameraservice/CameraService.cpp b/services/camera/libcameraservice/CameraService.cpp index 808c679..d09dfff 100644 --- a/services/camera/libcameraservice/CameraService.cpp +++ b/services/camera/libcameraservice/CameraService.cpp @@ -320,6 +320,7 @@ CameraService::Client::Client(const sp<CameraService>& cameraService, // Callback is disabled by default mPreviewCallbackFlag = FRAME_CALLBACK_FLAG_NOOP; mOrientation = 0; + mPreviewWindowFlag = 0; mOrientationChanged = false; mPlayShutterSound = true; cameraService->setCameraBusy(cameraId); @@ -508,6 +509,8 @@ status_t CameraService::Client::setPreviewDisplay(const sp<Surface>& surface) { if (mUseOverlay) { result = setOverlay(); } else if (mPreviewWindow != 0) { + native_window_set_buffers_transform(mPreviewWindow.get(), + mPreviewWindowFlag); result = mHardware->setPreviewWindow(mPreviewWindow); } } @@ -633,7 +636,10 @@ status_t CameraService::Client::startPreviewMode() { if (result != NO_ERROR) return result; result = mHardware->startPreview(); } else { - // XXX: Set the orientation of the ANativeWindow. + if (mPreviewWindow != 0) { + native_window_set_buffers_transform(mPreviewWindow.get(), + mPreviewWindowFlag); + } mHardware->setPreviewWindow(mPreviewWindow); result = mHardware->startPreview(); } @@ -818,15 +824,19 @@ status_t CameraService::Client::sendCommand(int32_t cmd, int32_t arg1, int32_t a switch (arg1) { case 0: orientation = ISurface::BufferHeap::ROT_0; + mPreviewWindowFlag = 0; break; case 90: orientation = ISurface::BufferHeap::ROT_90; + mPreviewWindowFlag = NATIVE_WINDOW_TRANSFORM_ROT_90; break; case 180: orientation = ISurface::BufferHeap::ROT_180; + mPreviewWindowFlag = NATIVE_WINDOW_TRANSFORM_ROT_180; break; case 270: orientation = ISurface::BufferHeap::ROT_270; + mPreviewWindowFlag = NATIVE_WINDOW_TRANSFORM_ROT_270; break; default: return BAD_VALUE; diff --git a/services/camera/libcameraservice/CameraService.h b/services/camera/libcameraservice/CameraService.h index d57364a..c8e0c88 100644 --- a/services/camera/libcameraservice/CameraService.h +++ b/services/camera/libcameraservice/CameraService.h @@ -166,6 +166,7 @@ private: sp<CameraService> mCameraService; // immutable after constructor sp<ICameraClient> mCameraClient; int mCameraId; // immutable after constructor + int mCameraFacing; // immutable after constructor pid_t mClientPid; sp<CameraHardwareInterface> mHardware; // cleared after disconnect() bool mUseOverlay; // immutable after constructor @@ -176,6 +177,7 @@ private: int mOrientation; // Current display orientation // True if display orientation has been changed. This is only used in overlay. int mOrientationChanged; + int mPreviewWindowFlag; bool mPlayShutterSound; // Ensures atomicity among the public methods |