Show a patch.

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

{
    "id": 2377,
    "url": "https://patchwork.libcamera.org/api/1.1/patches/2377/?format=api",
    "web_url": "https://patchwork.libcamera.org/patch/2377/",
    "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": "<20191126233620.1695316-30-niklas.soderlund@ragnatech.se>",
    "date": "2019-11-26T23:36:19",
    "name": "[libcamera-devel,29/30] libcamera: pipeline: Remove explicit buffer handling",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": false,
    "hash": "a706e47f2a175bea2382294a952a461f078e3ac0",
    "submitter": {
        "id": 5,
        "url": "https://patchwork.libcamera.org/api/1.1/people/5/?format=api",
        "name": "Niklas Söderlund",
        "email": "niklas.soderlund@ragnatech.se"
    },
    "delegate": null,
    "mbox": "https://patchwork.libcamera.org/patch/2377/mbox/",
    "series": [
        {
            "id": 579,
            "url": "https://patchwork.libcamera.org/api/1.1/series/579/?format=api",
            "web_url": "https://patchwork.libcamera.org/project/libcamera/list/?series=579",
            "date": "2019-11-26T23:35:50",
            "name": "libcamera: Rework buffer API",
            "version": 1,
            "mbox": "https://patchwork.libcamera.org/series/579/mbox/"
        }
    ],
    "comments": "https://patchwork.libcamera.org/api/patches/2377/comments/",
    "check": "pending",
    "checks": "https://patchwork.libcamera.org/api/patches/2377/checks/",
    "tags": {},
    "headers": {
        "Return-Path": "<niklas.soderlund@ragnatech.se>",
        "Received": [
            "from bin-mail-out-05.binero.net (bin-mail-out-05.binero.net\n\t[195.74.38.228])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 1C96260C3D\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 27 Nov 2019 00:39:52 +0100 (CET)",
            "from bismarck.berto.se (p54ac5865.dip0.t-ipconnect.de\n\t[84.172.88.101]) by bin-vsp-out-02.atm.binero.net (Halon) with ESMTPA\n\tid 099e7011-10a6-11ea-a0b9-005056917f90;\n\tWed, 27 Nov 2019 00:39:50 +0100 (CET)"
        ],
        "X-Halon-ID": "099e7011-10a6-11ea-a0b9-005056917f90",
        "Authorized-sender": "niklas@soderlund.pp.se",
        "From": "=?utf-8?q?Niklas_S=C3=B6derlund?= <niklas.soderlund@ragnatech.se>",
        "To": "libcamera-devel@lists.libcamera.org",
        "Date": "Wed, 27 Nov 2019 00:36:19 +0100",
        "Message-Id": "<20191126233620.1695316-30-niklas.soderlund@ragnatech.se>",
        "X-Mailer": "git-send-email 2.24.0",
        "In-Reply-To": "<20191126233620.1695316-1-niklas.soderlund@ragnatech.se>",
        "References": "<20191126233620.1695316-1-niklas.soderlund@ragnatech.se>",
        "MIME-Version": "1.0",
        "Content-Type": "text/plain; charset=UTF-8",
        "Content-Transfer-Encoding": "8bit",
        "Subject": "[libcamera-devel] [PATCH 29/30] libcamera: pipeline: Remove\n\texplicit buffer handling",
        "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": "Tue, 26 Nov 2019 23:39:52 -0000"
    },
    "content": "With FrameBuffer interface in place there is no need for the Camera to\ncall into the specific pipelines allocation and freeing of buffers as it\nno longer needs to be synced with buffer allocation by the application.\n\nRemove the function prototypes in the pipeline handler base class and\nfold the functionality in the pipelines start() and stop() functions\nwhere needed. A follow up patch will remove the now no-op\nCamera::allocateBuffers() and Camera::freeBuffers().\n\nSigned-off-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>\n---\n src/libcamera/camera.cpp                 |  8 +------\n src/libcamera/include/pipeline_handler.h |  5 ----\n src/libcamera/pipeline/ipu3/ipu3.cpp     | 21 +++++++++--------\n src/libcamera/pipeline/rkisp1/rkisp1.cpp | 21 ++++++++++-------\n src/libcamera/pipeline/uvcvideo.cpp      | 17 --------------\n src/libcamera/pipeline/vimc.cpp          | 17 --------------\n src/libcamera/pipeline_handler.cpp       | 29 ------------------------\n 7 files changed, 26 insertions(+), 92 deletions(-)",
    "diff": "diff --git a/src/libcamera/camera.cpp b/src/libcamera/camera.cpp\nindex 05fdcaab8f918afa..12878a1c2e6076d3 100644\n--- a/src/libcamera/camera.cpp\n+++ b/src/libcamera/camera.cpp\n@@ -709,12 +709,6 @@ int Camera::allocateBuffers()\n \t\treturn -EINVAL;\n \t}\n \n-\tint ret = pipe_->allocateBuffers(this, activeStreams_);\n-\tif (ret) {\n-\t\tLOG(Camera, Error) << \"Failed to allocate buffers\";\n-\t\treturn ret;\n-\t}\n-\n \tstate_ = CameraPrepared;\n \n \treturn 0;\n@@ -735,7 +729,7 @@ int Camera::freeBuffers()\n \n \tstate_ = CameraConfigured;\n \n-\treturn pipe_->freeBuffers(this, activeStreams_);\n+\treturn 0;\n }\n \n /**\ndiff --git a/src/libcamera/include/pipeline_handler.h b/src/libcamera/include/pipeline_handler.h\nindex e4588f10bac0228c..9e5dca894aff45ae 100644\n--- a/src/libcamera/include/pipeline_handler.h\n+++ b/src/libcamera/include/pipeline_handler.h\n@@ -69,11 +69,6 @@ public:\n \t\tconst StreamRoles &roles) = 0;\n \tvirtual int configure(Camera *camera, CameraConfiguration *config) = 0;\n \n-\tvirtual int allocateBuffers(Camera *camera,\n-\t\t\t\t    const std::set<Stream *> &streams) = 0;\n-\tvirtual int freeBuffers(Camera *camera,\n-\t\t\t\tconst std::set<Stream *> &streams) = 0;\n-\n \tvirtual int start(Camera *camera) = 0;\n \tvirtual void stop(Camera *camera) = 0;\n \ndiff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp\nindex 8d9420aea3eb0b21..6d6ecb511777ec49 100644\n--- a/src/libcamera/pipeline/ipu3/ipu3.cpp\n+++ b/src/libcamera/pipeline/ipu3/ipu3.cpp\n@@ -215,10 +215,8 @@ public:\n \t\tconst StreamRoles &roles) override;\n \tint configure(Camera *camera, CameraConfiguration *config) override;\n \n-\tint allocateBuffers(Camera *camera,\n-\t\t\t    const std::set<Stream *> &streams) override;\n-\tint freeBuffers(Camera *camera,\n-\t\t\tconst std::set<Stream *> &streams) override;\n+\tint allocateBuffers(Camera *camera);\n+\tint freeBuffers(Camera *camera);\n \n \tint start(Camera *camera) override;\n \tvoid stop(Camera *camera) override;\n@@ -629,8 +627,7 @@ int PipelineHandlerIPU3::configure(Camera *camera, CameraConfiguration *c)\n  * In order to be able to start the 'viewfinder' and 'stat' nodes, we need\n  * memory to be reserved.\n  */\n-int PipelineHandlerIPU3::allocateBuffers(Camera *camera,\n-\t\t\t\t\t const std::set<Stream *> &streams)\n+int PipelineHandlerIPU3::allocateBuffers(Camera *camera)\n {\n \tIPU3CameraData *data = cameraData(camera);\n \tunsigned int bufferCount;\n@@ -670,13 +667,12 @@ int PipelineHandlerIPU3::allocateBuffers(Camera *camera,\n \n \treturn 0;\n error:\n-\tfreeBuffers(camera, streams);\n+\tfreeBuffers(camera);\n \n \treturn ret;\n }\n \n-int PipelineHandlerIPU3::freeBuffers(Camera *camera,\n-\t\t\t\t     const std::set<Stream *> &streams)\n+int PipelineHandlerIPU3::freeBuffers(Camera *camera)\n {\n \tIPU3CameraData *data = cameraData(camera);\n \n@@ -693,6 +689,10 @@ int PipelineHandlerIPU3::start(Camera *camera)\n \tImgUDevice *imgu = data->imgu_;\n \tint ret;\n \n+\tret = allocateBuffers(camera);\n+\tif (ret)\n+\t\treturn ret;\n+\n \t/*\n \t * Start the ImgU video devices, buffers will be queued to the\n \t * ImgU output and viewfinder when requests will be queued.\n@@ -711,6 +711,7 @@ int PipelineHandlerIPU3::start(Camera *camera)\n \treturn 0;\n \n error:\n+\tfreeBuffers(camera);\n \tLOG(IPU3, Error) << \"Failed to start camera \" << camera->name();\n \n \treturn ret;\n@@ -726,6 +727,8 @@ void PipelineHandlerIPU3::stop(Camera *camera)\n \tif (ret)\n \t\tLOG(IPU3, Warning) << \"Failed to stop camera \"\n \t\t\t\t   << camera->name();\n+\n+\tfreeBuffers(camera);\n }\n \n int PipelineHandlerIPU3::queueRequestHardware(Camera *camera, Request *request)\ndiff --git a/src/libcamera/pipeline/rkisp1/rkisp1.cpp b/src/libcamera/pipeline/rkisp1/rkisp1.cpp\nindex 96e863f0208fa748..a56c7022f57ce771 100644\n--- a/src/libcamera/pipeline/rkisp1/rkisp1.cpp\n+++ b/src/libcamera/pipeline/rkisp1/rkisp1.cpp\n@@ -174,10 +174,8 @@ public:\n \t\tconst StreamRoles &roles) override;\n \tint configure(Camera *camera, CameraConfiguration *config) override;\n \n-\tint allocateBuffers(Camera *camera,\n-\t\tconst std::set<Stream *> &streams) override;\n-\tint freeBuffers(Camera *camera,\n-\t\tconst std::set<Stream *> &streams) override;\n+\tint allocateBuffers(Camera *camera);\n+\tint freeBuffers(Camera *camera);\n \n \tint start(Camera *camera) override;\n \tvoid stop(Camera *camera) override;\n@@ -651,8 +649,7 @@ int PipelineHandlerRkISP1::configure(Camera *camera, CameraConfiguration *c)\n \treturn 0;\n }\n \n-int PipelineHandlerRkISP1::allocateBuffers(Camera *camera,\n-\t\t\t\t\t   const std::set<Stream *> &streams)\n+int PipelineHandlerRkISP1::allocateBuffers(Camera *camera)\n {\n \tRkISP1CameraData *data = cameraData(camera);\n \tstd::vector<FrameBuffer *> paramBuffers, statBuffers;\n@@ -695,8 +692,7 @@ err:\n \treturn ret;\n }\n \n-int PipelineHandlerRkISP1::freeBuffers(Camera *camera,\n-\t\t\t\t       const std::set<Stream *> &streams)\n+int PipelineHandlerRkISP1::freeBuffers(Camera *camera)\n {\n \tRkISP1CameraData *data = cameraData(camera);\n \n@@ -731,10 +727,15 @@ int PipelineHandlerRkISP1::start(Camera *camera)\n \tRkISP1CameraData *data = cameraData(camera);\n \tint ret;\n \n+\tret = allocateBuffers(camera);\n+\tif (ret)\n+\t\treturn ret;\n+\n \tdata->frame_ = 0;\n \n \tret = param_->streamOn();\n \tif (ret) {\n+\t\tfreeBuffers(camera);\n \t\tLOG(RkISP1, Error)\n \t\t\t<< \"Failed to start parameters \" << camera->name();\n \t\treturn ret;\n@@ -743,6 +744,7 @@ int PipelineHandlerRkISP1::start(Camera *camera)\n \tret = stat_->streamOn();\n \tif (ret) {\n \t\tparam_->streamOff();\n+\t\tfreeBuffers(camera);\n \t\tLOG(RkISP1, Error)\n \t\t\t<< \"Failed to start statistics \" << camera->name();\n \t\treturn ret;\n@@ -752,6 +754,7 @@ int PipelineHandlerRkISP1::start(Camera *camera)\n \tif (ret) {\n \t\tparam_->streamOff();\n \t\tstat_->streamOff();\n+\t\tfreeBuffers(camera);\n \n \t\tLOG(RkISP1, Error)\n \t\t\t<< \"Failed to start camera \" << camera->name();\n@@ -796,6 +799,8 @@ void PipelineHandlerRkISP1::stop(Camera *camera)\n \n \tdata->timeline_.reset();\n \n+\tfreeBuffers(camera);\n+\n \tactiveCamera_ = nullptr;\n }\n \ndiff --git a/src/libcamera/pipeline/uvcvideo.cpp b/src/libcamera/pipeline/uvcvideo.cpp\nindex c275b9f0f75429bd..2be7864ef59e932b 100644\n--- a/src/libcamera/pipeline/uvcvideo.cpp\n+++ b/src/libcamera/pipeline/uvcvideo.cpp\n@@ -65,11 +65,6 @@ public:\n \t\tconst StreamRoles &roles) override;\n \tint configure(Camera *camera, CameraConfiguration *config) override;\n \n-\tint allocateBuffers(Camera *camera,\n-\t\t\t    const std::set<Stream *> &streams) override;\n-\tint freeBuffers(Camera *camera,\n-\t\t\tconst std::set<Stream *> &streams) override;\n-\n \tint start(Camera *camera) override;\n \tvoid stop(Camera *camera) override;\n \n@@ -193,18 +188,6 @@ int PipelineHandlerUVC::configure(Camera *camera, CameraConfiguration *config)\n \treturn 0;\n }\n \n-int PipelineHandlerUVC::allocateBuffers(Camera *camera,\n-\t\t\t\t\tconst std::set<Stream *> &streams)\n-{\n-\treturn 0;\n-}\n-\n-int PipelineHandlerUVC::freeBuffers(Camera *camera,\n-\t\t\t\t    const std::set<Stream *> &streams)\n-{\n-\treturn 0;\n-}\n-\n int PipelineHandlerUVC::start(Camera *camera)\n {\n \tUVCCameraData *data = cameraData(camera);\ndiff --git a/src/libcamera/pipeline/vimc.cpp b/src/libcamera/pipeline/vimc.cpp\nindex 64793788c752c791..cacf8bfe3ff9cc45 100644\n--- a/src/libcamera/pipeline/vimc.cpp\n+++ b/src/libcamera/pipeline/vimc.cpp\n@@ -84,11 +84,6 @@ public:\n \t\tconst StreamRoles &roles) override;\n \tint configure(Camera *camera, CameraConfiguration *config) override;\n \n-\tint allocateBuffers(Camera *camera,\n-\t\t\t    const std::set<Stream *> &streams) override;\n-\tint freeBuffers(Camera *camera,\n-\t\t\tconst std::set<Stream *> &streams) override;\n-\n \tint start(Camera *camera) override;\n \tvoid stop(Camera *camera) override;\n \n@@ -261,18 +256,6 @@ int PipelineHandlerVimc::configure(Camera *camera, CameraConfiguration *config)\n \treturn 0;\n }\n \n-int PipelineHandlerVimc::allocateBuffers(Camera *camera,\n-\t\t\t\t\t const std::set<Stream *> &streams)\n-{\n-\treturn 0;\n-}\n-\n-int PipelineHandlerVimc::freeBuffers(Camera *camera,\n-\t\t\t\t     const std::set<Stream *> &streams)\n-{\n-\treturn 0;\n-}\n-\n int PipelineHandlerVimc::start(Camera *camera)\n {\n \tVimcCameraData *data = cameraData(camera);\ndiff --git a/src/libcamera/pipeline_handler.cpp b/src/libcamera/pipeline_handler.cpp\nindex b107e23258dee692..67758f3f1ebc39e5 100644\n--- a/src/libcamera/pipeline_handler.cpp\n+++ b/src/libcamera/pipeline_handler.cpp\n@@ -287,35 +287,6 @@ const ControlInfoMap &PipelineHandler::controls(Camera *camera)\n  * \\return 0 on success or a negative error code otherwise\n  */\n \n-/**\n- * \\fn PipelineHandler::allocateBuffers()\n- * \\brief Allocate buffers for a stream\n- * \\param[in] camera The camera the \\a stream belongs to\n- * \\param[in] streams The set of streams to allocate buffers for\n- *\n- * This method allocates buffers internally in the pipeline handler for each\n- * stream in the \\a streams buffer set, and associates them with the stream's\n- * buffer pool.\n- *\n- * The intended caller of this method is the Camera class.\n- *\n- * \\return 0 on success or a negative error code otherwise\n- */\n-\n-/**\n- * \\fn PipelineHandler::freeBuffers()\n- * \\brief Free all buffers associated with a stream\n- * \\param[in] camera The camera the \\a stream belongs to\n- * \\param[in] streams The set of streams to free buffers from\n- *\n- * After a capture session has been stopped all buffers associated with each\n- * stream shall be freed.\n- *\n- * The intended caller of this method is the Camera class.\n- *\n- * \\return 0 on success or a negative error code otherwise\n- */\n-\n /**\n  * \\fn PipelineHandler::start()\n  * \\brief Start capturing from a group of streams\n",
    "prefixes": [
        "libcamera-devel",
        "29/30"
    ]
}