diff options
author | Hirokazu Honda <hiroh@chromium.org> | 2021-06-15 17:00:28 +0900 |
---|---|---|
committer | Laurent Pinchart <laurent.pinchart@ideasonboard.com> | 2021-06-28 07:51:36 +0300 |
commit | b8732a80fea43fede84480c95903002d7feff975 (patch) | |
tree | d6dee88e6f58e060174fe901daccbfc3014f0e6d /src | |
parent | 4510638e5daf470a173596ce3f33a9e3b236f842 (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>
Diffstat (limited to 'src')
-rw-r--r-- | src/android/camera_device.cpp | 108 | ||||
-rw-r--r-- | src/android/camera_device.h | 1 |
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); |