summaryrefslogtreecommitdiffstats
path: root/tools
diff options
context:
space:
mode:
authorVladimir Chtchetkine <vchtchetkine@google.com>2011-10-14 14:25:51 -0700
committerVladimir Chtchetkine <vchtchetkine@google.com>2011-10-18 12:32:24 -0700
commitf7f6886820208bdea0ae42a323baade4d1c939da (patch)
tree2416ccaca8b4504f71e4d83ebf05171e2cd6e647 /tools
parent00cd68e27f2e2ebf8221550728ec786299d3beae (diff)
downloadandroid_development-f7f6886820208bdea0ae42a323baade4d1c939da.tar.gz
android_development-f7f6886820208bdea0ae42a323baade4d1c939da.tar.bz2
android_development-f7f6886820208bdea0ae42a323baade4d1c939da.zip
Cherry picked from c9a94b0f in master. Do not merge.
Implement CAMERA_MSG_PREVIEW_FRAME callback Also does better work detecting pixel format for video frames, depending on the mode that camera is intended to be operated with. Change-Id: Idb2dfc7c0a79e81eff58f83a14af769afc713096
Diffstat (limited to 'tools')
-rwxr-xr-xtools/emulator/system/camera/CallbackNotifier.cpp12
-rwxr-xr-xtools/emulator/system/camera/EmulatedCamera.cpp104
-rwxr-xr-xtools/emulator/system/camera/EmulatedCamera.h1
3 files changed, 51 insertions, 66 deletions
diff --git a/tools/emulator/system/camera/CallbackNotifier.cpp b/tools/emulator/system/camera/CallbackNotifier.cpp
index a877b4095..f974b8673 100755
--- a/tools/emulator/system/camera/CallbackNotifier.cpp
+++ b/tools/emulator/system/camera/CallbackNotifier.cpp
@@ -219,6 +219,18 @@ void CallbackNotifier::onNextFrameAvailable(const void* frame,
}
}
+ if (isMessageEnabled(CAMERA_MSG_PREVIEW_FRAME)) {
+ camera_memory_t* cam_buff =
+ mGetMemoryCB(-1, camera_dev->getFrameBufferSize(), 1, NULL);
+ if (NULL != cam_buff && NULL != cam_buff->data) {
+ memcpy(cam_buff->data, frame, camera_dev->getFrameBufferSize());
+ mDataCB(CAMERA_MSG_PREVIEW_FRAME, cam_buff, 0, NULL, mCBOpaque);
+ cam_buff->release(cam_buff);
+ } else {
+ LOGE("%s: Memory failure in CAMERA_MSG_PREVIEW_FRAME", __FUNCTION__);
+ }
+ }
+
if (mTakingPicture) {
/* This happens just once. */
mTakingPicture = false;
diff --git a/tools/emulator/system/camera/EmulatedCamera.cpp b/tools/emulator/system/camera/EmulatedCamera.cpp
index 9cabe75d9..8fde26393 100755
--- a/tools/emulator/system/camera/EmulatedCamera.cpp
+++ b/tools/emulator/system/camera/EmulatedCamera.cpp
@@ -88,11 +88,19 @@ EmulatedCamera::~EmulatedCamera()
status_t EmulatedCamera::Initialize()
{
+ /* Preview formats supported by this HAL. */
+ char preview_formats[1024];
+ snprintf(preview_formats, sizeof(preview_formats), "%s,%s,%s",
+ CameraParameters::PIXEL_FORMAT_YUV420SP,
+ CameraParameters::PIXEL_FORMAT_YUV420P,
+ CameraParameters::PIXEL_FORMAT_RGBA8888);
+
/*
* Fake required parameters.
*/
- mParameters.set(CameraParameters::KEY_SUPPORTED_JPEG_THUMBNAIL_SIZES, "320x240,0x0");
+ mParameters.set(CameraParameters::KEY_SUPPORTED_JPEG_THUMBNAIL_SIZES,
+ "320x240,0x0");
mParameters.set(CameraParameters::KEY_MAX_EXPOSURE_COMPENSATION, "6");
mParameters.set(CameraParameters::KEY_MIN_EXPOSURE_COMPENSATION, "-6");
mParameters.set(CameraParameters::KEY_EXPOSURE_COMPENSATION_STEP, "0.5");
@@ -109,7 +117,7 @@ status_t EmulatedCamera::Initialize()
* is explicitly stated when set_buffers_geometry is called on the preview
* window object. */
mParameters.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FORMATS,
- CameraParameters::PIXEL_FORMAT_YUV420SP);
+ preview_formats);
mParameters.setPreviewFormat(CameraParameters::PIXEL_FORMAT_YUV420SP);
/* We don't relay on the actual frame rates supported by the camera device,
@@ -121,7 +129,7 @@ status_t EmulatedCamera::Initialize()
mParameters.set(CameraParameters::KEY_PREVIEW_FPS_RANGE, "5,30");
mParameters.setPreviewFrameRate(24);
- /* Only PIXEL_FORMAT_YUV420P is accepted by camera framework in emulator! */
+ /* Only PIXEL_FORMAT_YUV420P is accepted by video framework in emulator! */
mParameters.set(CameraParameters::KEY_VIDEO_FRAME_FORMAT,
CameraParameters::PIXEL_FORMAT_YUV420P);
mParameters.set(CameraParameters::KEY_SUPPORTED_PICTURE_FORMATS,
@@ -132,8 +140,10 @@ status_t EmulatedCamera::Initialize()
* Not supported features
*/
- mParameters.set(CameraParameters::KEY_SUPPORTED_FOCUS_MODES, CameraParameters::FOCUS_MODE_FIXED);
- mParameters.set(CameraParameters::KEY_FOCUS_MODE, CameraParameters::FOCUS_MODE_FIXED);
+ mParameters.set(CameraParameters::KEY_SUPPORTED_FOCUS_MODES,
+ CameraParameters::FOCUS_MODE_FIXED);
+ mParameters.set(CameraParameters::KEY_FOCUS_MODE,
+ CameraParameters::FOCUS_MODE_FIXED);
return NO_ERROR;
}
@@ -398,62 +408,6 @@ status_t EmulatedCamera::setParameters(const char* parms)
new_param.unflatten(str8_param);
mParameters = new_param;
- /*
- * In emulation, there are certain parameters that are required by the
- * framework to be exact, and supported by the camera. Since we can't predict
- * the values of such parameters, we must dynamically update them as they
- * are set by the framework.
- */
-
- /* Supported preview size. */
- const char* check = mParameters.get(CameraParameters::KEY_PREVIEW_SIZE);
- if (check != NULL) {
- const char* current =
- mParameters.get(CameraParameters::KEY_SUPPORTED_PREVIEW_SIZES);
- if (strstr(current, check) == NULL) {
- /* Required size doesn't exist in the list. Add it. */
- char* to_add = AddValue(current, check);
- if (to_add != NULL) {
- LOGD("+++ %s: Added %s to supported preview sizes",
- __FUNCTION__, check);
- mParameters.set(CameraParameters::KEY_SUPPORTED_PREVIEW_SIZES, to_add);
- free(to_add);
- }
- }
- }
-
- /* Supported preview frame rate. */
- check = mParameters.get(CameraParameters::KEY_PREVIEW_FRAME_RATE);
- if (check != NULL) {
- const char* current =
- mParameters.get(CameraParameters::KEY_SUPPORTED_PREVIEW_FRAME_RATES);
- if (strstr(current, check) == NULL) {
- char* to_add = AddValue(current, check);
- if (to_add != NULL) {
- LOGD("+++ %s: Added %s to supported preview frame rates",
- __FUNCTION__, check);
- mParameters.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FRAME_RATES, to_add);
- free(to_add);
- }
- }
- }
-
- /* Supported picture size. */
- check = mParameters.get(CameraParameters::KEY_PICTURE_SIZE);
- if (check != NULL) {
- const char* current =
- mParameters.get(CameraParameters::KEY_SUPPORTED_PICTURE_SIZES);
- if (strstr(current, check) == NULL) {
- char* to_add = AddValue(current, check);
- if (to_add != NULL) {
- LOGD("+++ %s: Added %s to supported picture sizes",
- __FUNCTION__, check);
- mParameters.set(CameraParameters::KEY_SUPPORTED_PICTURE_SIZES, to_add);
- free(to_add);
- }
- }
- }
-
return NO_ERROR;
}
@@ -542,9 +496,24 @@ status_t EmulatedCamera::doStartPreview()
} else {
mParameters.getPreviewSize(&width, &height);
}
- /* Lets see what should we use for the frame pixel format. */
- const char* pix_fmt =
- mParameters.get(CameraParameters::KEY_VIDEO_FRAME_FORMAT);
+ /* Lets see what should we use for the frame pixel format. Note that there
+ * are two parameters that define pixel formats for frames sent to the
+ * application via notification callbacks:
+ * - KEY_VIDEO_FRAME_FORMAT, that is used when recording video, and
+ * - KEY_PREVIEW_FORMAT, that is used for preview frame notification.
+ * We choose one or the other, depending on "recording-hint" property set by
+ * the framework that indicating intention: video, or preview. */
+ const char* pix_fmt = NULL;
+ const char* is_video = mParameters.get(EmulatedCamera::RECORDING_HINT_KEY);
+ if (is_video == NULL) {
+ is_video = CameraParameters::FALSE;
+ }
+ if (strcmp(is_video, CameraParameters::TRUE) == 0) {
+ /* Video recording is requested. Lets see if video frame format is set. */
+ pix_fmt = mParameters.get(CameraParameters::KEY_VIDEO_FRAME_FORMAT);
+ }
+ /* If this was not video recording, or video frame format is not set, lets
+ * use preview pixel format for the main framebuffer. */
if (pix_fmt == NULL) {
pix_fmt = mParameters.getPreviewFormat();
}
@@ -553,6 +522,8 @@ status_t EmulatedCamera::doStartPreview()
mPreviewWindow.stopPreview();
return EINVAL;
}
+
+ /* Convert framework's pixel format to the FOURCC one. */
uint32_t org_fmt;
if (strcmp(pix_fmt, CameraParameters::PIXEL_FORMAT_YUV420P) == 0) {
org_fmt = V4L2_PIX_FMT_YUV420;
@@ -934,8 +905,9 @@ camera_device_ops_t EmulatedCamera::mDeviceOps = {
* Common keys
***************************************************************************/
-const char EmulatedCamera::FACING_KEY[] = "prop-facing";
-const char EmulatedCamera::ORIENTATION_KEY[] = "prop-orientation";
+const char EmulatedCamera::FACING_KEY[] = "prop-facing";
+const char EmulatedCamera::ORIENTATION_KEY[] = "prop-orientation";
+const char EmulatedCamera::RECORDING_HINT_KEY[] = "recording-hint";
/****************************************************************************
* Common string values
diff --git a/tools/emulator/system/camera/EmulatedCamera.h b/tools/emulator/system/camera/EmulatedCamera.h
index 8afdd8306..0a7584e0f 100755
--- a/tools/emulator/system/camera/EmulatedCamera.h
+++ b/tools/emulator/system/camera/EmulatedCamera.h
@@ -402,6 +402,7 @@ private:
public:
static const char FACING_KEY[];
static const char ORIENTATION_KEY[];
+ static const char RECORDING_HINT_KEY[];
/****************************************************************************
* Common string values