Patch Detail
Show a patch.
GET /api/patches/3101/?format=api
{ "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, ¶mBuffers_);\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" ] }