Show a patch.

GET /api/1.1/patches/23283/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 23283,
    "url": "https://patchwork.libcamera.org/api/1.1/patches/23283/?format=api",
    "web_url": "https://patchwork.libcamera.org/patch/23283/",
    "project": {
        "id": 1,
        "url": "https://patchwork.libcamera.org/api/1.1/projects/1/?format=api",
        "name": "libcamera",
        "link_name": "libcamera",
        "list_id": "libcamera_core",
        "list_email": "libcamera-devel@lists.libcamera.org",
        "web_url": "",
        "scm_url": "",
        "webscm_url": ""
    },
    "msgid": "<20250428090413.38234-12-s.pueschel@pengutronix.de>",
    "date": "2025-04-28T09:02:36",
    "name": "[v11,11/19] libcamera: stream: Remove bufferCount",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": false,
    "hash": "265ffe2cc87d09d4ae5ec7a2c9995e1f2cd248db",
    "submitter": {
        "id": 225,
        "url": "https://patchwork.libcamera.org/api/1.1/people/225/?format=api",
        "name": "Sven Püschel",
        "email": "s.pueschel@pengutronix.de"
    },
    "delegate": null,
    "mbox": "https://patchwork.libcamera.org/patch/23283/mbox/",
    "series": [
        {
            "id": 5148,
            "url": "https://patchwork.libcamera.org/api/1.1/series/5148/?format=api",
            "web_url": "https://patchwork.libcamera.org/project/libcamera/list/?series=5148",
            "date": "2025-04-28T09:02:25",
            "name": "lc-compliance: Add test to queue more requests than hardware depth",
            "version": 11,
            "mbox": "https://patchwork.libcamera.org/series/5148/mbox/"
        }
    ],
    "comments": "https://patchwork.libcamera.org/api/patches/23283/comments/",
    "check": "pending",
    "checks": "https://patchwork.libcamera.org/api/patches/23283/checks/",
    "tags": {},
    "headers": {
        "Return-Path": "<libcamera-devel-bounces@lists.libcamera.org>",
        "X-Original-To": "parsemail@patchwork.libcamera.org",
        "Delivered-To": "parsemail@patchwork.libcamera.org",
        "Received": [
            "from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id 9E4FCC3324\n\tfor <parsemail@patchwork.libcamera.org>;\n\tMon, 28 Apr 2025 09:05:30 +0000 (UTC)",
            "from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id C040868B46;\n\tMon, 28 Apr 2025 11:05:29 +0200 (CEST)",
            "from metis.whiteo.stw.pengutronix.de\n\t(metis.whiteo.stw.pengutronix.de [IPv6:2a0a:edc0:2:b01:1d::104])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id E006068ADE\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon, 28 Apr 2025 11:05:07 +0200 (CEST)",
            "from ptz.office.stw.pengutronix.de ([2a0a:edc0:0:900:1d::77]\n\thelo=peter.guest.stw.pengutronix.de)\n\tby metis.whiteo.stw.pengutronix.de with esmtp (Exim 4.92)\n\t(envelope-from <s.pueschel@pengutronix.de>)\n\tid 1u9KQF-0001au-JB; Mon, 28 Apr 2025 11:05:07 +0200"
        ],
        "From": "=?utf-8?q?Sven_P=C3=BCschel?= <s.pueschel@pengutronix.de>",
        "To": "libcamera-devel@lists.libcamera.org",
        "Cc": "=?utf-8?b?TsOtY29sYXMgRi4gUi4gQS4gUHJhZG8=?= <nfraprado@collabora.com>,\n\tPaul Elder <paul.elder@ideasonboard.com>, =?utf-8?q?Sven_P=C3=BCschel?=\n\t<s.pueschel@pengutronix.de>",
        "Subject": "[PATCH v11 11/19] libcamera: stream: Remove bufferCount",
        "Date": "Mon, 28 Apr 2025 11:02:36 +0200",
        "Message-ID": "<20250428090413.38234-12-s.pueschel@pengutronix.de>",
        "X-Mailer": "git-send-email 2.49.0",
        "In-Reply-To": "<20250428090413.38234-1-s.pueschel@pengutronix.de>",
        "References": "<20250428090413.38234-1-s.pueschel@pengutronix.de>",
        "MIME-Version": "1.0",
        "Content-Type": "text/plain; charset=UTF-8",
        "Content-Transfer-Encoding": "8bit",
        "X-SA-Exim-Connect-IP": "2a0a:edc0:0:900:1d::77",
        "X-SA-Exim-Mail-From": "s.pueschel@pengutronix.de",
        "X-SA-Exim-Scanned": "No (on metis.whiteo.stw.pengutronix.de);\n\tSAEximRunCond expanded to false",
        "X-PTX-Original-Recipient": "libcamera-devel@lists.libcamera.org",
        "X-BeenThere": "libcamera-devel@lists.libcamera.org",
        "X-Mailman-Version": "2.1.29",
        "Precedence": "list",
        "List-Id": "<libcamera-devel.lists.libcamera.org>",
        "List-Unsubscribe": "<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>",
        "List-Archive": "<https://lists.libcamera.org/pipermail/libcamera-devel/>",
        "List-Post": "<mailto:libcamera-devel@lists.libcamera.org>",
        "List-Help": "<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>",
        "List-Subscribe": "<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>",
        "Errors-To": "libcamera-devel-bounces@lists.libcamera.org",
        "Sender": "\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"
    },
    "content": "From: Nícolas F. R. A. Prado <nfraprado@collabora.com>\n\nNow that the number of buffers allocated by the FrameBufferAllocator\nhelper is passed through FrameBufferAllocator::allocate() and the\npipelines no longer use bufferCount for internal buffer or V4L2 buffer\nslots allocation, we no longer need to have bufferCount in the\nStreamConfiguration, so remove it.\n\nSigned-off-by: Nícolas F. R. A. Prado <nfraprado@collabora.com>\nReviewed-by: Paul Elder <paul.elder@ideasonboard.com>\nSigned-off-by: Paul Elder <paul.elder@ideasonboard.com>\nSigned-off-by: Sven Püschel <s.pueschel@pengutronix.de>\n\n---\nChanges in v11:\n- add mali-c55 and virtual\n\nChanges in v10:\n- fix compilation error (android and pycamera)\n- add isi\n\nChanges in v9:\n- rebased\n\nChanges in v8:\n- Updated the pipeline-handler guide to use MinimumRequests instead of\n  bufferCount\n- Removed kNumInternalBuffers as it was unused\n\nChanges in v6:\n- Removed IPU3_BUFFER_COUNT as it was unused\n---\n Documentation/guides/pipeline-handler.rst         | 15 +++++++++------\n .../internal/converter/converter_v4l2_m2m.h       |  3 ---\n include/libcamera/stream.h                        |  2 --\n src/android/camera_stream.cpp                     |  5 ++++-\n src/apps/lc-compliance/helpers/capture.cpp        | 14 --------------\n src/libcamera/converter/converter_v4l2_m2m.cpp    |  3 ---\n src/libcamera/pipeline/imx8-isi/imx8-isi.cpp      |  2 --\n src/libcamera/pipeline/ipu3/ipu3.cpp              |  8 --------\n src/libcamera/pipeline/mali-c55/mali-c55.cpp      |  1 -\n src/libcamera/pipeline/rkisp1/rkisp1_path.cpp     |  2 --\n src/libcamera/pipeline/rkisp1/rkisp1_path.h       |  2 --\n src/libcamera/pipeline/simple/simple.cpp          |  6 +-----\n src/libcamera/pipeline/uvcvideo/uvcvideo.cpp      |  3 ---\n src/libcamera/pipeline/vimc/vimc.cpp              |  3 ---\n src/libcamera/pipeline/virtual/virtual.cpp        |  5 -----\n src/libcamera/stream.cpp                          | 12 +++---------\n src/py/libcamera/py_main.cpp                      |  1 -\n test/camera/buffer_import.cpp                     |  9 +++++++--\n test/libtest/buffer_source.cpp                    |  4 ++--\n test/libtest/buffer_source.h                      |  2 +-\n test/v4l2_videodevice/buffer_cache.cpp            |  3 +--\n 21 files changed, 28 insertions(+), 77 deletions(-)",
    "diff": "diff --git a/Documentation/guides/pipeline-handler.rst b/Documentation/guides/pipeline-handler.rst\nindex 2e9825dc..725e35e6 100644\n--- a/Documentation/guides/pipeline-handler.rst\n+++ b/Documentation/guides/pipeline-handler.rst\n@@ -882,14 +882,12 @@ As well as a list of supported StreamFormats, the StreamConfiguration is also\n expected to provide an initialised default configuration. This may be arbitrary,\n but depending on use case you may wish to select an output that matches the\n Sensor output, or prefer a pixelformat which might provide higher performance on\n-the hardware. The bufferCount represents the number of buffers required to\n-support functional continuous processing on this stream.\n+the hardware.\n \n .. code-block:: cpp\n \n    cfg.pixelFormat = formats::BGR888;\n    cfg.size = { 1280, 720 };\n-   cfg.bufferCount = 4;\n \n Finally add each ``StreamConfiguration`` generated to the\n ``CameraConfiguration``, and ensure that it has been validated before returning\n@@ -955,8 +953,6 @@ Add the following function implementation to your file:\n                   status = Adjusted;\n            }\n \n-           cfg.bufferCount = 4;\n-\n            return status;\n    }\n \n@@ -1200,13 +1196,20 @@ is performed by using the ``V4L2VideoDevice`` API, which provides an\n \n .. _FrameBuffer: https://libcamera.org/api-html/classlibcamera_1_1FrameBuffer.html\n \n+The number passed to ``importBuffers()`` should be at least equal to the value\n+of the ``MinimumRequests`` property in order to be possible to queue enough\n+buffers to the video device that frames won't be dropped during capture. A\n+bigger value can be advantageous to reduce the thrashing of dma-buf file\n+descriptor mappings in case the application queues more requests and therefore\n+improve performance, but for simplicity we'll just use ``MinimumRequests``.\n+\n Implement the pipeline handler ``start()`` function by replacing the stub\n version with the following code:\n \n .. code-block:: c++\n \n    VividCameraData *data = cameraData(camera);\n-   unsigned int count = data->stream_.configuration().bufferCount;\n+   unsigned int count = camera->properties().get(properties::MinimumRequests);\n \n    int ret = data->video_->importBuffers(count);\n    if (ret < 0)\ndiff --git a/include/libcamera/internal/converter/converter_v4l2_m2m.h b/include/libcamera/internal/converter/converter_v4l2_m2m.h\nindex 24997c6f..b32c338c 100644\n--- a/include/libcamera/internal/converter/converter_v4l2_m2m.h\n+++ b/include/libcamera/internal/converter/converter_v4l2_m2m.h\n@@ -106,9 +106,6 @@ private:\n \t\tconst Stream *stream_;\n \t\tstd::unique_ptr<V4L2M2MDevice> m2m_;\n \n-\t\tunsigned int inputBufferCount_;\n-\t\tunsigned int outputBufferCount_;\n-\n \t\tstd::pair<Rectangle, Rectangle> inputCropBounds_;\n \t};\n \ndiff --git a/include/libcamera/stream.h b/include/libcamera/stream.h\nindex b5e8f0a9..a75a82a0 100644\n--- a/include/libcamera/stream.h\n+++ b/include/libcamera/stream.h\n@@ -46,8 +46,6 @@ struct StreamConfiguration {\n \tunsigned int stride;\n \tunsigned int frameSize;\n \n-\tunsigned int bufferCount;\n-\n \tstd::optional<ColorSpace> colorSpace;\n \n \tStream *stream() const { return stream_; }\ndiff --git a/src/android/camera_stream.cpp b/src/android/camera_stream.cpp\nindex 1d68540d..9b11c3fa 100644\n--- a/src/android/camera_stream.cpp\n+++ b/src/android/camera_stream.cpp\n@@ -14,6 +14,7 @@\n #include <unistd.h>\n \n #include <libcamera/formats.h>\n+#include <libcamera/property_ids.h>\n \n #include \"jpeg/post_processor_jpeg.h\"\n #include \"yuv/post_processor_yuv.h\"\n@@ -131,7 +132,9 @@ int CameraStream::configure()\n \tallocator_ = std::make_unique<PlatformFrameBufferAllocator>(cameraDevice_);\n \tmutex_ = std::make_unique<Mutex>();\n \n-\tcamera3Stream_->max_buffers = configuration().bufferCount;\n+\tunsigned int bufferCount =\n+\t\tcameraDevice_->camera()->properties().get(properties::MinimumRequests).value();\n+\tcamera3Stream_->max_buffers = bufferCount;\n \n \treturn 0;\n }\ndiff --git a/src/apps/lc-compliance/helpers/capture.cpp b/src/apps/lc-compliance/helpers/capture.cpp\nindex 690de005..5e8b5df6 100644\n--- a/src/apps/lc-compliance/helpers/capture.cpp\n+++ b/src/apps/lc-compliance/helpers/capture.cpp\n@@ -33,20 +33,6 @@ void Capture::configure(libcamera::Span<const libcamera::StreamRole> roles)\n \n \tASSERT_EQ(config_->size(), roles.size()) << \"Unexpected number of streams in configuration\";\n \n-\t/*\n-\t * Set the buffers count to the largest value across all streams.\n-\t * \\todo: Should all streams from a Camera have the same buffer count ?\n-\t */\n-\tauto largest =\n-\t\tstd::max_element(config_->begin(), config_->end(),\n-\t\t\t\t [](const StreamConfiguration &l, const StreamConfiguration &r)\n-\t\t\t\t { return l.bufferCount < r.bufferCount; });\n-\n-\tassert(largest != config_->end());\n-\n-\tfor (auto &cfg : *config_)\n-\t\tcfg.bufferCount = largest->bufferCount;\n-\n \tif (config_->validate() != CameraConfiguration::Valid) {\n \t\tconfig_.reset();\n \t\tFAIL() << \"Configuration not valid\";\ndiff --git a/src/libcamera/converter/converter_v4l2_m2m.cpp b/src/libcamera/converter/converter_v4l2_m2m.cpp\nindex 242e0d85..3efd1f76 100644\n--- a/src/libcamera/converter/converter_v4l2_m2m.cpp\n+++ b/src/libcamera/converter/converter_v4l2_m2m.cpp\n@@ -141,9 +141,6 @@ int V4L2M2MConverter::V4L2M2MStream::configure(const StreamConfiguration &inputC\n \t\treturn -EINVAL;\n \t}\n \n-\tinputBufferCount_ = inputCfg.bufferCount;\n-\toutputBufferCount_ = outputCfg.bufferCount;\n-\n \tif (converter_->features() & Feature::InputCrop) {\n \t\tret = getCropBounds(m2m_->output(), inputCropBounds_.first,\n \t\t\t\t    inputCropBounds_.second);\ndiff --git a/src/libcamera/pipeline/imx8-isi/imx8-isi.cpp b/src/libcamera/pipeline/imx8-isi/imx8-isi.cpp\nindex efb280d7..3d2e6a3d 100644\n--- a/src/libcamera/pipeline/imx8-isi/imx8-isi.cpp\n+++ b/src/libcamera/pipeline/imx8-isi/imx8-isi.cpp\n@@ -666,7 +666,6 @@ StreamConfiguration PipelineHandlerISI::generateYUVConfiguration(Camera *camera,\n \tStreamConfiguration cfg(formats);\n \tcfg.pixelFormat = pixelFormat;\n \tcfg.size = sensorSize;\n-\tcfg.bufferCount = 4;\n \n \treturn cfg;\n }\n@@ -734,7 +733,6 @@ StreamConfiguration PipelineHandlerISI::generateRawConfiguration(Camera *camera)\n \tStreamConfiguration cfg(formats);\n \tcfg.size = sensor->resolution();\n \tcfg.pixelFormat = pixelFormat;\n-\tcfg.bufferCount = 4;\n \n \treturn cfg;\n }\ndiff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp\nindex 665466c7..c8b25913 100644\n--- a/src/libcamera/pipeline/ipu3/ipu3.cpp\n+++ b/src/libcamera/pipeline/ipu3/ipu3.cpp\n@@ -97,7 +97,6 @@ private:\n class IPU3CameraConfiguration : public CameraConfiguration\n {\n public:\n-\tstatic constexpr unsigned int kBufferCount = 4;\n \tstatic constexpr unsigned int kMaxStreams = 3;\n \n \tIPU3CameraConfiguration(IPU3CameraData *data);\n@@ -293,7 +292,6 @@ CameraConfiguration::Status IPU3CameraConfiguration::validate()\n \t\t\t/* Initialize the RAW stream with the CIO2 configuration. */\n \t\t\tcfg->size = cio2Configuration_.size;\n \t\t\tcfg->pixelFormat = cio2Configuration_.pixelFormat;\n-\t\t\tcfg->bufferCount = cio2Configuration_.bufferCount;\n \t\t\tcfg->stride = info.stride(cfg->size.width, 0, 64);\n \t\t\tcfg->frameSize = info.frameSize(cfg->size, 64);\n \t\t\tcfg->setStream(const_cast<Stream *>(&data_->rawStream_));\n@@ -337,7 +335,6 @@ CameraConfiguration::Status IPU3CameraConfiguration::validate()\n \t\t\t\t\t      ImgUDevice::kOutputAlignHeight);\n \n \t\t\tcfg->pixelFormat = formats::NV12;\n-\t\t\tcfg->bufferCount = kBufferCount;\n \t\t\tcfg->stride = info.stride(cfg->size.width, 0, 1);\n \t\t\tcfg->frameSize = info.frameSize(cfg->size, 1);\n \n@@ -406,7 +403,6 @@ PipelineHandlerIPU3::generateConfiguration(Camera *camera, Span<const StreamRole\n \tSize sensorResolution = data->cio2_.sensor()->resolution();\n \tfor (const StreamRole role : roles) {\n \t\tstd::map<PixelFormat, std::vector<SizeRange>> streamFormats;\n-\t\tunsigned int bufferCount;\n \t\tPixelFormat pixelFormat;\n \t\tSize size;\n \n@@ -426,7 +422,6 @@ PipelineHandlerIPU3::generateConfiguration(Camera *camera, Span<const StreamRole\n \t\t\t\t\t       .alignedDownTo(ImgUDevice::kOutputMarginWidth,\n \t\t\t\t\t\t\t      ImgUDevice::kOutputMarginHeight);\n \t\t\tpixelFormat = formats::NV12;\n-\t\t\tbufferCount = IPU3CameraConfiguration::kBufferCount;\n \t\t\tstreamFormats[pixelFormat] = { { ImgUDevice::kOutputMinSize, size } };\n \n \t\t\tbreak;\n@@ -436,7 +431,6 @@ PipelineHandlerIPU3::generateConfiguration(Camera *camera, Span<const StreamRole\n \t\t\t\tdata->cio2_.generateConfiguration(sensorResolution);\n \t\t\tpixelFormat = cio2Config.pixelFormat;\n \t\t\tsize = cio2Config.size;\n-\t\t\tbufferCount = cio2Config.bufferCount;\n \n \t\t\tfor (const PixelFormat &format : data->cio2_.formats())\n \t\t\t\tstreamFormats[format] = data->cio2_.sizes(format);\n@@ -455,7 +449,6 @@ PipelineHandlerIPU3::generateConfiguration(Camera *camera, Span<const StreamRole\n \t\t\t\t\t       .alignedDownTo(ImgUDevice::kOutputAlignWidth,\n \t\t\t\t\t\t\t      ImgUDevice::kOutputAlignHeight);\n \t\t\tpixelFormat = formats::NV12;\n-\t\t\tbufferCount = IPU3CameraConfiguration::kBufferCount;\n \t\t\tstreamFormats[pixelFormat] = { { ImgUDevice::kOutputMinSize, size } };\n \n \t\t\tbreak;\n@@ -471,7 +464,6 @@ PipelineHandlerIPU3::generateConfiguration(Camera *camera, Span<const StreamRole\n \t\tStreamConfiguration cfg(formats);\n \t\tcfg.size = size;\n \t\tcfg.pixelFormat = pixelFormat;\n-\t\tcfg.bufferCount = bufferCount;\n \t\tconfig->addConfiguration(cfg);\n \t}\n \ndiff --git a/src/libcamera/pipeline/mali-c55/mali-c55.cpp b/src/libcamera/pipeline/mali-c55/mali-c55.cpp\nindex 726d9780..0ce19b16 100644\n--- a/src/libcamera/pipeline/mali-c55/mali-c55.cpp\n+++ b/src/libcamera/pipeline/mali-c55/mali-c55.cpp\n@@ -818,7 +818,6 @@ PipelineHandlerMaliC55::generateConfiguration(Camera *camera,\n \t\tStreamFormats streamFormats(formats);\n \t\tStreamConfiguration cfg(streamFormats);\n \t\tcfg.pixelFormat = pixelFormat;\n-\t\tcfg.bufferCount = 4;\n \t\tcfg.size = size;\n \n \t\tconfig->addConfiguration(cfg);\ndiff --git a/src/libcamera/pipeline/rkisp1/rkisp1_path.cpp b/src/libcamera/pipeline/rkisp1/rkisp1_path.cpp\nindex 6a5b22ba..e07be15e 100644\n--- a/src/libcamera/pipeline/rkisp1/rkisp1_path.cpp\n+++ b/src/libcamera/pipeline/rkisp1/rkisp1_path.cpp\n@@ -249,7 +249,6 @@ RkISP1Path::generateConfiguration(const CameraSensor *sensor, const Size &size,\n \tStreamConfiguration cfg(formats);\n \tcfg.pixelFormat = format;\n \tcfg.size = streamSize;\n-\tcfg.bufferCount = RKISP1_BUFFER_COUNT;\n \n \treturn cfg;\n }\n@@ -383,7 +382,6 @@ RkISP1Path::validate(const CameraSensor *sensor,\n \n \tcfg->size.boundTo(maxResolution);\n \tcfg->size.expandTo(minResolution);\n-\tcfg->bufferCount = RKISP1_BUFFER_COUNT;\n \n \tV4L2DeviceFormat format;\n \tformat.fourcc = video_->toV4L2PixelFormat(cfg->pixelFormat);\ndiff --git a/src/libcamera/pipeline/rkisp1/rkisp1_path.h b/src/libcamera/pipeline/rkisp1/rkisp1_path.h\nindex 7365275d..d7c50f3a 100644\n--- a/src/libcamera/pipeline/rkisp1/rkisp1_path.h\n+++ b/src/libcamera/pipeline/rkisp1/rkisp1_path.h\n@@ -69,8 +69,6 @@ private:\n \tvoid populateFormats();\n \tSize filterSensorResolution(const CameraSensor *sensor);\n \n-\tstatic constexpr unsigned int RKISP1_BUFFER_COUNT = 4;\n-\n \tconst char *name_;\n \tbool running_;\n \ndiff --git a/src/libcamera/pipeline/simple/simple.cpp b/src/libcamera/pipeline/simple/simple.cpp\nindex 4f4cba06..c49ea6f6 100644\n--- a/src/libcamera/pipeline/simple/simple.cpp\n+++ b/src/libcamera/pipeline/simple/simple.cpp\n@@ -421,7 +421,6 @@ protected:\n \tint queueRequestDevice(Camera *camera, Request *request) override;\n \n private:\n-\tstatic constexpr unsigned int kNumInternalBuffers = 3;\n \tstatic constexpr unsigned int kSimpleBufferSlotCount = 16;\n \n \tstruct EntityData {\n@@ -1239,7 +1238,7 @@ CameraConfiguration::Status SimpleCameraConfiguration::validate()\n \t\t    cfg.size != pipeConfig_->captureSize)\n \t\t\tneedConversion_ = true;\n \n-\t\t/* Set the stride, frameSize and bufferCount. */\n+\t\t/* Set the stride and frameSize. */\n \t\tif (needConversion_) {\n \t\t\tstd::tie(cfg.stride, cfg.frameSize) =\n \t\t\t\tdata_->converter_\n@@ -1261,8 +1260,6 @@ CameraConfiguration::Status SimpleCameraConfiguration::validate()\n \t\t\tcfg.stride = format.planes[0].bpl;\n \t\t\tcfg.frameSize = format.planes[0].size;\n \t\t}\n-\n-\t\tcfg.bufferCount = 4;\n \t}\n \n \treturn status;\n@@ -1407,7 +1404,6 @@ int SimplePipelineHandler::configure(Camera *camera, CameraConfiguration *c)\n \tinputCfg.pixelFormat = pipeConfig->captureFormat;\n \tinputCfg.size = pipeConfig->captureSize;\n \tinputCfg.stride = captureFormat.planes[0].bpl;\n-\tinputCfg.bufferCount = kNumInternalBuffers;\n \n \tif (data->converter_) {\n \t\t/*\ndiff --git a/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp b/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp\nindex e1259cf3..c3b718f9 100644\n--- a/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp\n+++ b/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp\n@@ -186,8 +186,6 @@ CameraConfiguration::Status UVCCameraConfiguration::validate()\n \t\tstatus = Adjusted;\n \t}\n \n-\tcfg.bufferCount = 4;\n-\n \tV4L2DeviceFormat format;\n \tformat.fourcc = data_->video_->toV4L2PixelFormat(cfg.pixelFormat);\n \tformat.size = cfg.size;\n@@ -248,7 +246,6 @@ PipelineHandlerUVC::generateConfiguration(Camera *camera,\n \n \tcfg.pixelFormat = formats.pixelformats().front();\n \tcfg.size = formats.sizes(cfg.pixelFormat).back();\n-\tcfg.bufferCount = 4;\n \n \tconfig->addConfiguration(cfg);\n \ndiff --git a/src/libcamera/pipeline/vimc/vimc.cpp b/src/libcamera/pipeline/vimc/vimc.cpp\nindex e66dbd78..2632a1ab 100644\n--- a/src/libcamera/pipeline/vimc/vimc.cpp\n+++ b/src/libcamera/pipeline/vimc/vimc.cpp\n@@ -183,8 +183,6 @@ CameraConfiguration::Status VimcCameraConfiguration::validate()\n \t\tstatus = Adjusted;\n \t}\n \n-\tcfg.bufferCount = 4;\n-\n \tV4L2DeviceFormat format;\n \tformat.fourcc = data_->video_->toV4L2PixelFormat(cfg.pixelFormat);\n \tformat.size = cfg.size;\n@@ -244,7 +242,6 @@ PipelineHandlerVimc::generateConfiguration(Camera *camera,\n \n \tcfg.pixelFormat = formats::BGR888;\n \tcfg.size = { 1920, 1080 };\n-\tcfg.bufferCount = 4;\n \n \tconfig->addConfiguration(cfg);\n \ndiff --git a/src/libcamera/pipeline/virtual/virtual.cpp b/src/libcamera/pipeline/virtual/virtual.cpp\nindex ad2bdb57..60c06d4e 100644\n--- a/src/libcamera/pipeline/virtual/virtual.cpp\n+++ b/src/libcamera/pipeline/virtual/virtual.cpp\n@@ -67,8 +67,6 @@ overloaded(Ts...) -> overloaded<Ts...>;\n class VirtualCameraConfiguration : public CameraConfiguration\n {\n public:\n-\tstatic constexpr unsigned int kBufferCount = 4;\n-\n \tVirtualCameraConfiguration(VirtualCameraData *data);\n \n \tStatus validate() override;\n@@ -188,8 +186,6 @@ CameraConfiguration::Status VirtualCameraConfiguration::validate()\n \t\tconst PixelFormatInfo &info = PixelFormatInfo::info(cfg.pixelFormat);\n \t\tcfg.stride = info.stride(cfg.size.width, 0, 1);\n \t\tcfg.frameSize = info.frameSize(cfg.size, 1);\n-\n-\t\tcfg.bufferCount = VirtualCameraConfiguration::kBufferCount;\n \t}\n \n \treturn status;\n@@ -244,7 +240,6 @@ PipelineHandlerVirtual::generateConfiguration(Camera *camera,\n \t\tStreamConfiguration cfg(formats);\n \t\tcfg.pixelFormat = pixelFormat;\n \t\tcfg.size = data->config_.maxResolutionSize;\n-\t\tcfg.bufferCount = VirtualCameraConfiguration::kBufferCount;\n \n \t\tconfig->addConfiguration(cfg);\n \t}\ndiff --git a/src/libcamera/stream.cpp b/src/libcamera/stream.cpp\nindex 978d7275..684bc209 100644\n--- a/src/libcamera/stream.cpp\n+++ b/src/libcamera/stream.cpp\n@@ -280,8 +280,7 @@ SizeRange StreamFormats::range(const PixelFormat &pixelformat) const\n  * handlers provide StreamFormats.\n  */\n StreamConfiguration::StreamConfiguration()\n-\t: pixelFormat(0), stride(0), frameSize(0), bufferCount(0),\n-\t  stream_(nullptr)\n+\t: pixelFormat(0), stride(0), frameSize(0), stream_(nullptr)\n {\n }\n \n@@ -289,8 +288,8 @@ StreamConfiguration::StreamConfiguration()\n  * \\brief Construct a configuration with stream formats\n  */\n StreamConfiguration::StreamConfiguration(const StreamFormats &formats)\n-\t: pixelFormat(0), stride(0), frameSize(0), bufferCount(0),\n-\t  stream_(nullptr), formats_(formats)\n+\t: pixelFormat(0), stride(0), frameSize(0), stream_(nullptr),\n+\t  formats_(formats)\n {\n }\n \n@@ -325,11 +324,6 @@ StreamConfiguration::StreamConfiguration(const StreamFormats &formats)\n  * validating the configuration with a call to CameraConfiguration::validate().\n  */\n \n-/**\n- * \\var StreamConfiguration::bufferCount\n- * \\brief Requested number of buffers to allocate for the stream\n- */\n-\n /**\n  * \\var StreamConfiguration::colorSpace\n  * \\brief The ColorSpace for this stream\ndiff --git a/src/py/libcamera/py_main.cpp b/src/py/libcamera/py_main.cpp\nindex f75450ee..10e1d5cb 100644\n--- a/src/py/libcamera/py_main.cpp\n+++ b/src/py/libcamera/py_main.cpp\n@@ -337,7 +337,6 @@ PYBIND11_MODULE(_libcamera, m)\n \t\t.def_readwrite(\"pixel_format\", &StreamConfiguration::pixelFormat)\n \t\t.def_readwrite(\"stride\", &StreamConfiguration::stride)\n \t\t.def_readwrite(\"frame_size\", &StreamConfiguration::frameSize)\n-\t\t.def_readwrite(\"buffer_count\", &StreamConfiguration::bufferCount)\n \t\t.def_property_readonly(\"formats\", &StreamConfiguration::formats,\n \t\t\t\t       py::return_value_policy::reference_internal)\n \t\t.def_readwrite(\"color_space\", &StreamConfiguration::colorSpace);\ndiff --git a/test/camera/buffer_import.cpp b/test/camera/buffer_import.cpp\nindex 815d1cae..47958898 100644\n--- a/test/camera/buffer_import.cpp\n+++ b/test/camera/buffer_import.cpp\n@@ -16,6 +16,8 @@\n #include <libcamera/base/thread.h>\n #include <libcamera/base/timer.h>\n \n+#include <libcamera/property_ids.h>\n+\n #include \"libcamera/internal/device_enumerator.h\"\n #include \"libcamera/internal/media_device.h\"\n #include \"libcamera/internal/v4l2_videodevice.h\"\n@@ -97,10 +99,13 @@ protected:\n \t\t\treturn TestFail;\n \t\t}\n \n+\t\tunsigned int bufferCount =\n+\t\t\tcamera_->properties().get(properties::MinimumRequests).value();\n+\n \t\tStream *stream = cfg.stream();\n \n \t\tBufferSource source;\n-\t\tint ret = source.allocate(cfg);\n+\t\tint ret = source.allocate(cfg, bufferCount);\n \t\tif (ret != TestPass)\n \t\t\treturn ret;\n \n@@ -137,7 +142,7 @@ protected:\n \t\t\t}\n \t\t}\n \n-\t\tconst unsigned int nFrames = cfg.bufferCount * 2;\n+\t\tconst unsigned int nFrames = bufferCount * 2;\n \n \t\tTimer timer;\n \t\ttimer.start(500ms * nFrames);\ndiff --git a/test/libtest/buffer_source.cpp b/test/libtest/buffer_source.cpp\nindex dde11f36..c1bc45db 100644\n--- a/test/libtest/buffer_source.cpp\n+++ b/test/libtest/buffer_source.cpp\n@@ -26,7 +26,7 @@ BufferSource::~BufferSource()\n \t\tmedia_->release();\n }\n \n-int BufferSource::allocate(const StreamConfiguration &config)\n+int BufferSource::allocate(const StreamConfiguration &config, unsigned int count)\n {\n \t/* Locate and open the video device. */\n \tstd::string videoDeviceName = \"vivid-000-vid-out\";\n@@ -78,7 +78,7 @@ int BufferSource::allocate(const StreamConfiguration &config)\n \t\treturn TestFail;\n \t}\n \n-\tif (video->allocateBuffers(config.bufferCount, &buffers_) < 0) {\n+\tif (video->allocateBuffers(count, &buffers_) < 0) {\n \t\tstd::cout << \"Failed to allocate buffers\" << std::endl;\n \t\treturn TestFail;\n \t}\ndiff --git a/test/libtest/buffer_source.h b/test/libtest/buffer_source.h\nindex 495da8a9..deca2aab 100644\n--- a/test/libtest/buffer_source.h\n+++ b/test/libtest/buffer_source.h\n@@ -18,7 +18,7 @@ public:\n \tBufferSource();\n \t~BufferSource();\n \n-\tint allocate(const libcamera::StreamConfiguration &config);\n+\tint allocate(const libcamera::StreamConfiguration &config, unsigned int count);\n \tconst std::vector<std::unique_ptr<libcamera::FrameBuffer>> &buffers();\n \n private:\ndiff --git a/test/v4l2_videodevice/buffer_cache.cpp b/test/v4l2_videodevice/buffer_cache.cpp\nindex 5a9aa219..8d2cf6d1 100644\n--- a/test/v4l2_videodevice/buffer_cache.cpp\n+++ b/test/v4l2_videodevice/buffer_cache.cpp\n@@ -174,10 +174,9 @@ public:\n \t\tStreamConfiguration cfg;\n \t\tcfg.pixelFormat = formats::YUYV;\n \t\tcfg.size = Size(600, 800);\n-\t\tcfg.bufferCount = numBuffers;\n \n \t\tBufferSource source;\n-\t\tint ret = source.allocate(cfg);\n+\t\tint ret = source.allocate(cfg, numBuffers);\n \t\tif (ret != TestPass)\n \t\t\treturn ret;\n \n",
    "prefixes": [
        "v11",
        "11/19"
    ]
}