Patch Detail
Show a patch.
GET /api/patches/12053/?format=api
{ "id": 12053, "url": "https://patchwork.libcamera.org/api/patches/12053/?format=api", "web_url": "https://patchwork.libcamera.org/patch/12053/", "project": { "id": 1, "url": "https://patchwork.libcamera.org/api/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": "<20210421165139.318432-5-nfraprado@collabora.com>", "date": "2021-04-21T16:51:39", "name": "[libcamera-devel,v3,4/4] libcamera: stream: Remove bufferCount", "commit_ref": null, "pull_url": null, "state": "superseded", "archived": false, "hash": "30a15e959e85adcf4b8059f54768f3272ab016c0", "submitter": { "id": 84, "url": "https://patchwork.libcamera.org/api/people/84/?format=api", "name": "Nícolas F. R. A. Prado", "email": "nfraprado@collabora.com" }, "delegate": null, "mbox": "https://patchwork.libcamera.org/patch/12053/mbox/", "series": [ { "id": 1958, "url": "https://patchwork.libcamera.org/api/series/1958/?format=api", "web_url": "https://patchwork.libcamera.org/project/libcamera/list/?series=1958", "date": "2021-04-21T16:51:35", "name": "lc-compliance: Add test to queue more requests than hardware depth", "version": 3, "mbox": "https://patchwork.libcamera.org/series/1958/mbox/" } ], "comments": "https://patchwork.libcamera.org/api/patches/12053/comments/", "check": "pending", "checks": "https://patchwork.libcamera.org/api/patches/12053/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 EC9F4BDB15\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed, 21 Apr 2021 16:52:32 +0000 (UTC)", "from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 9B55668853;\n\tWed, 21 Apr 2021 18:52:32 +0200 (CEST)", "from bhuna.collabora.co.uk (bhuna.collabora.co.uk [46.235.227.227])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 51ECE68840\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 21 Apr 2021 18:52:30 +0200 (CEST)", "from [127.0.0.1] (localhost [127.0.0.1])\n\t(Authenticated sender: nfraprado) with ESMTPSA id 1BFEB1F423F1" ], "From": "=?utf-8?b?TsOtY29sYXMgRi4gUi4gQS4gUHJhZG8=?= <nfraprado@collabora.com>", "To": "libcamera-devel@lists.libcamera.org", "Date": "Wed, 21 Apr 2021 13:51:39 -0300", "Message-Id": "<20210421165139.318432-5-nfraprado@collabora.com>", "X-Mailer": "git-send-email 2.31.1", "In-Reply-To": "<20210421165139.318432-1-nfraprado@collabora.com>", "References": "<20210421165139.318432-1-nfraprado@collabora.com>", "MIME-Version": "1.0", "Subject": "[libcamera-devel] [PATCH v3 4/4] 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": "=?utf-8?q?Andr=C3=A9_Almeida?= <andrealmeid@collabora.com>,\n\tkernel@collabora.com", "Content-Type": "text/plain; charset=\"utf-8\"", "Content-Transfer-Encoding": "base64", "Errors-To": "libcamera-devel-bounces@lists.libcamera.org", "Sender": "\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>" }, "content": "Now that the amount of internal buffers allocated is hardcoded by the\npipelines, and the amount of buffers allocated by the\nFrameBufferAllocator helper is passed through\nFrameBufferAllocator::allocate(), we no longer need to have bufferCount\nin the StreamConfiguration, so remove it.\n\nSigned-off-by: Nícolas F. R. A. Prado <nfraprado@collabora.com>\n---\n include/libcamera/stream.h | 2 --\n src/libcamera/pipeline/ipu3/cio2.cpp | 1 -\n src/libcamera/pipeline/ipu3/ipu3.cpp | 15 +--------------\n .../pipeline/raspberrypi/raspberrypi.cpp | 9 ++-------\n src/libcamera/pipeline/rkisp1/rkisp1.cpp | 9 ++-------\n src/libcamera/pipeline/rkisp1/rkisp1_path.cpp | 2 --\n src/libcamera/pipeline/simple/converter.cpp | 7 ++-----\n src/libcamera/pipeline/simple/converter.h | 5 ++---\n src/libcamera/pipeline/simple/simple.cpp | 15 ++++-----------\n src/libcamera/pipeline/uvcvideo/uvcvideo.cpp | 5 +----\n src/libcamera/pipeline/vimc/vimc.cpp | 5 +----\n src/libcamera/stream.cpp | 9 ++-------\n src/v4l2/v4l2_camera.cpp | 14 ++++++++++----\n src/v4l2/v4l2_camera.h | 5 +++--\n src/v4l2/v4l2_camera_proxy.cpp | 8 +++-----\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 | 4 ++--\n 19 files changed, 45 insertions(+), 86 deletions(-)", "diff": "diff --git a/include/libcamera/stream.h b/include/libcamera/stream.h\nindex bb47c390f8a1..f36aeffd9540 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/libcamera/pipeline/ipu3/cio2.cpp b/src/libcamera/pipeline/ipu3/cio2.cpp\nindex 3cd777d1b742..1e110fe0c189 100644\n--- a/src/libcamera/pipeline/ipu3/cio2.cpp\n+++ b/src/libcamera/pipeline/ipu3/cio2.cpp\n@@ -213,7 +213,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/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp\nindex c8fcc2fda75f..f0a17a553bd3 100644\n--- a/src/libcamera/pipeline/ipu3/ipu3.cpp\n+++ b/src/libcamera/pipeline/ipu3/ipu3.cpp\n@@ -291,7 +291,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@@ -335,7 +334,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@@ -403,7 +401,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@@ -424,7 +421,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@@ -434,7 +430,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@@ -453,7 +448,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@@ -470,7 +464,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 \n@@ -668,15 +661,9 @@ int PipelineHandlerIPU3::allocateBuffers(Camera *camera)\n {\n \tIPU3CameraData *data = cameraData(camera);\n \tImgUDevice *imgu = data->imgu_;\n-\tunsigned int bufferCount;\n+\tunsigned int bufferCount = data->properties_.get(properties::QueueDepth);\n \tint ret;\n \n-\tbufferCount = std::max({\n-\t\tdata->outStream_.configuration().bufferCount,\n-\t\tdata->vfStream_.configuration().bufferCount,\n-\t\tdata->rawStream_.configuration().bufferCount,\n-\t});\n-\n \tret = imgu->allocateBuffers(bufferCount);\n \tif (ret < 0)\n \t\treturn ret;\ndiff --git a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp\nindex 3f35596fe550..44a8a472ae4f 100644\n--- a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp\n+++ b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp\n@@ -471,7 +471,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@@ -489,7 +488,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@@ -498,7 +496,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@@ -514,7 +511,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@@ -522,7 +518,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@@ -552,7 +547,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 \n@@ -1142,6 +1136,7 @@ int PipelineHandlerRPi::prepareBuffers(Camera *camera)\n {\n \tRPiCameraData *data = cameraData(camera);\n \tint ret;\n+\tunsigned int bufferCount = data->properties_.get(properties::QueueDepth);\n \n \t/*\n \t * Decide how many internal buffers to allocate. For now, simply look\n@@ -1152,7 +1147,7 @@ int PipelineHandlerRPi::prepareBuffers(Camera *camera)\n \tunsigned int maxBuffers = 0;\n \tfor (const Stream *s : camera->streams())\n \t\tif (static_cast<const RPi::Stream *>(s)->isExternal())\n-\t\t\tmaxBuffers = std::max(maxBuffers, s->configuration().bufferCount);\n+\t\t\tmaxBuffers = std::max(maxBuffers, bufferCount);\n \n \tfor (auto const stream : data->streams_) {\n \t\tret = stream->prepareBuffers(maxBuffers);\ndiff --git a/src/libcamera/pipeline/rkisp1/rkisp1.cpp b/src/libcamera/pipeline/rkisp1/rkisp1.cpp\nindex 2d95c1ca2a43..73d4ea6ba8f5 100644\n--- a/src/libcamera/pipeline/rkisp1/rkisp1.cpp\n+++ b/src/libcamera/pipeline/rkisp1/rkisp1.cpp\n@@ -686,16 +686,11 @@ int PipelineHandlerRkISP1::allocateBuffers(Camera *camera)\n \tunsigned int ipaBufferId = 1;\n \tint ret;\n \n-\tunsigned int maxCount = std::max({\n-\t\tdata->mainPathStream_.configuration().bufferCount,\n-\t\tdata->selfPathStream_.configuration().bufferCount,\n-\t});\n-\n-\tret = param_->allocateBuffers(maxCount, ¶mBuffers_);\n+\tret = param_->allocateBuffers(RKISP1_BUFFER_COUNT, ¶mBuffers_);\n \tif (ret < 0)\n \t\tgoto error;\n \n-\tret = stat_->allocateBuffers(maxCount, &statBuffers_);\n+\tret = stat_->allocateBuffers(RKISP1_BUFFER_COUNT, &statBuffers_);\n \tif (ret < 0)\n \t\tgoto error;\n \ndiff --git a/src/libcamera/pipeline/rkisp1/rkisp1_path.cpp b/src/libcamera/pipeline/rkisp1/rkisp1_path.cpp\nindex 25f482eb8d8e..200e3c2c4cca 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/simple/converter.cpp b/src/libcamera/pipeline/simple/converter.cpp\nindex 68644ef6477f..54e7f1b051f7 100644\n--- a/src/libcamera/pipeline/simple/converter.cpp\n+++ b/src/libcamera/pipeline/simple/converter.cpp\n@@ -86,9 +86,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 \n@@ -100,11 +97,11 @@ int SimpleConverter::Stream::exportBuffers(unsigned int count,\n \n int SimpleConverter::Stream::start()\n {\n-\tint ret = m2m_->output()->importBuffers(inputBufferCount_);\n+\tint ret = m2m_->output()->importBuffers(SIMPLE_QUEUE_DEPTH);\n \tif (ret < 0)\n \t\treturn ret;\n \n-\tret = m2m_->capture()->importBuffers(outputBufferCount_);\n+\tret = m2m_->capture()->importBuffers(SIMPLE_QUEUE_DEPTH);\n \tif (ret < 0) {\n \t\tstop();\n \t\treturn ret;\ndiff --git a/src/libcamera/pipeline/simple/converter.h b/src/libcamera/pipeline/simple/converter.h\nindex 480e528d2210..32313748cd24 100644\n--- a/src/libcamera/pipeline/simple/converter.h\n+++ b/src/libcamera/pipeline/simple/converter.h\n@@ -29,6 +29,8 @@ class SizeRange;\n struct StreamConfiguration;\n class V4L2M2MDevice;\n \n+constexpr unsigned int SIMPLE_QUEUE_DEPTH = 3;\n+\n class SimpleConverter\n {\n public:\n@@ -84,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 b9f14be6733f..9f28bb66e2e7 100644\n--- a/src/libcamera/pipeline/simple/simple.cpp\n+++ b/src/libcamera/pipeline/simple/simple.cpp\n@@ -142,8 +142,6 @@ static const SimplePipelineInfo supportedDevices[] = {\n \n } /* namespace */\n \n-static constexpr unsigned int kNumInternalBuffers = 3;\n-\n class SimpleCameraData : public CameraData\n {\n public:\n@@ -425,7 +423,7 @@ int SimpleCameraData::init()\n \t}\n \n \tproperties_ = sensor_->properties();\n-\tproperties_.set(properties::QueueDepth, kNumInternalBuffers);\n+\tproperties_.set(properties::QueueDepth, SIMPLE_QUEUE_DEPTH);\n \n \treturn 0;\n }\n@@ -616,7 +614,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@@ -634,8 +632,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@@ -758,7 +754,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 \treturn converter_->configure(inputCfg, outputCfgs);\n }\n@@ -791,12 +786,10 @@ int SimplePipelineHandler::start(Camera *camera, [[maybe_unused]] const ControlL\n \t\t * When using the converter allocate a fixed number of internal\n \t\t * buffers.\n \t\t */\n-\t\tret = video->allocateBuffers(kNumInternalBuffers,\n+\t\tret = video->allocateBuffers(SIMPLE_QUEUE_DEPTH,\n \t\t\t\t\t &data->converterBuffers_);\n \t} else {\n-\t\t/* Otherwise, prepare for using buffers from the only stream. */\n-\t\tStream *stream = &data->streams_[0];\n-\t\tret = video->importBuffers(stream->configuration().bufferCount);\n+\t\tret = video->importBuffers(SIMPLE_QUEUE_DEPTH);\n \t}\n \tif (ret < 0)\n \t\treturn ret;\ndiff --git a/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp b/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp\nindex a148c35f1265..94e6fd9d2d56 100644\n--- a/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp\n+++ b/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp\n@@ -148,8 +148,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@@ -191,7 +189,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 \n@@ -236,7 +233,7 @@ int PipelineHandlerUVC::exportFrameBuffers(Camera *camera,\n int PipelineHandlerUVC::start(Camera *camera, [[maybe_unused]] const ControlList *controls)\n {\n \tUVCCameraData *data = cameraData(camera);\n-\tunsigned int count = data->stream_.configuration().bufferCount;\n+\tunsigned int count = data->properties_.get(properties::QueueDepth);\n \n \tint ret = data->video_->importBuffers(count);\n \tif (ret < 0)\ndiff --git a/src/libcamera/pipeline/vimc/vimc.cpp b/src/libcamera/pipeline/vimc/vimc.cpp\nindex 22d6fdcbb141..891571afb3e5 100644\n--- a/src/libcamera/pipeline/vimc/vimc.cpp\n+++ b/src/libcamera/pipeline/vimc/vimc.cpp\n@@ -165,8 +165,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@@ -222,7 +220,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 \n@@ -312,7 +309,7 @@ int PipelineHandlerVimc::exportFrameBuffers(Camera *camera,\n int PipelineHandlerVimc::start(Camera *camera, [[maybe_unused]] const ControlList *controls)\n {\n \tVimcCameraData *data = cameraData(camera);\n-\tunsigned int count = data->stream_.configuration().bufferCount;\n+\tunsigned int count = data->properties_.get(properties::QueueDepth);\n \n \tint ret = data->video_->importBuffers(count);\n \tif (ret < 0)\ndiff --git a/src/libcamera/stream.cpp b/src/libcamera/stream.cpp\nindex f7bafcf8fc97..be57abce4eb3 100644\n--- a/src/libcamera/stream.cpp\n+++ b/src/libcamera/stream.cpp\n@@ -279,7 +279,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: pixelFormat(0), stride(0), frameSize(0),\n \t stream_(nullptr)\n {\n }\n@@ -288,7 +288,7 @@ 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: pixelFormat(0), stride(0), frameSize(0),\n \t stream_(nullptr), formats_(formats)\n {\n }\n@@ -323,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/src/v4l2/v4l2_camera.cpp b/src/v4l2/v4l2_camera.cpp\nindex 53d97f3e6b86..79bf7aec7782 100644\n--- a/src/v4l2/v4l2_camera.cpp\n+++ b/src/v4l2/v4l2_camera.cpp\n@@ -10,6 +10,8 @@\n #include <errno.h>\n #include <unistd.h>\n \n+#include <libcamera/property_ids.h>\n+\n #include \"libcamera/internal/log.h\"\n \n using namespace libcamera;\n@@ -107,14 +109,12 @@ void V4L2Camera::requestComplete(Request *request)\n }\n \n int V4L2Camera::configure(StreamConfiguration *streamConfigOut,\n-\t\t\t const Size &size, const PixelFormat &pixelformat,\n-\t\t\t unsigned int bufferCount)\n+\t\t\t const Size &size, const PixelFormat &pixelformat)\n {\n \tStreamConfiguration &streamConfig = config_->at(0);\n \tstreamConfig.size.width = size.width;\n \tstreamConfig.size.height = size.height;\n \tstreamConfig.pixelFormat = pixelformat;\n-\tstreamConfig.bufferCount = bufferCount;\n \t/* \\todo memoryType (interval vs external) */\n \n \tCameraConfiguration::Status validation = config_->validate();\n@@ -146,7 +146,6 @@ int V4L2Camera::validateConfiguration(const PixelFormat &pixelFormat,\n \tStreamConfiguration &cfg = config->at(0);\n \tcfg.size = size;\n \tcfg.pixelFormat = pixelFormat;\n-\tcfg.bufferCount = 1;\n \n \tCameraConfiguration::Status validation = config->validate();\n \tif (validation == CameraConfiguration::Invalid)\n@@ -299,3 +298,10 @@ bool V4L2Camera::isRunning()\n {\n \treturn isRunning_;\n }\n+\n+int V4L2Camera::getBufCount(int count)\n+{\n+\tint min = camera_->properties().get(properties::QueueDepth);\n+\n+\treturn std::max(count, min);\n+}\ndiff --git a/src/v4l2/v4l2_camera.h b/src/v4l2/v4l2_camera.h\nindex d238046250e3..68df8ad05917 100644\n--- a/src/v4l2/v4l2_camera.h\n+++ b/src/v4l2/v4l2_camera.h\n@@ -45,8 +45,7 @@ public:\n \tstd::vector<Buffer> completedBuffers();\n \n \tint configure(StreamConfiguration *streamConfigOut,\n-\t\t const Size &size, const PixelFormat &pixelformat,\n-\t\t unsigned int bufferCount);\n+\t\t const Size &size, const PixelFormat &pixelformat);\n \tint validateConfiguration(const PixelFormat &pixelformat,\n \t\t\t\t const Size &size,\n \t\t\t\t StreamConfiguration *streamConfigOut);\n@@ -65,6 +64,8 @@ public:\n \n \tbool isRunning();\n \n+\tint getBufCount(int count);\n+\n private:\n \tvoid requestComplete(Request *request);\n \ndiff --git a/src/v4l2/v4l2_camera_proxy.cpp b/src/v4l2/v4l2_camera_proxy.cpp\nindex f8bfe595e90e..cd32e44a01ad 100644\n--- a/src/v4l2/v4l2_camera_proxy.cpp\n+++ b/src/v4l2/v4l2_camera_proxy.cpp\n@@ -348,8 +348,7 @@ int V4L2CameraProxy::vidioc_s_fmt(V4L2CameraFile *file, struct v4l2_format *arg)\n \tSize size(arg->fmt.pix.width, arg->fmt.pix.height);\n \tV4L2PixelFormat v4l2Format = V4L2PixelFormat(arg->fmt.pix.pixelformat);\n \tret = vcam_->configure(&streamConfig_, size,\n-\t\t\t PixelFormatInfo::info(v4l2Format).format,\n-\t\t\t bufferCount_);\n+\t\t\t PixelFormatInfo::info(v4l2Format).format);\n \tif (ret < 0)\n \t\treturn -EINVAL;\n \n@@ -490,14 +489,13 @@ int V4L2CameraProxy::vidioc_reqbufs(V4L2CameraFile *file, struct v4l2_requestbuf\n \tSize size(v4l2PixFormat_.width, v4l2PixFormat_.height);\n \tV4L2PixelFormat v4l2Format = V4L2PixelFormat(v4l2PixFormat_.pixelformat);\n \tint ret = vcam_->configure(&streamConfig_, size,\n-\t\t\t\t PixelFormatInfo::info(v4l2Format).format,\n-\t\t\t\t arg->count);\n+\t\t\t\t PixelFormatInfo::info(v4l2Format).format);\n \tif (ret < 0)\n \t\treturn -EINVAL;\n \n \tsetFmtFromConfig(streamConfig_);\n \n-\targ->count = streamConfig_.bufferCount;\n+\targ->count = vcam_->getBufCount(arg->count);\n \tbufferCount_ = arg->count;\n \n \tret = vcam_->allocBuffers(arg->count);\ndiff --git a/test/camera/buffer_import.cpp b/test/camera/buffer_import.cpp\nindex 61f4eb92ae95..f2c38bfb0b72 100644\n--- a/test/camera/buffer_import.cpp\n+++ b/test/camera/buffer_import.cpp\n@@ -12,6 +12,8 @@\n #include <numeric>\n #include <vector>\n \n+#include <libcamera/property_ids.h>\n+\n #include \"libcamera/internal/device_enumerator.h\"\n #include \"libcamera/internal/event_dispatcher.h\"\n #include \"libcamera/internal/media_device.h\"\n@@ -91,10 +93,12 @@ protected:\n \t\t\treturn TestFail;\n \t\t}\n \n+\t\tunsigned int bufCount = camera_->properties().get(properties::QueueDepth);\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, bufCount);\n \t\tif (ret != TestPass)\n \t\t\treturn ret;\n \n@@ -138,10 +142,10 @@ protected:\n \t\twhile (timer.isRunning())\n \t\t\tdispatcher->processEvents();\n \n-\t\tif (completeRequestsCount_ < cfg.bufferCount * 2) {\n+\t\tif (completeRequestsCount_ < bufCount * 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 << bufCount * 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..07fddfd2617c 100644\n--- a/test/v4l2_videodevice/buffer_cache.cpp\n+++ b/test/v4l2_videodevice/buffer_cache.cpp\n@@ -10,6 +10,7 @@\n #include <vector>\n \n #include <libcamera/formats.h>\n+#include <libcamera/property_ids.h>\n #include <libcamera/stream.h>\n \n #include \"buffer_source.h\"\n@@ -145,10 +146,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", "v3", "4/4" ] }