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>
53 lines
1.4 KiB
C++
53 lines
1.4 KiB
C++
/* SPDX-License-Identifier: LGPL-2.1-or-later */
|
|
/*
|
|
* Copyright (C) 2019-2021, Google Inc.
|
|
*
|
|
* camera_request.cpp - libcamera Android Camera Request Descriptor
|
|
*/
|
|
|
|
#include "camera_request.h"
|
|
|
|
#include <libcamera/base/span.h>
|
|
|
|
using namespace libcamera;
|
|
|
|
/*
|
|
* \class Camera3RequestDescriptor
|
|
*
|
|
* A utility class that groups information about a capture request to be later
|
|
* reused at request complete time to notify the framework.
|
|
*/
|
|
|
|
Camera3RequestDescriptor::Camera3RequestDescriptor(
|
|
Camera *camera, const camera3_capture_request_t *camera3Request)
|
|
{
|
|
frameNumber_ = camera3Request->frame_number;
|
|
|
|
/* Copy the camera3 request stream information for later access. */
|
|
const Span<const camera3_stream_buffer_t> buffers{
|
|
camera3Request->output_buffers,
|
|
camera3Request->num_output_buffers
|
|
};
|
|
|
|
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);
|
|
|
|
/*
|
|
* Create the CaptureRequest, stored as a unique_ptr<> to tie its
|
|
* lifetime to the descriptor.
|
|
*/
|
|
request_ = std::make_unique<CaptureRequest>(camera,
|
|
reinterpret_cast<uint64_t>(this));
|
|
}
|
|
|
|
Camera3RequestDescriptor::~Camera3RequestDescriptor() = default;
|