android: camera_request: Don't embed full camera3_stream_buffer_t

The camera3_stream_buffer_t structure is meant to communicate between
the camera service and the HAL. They are short-live structures that
don't outlive the .process_capture_request() operation (when queuing
requests) or the .process_capture_result() callback.

We currently store copies of the camera3_stream_buffer_t passed to
.process_capture_request() in Camera3RequestDescriptor::StreamBuffer to
store the structure members that the HAL need, and reuse them when
calling the .process_capture_result() callback. This is conceptually not
right, as the camera3_stream_buffer_t pass to the callback are not the
same objects as the ones received in .process_capture_request().

Store individual fields of the camera3_stream_buffer_t in StreamBuffer
instead of copying the whole structure. This gives the HAL full control
of how data is stored, and properly decouples request queueing from
result reporting.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Umang Jain <umang.jain@ideasonboard.com>
Reviewed-by: Umang Jain <umang.jain@ideasonboard.com>
Reviewed-by: Jacopo Mondi <jacopo@jmondi.org>
This commit is contained in:
Laurent Pinchart 2021-10-19 17:17:59 +05:30 committed by Umang Jain
parent b393edb181
commit e82d7e4767
4 changed files with 63 additions and 47 deletions

View file

@ -7,6 +7,8 @@
#include "camera_request.h"
#include <libcamera/base/span.h>
using namespace libcamera;
/*
@ -22,11 +24,20 @@ Camera3RequestDescriptor::Camera3RequestDescriptor(
frameNumber_ = camera3Request->frame_number;
/* Copy the camera3 request stream information for later access. */
const uint32_t numBuffers = camera3Request->num_output_buffers;
const Span<const camera3_stream_buffer_t> buffers{
camera3Request->output_buffers,
camera3Request->num_output_buffers
};
buffers_.resize(numBuffers);
for (uint32_t i = 0; i < numBuffers; i++)
buffers_[i].buffer = camera3Request->output_buffers[i];
buffers_.reserve(buffers.size());
for (const camera3_stream_buffer_t &buffer : buffers) {
CameraStream *stream =
static_cast<CameraStream *>(buffer.stream->priv);
buffers_.push_back({ stream, buffer.buffer, nullptr,
buffer.acquire_fence, Status::Pending });
}
/* Clone the controls associated with the camera3 request. */
settings_ = CameraMetadata(camera3Request->settings);