From 9c7ac0d142eaf4b083a309299ab023932a9bb109 Mon Sep 17 00:00:00 2001 From: Iliyan Malchev Date: Thu, 14 Apr 2011 16:51:21 -0700 Subject: [PATCH] frameworks/base: include system/core header camera.h in Camera.h We define struct CameraInfo in this camera/Camera.h, even though an identical struct camera_info is defined in hardware/camera.h (but not in hardware/camera_defs.h). We may not export struct definitions from the HAL into headers which may find their way into the NDK. This commit also renames FRAME_CALLBACK_FLAG_xxx to CAMERA_FRAME_CALLBACK_xxx. Change-Id: I3e2ddd01d61bf5371ff2fc1a397995e0f1ee11f8 Signed-off-by: Iliyan Malchev --- core/jni/android_hardware_Camera.cpp | 14 +-- include/camera/Camera.h | 108 ++---------------- .../camera/libcameraservice/CameraService.cpp | 18 +-- .../CameraServiceTest/CameraServiceTest.cpp | 8 +- 4 files changed, 27 insertions(+), 121 deletions(-) diff --git a/core/jni/android_hardware_Camera.cpp b/core/jni/android_hardware_Camera.cpp index 97580f54cde3e..4687ee07f6fdc 100644 --- a/core/jni/android_hardware_Camera.cpp +++ b/core/jni/android_hardware_Camera.cpp @@ -218,7 +218,7 @@ void JNICameraContext::copyAndPost(JNIEnv* env, const sp& dataPtr, int if (mCallbackBuffers.isEmpty()) { LOGV("Out of buffers, clearing callback!"); - mCamera->setPreviewCallbackFlags(FRAME_CALLBACK_FLAG_NOOP); + mCamera->setPreviewCallbackFlags(CAMERA_FRAME_CALLBACK_FLAG_NOOP); mManualCameraCallbackSet = false; if (obj == NULL) { @@ -305,22 +305,22 @@ void JNICameraContext::setCallbackMode(JNIEnv *env, bool installed, bool manualM mManualCameraCallbackSet = false; // In order to limit the over usage of binder threads, all non-manual buffer - // callbacks use FRAME_CALLBACK_FLAG_BARCODE_SCANNER mode now. + // callbacks use CAMERA_FRAME_CALLBACK_FLAG_BARCODE_SCANNER mode now. // // Continuous callbacks will have the callback re-registered from handleMessage. // Manual buffer mode will operate as fast as possible, relying on the finite supply // of buffers for throttling. if (!installed) { - mCamera->setPreviewCallbackFlags(FRAME_CALLBACK_FLAG_NOOP); + mCamera->setPreviewCallbackFlags(CAMERA_FRAME_CALLBACK_FLAG_NOOP); clearCallbackBuffers_l(env, &mCallbackBuffers); } else if (mManualBufferMode) { if (!mCallbackBuffers.isEmpty()) { - mCamera->setPreviewCallbackFlags(FRAME_CALLBACK_FLAG_CAMERA); + mCamera->setPreviewCallbackFlags(CAMERA_FRAME_CALLBACK_FLAG_CAMERA); mManualCameraCallbackSet = true; } } else { - mCamera->setPreviewCallbackFlags(FRAME_CALLBACK_FLAG_BARCODE_SCANNER); + mCamera->setPreviewCallbackFlags(CAMERA_FRAME_CALLBACK_FLAG_BARCODE_SCANNER); clearCallbackBuffers_l(env, &mCallbackBuffers); } } @@ -343,7 +343,7 @@ void JNICameraContext::addCallbackBuffer( // next frame. This may have come unset had we not had a // callbackbuffer ready for it last time. if (mManualBufferMode && !mManualCameraCallbackSet) { - mCamera->setPreviewCallbackFlags(FRAME_CALLBACK_FLAG_CAMERA); + mCamera->setPreviewCallbackFlags(CAMERA_FRAME_CALLBACK_FLAG_CAMERA); mManualCameraCallbackSet = true; } break; @@ -456,7 +456,7 @@ static void android_hardware_Camera_release(JNIEnv *env, jobject thiz) // clear callbacks if (camera != NULL) { - camera->setPreviewCallbackFlags(FRAME_CALLBACK_FLAG_NOOP); + camera->setPreviewCallbackFlags(CAMERA_FRAME_CALLBACK_FLAG_NOOP); camera->disconnect(); } diff --git a/include/camera/Camera.h b/include/camera/Camera.h index 3c6dccc73e615..7106bfa6606f7 100644 --- a/include/camera/Camera.h +++ b/include/camera/Camera.h @@ -20,122 +20,28 @@ #include #include #include +#include namespace android { -/* - * A set of bit masks for specifying how the received preview frames are - * handled before the previewCallback() call. - * - * The least significant 3 bits of an "int" value are used for this purpose: - * - * ..... 0 0 0 - * ^ ^ ^ - * | | |---------> determine whether the callback is enabled or not - * | |-----------> determine whether the callback is one-shot or not - * |-------------> determine whether the frame is copied out or not - * - * WARNING: - * When a frame is sent directly without copying, it is the frame receiver's - * responsiblity to make sure that the frame data won't get corrupted by - * subsequent preview frames filled by the camera. This flag is recommended - * only when copying out data brings significant performance price and the - * handling/processing of the received frame data is always faster than - * the preview frame rate so that data corruption won't occur. - * - * For instance, - * 1. 0x00 disables the callback. In this case, copy out and one shot bits - * are ignored. - * 2. 0x01 enables a callback without copying out the received frames. A - * typical use case is the Camcorder application to avoid making costly - * frame copies. - * 3. 0x05 is enabling a callback with frame copied out repeatedly. A typical - * use case is the Camera application. - * 4. 0x07 is enabling a callback with frame copied out only once. A typical use - * case is the Barcode scanner application. - */ -#define FRAME_CALLBACK_FLAG_ENABLE_MASK 0x01 -#define FRAME_CALLBACK_FLAG_ONE_SHOT_MASK 0x02 -#define FRAME_CALLBACK_FLAG_COPY_OUT_MASK 0x04 - -// Typical use cases -#define FRAME_CALLBACK_FLAG_NOOP 0x00 -#define FRAME_CALLBACK_FLAG_CAMCORDER 0x01 -#define FRAME_CALLBACK_FLAG_CAMERA 0x05 -#define FRAME_CALLBACK_FLAG_BARCODE_SCANNER 0x07 - -// msgType in notifyCallback and dataCallback functions -enum { - CAMERA_MSG_ERROR = 0x0001, - CAMERA_MSG_SHUTTER = 0x0002, - CAMERA_MSG_FOCUS = 0x0004, - CAMERA_MSG_ZOOM = 0x0008, - CAMERA_MSG_PREVIEW_FRAME = 0x0010, - CAMERA_MSG_VIDEO_FRAME = 0x0020, - CAMERA_MSG_POSTVIEW_FRAME = 0x0040, - CAMERA_MSG_RAW_IMAGE = 0x0080, - CAMERA_MSG_COMPRESSED_IMAGE = 0x0100, - CAMERA_MSG_RAW_IMAGE_NOTIFY = 0x0200, - CAMERA_MSG_ALL_MSGS = 0xFFFF -}; - -// cmdType in sendCommand functions -enum { - CAMERA_CMD_START_SMOOTH_ZOOM = 1, - CAMERA_CMD_STOP_SMOOTH_ZOOM = 2, - // Set the clockwise rotation of preview display (setPreviewDisplay) in - // degrees. This affects the preview frames and the picture displayed after - // snapshot. This method is useful for portrait mode applications. Note that - // preview display of front-facing cameras is flipped horizontally before - // the rotation, that is, the image is reflected along the central vertical - // axis of the camera sensor. So the users can see themselves as looking - // into a mirror. - // - // This does not affect the order of byte array of CAMERA_MSG_PREVIEW_FRAME, - // CAMERA_MSG_VIDEO_FRAME, CAMERA_MSG_POSTVIEW_FRAME, CAMERA_MSG_RAW_IMAGE, - // or CAMERA_MSG_COMPRESSED_IMAGE. This is not allowed to be set during - // preview. - CAMERA_CMD_SET_DISPLAY_ORIENTATION = 3, - - // cmdType to disable/enable shutter sound. - // In sendCommand passing arg1 = 0 will disable, - // while passing arg1 = 1 will enable the shutter sound. - CAMERA_CMD_ENABLE_SHUTTER_SOUND = 4, - - // cmdType to play recording sound. - CAMERA_CMD_PLAY_RECORDING_SOUND = 5, -}; - -// camera fatal errors -enum { - CAMERA_ERROR_UNKNOWN = 1, - CAMERA_ERROR_SERVER_DIED = 100 -}; - -enum { - CAMERA_FACING_BACK = 0, /* The facing of the camera is opposite to that of the screen. */ - CAMERA_FACING_FRONT = 1 /* The facing of the camera is the same as that of the screen. */ -}; - struct CameraInfo { - /** - * The direction that the camera faces to. It should be - * CAMERA_FACING_BACK or CAMERA_FACING_FRONT. + * The direction that the camera faces to. It should be CAMERA_FACING_BACK + * or CAMERA_FACING_FRONT. */ int facing; /** * The orientation of the camera image. The value is the angle that the - * camera image needs to be rotated clockwise so it shows correctly on - * the display in its natural orientation. It should be 0, 90, 180, or 270. + * camera image needs to be rotated clockwise so it shows correctly on the + * display in its natural orientation. It should be 0, 90, 180, or 270. * * For example, suppose a device has a naturally tall screen. The * back-facing camera sensor is mounted in landscape. You are looking at * the screen. If the top side of the camera sensor is aligned with the * right edge of the screen in natural orientation, the value should be - * 90. If the top side of a front-facing camera sensor is aligned with - * the right of the screen, the value should be 270. + * 90. If the top side of a front-facing camera sensor is aligned with the + * right of the screen, the value should be 270. */ int orientation; }; diff --git a/services/camera/libcameraservice/CameraService.cpp b/services/camera/libcameraservice/CameraService.cpp index f4859ec5b1c7d..56c92469070d9 100644 --- a/services/camera/libcameraservice/CameraService.cpp +++ b/services/camera/libcameraservice/CameraService.cpp @@ -320,7 +320,7 @@ CameraService::Client::Client(const sp& cameraService, CAMERA_MSG_FOCUS); // Callback is disabled by default - mPreviewCallbackFlag = FRAME_CALLBACK_FLAG_NOOP; + mPreviewCallbackFlag = CAMERA_FRAME_CALLBACK_FLAG_NOOP; mOrientation = getOrientation(0, mCameraFacing == CAMERA_FACING_FRONT); mPlayShutterSound = true; cameraService->setCameraBusy(cameraId); @@ -410,7 +410,7 @@ status_t CameraService::Client::connect(const sp& client) { return NO_ERROR; } - mPreviewCallbackFlag = FRAME_CALLBACK_FLAG_NOOP; + mPreviewCallbackFlag = CAMERA_FRAME_CALLBACK_FLAG_NOOP; mClientPid = callingPid; mCameraClient = client; @@ -543,7 +543,7 @@ void CameraService::Client::setPreviewCallbackFlag(int callback_flag) { if (checkPidAndHardware() != NO_ERROR) return; mPreviewCallbackFlag = callback_flag; - if (mPreviewCallbackFlag & FRAME_CALLBACK_FLAG_ENABLE_MASK) { + if (mPreviewCallbackFlag & CAMERA_FRAME_CALLBACK_FLAG_ENABLE_MASK) { enableMsgType(CAMERA_MSG_PREVIEW_FRAME); } else { disableMsgType(CAMERA_MSG_PREVIEW_FRAME); @@ -1009,7 +1009,7 @@ void CameraService::Client::handlePreviewData(const sp& mem) { int flags = mPreviewCallbackFlag; // is callback enabled? - if (!(flags & FRAME_CALLBACK_FLAG_ENABLE_MASK)) { + if (!(flags & CAMERA_FRAME_CALLBACK_FLAG_ENABLE_MASK)) { // If the enable bit is off, the copy-out and one-shot bits are ignored LOG2("frame callback is disabled"); mLock.unlock(); @@ -1020,17 +1020,17 @@ void CameraService::Client::handlePreviewData(const sp& mem) { sp c = mCameraClient; // clear callback flags if no client or one-shot mode - if (c == 0 || (mPreviewCallbackFlag & FRAME_CALLBACK_FLAG_ONE_SHOT_MASK)) { + if (c == 0 || (mPreviewCallbackFlag & CAMERA_FRAME_CALLBACK_FLAG_ONE_SHOT_MASK)) { LOG2("Disable preview callback"); - mPreviewCallbackFlag &= ~(FRAME_CALLBACK_FLAG_ONE_SHOT_MASK | - FRAME_CALLBACK_FLAG_COPY_OUT_MASK | - FRAME_CALLBACK_FLAG_ENABLE_MASK); + mPreviewCallbackFlag &= ~(CAMERA_FRAME_CALLBACK_FLAG_ONE_SHOT_MASK | + CAMERA_FRAME_CALLBACK_FLAG_COPY_OUT_MASK | + CAMERA_FRAME_CALLBACK_FLAG_ENABLE_MASK); disableMsgType(CAMERA_MSG_PREVIEW_FRAME); } if (c != 0) { // Is the received frame copied out or not? - if (flags & FRAME_CALLBACK_FLAG_COPY_OUT_MASK) { + if (flags & CAMERA_FRAME_CALLBACK_FLAG_COPY_OUT_MASK) { LOG2("frame is copied"); copyFrameAndPostCopiedFrame(c, heap, offset, size); } else { diff --git a/services/camera/tests/CameraServiceTest/CameraServiceTest.cpp b/services/camera/tests/CameraServiceTest/CameraServiceTest.cpp index 8a228fd7b6c4a..f86ca475b6780 100644 --- a/services/camera/tests/CameraServiceTest/CameraServiceTest.cpp +++ b/services/camera/tests/CameraServiceTest/CameraServiceTest.cpp @@ -830,10 +830,10 @@ public: ASSERT(c->previewEnabled() == true); sleep(2); c->stopPreview(); - if ((v & FRAME_CALLBACK_FLAG_ENABLE_MASK) == 0) { + if ((v & CAMERA_FRAME_CALLBACK_FLAG_ENABLE_MASK) == 0) { cc->assertData(CAMERA_MSG_PREVIEW_FRAME, MCameraClient::EQ, 0); } else { - if ((v & FRAME_CALLBACK_FLAG_ONE_SHOT_MASK) == 0) { + if ((v & CAMERA_FRAME_CALLBACK_FLAG_ONE_SHOT_MASK) == 0) { cc->assertData(CAMERA_MSG_PREVIEW_FRAME, MCameraClient::GE, 10); } else { cc->assertData(CAMERA_MSG_PREVIEW_FRAME, MCameraClient::EQ, 1); @@ -849,7 +849,7 @@ public: ASSERT(c->recordingEnabled() == false); sp surface = new MSurface(); ASSERT(c->setPreviewDisplay(surface) == NO_ERROR); - c->setPreviewCallbackFlag(FRAME_CALLBACK_FLAG_ENABLE_MASK); + c->setPreviewCallbackFlag(CAMERA_FRAME_CALLBACK_FLAG_ENABLE_MASK); cc->setReleaser(c.get()); c->startRecording(); ASSERT(c->recordingEnabled() == true); @@ -870,7 +870,7 @@ public: CameraParameters param(c->getParameters()); param.setPreviewSize(w, h); - c->setPreviewCallbackFlag(FRAME_CALLBACK_FLAG_ENABLE_MASK); + c->setPreviewCallbackFlag(CAMERA_FRAME_CALLBACK_FLAG_ENABLE_MASK); c->setParameters(param.flatten()); c->startPreview();