pipeline: raspberrypi: Fix under-allocation of embedded data buffers

The code was reducing the number of raw stream buffers allocated when
the application is providing some of its own. However, it was not
taking account of the fact that the application cannot supply embedded
data buffers, so it must always allocate a reasonable minimum number
of these buffers (possibly more than the number of raw stream buffers)
to prevent frame drops.

Signed-off-by: David Plowman <david.plowman@raspberrypi.com>
Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
Reviewed-by: Naushir Patuck <naush@raspberrypi.com>
Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
This commit is contained in:
David Plowman 2021-12-01 10:15:07 +00:00 committed by Kieran Bingham
parent 8acc82ec0d
commit bab0f7df56

View file

@ -1248,18 +1248,25 @@ int PipelineHandlerRPi::prepareBuffers(Camera *camera)
/* Decide how many internal buffers to allocate. */ /* Decide how many internal buffers to allocate. */
for (auto const stream : data->streams_) { for (auto const stream : data->streams_) {
unsigned int numBuffers; unsigned int numBuffers;
/*
if (stream == &data->unicam_[Unicam::Image] || * For Unicam, allocate a minimum of 4 buffers as we want
stream == &data->unicam_[Unicam::Embedded]) { * to avoid any frame drops.
*/
constexpr unsigned int minBuffers = 4;
if (stream == &data->unicam_[Unicam::Image]) {
/* /*
* For Unicam, allocate a minimum of 4 buffers as we want * If an application has configured a RAW stream, allocate
* to avoid any frame drops. If an application has configured * additional buffers to make up the minimum, but ensure
* a RAW stream, allocate additional buffers to make up the * we have at least 2 sets of internal buffers to use to
* minimum, but ensure we have at least 2 sets of internal * minimise frame drops.
* buffers to use to minimise frame drops.
*/ */
constexpr unsigned int minBuffers = 4;
numBuffers = std::max<int>(2, minBuffers - numRawBuffers); numBuffers = std::max<int>(2, minBuffers - numRawBuffers);
} else if (stream == &data->unicam_[Unicam::Embedded]) {
/*
* Embedded data buffers are (currently) for internal use,
* so allocate the minimum required to avoid frame drops.
*/
numBuffers = minBuffers;
} else { } else {
/* /*
* Since the ISP runs synchronous with the IPA and requests, * Since the ISP runs synchronous with the IPA and requests,