Show a patch.

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

{
    "id": 3649,
    "url": "https://patchwork.libcamera.org/api/1.1/patches/3649/?format=api",
    "web_url": "https://patchwork.libcamera.org/patch/3649/",
    "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": "<20200501143021.404090-1-niklas.soderlund@ragnatech.se>",
    "date": "2020-05-01T14:30:21",
    "name": "[libcamera-devel] libcamera: stream: Expose stride value",
    "commit_ref": null,
    "pull_url": null,
    "state": "accepted",
    "archived": false,
    "hash": "bcff8a610b86af353a7aba63c81a81f12896a079",
    "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/3649/mbox/",
    "series": [
        {
            "id": 865,
            "url": "https://patchwork.libcamera.org/api/1.1/series/865/?format=api",
            "web_url": "https://patchwork.libcamera.org/project/libcamera/list/?series=865",
            "date": "2020-05-01T14:30:21",
            "name": "[libcamera-devel] libcamera: stream: Expose stride value",
            "version": 1,
            "mbox": "https://patchwork.libcamera.org/series/865/mbox/"
        }
    ],
    "comments": "https://patchwork.libcamera.org/api/patches/3649/comments/",
    "check": "pending",
    "checks": "https://patchwork.libcamera.org/api/patches/3649/checks/",
    "tags": {},
    "headers": {
        "Return-Path": "<niklas.soderlund@ragnatech.se>",
        "Received": [
            "from vsp-unauthed02.binero.net (vsp-unauthed02.binero.net\n\t[195.74.38.227])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 4A101603F2\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri,  1 May 2020 16:30:41 +0200 (CEST)",
            "from bismarck.berto.se (p4fca2392.dip0.t-ipconnect.de\n\t[79.202.35.146]) by bin-vsp-out-01.atm.binero.net (Halon) with ESMTPA\n\tid 4989eff3-8bb8-11ea-b7d8-005056917a89;\n\tFri, 01 May 2020 16:30:36 +0200 (CEST)"
        ],
        "X-Halon-ID": "4989eff3-8bb8-11ea-b7d8-005056917a89",
        "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": "Fri,  1 May 2020 16:30:21 +0200",
        "Message-Id": "<20200501143021.404090-1-niklas.soderlund@ragnatech.se>",
        "X-Mailer": "git-send-email 2.26.2",
        "MIME-Version": "1.0",
        "Content-Type": "text/plain; charset=UTF-8",
        "Content-Transfer-Encoding": "8bit",
        "Subject": "[libcamera-devel] [PATCH] libcamera: stream: Expose stride value",
        "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": "Fri, 01 May 2020 14:30:41 -0000"
    },
    "content": "Expose the image stride  which may be retrieved after a video device\nhave been configured. It may only be retrieved at that point as the\nassignment of video devices takes place at this point.\n\nIn the future video devices should be assign at configuration validation\ntime and the stride value retrieved at that point.\n\nSigned-off-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>\n---\n include/libcamera/stream.h                   |  1 +\n src/libcamera/pipeline/ipu3/ipu3.cpp         | 42 ++++++++++++--------\n src/libcamera/pipeline/rkisp1/rkisp1.cpp     |  1 +\n src/libcamera/pipeline/uvcvideo/uvcvideo.cpp |  1 +\n src/libcamera/pipeline/vimc/vimc.cpp         |  1 +\n src/libcamera/stream.cpp                     |  7 ++++\n 6 files changed, 36 insertions(+), 17 deletions(-)",
    "diff": "diff --git a/include/libcamera/stream.h b/include/libcamera/stream.h\nindex 18142dc997bb8885..b3cbea3d52294846 100644\n--- a/include/libcamera/stream.h\n+++ b/include/libcamera/stream.h\n@@ -42,6 +42,7 @@ struct StreamConfiguration {\n \n \tPixelFormat pixelFormat;\n \tSize size;\n+\tunsigned int stride;\n \n \tunsigned int bufferCount;\n \ndiff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp\nindex ff33f15f9eac3b68..0f9ffd411a680ad9 100644\n--- a/src/libcamera/pipeline/ipu3/ipu3.cpp\n+++ b/src/libcamera/pipeline/ipu3/ipu3.cpp\n@@ -77,7 +77,8 @@ public:\n \tint configureInput(const Size &size,\n \t\t\t   V4L2DeviceFormat *inputFormat);\n \tint configureOutput(ImgUOutput *output,\n-\t\t\t    const StreamConfiguration &cfg);\n+\t\t\t    const StreamConfiguration &cfg,\n+\t\t\t    V4L2DeviceFormat *outputFormat);\n \n \tint allocateBuffers(IPU3CameraData *data, unsigned int bufferCount);\n \tvoid freeBuffers(IPU3CameraData *data);\n@@ -546,6 +547,7 @@ int PipelineHandlerIPU3::configure(Camera *camera, CameraConfiguration *c)\n \tIPU3Stream *vfStream = &data->vfStream_;\n \tCIO2Device *cio2 = &data->cio2_;\n \tImgUDevice *imgu = data->imgu_;\n+\tV4L2DeviceFormat outputFormat;\n \tint ret;\n \n \t/*\n@@ -625,12 +627,15 @@ int PipelineHandlerIPU3::configure(Camera *camera, CameraConfiguration *c)\n \t\t * The RAW still capture stream just copies buffers from the\n \t\t * internal queue and doesn't need any specific configuration.\n \t\t */\n-\t\tif (stream->raw_)\n-\t\t\tcontinue;\n-\n-\t\tret = imgu->configureOutput(stream->device_, cfg);\n-\t\tif (ret)\n-\t\t\treturn ret;\n+\t\tif (stream->raw_) {\n+\t\t\tcfg.stride = cio2Format.planes[0].bpl;\n+\t\t} else {\n+\t\t\tret = imgu->configureOutput(stream->device_, cfg,\n+\t\t\t\t\t\t    &outputFormat);\n+\t\t\tif (ret)\n+\t\t\t\treturn ret;\n+\t\t\tcfg.stride = outputFormat.planes[0].bpl;\n+\t\t}\n \t}\n \n \t/*\n@@ -639,13 +644,15 @@ int PipelineHandlerIPU3::configure(Camera *camera, CameraConfiguration *c)\n \t * be at least one active stream in the configuration request).\n \t */\n \tif (!outStream->active_) {\n-\t\tret = imgu->configureOutput(outStream->device_, config->at(0));\n+\t\tret = imgu->configureOutput(outStream->device_, config->at(0),\n+\t\t\t\t\t    &outputFormat);\n \t\tif (ret)\n \t\t\treturn ret;\n \t}\n \n \tif (!vfStream->active_) {\n-\t\tret = imgu->configureOutput(vfStream->device_, config->at(0));\n+\t\tret = imgu->configureOutput(vfStream->device_, config->at(0),\n+\t\t\t\t\t    &outputFormat);\n \t\tif (ret)\n \t\t\treturn ret;\n \t}\n@@ -657,7 +664,7 @@ int PipelineHandlerIPU3::configure(Camera *camera, CameraConfiguration *c)\n \tStreamConfiguration statCfg = {};\n \tstatCfg.size = cio2Format.size;\n \n-\tret = imgu->configureOutput(&imgu->stat_, statCfg);\n+\tret = imgu->configureOutput(&imgu->stat_, statCfg, &outputFormat);\n \tif (ret)\n \t\treturn ret;\n \n@@ -1166,7 +1173,8 @@ int ImgUDevice::configureInput(const Size &size,\n  * \\return 0 on success or a negative error code otherwise\n  */\n int ImgUDevice::configureOutput(ImgUOutput *output,\n-\t\t\t\tconst StreamConfiguration &cfg)\n+\t\t\t\tconst StreamConfiguration &cfg,\n+\t\t\t\tV4L2DeviceFormat *outputFormat)\n {\n \tV4L2VideoDevice *dev = output->dev;\n \tunsigned int pad = output->pad;\n@@ -1183,17 +1191,17 @@ int ImgUDevice::configureOutput(ImgUOutput *output,\n \tif (output == &stat_)\n \t\treturn 0;\n \n-\tV4L2DeviceFormat outputFormat = {};\n-\toutputFormat.fourcc = dev->toV4L2PixelFormat(PixelFormat(DRM_FORMAT_NV12));\n-\toutputFormat.size = cfg.size;\n-\toutputFormat.planesCount = 2;\n+\t*outputFormat = {};\n+\toutputFormat->fourcc = dev->toV4L2PixelFormat(PixelFormat(DRM_FORMAT_NV12));\n+\toutputFormat->size = cfg.size;\n+\toutputFormat->planesCount = 2;\n \n-\tret = dev->setFormat(&outputFormat);\n+\tret = dev->setFormat(outputFormat);\n \tif (ret)\n \t\treturn ret;\n \n \tLOG(IPU3, Debug) << \"ImgU \" << output->name << \" format = \"\n-\t\t\t << outputFormat.toString();\n+\t\t\t << outputFormat->toString();\n \n \treturn 0;\n }\ndiff --git a/src/libcamera/pipeline/rkisp1/rkisp1.cpp b/src/libcamera/pipeline/rkisp1/rkisp1.cpp\nindex 6aa3178669b40a37..1e81a0048f093d8f 100644\n--- a/src/libcamera/pipeline/rkisp1/rkisp1.cpp\n+++ b/src/libcamera/pipeline/rkisp1/rkisp1.cpp\n@@ -681,6 +681,7 @@ int PipelineHandlerRkISP1::configure(Camera *camera, CameraConfiguration *c)\n \t\treturn ret;\n \n \tcfg.setStream(&data->stream_);\n+\tcfg.stride = outputFormat.planes[0].bpl;\n \n \treturn 0;\n }\ndiff --git a/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp b/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp\nindex 455693264c2e3e67..f0c1337de8623a6b 100644\n--- a/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp\n+++ b/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp\n@@ -204,6 +204,7 @@ int PipelineHandlerUVC::configure(Camera *camera, CameraConfiguration *config)\n \t\treturn -EINVAL;\n \n \tcfg.setStream(&data->stream_);\n+\tcfg.stride = format.planes[0].bpl;\n \n \treturn 0;\n }\ndiff --git a/src/libcamera/pipeline/vimc/vimc.cpp b/src/libcamera/pipeline/vimc/vimc.cpp\nindex ccfd7f86d15860c5..7019ac322e6c2c59 100644\n--- a/src/libcamera/pipeline/vimc/vimc.cpp\n+++ b/src/libcamera/pipeline/vimc/vimc.cpp\n@@ -253,6 +253,7 @@ int PipelineHandlerVimc::configure(Camera *camera, CameraConfiguration *config)\n \t\treturn ret;\n \n \tcfg.setStream(&data->stream_);\n+\tcfg.stride = format.planes[0].bpl;\n \n \treturn 0;\n }\ndiff --git a/src/libcamera/stream.cpp b/src/libcamera/stream.cpp\nindex ef16aaa1b2f4586a..0a2468d92039676c 100644\n--- a/src/libcamera/stream.cpp\n+++ b/src/libcamera/stream.cpp\n@@ -301,6 +301,13 @@ StreamConfiguration::StreamConfiguration(const StreamFormats &formats)\n  * \\brief Stream pixel format\n  */\n \n+/**\n+ * \\var StreamConfiguration::stride\n+ * \\brief Stream stride in bytes\n+ * \\todo Update this value when configuration is validated instead of when\n+ * the camera is configured.\n+ */\n+\n /**\n  * \\var StreamConfiguration::bufferCount\n  * \\brief Requested number of buffers to allocate for the stream\n",
    "prefixes": [
        "libcamera-devel"
    ]
}