Show a patch.

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

{
    "id": 13470,
    "url": "https://patchwork.libcamera.org/api/1.1/patches/13470/?format=api",
    "web_url": "https://patchwork.libcamera.org/patch/13470/",
    "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": "<20210824195636.1110845-10-nfraprado@collabora.com>",
    "date": "2021-08-24T19:56:28",
    "name": "[libcamera-devel,v8,09/17] libcamera: stream: Remove bufferCount",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": false,
    "hash": "febe13710581b1e921ccde1c7bbe3c4f42432a9c",
    "submitter": {
        "id": 84,
        "url": "https://patchwork.libcamera.org/api/1.1/people/84/?format=api",
        "name": "Nícolas F. R. A. Prado",
        "email": "nfraprado@collabora.com"
    },
    "delegate": null,
    "mbox": "https://patchwork.libcamera.org/patch/13470/mbox/",
    "series": [
        {
            "id": 2389,
            "url": "https://patchwork.libcamera.org/api/1.1/series/2389/?format=api",
            "web_url": "https://patchwork.libcamera.org/project/libcamera/list/?series=2389",
            "date": "2021-08-24T19:56:19",
            "name": "lc-compliance: Add test to queue more requests than hardware depth",
            "version": 8,
            "mbox": "https://patchwork.libcamera.org/series/2389/mbox/"
        }
    ],
    "comments": "https://patchwork.libcamera.org/api/patches/13470/comments/",
    "check": "pending",
    "checks": "https://patchwork.libcamera.org/api/patches/13470/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 9BADDC3249\n\tfor <parsemail@patchwork.libcamera.org>;\n\tTue, 24 Aug 2021 19:57:56 +0000 (UTC)",
            "from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 9A1E768918;\n\tTue, 24 Aug 2021 21:57:37 +0200 (CEST)",
            "from bhuna.collabora.co.uk (bhuna.collabora.co.uk [46.235.227.227])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 426116890C\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue, 24 Aug 2021 21:57:34 +0200 (CEST)",
            "from [127.0.0.1] (localhost [127.0.0.1])\n\t(Authenticated sender: nfraprado) with ESMTPSA id DBBA11F43378"
        ],
        "From": "=?utf-8?b?TsOtY29sYXMgRi4gUi4gQS4gUHJhZG8=?= <nfraprado@collabora.com>",
        "To": "libcamera-devel@lists.libcamera.org",
        "Date": "Tue, 24 Aug 2021 16:56:28 -0300",
        "Message-Id": "<20210824195636.1110845-10-nfraprado@collabora.com>",
        "X-Mailer": "git-send-email 2.33.0",
        "In-Reply-To": "<20210824195636.1110845-1-nfraprado@collabora.com>",
        "References": "<20210824195636.1110845-1-nfraprado@collabora.com>",
        "MIME-Version": "1.0",
        "Content-Type": "text/plain; charset=UTF-8",
        "Content-Transfer-Encoding": "8bit",
        "Subject": "[libcamera-devel] [PATCH v8 09/17] libcamera: stream: Remove\n\tbufferCount",
        "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>",
        "Cc": "kernel@collabora.com, =?utf-8?q?Andr=C3=A9_Almeida?=\n\t<andrealmeid@collabora.com>",
        "Errors-To": "libcamera-devel-bounces@lists.libcamera.org",
        "Sender": "\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"
    },
    "content": "Now 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>\n\n---\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 include/libcamera/stream.h                        |  2 --\n src/android/camera_stream.cpp                     |  2 +-\n src/libcamera/pipeline/ipu3/cio2.cpp              |  1 -\n src/libcamera/pipeline/ipu3/cio2.h                |  2 --\n src/libcamera/pipeline/ipu3/ipu3.cpp              |  8 --------\n .../pipeline/raspberrypi/raspberrypi.cpp          |  6 ------\n src/libcamera/pipeline/rkisp1/rkisp1_path.cpp     |  2 --\n src/libcamera/pipeline/rkisp1/rkisp1_path.h       |  2 --\n src/libcamera/pipeline/simple/converter.cpp       |  3 ---\n src/libcamera/pipeline/simple/converter.h         |  3 ---\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/stream.cpp                          | 12 +++---------\n test/camera/buffer_import.cpp                     | 10 +++++++---\n test/libtest/buffer_source.cpp                    |  4 ++--\n test/libtest/buffer_source.h                      |  2 +-\n test/v4l2_videodevice/buffer_cache.cpp            |  3 +--\n 19 files changed, 25 insertions(+), 64 deletions(-)",
    "diff": "diff --git a/Documentation/guides/pipeline-handler.rst b/Documentation/guides/pipeline-handler.rst\nindex 2a69ef7d7461..3ee79b98c4dc 100644\n--- a/Documentation/guides/pipeline-handler.rst\n+++ b/Documentation/guides/pipeline-handler.rst\n@@ -826,14 +826,12 @@ As well as a list of supported StreamFormats, the StreamConfiguration is also\n expected to provide an initialsed default configuration. This may be arbitrary,\n but depending on use case you may which 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@@ -899,8 +897,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@@ -1144,13 +1140,20 @@ is performed by using the ``V4L2VideoDevice`` API, which provides an\n \n .. _FrameBuffer: http://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/stream.h b/include/libcamera/stream.h\nindex 0c55e7164592..b25f0059f2f1 100644\n--- a/include/libcamera/stream.h\n+++ b/include/libcamera/stream.h\n@@ -45,8 +45,6 @@ struct StreamConfiguration {\n \tunsigned int stride;\n \tunsigned int frameSize;\n \n-\tunsigned int bufferCount;\n-\n \tStream *stream() const { return stream_; }\n \tvoid setStream(Stream *stream) { stream_ = stream; }\n \tconst StreamFormats &formats() const { return formats_; }\ndiff --git a/src/android/camera_stream.cpp b/src/android/camera_stream.cpp\nindex 29be1ac5ca4f..d9ee8842938f 100644\n--- a/src/android/camera_stream.cpp\n+++ b/src/android/camera_stream.cpp\n@@ -96,7 +96,7 @@ int CameraStream::configure()\n \t\t\tbuffers_.push_back(frameBuffer.get());\n \t}\n \n-\tcamera3Stream_->max_buffers = configuration().bufferCount;\n+\tcamera3Stream_->max_buffers = bufferCount;\n \n \treturn 0;\n }\ndiff --git a/src/libcamera/pipeline/ipu3/cio2.cpp b/src/libcamera/pipeline/ipu3/cio2.cpp\nindex b940a0f6d7d6..c555ef5ffd27 100644\n--- a/src/libcamera/pipeline/ipu3/cio2.cpp\n+++ b/src/libcamera/pipeline/ipu3/cio2.cpp\n@@ -214,7 +214,6 @@ StreamConfiguration CIO2Device::generateConfiguration(Size size) const\n \n \tcfg.size = sensorFormat.size;\n \tcfg.pixelFormat = mbusCodesToPixelFormat.at(sensorFormat.mbus_code);\n-\tcfg.bufferCount = CIO2_BUFFER_COUNT;\n \n \treturn cfg;\n }\ndiff --git a/src/libcamera/pipeline/ipu3/cio2.h b/src/libcamera/pipeline/ipu3/cio2.h\nindex ab915b6a16fa..50ccb20765d3 100644\n--- a/src/libcamera/pipeline/ipu3/cio2.h\n+++ b/src/libcamera/pipeline/ipu3/cio2.h\n@@ -30,8 +30,6 @@ struct StreamConfiguration;\n class CIO2Device\n {\n public:\n-\tstatic constexpr unsigned int CIO2_BUFFER_COUNT = 4;\n-\n \tCIO2Device();\n \n \tstd::vector<PixelFormat> formats() const;\ndiff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp\nindex cc519ae6adbe..4a60f00ecf8b 100644\n--- a/src/libcamera/pipeline/ipu3/ipu3.cpp\n+++ b/src/libcamera/pipeline/ipu3/ipu3.cpp\n@@ -39,7 +39,6 @@ namespace libcamera {\n \n LOG_DEFINE_CATEGORY(IPU3)\n \n-static constexpr unsigned int IPU3_BUFFER_COUNT = 4;\n static constexpr unsigned int IPU3_MAX_STREAMS = 3;\n static const Size IMGU_OUTPUT_MIN_SIZE = { 2, 2 };\n static const Size IMGU_OUTPUT_MAX_SIZE = { 4480, 34004 };\n@@ -313,7 +312,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@@ -357,7 +355,6 @@ CameraConfiguration::Status IPU3CameraConfiguration::validate()\n \t\t\t\t\t      IMGU_OUTPUT_HEIGHT_ALIGN);\n \n \t\t\tcfg->pixelFormat = formats::NV12;\n-\t\t\tcfg->bufferCount = IPU3_BUFFER_COUNT;\n \t\t\tcfg->stride = info.stride(cfg->size.width, 0, 1);\n \t\t\tcfg->frameSize = info.frameSize(cfg->size, 1);\n \n@@ -425,7 +422,6 @@ CameraConfiguration *PipelineHandlerIPU3::generateConfiguration(Camera *camera,\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@@ -446,7 +442,6 @@ CameraConfiguration *PipelineHandlerIPU3::generateConfiguration(Camera *camera,\n \t\t\tsize.height = utils::alignDown(size.height - 1,\n \t\t\t\t\t\t       IMGU_OUTPUT_HEIGHT_MARGIN);\n \t\t\tpixelFormat = formats::NV12;\n-\t\t\tbufferCount = IPU3_BUFFER_COUNT;\n \t\t\tstreamFormats[pixelFormat] = { { IMGU_OUTPUT_MIN_SIZE, size } };\n \n \t\t\tbreak;\n@@ -456,7 +451,6 @@ CameraConfiguration *PipelineHandlerIPU3::generateConfiguration(Camera *camera,\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();\n@@ -475,7 +469,6 @@ CameraConfiguration *PipelineHandlerIPU3::generateConfiguration(Camera *camera,\n \t\t\t\t\t       .alignedDownTo(IMGU_OUTPUT_WIDTH_ALIGN,\n \t\t\t\t\t\t\t      IMGU_OUTPUT_HEIGHT_ALIGN);\n \t\t\tpixelFormat = formats::NV12;\n-\t\t\tbufferCount = IPU3_BUFFER_COUNT;\n \t\t\tstreamFormats[pixelFormat] = { { IMGU_OUTPUT_MIN_SIZE, size } };\n \n \t\t\tbreak;\n@@ -492,7 +485,6 @@ CameraConfiguration *PipelineHandlerIPU3::generateConfiguration(Camera *camera,\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/raspberrypi/raspberrypi.cpp b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp\nindex a7c1cc1d5001..12d6729044e6 100644\n--- a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp\n+++ b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp\n@@ -492,7 +492,6 @@ CameraConfiguration *PipelineHandlerRPi::generateConfiguration(Camera *camera,\n \tRPiCameraData *data = cameraData(camera);\n \tCameraConfiguration *config = new RPiCameraConfiguration(data);\n \tV4L2DeviceFormat sensorFormat;\n-\tunsigned int bufferCount;\n \tPixelFormat pixelFormat;\n \tV4L2VideoDevice::Formats fmts;\n \tSize size;\n@@ -510,7 +509,6 @@ CameraConfiguration *PipelineHandlerRPi::generateConfiguration(Camera *camera,\n \t\t\tsensorFormat = findBestMode(fmts, size);\n \t\t\tpixelFormat = sensorFormat.fourcc.toPixelFormat();\n \t\t\tASSERT(pixelFormat.isValid());\n-\t\t\tbufferCount = 2;\n \t\t\trawCount++;\n \t\t\tbreak;\n \n@@ -519,7 +517,6 @@ CameraConfiguration *PipelineHandlerRPi::generateConfiguration(Camera *camera,\n \t\t\tpixelFormat = formats::NV12;\n \t\t\t/* Return the largest sensor resolution. */\n \t\t\tsize = data->sensor_->resolution();\n-\t\t\tbufferCount = 1;\n \t\t\toutCount++;\n \t\t\tbreak;\n \n@@ -535,7 +532,6 @@ CameraConfiguration *PipelineHandlerRPi::generateConfiguration(Camera *camera,\n \t\t\tfmts = data->isp_[Isp::Output0].dev()->formats();\n \t\t\tpixelFormat = formats::YUV420;\n \t\t\tsize = { 1920, 1080 };\n-\t\t\tbufferCount = 4;\n \t\t\toutCount++;\n \t\t\tbreak;\n \n@@ -543,7 +539,6 @@ CameraConfiguration *PipelineHandlerRPi::generateConfiguration(Camera *camera,\n \t\t\tfmts = data->isp_[Isp::Output0].dev()->formats();\n \t\t\tpixelFormat = formats::ARGB8888;\n \t\t\tsize = { 800, 600 };\n-\t\t\tbufferCount = 4;\n \t\t\toutCount++;\n \t\t\tbreak;\n \n@@ -573,7 +568,6 @@ CameraConfiguration *PipelineHandlerRPi::generateConfiguration(Camera *camera,\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/rkisp1/rkisp1_path.cpp b/src/libcamera/pipeline/rkisp1/rkisp1_path.cpp\nindex 515f4be16d7e..9bbdf951d9b6 100644\n--- a/src/libcamera/pipeline/rkisp1/rkisp1_path.cpp\n+++ b/src/libcamera/pipeline/rkisp1/rkisp1_path.cpp\n@@ -61,7 +61,6 @@ StreamConfiguration RkISP1Path::generateConfiguration(const Size &resolution)\n \tStreamConfiguration cfg(formats);\n \tcfg.pixelFormat = formats::NV12;\n \tcfg.size = maxResolution;\n-\tcfg.bufferCount = RKISP1_BUFFER_COUNT;\n \n \treturn cfg;\n }\n@@ -77,7 +76,6 @@ CameraConfiguration::Status RkISP1Path::validate(StreamConfiguration *cfg)\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 267d8f988ace..dd54fc609da6 100644\n--- a/src/libcamera/pipeline/rkisp1/rkisp1_path.h\n+++ b/src/libcamera/pipeline/rkisp1/rkisp1_path.h\n@@ -57,8 +57,6 @@ public:\n \tSignal<FrameBuffer *> &bufferReady() { return video_->bufferReady; }\n \n private:\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/converter.cpp b/src/libcamera/pipeline/simple/converter.cpp\nindex 3133b3dbda07..46ab503b7c38 100644\n--- a/src/libcamera/pipeline/simple/converter.cpp\n+++ b/src/libcamera/pipeline/simple/converter.cpp\n@@ -89,9 +89,6 @@ int SimpleConverter::Stream::configure(const StreamConfiguration &inputCfg,\n \t\treturn -EINVAL;\n \t}\n \n-\tinputBufferCount_ = inputCfg.bufferCount;\n-\toutputBufferCount_ = outputCfg.bufferCount;\n-\n \treturn 0;\n }\n \ndiff --git a/src/libcamera/pipeline/simple/converter.h b/src/libcamera/pipeline/simple/converter.h\nindex deb3df0d08df..365b99e9853e 100644\n--- a/src/libcamera/pipeline/simple/converter.h\n+++ b/src/libcamera/pipeline/simple/converter.h\n@@ -86,9 +86,6 @@ private:\n \t\tSimpleConverter *converter_;\n \t\tunsigned int index_;\n \t\tstd::unique_ptr<V4L2M2MDevice> m2m_;\n-\n-\t\tunsigned int inputBufferCount_;\n-\t\tunsigned int outputBufferCount_;\n \t};\n \n \tstd::string deviceNode_;\ndiff --git a/src/libcamera/pipeline/simple/simple.cpp b/src/libcamera/pipeline/simple/simple.cpp\nindex d0a658a23be8..6deba5d7dd61 100644\n--- a/src/libcamera/pipeline/simple/simple.cpp\n+++ b/src/libcamera/pipeline/simple/simple.cpp\n@@ -252,7 +252,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 \tSimpleCameraData *cameraData(Camera *camera)\n@@ -638,7 +637,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\tconverter->strideAndFrameSize(cfg.pixelFormat, cfg.size);\n@@ -656,8 +655,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 = 3;\n \t}\n \n \treturn status;\n@@ -780,7 +777,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 \t/* Set the MinimumRequests property. */\n \tunsigned int minimumRequests;\ndiff --git a/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp b/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp\nindex c210cf57750f..5977312a795d 100644\n--- a/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp\n+++ b/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp\n@@ -150,8 +150,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@@ -193,7 +191,6 @@ CameraConfiguration *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 d2943f61a745..ad71bfc67228 100644\n--- a/src/libcamera/pipeline/vimc/vimc.cpp\n+++ b/src/libcamera/pipeline/vimc/vimc.cpp\n@@ -170,8 +170,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@@ -227,7 +225,6 @@ CameraConfiguration *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/stream.cpp b/src/libcamera/stream.cpp\nindex b421e17ecb36..d4cc0fafb76f 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@@ -324,11 +323,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  * \\fn StreamConfiguration::stream()\n  * \\brief Retrieve the stream associated with the configuration\ndiff --git a/test/camera/buffer_import.cpp b/test/camera/buffer_import.cpp\nindex c504ea09e64b..67ac0ad20e15 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@@ -92,10 +94,12 @@ protected:\n \t\t\treturn TestFail;\n \t\t}\n \n+\t\tunsigned int bufferCount = camera_->properties().get(properties::MinimumRequests);\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@@ -139,10 +143,10 @@ protected:\n \t\twhile (timer.isRunning())\n \t\t\tdispatcher->processEvents();\n \n-\t\tif (completeRequestsCount_ < cfg.bufferCount * 2) {\n+\t\tif (completeRequestsCount_ < bufferCount * 2) {\n \t\t\tstd::cout << \"Failed to capture enough frames (got \"\n \t\t\t\t  << completeRequestsCount_ << \" expected at least \"\n-\t\t\t\t  << cfg.bufferCount * 2 << \")\" << std::endl;\n+\t\t\t\t  << bufferCount * 2 << \")\" << std::endl;\n \t\t\treturn TestFail;\n \t\t}\n \ndiff --git a/test/libtest/buffer_source.cpp b/test/libtest/buffer_source.cpp\nindex 73563f2fc39d..c3d5286a2462 100644\n--- a/test/libtest/buffer_source.cpp\n+++ b/test/libtest/buffer_source.cpp\n@@ -24,7 +24,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@@ -77,7 +77,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 14b4770e8d8a..6a18e269a575 100644\n--- a/test/libtest/buffer_source.h\n+++ b/test/libtest/buffer_source.h\n@@ -20,7 +20,7 @@ public:\n \tBufferSource();\n \t~BufferSource();\n \n-\tint allocate(const StreamConfiguration &config);\n+\tint allocate(const StreamConfiguration &config, unsigned int count);\n \tconst std::vector<std::unique_ptr<FrameBuffer>> &buffers();\n \n private:\ndiff --git a/test/v4l2_videodevice/buffer_cache.cpp b/test/v4l2_videodevice/buffer_cache.cpp\nindex b3f2bec11783..6c8183800d0b 100644\n--- a/test/v4l2_videodevice/buffer_cache.cpp\n+++ b/test/v4l2_videodevice/buffer_cache.cpp\n@@ -145,10 +145,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": [
        "libcamera-devel",
        "v8",
        "09/17"
    ]
}