[{"id":10940,"web_url":"https://patchwork.libcamera.org/comment/10940/","msgid":"<20200628183800.GP1105424@oden.dyn.berto.se>","date":"2020-06-28T18:38:00","subject":"Re: [libcamera-devel] [PATCH 3/3] libcamera: pipelines: Fail if\n\tmore than one role is requested","submitter":{"id":5,"url":"https://patchwork.libcamera.org/api/people/5/","name":"Niklas Söderlund","email":"niklas.soderlund@ragnatech.se"},"content":"Hello Jacopo,\n\nThanks for your patch.\n\nOn 2020-06-28 18:17:23 +0200, Jacopo Mondi wrote:\n> The rkisp1, vimc, uvc and simple pipeline handlers only support a single\n> stream.\n> \n> Their generateConfiguration() implementations does not check how many\n> roles have been requested, silently ignoring requests for more than one\n> role that cannot be satisfied.\n> \n> Fix this and comply to the documented Camera API by failing if more than one\n> role is requested by applications.\n> \n> Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>\n\nReviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>\n\n> ---\n>  src/libcamera/pipeline/rkisp1/rkisp1.cpp     | 5 +++++\n>  src/libcamera/pipeline/simple/simple.cpp     | 5 +++++\n>  src/libcamera/pipeline/uvcvideo/uvcvideo.cpp | 5 +++++\n>  src/libcamera/pipeline/vimc/vimc.cpp         | 5 +++++\n>  4 files changed, 20 insertions(+)\n> \n> diff --git a/src/libcamera/pipeline/rkisp1/rkisp1.cpp b/src/libcamera/pipeline/rkisp1/rkisp1.cpp\n> index 3c01821135f8..6d5c7c39edf1 100644\n> --- a/src/libcamera/pipeline/rkisp1/rkisp1.cpp\n> +++ b/src/libcamera/pipeline/rkisp1/rkisp1.cpp\n> @@ -566,6 +566,11 @@ CameraConfiguration *PipelineHandlerRkISP1::generateConfiguration(Camera *camera\n>  \tif (roles.empty())\n>  \t\treturn config;\n>  \n> +\tif (roles.size() > 1) {\n> +\t\tdelete config;\n> +\t\treturn nullptr;\n> +\t}\n> +\n>  \tStreamConfiguration cfg{};\n>  \tcfg.pixelFormat = formats::NV12;\n>  \tcfg.size = data->sensor_->resolution();\n> diff --git a/src/libcamera/pipeline/simple/simple.cpp b/src/libcamera/pipeline/simple/simple.cpp\n> index 1ec8d0f7de03..20675de568a8 100644\n> --- a/src/libcamera/pipeline/simple/simple.cpp\n> +++ b/src/libcamera/pipeline/simple/simple.cpp\n> @@ -484,6 +484,11 @@ CameraConfiguration *SimplePipelineHandler::generateConfiguration(Camera *camera\n>  \tif (roles.empty())\n>  \t\treturn config;\n>  \n> +\tif (roles.size() > 1) {\n> +\t\tdelete config;\n> +\t\treturn nullptr;\n> +\t}\n> +\n>  \t/* Create the formats map. */\n>  \tstd::map<PixelFormat, std::vector<SizeRange>> formats;\n>  \tstd::transform(data->formats_.begin(), data->formats_.end(),\n> diff --git a/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp b/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp\n> index 80a0e77ba3fc..773480e0a821 100644\n> --- a/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp\n> +++ b/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp\n> @@ -158,6 +158,11 @@ CameraConfiguration *PipelineHandlerUVC::generateConfiguration(Camera *camera,\n>  \tif (roles.empty())\n>  \t\treturn config;\n>  \n> +\tif (roles.size() > 1) {\n> +\t\tdelete config;\n> +\t\treturn nullptr;\n> +\t}\n> +\n>  \tstd::map<V4L2PixelFormat, std::vector<SizeRange>> v4l2Formats =\n>  \t\tdata->video_->formats();\n>  \tstd::map<PixelFormat, std::vector<SizeRange>> deviceFormats;\n> diff --git a/src/libcamera/pipeline/vimc/vimc.cpp b/src/libcamera/pipeline/vimc/vimc.cpp\n> index b6530662a9ba..e0980fc4a64c 100644\n> --- a/src/libcamera/pipeline/vimc/vimc.cpp\n> +++ b/src/libcamera/pipeline/vimc/vimc.cpp\n> @@ -177,6 +177,11 @@ CameraConfiguration *PipelineHandlerVimc::generateConfiguration(Camera *camera,\n>  \tif (roles.empty())\n>  \t\treturn config;\n>  \n> +\tif (roles.size() > 1) {\n> +\t\tdelete config;\n> +\t\treturn nullptr;\n> +\t}\n> +\n>  \tstd::map<PixelFormat, std::vector<SizeRange>> formats;\n>  \n>  \tfor (const auto &pixelformat : pixelformats) {\n> -- \n> 2.27.0\n> \n> _______________________________________________\n> libcamera-devel mailing list\n> libcamera-devel@lists.libcamera.org\n> https://lists.libcamera.org/listinfo/libcamera-devel","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 4F343C2E66\n\tfor <parsemail@patchwork.libcamera.org>;\n\tSun, 28 Jun 2020 18:38:04 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id C8666609C9;\n\tSun, 28 Jun 2020 20:38:03 +0200 (CEST)","from mail-lf1-x143.google.com (mail-lf1-x143.google.com\n\t[IPv6:2a00:1450:4864:20::143])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id F2BB7603B5\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tSun, 28 Jun 2020 20:38:01 +0200 (CEST)","by mail-lf1-x143.google.com with SMTP id d21so7860911lfb.6\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tSun, 28 Jun 2020 11:38:01 -0700 (PDT)","from localhost (h-209-203.A463.priv.bahnhof.se. [155.4.209.203])\n\tby smtp.gmail.com with ESMTPSA id\n\tq2sm1561327ljp.135.2020.06.28.11.38.00\n\t(version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n\tSun, 28 Jun 2020 11:38:00 -0700 (PDT)"],"Authentication-Results":"lancelot.ideasonboard.com;\n\tdkim=fail reason=\"signature verification failed\" (2048-bit key;\n\tunprotected) header.d=ragnatech-se.20150623.gappssmtp.com\n\theader.i=@ragnatech-se.20150623.gappssmtp.com\n\theader.b=\"LJRUtxFD\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=ragnatech-se.20150623.gappssmtp.com; s=20150623;\n\th=date:from:to:cc:subject:message-id:references:mime-version\n\t:content-disposition:content-transfer-encoding:in-reply-to;\n\tbh=yW504gGhIeP/Bj3MHuXRz/Yh88AcnopA58S//Od6hMk=;\n\tb=LJRUtxFDGBxcFvjzEqVC8vA/iG9yoRN4bAOvVYXf6pI/b2GnAGQgxMM+VsnHQzB8iD\n\tUkUc/1wh2QoHG5UJVmvHhffaMhCARKHLSVZIRJ8iwkXk+mOZrmgRKhkYf8EYOMViJzOq\n\tjG/GnXEhrBmVbIr3nUGm1wtYXokM4o+VrSu0plpoXE+FUAl0G94bO5BEmfcGXdkzOB2+\n\t8AOpzfbMGU+tHz839XlgbN+b015kwXDQGuK8ogudG0ifwAOEwiV2dV5WF2bbI1lxY96Z\n\t/WBCOzWHD4j6VSoiTlIPx+ksp4fsoJaf7fn8VTQjmix2waPsN6rc0Pz+ewsvXeJW0Jp6\n\tqpsg==","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20161025;\n\th=x-gm-message-state:date:from:to:cc:subject:message-id:references\n\t:mime-version:content-disposition:content-transfer-encoding\n\t:in-reply-to;\n\tbh=yW504gGhIeP/Bj3MHuXRz/Yh88AcnopA58S//Od6hMk=;\n\tb=bNyMTPhWaH7EOHuvzwxkZNcihmBWdbg+D/6MVvYELNpPxjCa7A6THH6++SDhN2x1Ea\n\tvNjgk4c0v6ilSXAshJN4nBhOEbOTnEiXftCzL84c+3ix/n735Yo38sWDpa9eASynBRGD\n\tza/Yv8cvpDMJlSWlwdcc9xNpiq9evJH2rUt2dWjUZI+sD7Ilt3JwxbcqWgPC3U/C/CdJ\n\tU28nxSJftIy6jXZWeZbmWlYttwwK9qBIVi5ybs1gMlugx8TSM+7z1CI3hzk+dG0c8MJl\n\tSV3UaPCZM0tfOCK7SN4aopDtR/4Rhj8yhauVJ88iJArHq3PnyHpVhQpXoyCoBjfaGZKq\n\tbRSQ==","X-Gm-Message-State":"AOAM5329vln2cPypNl1sGWGvumcyXgGqETNKT/aPlWgj2LXbi5sIGxrb\n\tbmppwbZfvj6hokNbmsUk5REJqQ4bXuo=","X-Google-Smtp-Source":"ABdhPJyZ7qKWUScHaOylsnlvqMz4FJmJwTzqvllq6aFURc/HTwVeEN0LMpv2ouKUUMGS0HX5jRDBKA==","X-Received":"by 2002:a05:6512:108f:: with SMTP id\n\tj15mr7249020lfg.19.1593369481345; \n\tSun, 28 Jun 2020 11:38:01 -0700 (PDT)","Date":"Sun, 28 Jun 2020 20:38:00 +0200","From":"Niklas =?iso-8859-1?q?S=F6derlund?= <niklas.soderlund@ragnatech.se>","To":"Jacopo Mondi <jacopo@jmondi.org>","Message-ID":"<20200628183800.GP1105424@oden.dyn.berto.se>","References":"<20200628161723.30625-1-jacopo@jmondi.org>\n\t<20200628161723.30625-4-jacopo@jmondi.org>","MIME-Version":"1.0","Content-Disposition":"inline","In-Reply-To":"<20200628161723.30625-4-jacopo@jmondi.org>","Subject":"Re: [libcamera-devel] [PATCH 3/3] libcamera: pipelines: Fail if\n\tmore than one role is requested","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":"libcamera-devel@lists.libcamera.org","Content-Type":"text/plain; charset=\"iso-8859-1\"","Content-Transfer-Encoding":"quoted-printable","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":10945,"web_url":"https://patchwork.libcamera.org/comment/10945/","msgid":"<20200628205954.GZ6954@pendragon.ideasonboard.com>","date":"2020-06-28T20:59:54","subject":"Re: [libcamera-devel] [PATCH 3/3] libcamera: pipelines: Fail if\n\tmore than one role is requested","submitter":{"id":2,"url":"https://patchwork.libcamera.org/api/people/2/","name":"Laurent Pinchart","email":"laurent.pinchart@ideasonboard.com"},"content":"Hi Jacopo,\n\nThank you for the patch.\n\nOn Sun, Jun 28, 2020 at 06:17:23PM +0200, Jacopo Mondi wrote:\n> The rkisp1, vimc, uvc and simple pipeline handlers only support a single\n> stream.\n> \n> Their generateConfiguration() implementations does not check how many\n> roles have been requested, silently ignoring requests for more than one\n> role that cannot be satisfied.\n> \n> Fix this and comply to the documented Camera API by failing if more than one\n> role is requested by applications.\n\nI don't think this is needed, Camera::generateConfiguration() already\nhas\n\n\tif (roles.size() > streams().size())\n\t\treturn nullptr;\n\n> Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>\n> ---\n>  src/libcamera/pipeline/rkisp1/rkisp1.cpp     | 5 +++++\n>  src/libcamera/pipeline/simple/simple.cpp     | 5 +++++\n>  src/libcamera/pipeline/uvcvideo/uvcvideo.cpp | 5 +++++\n>  src/libcamera/pipeline/vimc/vimc.cpp         | 5 +++++\n>  4 files changed, 20 insertions(+)\n> \n> diff --git a/src/libcamera/pipeline/rkisp1/rkisp1.cpp b/src/libcamera/pipeline/rkisp1/rkisp1.cpp\n> index 3c01821135f8..6d5c7c39edf1 100644\n> --- a/src/libcamera/pipeline/rkisp1/rkisp1.cpp\n> +++ b/src/libcamera/pipeline/rkisp1/rkisp1.cpp\n> @@ -566,6 +566,11 @@ CameraConfiguration *PipelineHandlerRkISP1::generateConfiguration(Camera *camera\n>  \tif (roles.empty())\n>  \t\treturn config;\n>  \n> +\tif (roles.size() > 1) {\n> +\t\tdelete config;\n> +\t\treturn nullptr;\n> +\t}\n> +\n>  \tStreamConfiguration cfg{};\n>  \tcfg.pixelFormat = formats::NV12;\n>  \tcfg.size = data->sensor_->resolution();\n> diff --git a/src/libcamera/pipeline/simple/simple.cpp b/src/libcamera/pipeline/simple/simple.cpp\n> index 1ec8d0f7de03..20675de568a8 100644\n> --- a/src/libcamera/pipeline/simple/simple.cpp\n> +++ b/src/libcamera/pipeline/simple/simple.cpp\n> @@ -484,6 +484,11 @@ CameraConfiguration *SimplePipelineHandler::generateConfiguration(Camera *camera\n>  \tif (roles.empty())\n>  \t\treturn config;\n>  \n> +\tif (roles.size() > 1) {\n> +\t\tdelete config;\n> +\t\treturn nullptr;\n> +\t}\n> +\n>  \t/* Create the formats map. */\n>  \tstd::map<PixelFormat, std::vector<SizeRange>> formats;\n>  \tstd::transform(data->formats_.begin(), data->formats_.end(),\n> diff --git a/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp b/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp\n> index 80a0e77ba3fc..773480e0a821 100644\n> --- a/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp\n> +++ b/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp\n> @@ -158,6 +158,11 @@ CameraConfiguration *PipelineHandlerUVC::generateConfiguration(Camera *camera,\n>  \tif (roles.empty())\n>  \t\treturn config;\n>  \n> +\tif (roles.size() > 1) {\n> +\t\tdelete config;\n> +\t\treturn nullptr;\n> +\t}\n> +\n>  \tstd::map<V4L2PixelFormat, std::vector<SizeRange>> v4l2Formats =\n>  \t\tdata->video_->formats();\n>  \tstd::map<PixelFormat, std::vector<SizeRange>> deviceFormats;\n> diff --git a/src/libcamera/pipeline/vimc/vimc.cpp b/src/libcamera/pipeline/vimc/vimc.cpp\n> index b6530662a9ba..e0980fc4a64c 100644\n> --- a/src/libcamera/pipeline/vimc/vimc.cpp\n> +++ b/src/libcamera/pipeline/vimc/vimc.cpp\n> @@ -177,6 +177,11 @@ CameraConfiguration *PipelineHandlerVimc::generateConfiguration(Camera *camera,\n>  \tif (roles.empty())\n>  \t\treturn config;\n>  \n> +\tif (roles.size() > 1) {\n> +\t\tdelete config;\n> +\t\treturn nullptr;\n> +\t}\n> +\n>  \tstd::map<PixelFormat, std::vector<SizeRange>> formats;\n>  \n>  \tfor (const auto &pixelformat : pixelformats) {","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 05031C2E66\n\tfor <parsemail@patchwork.libcamera.org>;\n\tSun, 28 Jun 2020 21:00:00 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 9D3BE609C9;\n\tSun, 28 Jun 2020 22:59:59 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 28F23603B5\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tSun, 28 Jun 2020 22:59:58 +0200 (CEST)","from pendragon.ideasonboard.com (81-175-216-236.bb.dnainternet.fi\n\t[81.175.216.236])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 8FFD24FB;\n\tSun, 28 Jun 2020 22:59:57 +0200 (CEST)"],"Authentication-Results":"lancelot.ideasonboard.com;\n\tdkim=fail reason=\"signature verification failed\" (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"ni00PfHM\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1593377997;\n\tbh=OxXOJqaNYHfe6UqBTXMW1p9mirRzIdzz3bCReZrivqc=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=ni00PfHMquqByjuovXOeSfhNPiS1fQUMrPuPV5Lsov1T04NRsCCY4XAkml+1LwGwU\n\t84/NPCDcR42zEu2S3+BbuQA5xf1/wlS48iB9aLFMI988kByciZ9CQDzQGPS0LkytnT\n\t8GqWfmMeOn82HMbla5hZhbgDcJe/DcNDe0X4udwA=","Date":"Sun, 28 Jun 2020 23:59:54 +0300","From":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","To":"Jacopo Mondi <jacopo@jmondi.org>","Message-ID":"<20200628205954.GZ6954@pendragon.ideasonboard.com>","References":"<20200628161723.30625-1-jacopo@jmondi.org>\n\t<20200628161723.30625-4-jacopo@jmondi.org>","MIME-Version":"1.0","Content-Disposition":"inline","In-Reply-To":"<20200628161723.30625-4-jacopo@jmondi.org>","Subject":"Re: [libcamera-devel] [PATCH 3/3] libcamera: pipelines: Fail if\n\tmore than one role is requested","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":"libcamera-devel@lists.libcamera.org","Content-Type":"text/plain; charset=\"us-ascii\"","Content-Transfer-Encoding":"7bit","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}}]