mirror of
https://git.libcamera.org/libcamera/libcamera.git
synced 2025-07-16 17:05:08 +03:00
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:
parent
73c07bf289
commit
6ab7d87ff2
1 changed files with 23 additions and 10 deletions
|
@ -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)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue