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 <malchev@google.com>
This commit is contained in:
@@ -218,7 +218,7 @@ void JNICameraContext::copyAndPost(JNIEnv* env, const sp<IMemory>& 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();
|
||||
}
|
||||
|
||||
|
||||
@@ -20,122 +20,28 @@
|
||||
#include <utils/Timers.h>
|
||||
#include <camera/ICameraClient.h>
|
||||
#include <gui/ISurfaceTexture.h>
|
||||
#include <system/camera.h>
|
||||
|
||||
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;
|
||||
};
|
||||
|
||||
@@ -320,7 +320,7 @@ CameraService::Client::Client(const sp<CameraService>& 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<ICameraClient>& 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<IMemory>& 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<IMemory>& mem) {
|
||||
sp<ICameraClient> 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 {
|
||||
|
||||
@@ -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<MSurface> 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();
|
||||
|
||||
Reference in New Issue
Block a user