pipeline: raspberrypi: Free buffers in the RPiCamera destructor and re-configure

Currently, all framebuffer allocations get freed and cleared on a stop in
PipelineHandlerRPi::stopDevice(). If PipelineHandlerRPi::start() is then called
without an intermediate PipelineHandlerRPi::configure(), it will re-allocate and
prepare all the buffers again, which is unnecessary.

Fix this by not freeing the buffer in PipelineHandlerRPi::stopDevice(), but
insted doing it in PipelineHandlerRPi::configure(), as the buffers might have
to be resized.

Add a flag to indicate that buffer allocations need to be done on the next
call to PipelineHandlerRPi::start().

Signed-off-by: Naushir Patuck <naush@raspberrypi.com>
Reviewed-by: David Plowman <david.plowman@raspberrypi.com>
Tested-by: David Plowman <david.plowman@raspberrypi.com>
Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
This commit is contained in:
Naushir Patuck 2022-03-25 09:08:58 +00:00 committed by Laurent Pinchart
parent 73c07bf289
commit 6ab7d87ff2

View file

@ -185,10 +185,15 @@ public:
RPiCameraData(PipelineHandler *pipe) RPiCameraData(PipelineHandler *pipe)
: Camera::Private(pipe), state_(State::Stopped), : Camera::Private(pipe), state_(State::Stopped),
supportsFlips_(false), flipsAlterBayerOrder_(false), supportsFlips_(false), flipsAlterBayerOrder_(false),
dropFrameCount_(0), ispOutputCount_(0) dropFrameCount_(0), buffersAllocated_(false), ispOutputCount_(0)
{ {
} }
~RPiCameraData()
{
freeBuffers();
}
void freeBuffers(); void freeBuffers();
void frameStarted(uint32_t sequence); void frameStarted(uint32_t sequence);
@ -280,6 +285,9 @@ public:
*/ */
std::optional<int32_t> notifyGainsUnity_; std::optional<int32_t> notifyGainsUnity_;
/* Have internal buffers been allocated? */
bool buffersAllocated_;
private: private:
void checkRequestCompleted(); void checkRequestCompleted();
void fillRequestMetadata(const ControlList &bufferControls, void fillRequestMetadata(const ControlList &bufferControls,
@ -682,7 +690,8 @@ int PipelineHandlerRPi::configure(Camera *camera, CameraConfiguration *config)
RPiCameraData *data = cameraData(camera); RPiCameraData *data = cameraData(camera);
int ret; int ret;
/* Start by resetting the Unicam and ISP stream states. */ /* Start by freeing all buffers and reset the Unicam and ISP stream states. */
data->freeBuffers();
for (auto const stream : data->streams_) for (auto const stream : data->streams_)
stream->reset(); stream->reset();
@ -982,13 +991,17 @@ int PipelineHandlerRPi::start(Camera *camera, const ControlList *controls)
RPiCameraData *data = cameraData(camera); RPiCameraData *data = cameraData(camera);
int ret; int ret;
if (!data->buffersAllocated_) {
/* Allocate buffers for internal pipeline usage. */ /* Allocate buffers for internal pipeline usage. */
ret = prepareBuffers(camera); ret = prepareBuffers(camera);
if (ret) { if (ret) {
LOG(RPI, Error) << "Failed to allocate buffers"; LOG(RPI, Error) << "Failed to allocate buffers";
data->freeBuffers();
stop(camera); stop(camera);
return ret; return ret;
} }
data->buffersAllocated_ = true;
}
/* Check if a ScalerCrop control was specified. */ /* Check if a ScalerCrop control was specified. */
if (controls) if (controls)
@ -1055,8 +1068,6 @@ void PipelineHandlerRPi::stopDevice(Camera *camera)
/* Stop the IPA. */ /* Stop the IPA. */
data->ipa_->stop(); data->ipa_->stop();
data->freeBuffers();
} }
int PipelineHandlerRPi::queueRequestDevice(Camera *camera, Request *request) int PipelineHandlerRPi::queueRequestDevice(Camera *camera, Request *request)
@ -1461,6 +1472,8 @@ void RPiCameraData::freeBuffers()
for (auto const stream : streams_) for (auto const stream : streams_)
stream->releaseBuffers(); stream->releaseBuffers();
buffersAllocated_ = false;
} }
void RPiCameraData::frameStarted(uint32_t sequence) void RPiCameraData::frameStarted(uint32_t sequence)