summaryrefslogtreecommitdiffstats
path: root/services/camera/libcameraservice/Camera2Device.cpp
diff options
context:
space:
mode:
authorEino-Ville Talvala <etalvala@google.com>2012-06-07 17:12:38 -0700
committerEino-Ville Talvala <etalvala@google.com>2012-06-13 12:03:28 -0700
commitd4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949 (patch)
tree9a7809d649c25ee5bb30bd7dd46da7753b59fa1a /services/camera/libcameraservice/Camera2Device.cpp
parenta9300fd3d84cc07bbfa702e2fad3b32a5ebfd337 (diff)
downloadframeworks_av-d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949.zip
frameworks_av-d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949.tar.gz
frameworks_av-d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949.tar.bz2
Camera2: Still image support
- Add stream / request creation for still image capture - Add takePicture call - Add callback handler - Fix shutdown bugs (wait until requests have drained) Bug: 6243944 Change-Id: Id73eb7090e61b40b90348d1eb262f641ea5f3229
Diffstat (limited to 'services/camera/libcameraservice/Camera2Device.cpp')
-rw-r--r--services/camera/libcameraservice/Camera2Device.cpp99
1 files changed, 81 insertions, 18 deletions
diff --git a/services/camera/libcameraservice/Camera2Device.cpp b/services/camera/libcameraservice/Camera2Device.cpp
index b81d54c..8cb872a 100644
--- a/services/camera/libcameraservice/Camera2Device.cpp
+++ b/services/camera/libcameraservice/Camera2Device.cpp
@@ -111,8 +111,15 @@ camera_metadata_t *Camera2Device::info() {
return mDeviceInfo;
}
-status_t Camera2Device::setStreamingRequest(camera_metadata_t* request)
-{
+status_t Camera2Device::capture(camera_metadata_t* request) {
+ ALOGV("%s: E", __FUNCTION__);
+
+ mRequestQueue.enqueue(request);
+ return OK;
+}
+
+
+status_t Camera2Device::setStreamingRequest(camera_metadata_t* request) {
ALOGV("%s: E", __FUNCTION__);
mRequestQueue.setStreamSlot(request);
@@ -120,13 +127,13 @@ status_t Camera2Device::setStreamingRequest(camera_metadata_t* request)
}
status_t Camera2Device::createStream(sp<ANativeWindow> consumer,
- uint32_t width, uint32_t height, int format, int *id) {
+ uint32_t width, uint32_t height, int format, size_t size, int *id) {
status_t res;
ALOGV("%s: E", __FUNCTION__);
sp<StreamAdapter> stream = new StreamAdapter(mDevice);
- res = stream->connectToDevice(consumer, width, height, format);
+ res = stream->connectToDevice(consumer, width, height, format, size);
if (res != OK) {
ALOGE("%s: Camera %d: Unable to create stream (%d x %d, format %x):"
"%s (%d)",
@@ -140,6 +147,31 @@ status_t Camera2Device::createStream(sp<ANativeWindow> consumer,
return OK;
}
+status_t Camera2Device::getStreamInfo(int id,
+ uint32_t *width, uint32_t *height, uint32_t *format) {
+ ALOGV("%s: E", __FUNCTION__);
+ bool found = false;
+ StreamList::iterator streamI;
+ for (streamI = mStreams.begin();
+ streamI != mStreams.end(); streamI++) {
+ if ((*streamI)->getId() == id) {
+ found = true;
+ break;
+ }
+ }
+ if (!found) {
+ ALOGE("%s: Camera %d: Stream %d does not exist",
+ __FUNCTION__, mId, id);
+ return BAD_VALUE;
+ }
+
+ if (width) *width = (*streamI)->getWidth();
+ if (height) *height = (*streamI)->getHeight();
+ if (format) *format = (*streamI)->getFormat();
+
+ return OK;
+}
+
status_t Camera2Device::deleteStream(int id) {
ALOGV("%s: E", __FUNCTION__);
@@ -163,7 +195,29 @@ status_t Camera2Device::deleteStream(int id) {
status_t Camera2Device::createDefaultRequest(int templateId,
camera_metadata_t **request) {
ALOGV("%s: E", __FUNCTION__);
- return mDevice->ops->construct_default_request(mDevice, templateId, request);
+ return mDevice->ops->construct_default_request(
+ mDevice, templateId, request);
+}
+
+status_t Camera2Device::waitUntilDrained() {
+ static const uint32_t kSleepTime = 50000; // 50 ms
+ static const uint32_t kMaxSleepTime = 10000000; // 10 s
+
+ if (mRequestQueue.getBufferCount() ==
+ CAMERA2_REQUEST_QUEUE_IS_BOTTOMLESS) return INVALID_OPERATION;
+
+ // TODO: Set up notifications from HAL, instead of sleeping here
+ uint32_t totalTime = 0;
+ while (mDevice->ops->get_in_progress_count(mDevice) > 0) {
+ usleep(kSleepTime);
+ totalTime += kSleepTime;
+ if (totalTime > kMaxSleepTime) {
+ ALOGE("%s: Waited %d us, requests still in flight", __FUNCTION__,
+ totalTime);
+ return TIMED_OUT;
+ }
+ }
+ return OK;
}
/**
@@ -463,8 +517,9 @@ Camera2Device::StreamAdapter::~StreamAdapter() {
disconnect();
}
-status_t Camera2Device::StreamAdapter::connectToDevice(sp<ANativeWindow> consumer,
- uint32_t width, uint32_t height, int format) {
+status_t Camera2Device::StreamAdapter::connectToDevice(
+ sp<ANativeWindow> consumer,
+ uint32_t width, uint32_t height, int format, size_t size) {
status_t res;
if (mState != DISCONNECTED) return INVALID_OPERATION;
@@ -476,6 +531,7 @@ status_t Camera2Device::StreamAdapter::connectToDevice(sp<ANativeWindow> consume
mConsumerInterface = consumer;
mWidth = width;
mHeight = height;
+ mSize = (format == HAL_PIXEL_FORMAT_BLOB) ? size : 0;
mFormatRequested = format;
// Allocate device-side stream interface
@@ -534,13 +590,24 @@ status_t Camera2Device::StreamAdapter::connectToDevice(sp<ANativeWindow> consume
return res;
}
- res = native_window_set_buffers_geometry(mConsumerInterface.get(),
- mWidth, mHeight, mFormat);
- if (res != OK) {
- ALOGE("%s: Unable to configure stream buffer geometry"
- " %d x %d, format 0x%x for stream %d",
- __FUNCTION__, mWidth, mHeight, mFormat, mId);
- return res;
+ if (mFormat == HAL_PIXEL_FORMAT_BLOB) {
+ res = native_window_set_buffers_geometry(mConsumerInterface.get(),
+ mSize, 1, mFormat);
+ if (res != OK) {
+ ALOGE("%s: Unable to configure compressed stream buffer geometry"
+ " %d x %d, size %d for stream %d",
+ __FUNCTION__, mWidth, mHeight, mSize, mId);
+ return res;
+ }
+ } else {
+ res = native_window_set_buffers_geometry(mConsumerInterface.get(),
+ mWidth, mHeight, mFormat);
+ if (res != OK) {
+ ALOGE("%s: Unable to configure stream buffer geometry"
+ " %d x %d, format 0x%x for stream %d",
+ __FUNCTION__, mWidth, mHeight, mFormat, mId);
+ return res;
+ }
}
int maxConsumerBuffers;
@@ -641,10 +708,6 @@ status_t Camera2Device::StreamAdapter::disconnect() {
return OK;
}
-int Camera2Device::StreamAdapter::getId() {
- return mId;
-}
-
const camera2_stream_ops *Camera2Device::StreamAdapter::getStreamOps() {
return static_cast<camera2_stream_ops *>(this);
}