summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHirokazu Honda <hiroh@chromium.org>2021-06-15 17:00:28 +0900
committerLaurent Pinchart <laurent.pinchart@ideasonboard.com>2021-06-28 07:51:36 +0300
commitb8732a80fea43fede84480c95903002d7feff975 (patch)
treed6dee88e6f58e060174fe901daccbfc3014f0e6d
parent4510638e5daf470a173596ce3f33a9e3b236f842 (diff)
android: camera_device: Check if a request is configured on processCaptureRequest()
Add a check on processCaptureRequest() if a given capture request contains a camera stream that has been configured. Signed-off-by: Hirokazu Honda <hiroh@chromium.org> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
-rw-r--r--src/android/camera_device.cpp108
-rw-r--r--src/android/camera_device.h1
2 files changed, 67 insertions, 42 deletions
diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp
index 407db507..13ee5fab 100644
--- a/src/android/camera_device.cpp
+++ b/src/android/camera_device.cpp
@@ -10,6 +10,7 @@
#include "camera_ops.h"
#include "post_processor.h"
+#include <algorithm>
#include <fstream>
#include <sys/mman.h>
#include <unistd.h>
@@ -157,48 +158,6 @@ void sortCamera3StreamConfigs(std::vector<Camera3StreamConfig> &unsortedConfigs,
unsortedConfigs = sortedConfigs;
}
-bool isValidRequest(camera3_capture_request_t *camera3Request)
-{
- if (!camera3Request) {
- LOG(HAL, Error) << "No capture request provided";
- return false;
- }
-
- if (!camera3Request->num_output_buffers ||
- !camera3Request->output_buffers) {
- LOG(HAL, Error) << "No output buffers provided";
- return false;
- }
-
- for (uint32_t i = 0; i < camera3Request->num_output_buffers; i++) {
- const camera3_stream_buffer_t &outputBuffer =
- camera3Request->output_buffers[i];
- if (!outputBuffer.buffer || !(*outputBuffer.buffer)) {
- LOG(HAL, Error) << "Invalid native handle";
- return false;
- }
-
- const native_handle_t *handle = *outputBuffer.buffer;
- constexpr int kNativeHandleMaxFds = 1024;
- if (handle->numFds < 0 || handle->numFds > kNativeHandleMaxFds) {
- LOG(HAL, Error)
- << "Invalid number of fds (" << handle->numFds
- << ") in buffer " << i;
- return false;
- }
-
- constexpr int kNativeHandleMaxInts = 1024;
- if (handle->numInts < 0 || handle->numInts > kNativeHandleMaxInts) {
- LOG(HAL, Error)
- << "Invalid number of ints (" << handle->numInts
- << ") in buffer " << i;
- return false;
- }
- }
-
- return true;
-}
-
const char *rotationToString(int rotation)
{
switch (rotation) {
@@ -843,6 +802,71 @@ void CameraDevice::abortRequest(camera3_capture_request_t *request)
callbacks_->process_capture_result(callbacks_, &result);
}
+bool CameraDevice::isValidRequest(camera3_capture_request_t *camera3Request) const
+{
+ if (!camera3Request) {
+ LOG(HAL, Error) << "No capture request provided";
+ return false;
+ }
+
+ if (!camera3Request->num_output_buffers ||
+ !camera3Request->output_buffers) {
+ LOG(HAL, Error) << "No output buffers provided";
+ return false;
+ }
+
+ /* configureStreams() has not been called or has failed. */
+ if (streams_.empty() || !config_) {
+ LOG(HAL, Error) << "No stream is configured";
+ return false;
+ }
+
+ for (uint32_t i = 0; i < camera3Request->num_output_buffers; i++) {
+ const camera3_stream_buffer_t &outputBuffer =
+ camera3Request->output_buffers[i];
+ if (!outputBuffer.buffer || !(*outputBuffer.buffer)) {
+ LOG(HAL, Error) << "Invalid native handle";
+ return false;
+ }
+
+ const native_handle_t *handle = *outputBuffer.buffer;
+ constexpr int kNativeHandleMaxFds = 1024;
+ if (handle->numFds < 0 || handle->numFds > kNativeHandleMaxFds) {
+ LOG(HAL, Error)
+ << "Invalid number of fds (" << handle->numFds
+ << ") in buffer " << i;
+ return false;
+ }
+
+ constexpr int kNativeHandleMaxInts = 1024;
+ if (handle->numInts < 0 || handle->numInts > kNativeHandleMaxInts) {
+ LOG(HAL, Error)
+ << "Invalid number of ints (" << handle->numInts
+ << ") in buffer " << i;
+ return false;
+ }
+
+ const camera3_stream *camera3Stream = outputBuffer.stream;
+ if (!camera3Stream)
+ return false;
+
+ const CameraStream *cameraStream =
+ static_cast<CameraStream *>(camera3Stream->priv);
+
+ auto found = std::find_if(streams_.begin(), streams_.end(),
+ [cameraStream](const CameraStream &stream) {
+ return &stream == cameraStream;
+ });
+ if (found == streams_.end()) {
+ LOG(HAL, Error)
+ << "No corresponding configured stream found";
+ return false;
+ }
+ }
+
+ return true;
+}
+
int CameraDevice::processCaptureRequest(camera3_capture_request_t *camera3Request)
{
if (!isValidRequest(camera3Request))
diff --git a/src/android/camera_device.h b/src/android/camera_device.h
index 4747f577..18cf5118 100644
--- a/src/android/camera_device.h
+++ b/src/android/camera_device.h
@@ -96,6 +96,7 @@ private:
libcamera::FrameBuffer *createFrameBuffer(const buffer_handle_t camera3buffer);
void abortRequest(camera3_capture_request_t *request);
+ bool isValidRequest(camera3_capture_request_t *request) const;
void notifyShutter(uint32_t frameNumber, uint64_t timestamp);
void notifyError(uint32_t frameNumber, camera3_stream_t *stream,
camera3_error_msg_code code);