summaryrefslogtreecommitdiffstats
path: root/modules/camera
diff options
context:
space:
mode:
authorAlex Ray <aray@google.com>2013-04-26 19:32:29 -0700
committerAlexander Ray <aray@google.com>2013-05-29 03:39:00 +0000
commit083315c85baf28098637684d2307ee8d4df337c6 (patch)
treef3225b4e548263f9c6fee5e111b376a111a23bcd /modules/camera
parent11bbeefaf9ba410916ec03a5c6869fe4eb67d672 (diff)
downloadhardware_libhardware-083315c85baf28098637684d2307ee8d4df337c6.zip
hardware_libhardware-083315c85baf28098637684d2307ee8d4df337c6.tar.gz
hardware_libhardware-083315c85baf28098637684d2307ee8d4df337c6.tar.bz2
modules: camera: No-op result submission with request
Change-Id: If4e377ba0ac327cc02ac2b9765ce5d406b8960a8
Diffstat (limited to 'modules/camera')
-rw-r--r--modules/camera/Android.mk1
-rw-r--r--modules/camera/Camera.cpp55
-rw-r--r--modules/camera/Camera.h3
3 files changed, 58 insertions, 1 deletions
diff --git a/modules/camera/Android.mk b/modules/camera/Android.mk
index 823fe17..5d26934 100644
--- a/modules/camera/Android.mk
+++ b/modules/camera/Android.mk
@@ -32,6 +32,7 @@ LOCAL_SHARED_LIBRARIES := \
libcamera_metadata \
libcutils \
liblog \
+ libsync \
LOCAL_CFLAGS += -Wall -Wextra -fvisibility=hidden
diff --git a/modules/camera/Camera.cpp b/modules/camera/Camera.cpp
index 4a45a2e..718d42b 100644
--- a/modules/camera/Camera.cpp
+++ b/modules/camera/Camera.cpp
@@ -17,6 +17,7 @@
#include <cstdlib>
#include <pthread.h>
#include <hardware/camera3.h>
+#include <sync/sync.h>
#include <system/camera_metadata.h>
#include "CameraHAL.h"
#include "Stream.h"
@@ -31,6 +32,8 @@
#include "Camera.h"
+#define CAMERA_SYNC_TIMEOUT 5000 // in msecs
+
namespace default_camera_hal {
extern "C" {
@@ -288,6 +291,8 @@ const camera_metadata_t* Camera::constructDefaultRequestSettings(int type)
int Camera::processCaptureRequest(camera3_capture_request_t *request)
{
+ camera3_capture_result result;
+
ALOGV("%s:%d: request=%p", __func__, mId, request);
CAMTRACE_CALL();
@@ -329,8 +334,32 @@ int Camera::processCaptureRequest(camera3_capture_request_t *request)
}
}
- // TODO: verify request; submit request to hardware
+ if (request->num_output_buffers <= 0) {
+ ALOGE("%s:%d: Invalid number of output buffers: %d", __func__, mId,
+ request->num_output_buffers);
+ return -EINVAL;
+ }
+ result.num_output_buffers = request->num_output_buffers;
+ result.output_buffers = new camera3_stream_buffer_t[result.num_output_buffers];
+ for (unsigned int i = 0; i < request->num_output_buffers; i++) {
+ int res = processCaptureBuffer(&request->output_buffers[i],
+ const_cast<camera3_stream_buffer_t*>(&result.output_buffers[i]));
+ if (res)
+ goto err_out;
+ }
+
+ result.frame_number = request->frame_number;
+ // TODO: return actual captured/reprocessed settings
+ result.result = request->settings;
+ // TODO: asynchronously return results
+ mCallbackOps->process_capture_result(mCallbackOps, &result);
+
return 0;
+
+err_out:
+ delete [] result.output_buffers;
+ // TODO: this should probably be a total device failure; transient for now
+ return -EINVAL;
}
void Camera::setSettings(const camera_metadata_t *new_settings)
@@ -358,6 +387,30 @@ bool Camera::isValidReprocessSettings(const camera_metadata_t *settings)
return false;
}
+int Camera::processCaptureBuffer(const camera3_stream_buffer_t *in,
+ camera3_stream_buffer_t *out)
+{
+ int res = sync_wait(in->acquire_fence, CAMERA_SYNC_TIMEOUT);
+ if (res == -ETIME) {
+ ALOGE("%s:%d: Timeout waiting on buffer acquire fence", __func__, mId);
+ return res;
+ } else if (res) {
+ ALOGE("%s:%d: Error waiting on buffer acquire fence: %s(%d)",
+ __func__, mId, strerror(-res), res);
+ return res;
+ }
+
+ out->stream = in->stream;
+ out->buffer = in->buffer;
+ out->status = CAMERA3_BUFFER_STATUS_OK;
+ // TODO: use driver-backed release fences
+ out->acquire_fence = -1;
+ out->release_fence = -1;
+
+ // TODO: lock and software-paint buffer
+ return 0;
+}
+
void Camera::getMetadataVendorTagOps(vendor_tag_query_ops_t *ops)
{
ALOGV("%s:%d: ops=%p", __func__, mId, ops);
diff --git a/modules/camera/Camera.h b/modules/camera/Camera.h
index 39e47f7..4001453 100644
--- a/modules/camera/Camera.h
+++ b/modules/camera/Camera.h
@@ -65,6 +65,9 @@ class Camera {
bool isValidCaptureSettings(const camera_metadata_t *settings);
// Verify settings are valid for reprocessing an input buffer
bool isValidReprocessSettings(const camera_metadata_t *settings);
+ // Process an output buffer
+ int processCaptureBuffer(const camera3_stream_buffer_t *in,
+ camera3_stream_buffer_t *out);
// Identifier used by framework to distinguish cameras
const int mId;