Show a patch.

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

{
    "id": 3101,
    "url": "https://patchwork.libcamera.org/api/patches/3101/?format=api",
    "web_url": "https://patchwork.libcamera.org/patch/3101/",
    "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": "<20200314235728.15495-9-laurent.pinchart@ideasonboard.com>",
    "date": "2020-03-14T23:57:27",
    "name": "[libcamera-devel,8/9] libcamera: pipeline_handler: Fold buffer management with start/stop",
    "commit_ref": null,
    "pull_url": null,
    "state": "accepted",
    "archived": false,
    "hash": "6cc2c13a6ceed50dfada055c263c890a9abffbe6",
    "submitter": {
        "id": 2,
        "url": "https://patchwork.libcamera.org/api/people/2/?format=api",
        "name": "Laurent Pinchart",
        "email": "laurent.pinchart@ideasonboard.com"
    },
    "delegate": null,
    "mbox": "https://patchwork.libcamera.org/patch/3101/mbox/",
    "series": [
        {
            "id": 719,
            "url": "https://patchwork.libcamera.org/api/series/719/?format=api",
            "web_url": "https://patchwork.libcamera.org/project/libcamera/list/?series=719",
            "date": "2020-03-14T23:57:19",
            "name": "Simplify buffer management with V4L2 buffer orphaning",
            "version": 1,
            "mbox": "https://patchwork.libcamera.org/series/719/mbox/"
        }
    ],
    "comments": "https://patchwork.libcamera.org/api/patches/3101/comments/",
    "check": "pending",
    "checks": "https://patchwork.libcamera.org/api/patches/3101/checks/",
    "tags": {},
    "headers": {
        "Return-Path": "<laurent.pinchart@ideasonboard.com>",
        "Received": [
            "from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 046DA62944\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tSun, 15 Mar 2020 00:57:43 +0100 (CET)",
            "from pendragon.bb.dnainternet.fi (81-175-216-236.bb.dnainternet.fi\n\t[81.175.216.236])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 97B87121F\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tSun, 15 Mar 2020 00:57:42 +0100 (CET)"
        ],
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1584230262;\n\tbh=ZXpQxE+RBSOk4eFuzWGen7dFq2kNAjCjqHDCxMp1A34=;\n\th=From:To:Subject:Date:In-Reply-To:References:From;\n\tb=gRqhdzqBefhd5q6zR/uhey5zOd+Jpm5G5KG3OhMIPmH1xGqSI8/czFuhoKTRrKWmh\n\tQVSz64y9s18W/Kk3Ag9psljZxg0F8qDF2SRkHdIlntX6/NGKahFl48do3MR59/qZt4\n\tphMlQ5IArM8uFTh+eiqu5TduE2CgMVigB+oCryQg=",
        "From": "Laurent Pinchart <laurent.pinchart@ideasonboard.com>",
        "To": "libcamera-devel@lists.libcamera.org",
        "Date": "Sun, 15 Mar 2020 01:57:27 +0200",
        "Message-Id": "<20200314235728.15495-9-laurent.pinchart@ideasonboard.com>",
        "X-Mailer": "git-send-email 2.24.1",
        "In-Reply-To": "<20200314235728.15495-1-laurent.pinchart@ideasonboard.com>",
        "References": "<20200314235728.15495-1-laurent.pinchart@ideasonboard.com>",
        "MIME-Version": "1.0",
        "Content-Transfer-Encoding": "8bit",
        "Subject": "[libcamera-devel] [PATCH 8/9] libcamera: pipeline_handler: Fold\n\tbuffer management with start/stop",
        "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>",
        "X-List-Received-Date": "Sat, 14 Mar 2020 23:57:43 -0000"
    },
    "content": "There's no need anymore to have the Camera object control how and when\npipeline handlers allocate and free the buffers for the\napplication-facing video devices. Fold those operations, currently\nperformed by importFrameBuffers() and freeFrameBuffers(), into the\nstart() and stop() functions. This simplifies the pipeline handler API,\nits implementation, and the implementation of the Camera class.\n\nSigned-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n---\n src/libcamera/camera.cpp                 |  11 --\n src/libcamera/include/pipeline_handler.h |   2 -\n src/libcamera/pipeline/ipu3/ipu3.cpp     | 146 +++++++++++------------\n src/libcamera/pipeline/rkisp1/rkisp1.cpp |  20 ++--\n src/libcamera/pipeline/uvcvideo.cpp      |  28 ++---\n src/libcamera/pipeline/vimc.cpp          |  28 ++---\n src/libcamera/pipeline_handler.cpp       |  41 +------\n 7 files changed, 101 insertions(+), 175 deletions(-)",
    "diff": "diff --git a/src/libcamera/camera.cpp b/src/libcamera/camera.cpp\nindex 3192dfb42d01..5593c1b317a0 100644\n--- a/src/libcamera/camera.cpp\n+++ b/src/libcamera/camera.cpp\n@@ -915,13 +915,6 @@ int Camera::start()\n \n \tLOG(Camera, Debug) << \"Starting capture\";\n \n-\tfor (Stream *stream : p_->activeStreams_) {\n-\t\tret = p_->pipe_->invokeMethod(&PipelineHandler::importFrameBuffers,\n-\t\t\t\t\t      ConnectionTypeDirect, this, stream);\n-\t\tif (ret < 0)\n-\t\t\treturn ret;\n-\t}\n-\n \tret = p_->pipe_->invokeMethod(&PipelineHandler::start,\n \t\t\t\t      ConnectionTypeBlocking, this);\n \tif (ret)\n@@ -959,10 +952,6 @@ int Camera::stop()\n \tp_->pipe_->invokeMethod(&PipelineHandler::stop, ConnectionTypeBlocking,\n \t\t\t\tthis);\n \n-\tfor (Stream *stream : p_->activeStreams_)\n-\t\tp_->pipe_->invokeMethod(&PipelineHandler::freeFrameBuffers,\n-\t\t\t\t\tConnectionTypeBlocking, this, stream);\n-\n \treturn 0;\n }\n \ndiff --git a/src/libcamera/include/pipeline_handler.h b/src/libcamera/include/pipeline_handler.h\nindex db6c3104d812..3fcfeda4bfee 100644\n--- a/src/libcamera/include/pipeline_handler.h\n+++ b/src/libcamera/include/pipeline_handler.h\n@@ -76,8 +76,6 @@ public:\n \n \tvirtual int exportFrameBuffers(Camera *camera, Stream *stream,\n \t\t\t\t       std::vector<std::unique_ptr<FrameBuffer>> *buffers) = 0;\n-\tvirtual int importFrameBuffers(Camera *camera, Stream *stream) = 0;\n-\tvirtual void freeFrameBuffers(Camera *camera, Stream *stream) = 0;\n \n \tvirtual int start(Camera *camera) = 0;\n \tvirtual void stop(Camera *camera) = 0;\ndiff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp\nindex b6db8d567ea4..6b93c50978a7 100644\n--- a/src/libcamera/pipeline/ipu3/ipu3.cpp\n+++ b/src/libcamera/pipeline/ipu3/ipu3.cpp\n@@ -72,6 +72,7 @@ public:\n \tint configureOutput(ImgUOutput *output,\n \t\t\t    const StreamConfiguration &cfg);\n \n+\tint allocateBuffers(IPU3CameraData *data, unsigned int bufferCount);\n \tvoid freeBuffers(IPU3CameraData *data);\n \n \tint start();\n@@ -208,8 +209,6 @@ public:\n \n \tint exportFrameBuffers(Camera *camera, Stream *stream,\n \t\t\t       std::vector<std::unique_ptr<FrameBuffer>> *buffers) override;\n-\tint importFrameBuffers(Camera *camera, Stream *stream) override;\n-\tvoid freeFrameBuffers(Camera *camera, Stream *stream) override;\n \n \tint start(Camera *camera) override;\n \tvoid stop(Camera *camera) override;\n@@ -625,23 +624,6 @@ int PipelineHandlerIPU3::exportFrameBuffers(Camera *camera, Stream *stream,\n \treturn video->exportBuffers(count, buffers);\n }\n \n-int PipelineHandlerIPU3::importFrameBuffers(Camera *camera, Stream *stream)\n-{\n-\tIPU3Stream *ipu3stream = static_cast<IPU3Stream *>(stream);\n-\tV4L2VideoDevice *video = ipu3stream->device_->dev;\n-\tunsigned int count = stream->configuration().bufferCount;\n-\n-\treturn video->importBuffers(count);\n-}\n-\n-void PipelineHandlerIPU3::freeFrameBuffers(Camera *camera, Stream *stream)\n-{\n-\tIPU3Stream *ipu3stream = static_cast<IPU3Stream *>(stream);\n-\tV4L2VideoDevice *video = ipu3stream->device_->dev;\n-\n-\tvideo->releaseBuffers();\n-}\n-\n /**\n  * \\todo Clarify if 'viewfinder' and 'stat' nodes have to be set up and\n  * started even if not in use. As of now, if not properly configured and\n@@ -653,69 +635,24 @@ void PipelineHandlerIPU3::freeFrameBuffers(Camera *camera, Stream *stream)\n int PipelineHandlerIPU3::allocateBuffers(Camera *camera)\n {\n \tIPU3CameraData *data = cameraData(camera);\n-\tIPU3Stream *outStream = &data->outStream_;\n-\tIPU3Stream *vfStream = &data->vfStream_;\n \tCIO2Device *cio2 = &data->cio2_;\n \tImgUDevice *imgu = data->imgu_;\n \tunsigned int bufferCount;\n \tint ret;\n \n-\t/* Share buffers between CIO2 output and ImgU input. */\n \tret = cio2->allocateBuffers();\n \tif (ret < 0)\n \t\treturn ret;\n \n \tbufferCount = ret;\n \n-\tret = imgu->input_->importBuffers(bufferCount);\n-\tif (ret) {\n-\t\tLOG(IPU3, Error) << \"Failed to import ImgU input buffers\";\n-\t\tgoto error;\n-\t}\n-\n-\t/*\n-\t * Use for the stat's internal pool the same number of buffers as for\n-\t * the input pool.\n-\t * \\todo To be revised when we'll actually use the stat node.\n-\t */\n-\tret = imgu->stat_.dev->allocateBuffers(bufferCount, &imgu->stat_.buffers);\n+\tret = imgu->allocateBuffers(data, bufferCount);\n \tif (ret < 0) {\n-\t\tLOG(IPU3, Error) << \"Failed to allocate ImgU stat buffers\";\n-\t\tgoto error;\n-\t}\n-\n-\t/*\n-\t * Allocate buffers also on non-active outputs; use the same number\n-\t * of buffers as the active ones.\n-\t */\n-\tif (!outStream->active_) {\n-\t\tImgUDevice::ImgUOutput *output = outStream->device_;\n-\n-\t\tret = output->dev->allocateBuffers(bufferCount, &output->buffers);\n-\t\tif (ret < 0) {\n-\t\t\tLOG(IPU3, Error) << \"Failed to allocate ImgU \"\n-\t\t\t\t\t << output->name << \" buffers\";\n-\t\t\tgoto error;\n-\t\t}\n-\t}\n-\n-\tif (!vfStream->active_) {\n-\t\tImgUDevice::ImgUOutput *output = vfStream->device_;\n-\n-\t\tret = output->dev->allocateBuffers(bufferCount, &output->buffers);\n-\t\tif (ret < 0) {\n-\t\t\tLOG(IPU3, Error) << \"Failed to allocate ImgU \"\n-\t\t\t\t\t << output->name << \" buffers\";\n-\t\t\tgoto error;\n-\t\t}\n+\t\tcio2->freeBuffers();\n+\t\treturn ret;\n \t}\n \n \treturn 0;\n-\n-error:\n-\tfreeBuffers(camera);\n-\n-\treturn ret;\n }\n \n int PipelineHandlerIPU3::freeBuffers(Camera *camera)\n@@ -1156,6 +1093,65 @@ int ImgUDevice::configureOutput(ImgUOutput *output,\n \treturn 0;\n }\n \n+/**\n+ * \\brief Allocate buffers for all the ImgU video devices\n+ */\n+int ImgUDevice::allocateBuffers(IPU3CameraData *data, unsigned int bufferCount)\n+{\n+\tIPU3Stream *outStream = &data->outStream_;\n+\tIPU3Stream *vfStream = &data->vfStream_;\n+\n+\t/* Share buffers between CIO2 output and ImgU input. */\n+\tint ret = input_->importBuffers(bufferCount);\n+\tif (ret) {\n+\t\tLOG(IPU3, Error) << \"Failed to import ImgU input buffers\";\n+\t\treturn ret;\n+\t}\n+\n+\t/*\n+\t * Use for the stat's internal pool the same number of buffers as for\n+\t * the input pool.\n+\t * \\todo To be revised when we'll actually use the stat node.\n+\t */\n+\tret = stat_.dev->allocateBuffers(bufferCount, &stat_.buffers);\n+\tif (ret < 0) {\n+\t\tLOG(IPU3, Error) << \"Failed to allocate ImgU stat buffers\";\n+\t\tgoto error;\n+\t}\n+\n+\t/*\n+\t * Allocate buffers for both outputs. If an output is active, prepare\n+\t * for buffer import, otherwise allocate internal buffers. Use the same\n+\t * number of buffers in either case.\n+\t */\n+\tif (outStream->active_)\n+\t\tret = output_.dev->importBuffers(bufferCount);\n+\telse\n+\t\tret = output_.dev->allocateBuffers(bufferCount,\n+\t\t\t\t\t\t   &output_.buffers);\n+\tif (ret < 0) {\n+\t\tLOG(IPU3, Error) << \"Failed to allocate ImgU output buffers\";\n+\t\tgoto error;\n+\t}\n+\n+\tif (vfStream->active_)\n+\t\tret = viewfinder_.dev->importBuffers(bufferCount);\n+\telse\n+\t\tret = viewfinder_.dev->allocateBuffers(bufferCount,\n+\t\t\t\t\t\t       &viewfinder_.buffers);\n+\tif (ret < 0) {\n+\t\tLOG(IPU3, Error) << \"Failed to allocate ImgU viewfinder buffers\";\n+\t\tgoto error;\n+\t}\n+\n+\treturn 0;\n+\n+error:\n+\tfreeBuffers(data);\n+\n+\treturn ret;\n+}\n+\n /**\n  * \\brief Release buffers for all the ImgU video devices\n  */\n@@ -1163,21 +1159,17 @@ void ImgUDevice::freeBuffers(IPU3CameraData *data)\n {\n \tint ret;\n \n-\tif (!data->outStream_.active_) {\n-\t\tret = output_.dev->releaseBuffers();\n-\t\tif (ret)\n-\t\t\tLOG(IPU3, Error) << \"Failed to release ImgU output buffers\";\n-\t}\n+\tret = output_.dev->releaseBuffers();\n+\tif (ret)\n+\t\tLOG(IPU3, Error) << \"Failed to release ImgU output buffers\";\n \n \tret = stat_.dev->releaseBuffers();\n \tif (ret)\n \t\tLOG(IPU3, Error) << \"Failed to release ImgU stat buffers\";\n \n-\tif (!data->vfStream_.active_) {\n-\t\tret = viewfinder_.dev->releaseBuffers();\n-\t\tif (ret)\n-\t\t\tLOG(IPU3, Error) << \"Failed to release ImgU viewfinder buffers\";\n-\t}\n+\tret = viewfinder_.dev->releaseBuffers();\n+\tif (ret)\n+\t\tLOG(IPU3, Error) << \"Failed to release ImgU viewfinder buffers\";\n \n \tret = input_->releaseBuffers();\n \tif (ret)\ndiff --git a/src/libcamera/pipeline/rkisp1/rkisp1.cpp b/src/libcamera/pipeline/rkisp1/rkisp1.cpp\nindex 1ad53fbde112..01977ad697a9 100644\n--- a/src/libcamera/pipeline/rkisp1/rkisp1.cpp\n+++ b/src/libcamera/pipeline/rkisp1/rkisp1.cpp\n@@ -175,8 +175,6 @@ public:\n \n \tint exportFrameBuffers(Camera *camera, Stream *stream,\n \t\t\t       std::vector<std::unique_ptr<FrameBuffer>> *buffers) override;\n-\tint importFrameBuffers(Camera *camera, Stream *stream) override;\n-\tvoid freeFrameBuffers(Camera *camera, Stream *stream) override;\n \n \tint start(Camera *camera) override;\n \tvoid stop(Camera *camera) override;\n@@ -668,17 +666,6 @@ int PipelineHandlerRkISP1::exportFrameBuffers(Camera *camera, Stream *stream,\n \treturn video_->exportBuffers(count, buffers);\n }\n \n-int PipelineHandlerRkISP1::importFrameBuffers(Camera *camera, Stream *stream)\n-{\n-\tunsigned int count = stream->configuration().bufferCount;\n-\treturn video_->importBuffers(count);\n-}\n-\n-void PipelineHandlerRkISP1::freeFrameBuffers(Camera *camera, Stream *stream)\n-{\n-\tvideo_->releaseBuffers();\n-}\n-\n int PipelineHandlerRkISP1::allocateBuffers(Camera *camera)\n {\n \tRkISP1CameraData *data = cameraData(camera);\n@@ -689,6 +676,10 @@ int PipelineHandlerRkISP1::allocateBuffers(Camera *camera)\n \tfor (const Stream *s : camera->streams())\n \t\tmaxBuffers = std::max(maxBuffers, s->configuration().bufferCount);\n \n+\tret = video_->importBuffers(count);\n+\tif (ret < 0)\n+\t\tgoto error;\n+\n \tret = param_->allocateBuffers(maxBuffers, &paramBuffers_);\n \tif (ret < 0)\n \t\tgoto error;\n@@ -749,6 +740,9 @@ int PipelineHandlerRkISP1::freeBuffers(Camera *camera)\n \tif (stat_->releaseBuffers())\n \t\tLOG(RkISP1, Error) << \"Failed to release stat buffers\";\n \n+\tif (video_->releaseBuffers())\n+\t\tLOG(RkISP1, Error) << \"Failed to release video buffers\";\n+\n \treturn 0;\n }\n \ndiff --git a/src/libcamera/pipeline/uvcvideo.cpp b/src/libcamera/pipeline/uvcvideo.cpp\nindex 29afb121aa46..40cc3ee7d098 100644\n--- a/src/libcamera/pipeline/uvcvideo.cpp\n+++ b/src/libcamera/pipeline/uvcvideo.cpp\n@@ -67,8 +67,6 @@ public:\n \n \tint exportFrameBuffers(Camera *camera, Stream *stream,\n \t\t\t       std::vector<std::unique_ptr<FrameBuffer>> *buffers) override;\n-\tint importFrameBuffers(Camera *camera, Stream *stream) override;\n-\tvoid freeFrameBuffers(Camera *camera, Stream *stream) override;\n \n \tint start(Camera *camera) override;\n \tvoid stop(Camera *camera) override;\n@@ -202,31 +200,29 @@ int PipelineHandlerUVC::exportFrameBuffers(Camera *camera, Stream *stream,\n \treturn data->video_->exportBuffers(count, buffers);\n }\n \n-int PipelineHandlerUVC::importFrameBuffers(Camera *camera, Stream *stream)\n+int PipelineHandlerUVC::start(Camera *camera)\n {\n \tUVCCameraData *data = cameraData(camera);\n-\tunsigned int count = stream->configuration().bufferCount;\n+\tunsigned int count = data->stream_.configuration().bufferCount;\n \n-\treturn data->video_->importBuffers(count);\n-}\n-\n-void PipelineHandlerUVC::freeFrameBuffers(Camera *camera, Stream *stream)\n-{\n-\tUVCCameraData *data = cameraData(camera);\n+\tint ret = data->video_->importBuffers(count);\n+\tif (ret < 0)\n+\t\treturn ret;\n \n-\tdata->video_->releaseBuffers();\n-}\n+\tret = data->video_->streamOn();\n+\tif (ret < 0) {\n+\t\tdata->video_->releaseBuffers();\n+\t\treturn ret;\n+\t}\n \n-int PipelineHandlerUVC::start(Camera *camera)\n-{\n-\tUVCCameraData *data = cameraData(camera);\n-\treturn data->video_->streamOn();\n+\treturn 0;\n }\n \n void PipelineHandlerUVC::stop(Camera *camera)\n {\n \tUVCCameraData *data = cameraData(camera);\n \tdata->video_->streamOff();\n+\tdata->video_->releaseBuffers();\n }\n \n int PipelineHandlerUVC::processControls(UVCCameraData *data, Request *request)\ndiff --git a/src/libcamera/pipeline/vimc.cpp b/src/libcamera/pipeline/vimc.cpp\nindex 5d3d12fef30b..eceb16d5586a 100644\n--- a/src/libcamera/pipeline/vimc.cpp\n+++ b/src/libcamera/pipeline/vimc.cpp\n@@ -84,8 +84,6 @@ public:\n \n \tint exportFrameBuffers(Camera *camera, Stream *stream,\n \t\t\t       std::vector<std::unique_ptr<FrameBuffer>> *buffers) override;\n-\tint importFrameBuffers(Camera *camera, Stream *stream) override;\n-\tvoid freeFrameBuffers(Camera *camera, Stream *stream) override;\n \n \tint start(Camera *camera) override;\n \tvoid stop(Camera *camera) override;\n@@ -268,31 +266,29 @@ int PipelineHandlerVimc::exportFrameBuffers(Camera *camera, Stream *stream,\n \treturn data->video_->exportBuffers(count, buffers);\n }\n \n-int PipelineHandlerVimc::importFrameBuffers(Camera *camera, Stream *stream)\n+int PipelineHandlerVimc::start(Camera *camera)\n {\n \tVimcCameraData *data = cameraData(camera);\n-\tunsigned int count = stream->configuration().bufferCount;\n+\tunsigned int count = data->stream_.configuration().bufferCount;\n \n-\treturn data->video_->importBuffers(count);\n-}\n-\n-void PipelineHandlerVimc::freeFrameBuffers(Camera *camera, Stream *stream)\n-{\n-\tVimcCameraData *data = cameraData(camera);\n+\tint ret = data->video_->importBuffers(count);\n+\tif (ret < 0)\n+\t\treturn ret;\n \n-\tdata->video_->releaseBuffers();\n-}\n+\tret = data->video_->streamOn();\n+\tif (ret < 0) {\n+\t\tdata->video_->releaseBuffers();\n+\t\treturn ret;\n+\t}\n \n-int PipelineHandlerVimc::start(Camera *camera)\n-{\n-\tVimcCameraData *data = cameraData(camera);\n-\treturn data->video_->streamOn();\n+\treturn 0;\n }\n \n void PipelineHandlerVimc::stop(Camera *camera)\n {\n \tVimcCameraData *data = cameraData(camera);\n \tdata->video_->streamOff();\n+\tdata->video_->releaseBuffers();\n }\n \n int PipelineHandlerVimc::processControls(VimcCameraData *data, Request *request)\ndiff --git a/src/libcamera/pipeline_handler.cpp b/src/libcamera/pipeline_handler.cpp\nindex e5034c54e2fb..254d341fb8a4 100644\n--- a/src/libcamera/pipeline_handler.cpp\n+++ b/src/libcamera/pipeline_handler.cpp\n@@ -325,7 +325,7 @@ const ControlList &PipelineHandler::properties(Camera *camera)\n \n /**\n  * \\fn PipelineHandler::exportFrameBuffers()\n- * \\brief Allocate buffers for \\a stream\n+ * \\brief Allocate and export buffers for \\a stream\n  * \\param[in] camera The camera\n  * \\param[in] stream The stream to allocate buffers for\n  * \\param[out] buffers Array of buffers successfully allocated\n@@ -347,45 +347,6 @@ const ControlList &PipelineHandler::properties(Camera *camera)\n  * otherwise\n  */\n \n-/**\n- * \\fn PipelineHandler::importFrameBuffers()\n- * \\brief Prepare \\a stream to use external buffers\n- * \\param[in] camera The camera\n- * \\param[in] stream The stream to prepare for import\n- *\n- * This method prepares the pipeline handler to use buffers provided by the\n- * application for the \\a stream.\n- *\n- * The method may only be called after the Camera has been configured and before\n- * it gets started, or after it gets stopped. It shall be called only for\n- * streams that are part of the active camera configuration, and at most once\n- * per stream until buffers for the stream are freed with freeFrameBuffers().\n- *\n- * importFrameBuffers() shall also allocate all other resources required by the\n- * pipeline handler for the stream to prepare for starting the Camera.\n- *\n- * The only intended caller is Camera::start().\n- *\n- * \\context This function is called from the CameraManager thread.\n- *\n- * \\return 0 on success or a negative error code otherwise\n- */\n-\n-/**\n- * \\fn PipelineHandler::freeFrameBuffers()\n- * \\brief Free buffers allocated from the stream\n- * \\param[in] camera The camera\n- * \\param[in] stream The stream to free buffers for\n- *\n- * This method shall release all resources allocated for the \\a stream by\n- * importFrameBuffers(). It shall be called only after a successful call that\n- * method, and only once per stream.\n- *\n- * The only intended callers are Camera::stop() and Camera::freeFrameBuffers().\n- *\n- * \\context This function is called from the CameraManager thread.\n- */\n-\n /**\n  * \\fn PipelineHandler::start()\n  * \\brief Start capturing from a group of streams\n",
    "prefixes": [
        "libcamera-devel",
        "8/9"
    ]
}