@@ -1457,7 +1457,7 @@ int PipelineHandlerRPi::prepareBuffers(Camera *camera)
RPiCameraData *data = cameraData(camera);
unsigned int minUnicamBuffers = data->config_.minUnicamBuffers;
unsigned int minTotalUnicamBuffers = data->config_.minTotalUnicamBuffers;
- unsigned int numRawBuffers = 0;
+ unsigned int numRawBuffers = 0, minIspBuffers = 1;
int ret;
for (Stream *s : camera->streams()) {
@@ -1481,8 +1481,21 @@ int PipelineHandlerRPi::prepareBuffers(Camera *camera)
minTotalUnicamBuffers = 0;
}
}
-
- break;
+ } else if (s == &data->isp_[Isp::Output0]) {
+ /*
+ * Since the ISP runs synchronous with the IPA and requests,
+ * we only ever need a maximum of one internal buffer. Any
+ * buffers the application wants to hold onto will already
+ * be exported through PipelineHandlerRPi::exportFrameBuffers().
+ *
+ * However, as above, if the application provides a guarantee
+ * that the buffer will always be provided for the ISP Output0
+ * stream in a Request, we don't need any internal buffers
+ * allocated.
+ */
+ if (!data->dropFrameCount_ &&
+ s->configuration().hints & StreamConfiguration::Hint::MandatoryStream)
+ minIspBuffers = 0;
}
}
@@ -1518,12 +1531,14 @@ int PipelineHandlerRPi::prepareBuffers(Camera *camera)
* so allocate the minimum required to avoid frame drops.
*/
numBuffers = data->config_.minTotalUnicamBuffers;
+ } else if (stream == &data->isp_[Isp::Output0]) {
+ /* Buffer count for this is handled in the earlier loop above. */
+ numBuffers = minIspBuffers;
} else {
/*
- * Since the ISP runs synchronous with the IPA and requests,
- * we only ever need one set of internal buffers. Any buffers
- * the application wants to hold onto will already be exported
- * through PipelineHandlerRPi::exportFrameBuffers().
+ * Same reasoning as for ISP Output 0, we only ever need
+ * a maximum of one internal buffer for Output1 (required
+ * for colour denoise) and ISP statistics.
*/
numBuffers = 1;
}