diff options
Diffstat (limited to 'modules')
-rw-r--r-- | modules/camera/Android.mk | 1 | ||||
-rw-r--r-- | modules/camera/Camera.cpp | 55 | ||||
-rw-r--r-- | modules/camera/Camera.h | 3 |
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; |