[{"id":11383,"web_url":"https://patchwork.libcamera.org/comment/11383/","msgid":"<913d1087-f584-6559-8fa7-ba72c77831a3@ideasonboard.com>","date":"2020-07-14T14:08:58","subject":"Re: [libcamera-devel] [PATCH 4/9] libcamera: pipeline: vivid:\n\tGenerate and validate StreamConfigurations","submitter":{"id":4,"url":"https://patchwork.libcamera.org/api/people/4/","name":"Kieran Bingham","email":"kieran.bingham@ideasonboard.com"},"content":"Hi Kieran,\n\nOn 13/07/2020 14:24, Kieran Bingham wrote:\n> Implement the support for Generating and Validating the streams the\n> Camera can provide.\n> \n> Vivid is a simple case with only a single stream.\n> \n> Test the configurations can be generated and reported with cam -I:\n> \n> \"\"\"\n> LIBCAMERA_LOG_LEVELS=Pipeline,VIVID:0 ./src/cam/cam -c 1 -I\n> [232:02:09.633067174] [2882911]  INFO IPAManager ipa_manager.cpp:136 libcamera is not installed. Adding '/home//libcamera/build-vivid/src/ipa' to the IPA search path\n> [232:02:09.633332451] [2882911]  WARN IPAManager ipa_manager.cpp:147 No IPA found in '/usr/local/lib/x86_64-linux-gnu/libcamera'\n> [232:02:09.633373414] [2882911]  INFO Camera camera_manager.cpp:283 libcamera v0.0.11+714-d1ebd889-dirty\n> Using camera vivid\n> 0: 1280x720-BGR888\n>  * Pixelformat: NV21 (320x180)-(3840x2160)/(+0,+0)\n>   - 320x180\n>   - 640x360\n>   - 640x480\n>   - 1280x720\n>   - 1920x1080\n>   - 3840x2160\n>  * Pixelformat: NV12 (320x180)-(3840x2160)/(+0,+0)\n>   - 320x180\n>   - 640x360\n>   - 640x480\n>   - 1280x720\n>   - 1920x1080\n>   - 3840x2160\n>  * Pixelformat: BGRA8888 (320x180)-(3840x2160)/(+0,+0)\n>   - 320x180\n>   - 640x360\n>   - 640x480\n>   - 1280x720\n>   - 1920x1080\n>   - 3840x2160\n>  * Pixelformat: RGBA8888 (320x180)-(3840x2160)/(+0,+0)\n>   - 320x180\n>   - 640x360\n>   - 640x480\n>   - 1280x720\n>   - 1920x1080\n>   - 3840x2160\n> \n> \"\"\"\n> \n> Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>\n> ---\n>  src/libcamera/pipeline/vivid/vivid.cpp | 74 +++++++++++++++++++++++++-\n>  1 file changed, 73 insertions(+), 1 deletion(-)\n> \n> diff --git a/src/libcamera/pipeline/vivid/vivid.cpp b/src/libcamera/pipeline/vivid/vivid.cpp\n> index a8922ce70ed4..9e95bae8bc30 100644\n> --- a/src/libcamera/pipeline/vivid/vivid.cpp\n> +++ b/src/libcamera/pipeline/vivid/vivid.cpp\n> @@ -6,6 +6,7 @@\n>   */\n>  \n>  #include <libcamera/camera.h>\n> +#include <libcamera/formats.h>\n>  \n>  #include \"libcamera/internal/device_enumerator.h\"\n>  #include \"libcamera/internal/log.h\"\n> @@ -63,8 +64,50 @@ public:\n>  \tint queueRequestDevice(Camera *camera, Request *request) override;\n>  \n>  \tbool match(DeviceEnumerator *enumerator) override;\n> +\n> +private:\n> +\tint processControls(VividCameraData *data, Request *request);\n> +\n> +\tVividCameraData *cameraData(const Camera *camera)\n> +\t{\n> +\t\treturn static_cast<VividCameraData *>(\n> +\t\t\tPipelineHandler::cameraData(camera));\n> +\t}\n>  };\n>  \n> +VividCameraConfiguration::VividCameraConfiguration()\n> +\t: CameraConfiguration()\n> +{\n> +}\n\nIs it odd / necessary to create the constructor for the\nCameraConfiguration here, I expect the CameraConfiguration constructor\nwould be called anyway, so we could remove this constructor...\n\nOn the other hand perhaps it's helpful to have it here as part of the\nskeleton for developers adding their own more complicated components...\n\n> +\n> +CameraConfiguration::Status VividCameraConfiguration::validate()\n> +{\n> +\tStatus status = Valid;\n> +\n> +\tif (config_.empty())\n> +\t\treturn Invalid;\n> +\n> +\t/* Cap the number of entries to the available streams. */\n> +\tif (config_.size() > 1) {\n> +\t\tconfig_.resize(1);\n> +\t\tstatus = Adjusted;\n> +\t}\n> +\n> +\tStreamConfiguration &cfg = config_[0];\n> +\n> +\t/* Adjust the pixel format. */\n> +\tconst std::vector<libcamera::PixelFormat> formats = cfg.formats().pixelformats();\n> +\tif (std::find(formats.begin(), formats.end(), cfg.pixelFormat) == formats.end()) {\n> +\t\tcfg.pixelFormat = cfg.formats().pixelformats()[0];\n> +\t\tLOG(VIVID, Debug) << \"Adjusting format to \" << cfg.pixelFormat.toString();\n> +\t\tstatus = Adjusted;\n> +\t}\n> +\n> +\tcfg.bufferCount = 4;\n> +\n> +\treturn status;\n> +}\n> +\n>  PipelineHandlerVivid::PipelineHandlerVivid(CameraManager *manager)\n>  \t: PipelineHandler(manager)\n>  {\n> @@ -73,7 +116,36 @@ PipelineHandlerVivid::PipelineHandlerVivid(CameraManager *manager)\n>  CameraConfiguration *PipelineHandlerVivid::generateConfiguration(Camera *camera,\n>  \t\t\t\t\t\t\t\t const StreamRoles &roles)\n>  {\n> -\treturn nullptr;\n> +\tCameraConfiguration *config = new VividCameraConfiguration();\n> +\tVividCameraData *data = cameraData(camera);\n> +\n> +\tif (roles.empty())\n> +\t\treturn config;\n> +\n> +\tstd::map<V4L2PixelFormat, std::vector<SizeRange>> v4l2Formats =\n> +\t\tdata->video_->formats();\n> +\tstd::map<PixelFormat, std::vector<SizeRange>> deviceFormats;\n> +\tstd::transform(v4l2Formats.begin(), v4l2Formats.end(),\n> +\t\t       std::inserter(deviceFormats, deviceFormats.begin()),\n> +\t\t       [&](const decltype(v4l2Formats)::value_type &format) {\n> +\t\t\t       return decltype(deviceFormats)::value_type{\n> +\t\t\t\t       format.first.toPixelFormat(),\n> +\t\t\t\t       format.second\n> +\t\t\t       };\n> +\t\t       });\n> +\n> +\tStreamFormats formats(deviceFormats);\n> +\tStreamConfiguration cfg(formats);\n> +\n> +\tcfg.pixelFormat = formats::BGR888;\n> +\tcfg.size = { 1280, 720 };\n> +\tcfg.bufferCount = 4;\n> +\n> +\tconfig->addConfiguration(cfg);\n> +\n> +\tconfig->validate();\n> +\n> +\treturn config;\n>  }\n>  \n>  int PipelineHandlerVivid::configure(Camera *camera, CameraConfiguration *config)\n>","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 B7C6EBD790\n\tfor <parsemail@patchwork.libcamera.org>;\n\tTue, 14 Jul 2020 14:09:05 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 26912605B0;\n\tTue, 14 Jul 2020 16:09:05 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id AB5A360484\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue, 14 Jul 2020 16:09:03 +0200 (CEST)","from [192.168.0.20]\n\t(cpc89242-aztw30-2-0-cust488.18-1.cable.virginm.net [86.31.129.233])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 1507A71D;\n\tTue, 14 Jul 2020 16:09:03 +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=\"v94O7ziv\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1594735743;\n\tbh=0jb3Rrow9/uCkVe6ctSV2/KO6On6hdo/D/BtZVrNaJQ=;\n\th=Reply-To:Subject:To:Cc:References:From:Date:In-Reply-To:From;\n\tb=v94O7zivVzhyiRxk2fhM7THIPD3kbJ5JFVnTg74keg3pkbci5XHGOlbxTGnZCGdqd\n\tZlo8Kgan+mBG/KBZ577sQgGDwu7o9ADLCWEYWJdZDIURU1xcGPHcqmcsfLM3fDVn3N\n\tFvm+qz3hiGLPuQQK6bj2YZ/xFjYcq8DIrE0Qf144=","To":"libcamera devel <libcamera-devel@lists.libcamera.org>","References":"<20200713132451.2944673-1-kieran.bingham@ideasonboard.com>\n\t<20200713132451.2944673-5-kieran.bingham@ideasonboard.com>","From":"Kieran Bingham <kieran.bingham@ideasonboard.com>","Autocrypt":"addr=kieran.bingham@ideasonboard.com; keydata=\n\t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\n\tWZw01QYHU/GUV/zHJSFk","Organization":"Ideas on Board","Message-ID":"<913d1087-f584-6559-8fa7-ba72c77831a3@ideasonboard.com>","Date":"Tue, 14 Jul 2020 15:08:58 +0100","User-Agent":"Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101\n\tThunderbird/68.8.0","MIME-Version":"1.0","In-Reply-To":"<20200713132451.2944673-5-kieran.bingham@ideasonboard.com>","Content-Language":"en-GB","Subject":"Re: [libcamera-devel] [PATCH 4/9] libcamera: pipeline: vivid:\n\tGenerate and validate StreamConfigurations","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>","Reply-To":"kieran.bingham@ideasonboard.com","Cc":"Chris Ward <chris@gregariousmammal.com>","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>"}}]