[{"id":23354,"web_url":"https://patchwork.libcamera.org/comment/23354/","msgid":"<20220608154922.2a8affa5.dorota.czaplejewicz@puri.sm>","date":"2022-06-08T13:49:22","subject":"Re: [libcamera-devel] [PATCH 3/5] libcamera: pipeline: simple:\n\tFactor out format test to separate function","submitter":{"id":96,"url":"https://patchwork.libcamera.org/api/people/96/","name":"Dorota Czaplejewicz","email":"dorota.czaplejewicz@puri.sm"},"content":"On Wed,  4 May 2022 16:21:52 +0300\nlaurent.pinchart at ideasonboard.com (Laurent Pinchart) wrote:\n\n> To prepare for the implementation of a more complex format discovery\n> method, factor out code that tries a pipeline configuration to a\n> separate function. No functional change intended.\n> \n> Signed-off-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>\n> ---\n>  src/libcamera/pipeline/simple/simple.cpp | 110 ++++++++++++-----------\n>  1 file changed, 59 insertions(+), 51 deletions(-)\n> \n> diff --git a/src/libcamera/pipeline/simple/simple.cpp b/src/libcamera/pipeline/simple/simple.cpp\n> index 4f963df16315..19deb9447c96 100644\n> --- a/src/libcamera/pipeline/simple/simple.cpp\n> +++ b/src/libcamera/pipeline/simple/simple.cpp\n> @@ -250,6 +250,9 @@ public:\n>  \tstd::queue<std::map<unsigned int, FrameBuffer *>> converterQueue_;\n>  \n>  private:\n> +\tvoid tryPipeline(unsigned int code, const Size &size);\n> +\tstatic std::vector<const MediaPad *> routedSourcePads(MediaPad *sink);\nThis doesn't seem to be used in this patch.\n\n> +\n>  \tvoid converterInputDone(FrameBuffer *buffer);\n>  \tvoid converterOutputDone(FrameBuffer *buffer);\n>  };\n> @@ -466,58 +469,11 @@ int SimpleCameraData::init()\n>  \t\treturn ret;\n>  \n>  \t/*\n> -\t * Enumerate the possible pipeline configurations. For each media bus\n> -\t * format supported by the sensor, propagate the formats through the\n> -\t * pipeline, and enumerate the corresponding possible V4L2 pixel\n> -\t * formats on the video node.\n> +\t * Generate the list of possible pipeline configurations by trying each\n> +\t * media bus format supported by the sensor.\n>  \t */\n> -\tfor (unsigned int code : sensor_->mbusCodes()) {\n> -\t\tV4L2SubdeviceFormat format{};\n> -\t\tformat.mbus_code = code;\n> -\t\tformat.size = sensor_->resolution();\n> -\n> -\t\tret = setupFormats(&format, V4L2Subdevice::TryFormat);\n> -\t\tif (ret < 0) {\n> -\t\t\tLOG(SimplePipeline, Debug)\n> -\t\t\t\t<< \"Media bus code \" << utils::hex(code, 4)\n> -\t\t\t\t<< \" not supported for this pipeline\";\n> -\t\t\t/* Try next mbus_code supported by the sensor */\n> -\t\t\tcontinue;\n> -\t\t}\n> -\n> -\t\tV4L2VideoDevice::Formats videoFormats =\n> -\t\t\tvideo_->formats(format.mbus_code);\n> -\n> -\t\tLOG(SimplePipeline, Debug)\n> -\t\t\t<< \"Adding configuration for \" << format.size\n> -\t\t\t<< \" in pixel formats [ \"\n> -\t\t\t<< utils::join(videoFormats, \", \",\n> -\t\t\t\t       [](const auto &f) {\n> -\t\t\t\t\t       return f.first.toString();\n> -\t\t\t\t       })\n> -\t\t\t<< \" ]\";\n> -\n> -\t\tfor (const auto &videoFormat : videoFormats) {\n> -\t\t\tPixelFormat pixelFormat = videoFormat.first.toPixelFormat();\n> -\t\t\tif (!pixelFormat)\n> -\t\t\t\tcontinue;\n> -\n> -\t\t\tConfiguration config;\n> -\t\t\tconfig.code = code;\n> -\t\t\tconfig.captureFormat = pixelFormat;\n> -\t\t\tconfig.captureSize = format.size;\n> -\n> -\t\t\tif (!converter_) {\n> -\t\t\t\tconfig.outputFormats = { pixelFormat };\n> -\t\t\t\tconfig.outputSizes = config.captureSize;\n> -\t\t\t} else {\n> -\t\t\t\tconfig.outputFormats = converter_->formats(pixelFormat);\n> -\t\t\t\tconfig.outputSizes = converter_->sizes(format.size);\n> -\t\t\t}\n> -\n> -\t\t\tconfigs_.push_back(config);\n> -\t\t}\n> -\t}\n> +\tfor (unsigned int code : sensor_->mbusCodes())\n> +\t\ttryPipeline(code, sensor_->resolution());\n>  \n>  \tif (configs_.empty()) {\n>  \t\tLOG(SimplePipeline, Error) << \"No valid configuration found\";\n> @@ -541,6 +497,58 @@ int SimpleCameraData::init()\n>  \treturn 0;\n>  }\n>  \n> +void SimpleCameraData::tryPipeline(unsigned int code, const Size &size)\n> +{\n> +\t/*\n> +\t * Propagate the format through the pipeline, and enumerate the\n> +\t * corresponding possible V4L2 pixel formats on the video node.\n> +\t */\nWhat are the output values/effects of this call? I can't easily track them, despite having rewritten this method twice in the past.\n\n--Dorota\n> +\tV4L2SubdeviceFormat format{};\n> +\tformat.mbus_code = code;\n> +\tformat.size = size;\n> +\n> +\tint ret = setupFormats(&format, V4L2Subdevice::TryFormat);\n> +\tif (ret < 0) {\n> +\t\t/* Pipeline configuration failed, skip this configuration. */\n> +\t\tLOG(SimplePipeline, Debug)\n> +\t\t\t<< \"Media bus code \" << utils::hex(code, 4)\n> +\t\t\t<< \" not supported for this pipeline\";\n> +\t\treturn;\n> +\t}\n> +\n> +\tV4L2VideoDevice::Formats videoFormats = video_->formats(format.mbus_code);\n> +\n> +\tLOG(SimplePipeline, Debug)\n> +\t\t<< \"Adding configuration for \" << format.size\n> +\t\t<< \" in pixel formats [ \"\n> +\t\t<< utils::join(videoFormats, \", \",\n> +\t\t\t       [](const auto &f) {\n> +\t\t\t\t       return f.first.toString();\n> +\t\t\t       })\n> +\t\t<< \" ]\";\n> +\n> +\tfor (const auto &videoFormat : videoFormats) {\n> +\t\tPixelFormat pixelFormat = videoFormat.first.toPixelFormat();\n> +\t\tif (!pixelFormat)\n> +\t\t\tcontinue;\n> +\n> +\t\tConfiguration config;\n> +\t\tconfig.code = code;\n> +\t\tconfig.captureFormat = pixelFormat;\n> +\t\tconfig.captureSize = format.size;\n> +\n> +\t\tif (!converter_) {\n> +\t\t\tconfig.outputFormats = { pixelFormat };\n> +\t\t\tconfig.outputSizes = config.captureSize;\n> +\t\t} else {\n> +\t\t\tconfig.outputFormats = converter_->formats(pixelFormat);\n> +\t\t\tconfig.outputSizes = converter_->sizes(format.size);\n> +\t\t}\n> +\n> +\t\tconfigs_.push_back(config);\n> +\t}\n> +}\n> +\n>  int SimpleCameraData::setupLinks()\n>  {\n>  \tint ret;","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 1178ABD161\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed,  8 Jun 2022 13:50:20 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 5671065633;\n\tWed,  8 Jun 2022 15:50:19 +0200 (CEST)","from comms.puri.sm (comms.puri.sm [159.203.221.185])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 5080165632\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed,  8 Jun 2022 15:50:16 +0200 (CEST)","from localhost (localhost [127.0.0.1])\n\tby comms.puri.sm (Postfix) with ESMTP id C3706DFF4B\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed,  8 Jun 2022 06:49:44 -0700 (PDT)","from comms.puri.sm ([127.0.0.1])\n\tby localhost (comms.puri.sm [127.0.0.1]) (amavisd-new, port 10024)\n\twith ESMTP id 5m0nErVzs64c for <libcamera-devel@lists.libcamera.org>; \n\tWed,  8 Jun 2022 06:49:44 -0700 (PDT)"],"DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org;\n\ts=mail; t=1654696219;\n\tbh=AD89MJkifN4GnGEG9WT/L3USlUw0r2QgXW0VauO9p/A=;\n\th=Date:To:In-Reply-To:References:Subject:List-Id:List-Unsubscribe:\n\tList-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To:\n\tFrom;\n\tb=bOKEoYGfmlKi/rQSLwJFArIjY6XdBbjTH7pC+pXq8iuyTAP14dsqSZPPt2JGyE/g3\n\t0u/8d0S3BC4JMD5O9q3rVKM3hy3DKkE/tSWRUAQC6ue3/SyzWfW5oONCZo/NWYDJ3A\n\tPDOZA1lPgSYGT7SPI9M2zGrr09fZNpLPZ0MMJXa4DluLMrvUHtfmvVX0V0LiiwRkcu\n\tZ5m7HG6QBW/wyMw9iffu57+WI++tssG2XKdA9Tr16X87vWAmxoG55lfeUxgLrZXY9t\n\tAo8usnhlKL+pPFUnaiQU9Ab0qk1P9V3Miyyulwe+Vqob5IzigpOtMjV34KZbC70UW6\n\thhYsQFy5HvZzg==","v=1; a=rsa-sha256; c=relaxed/simple; d=puri.sm; s=comms;\n\tt=1654696184; bh=AD89MJkifN4GnGEG9WT/L3USlUw0r2QgXW0VauO9p/A=;\n\th=Date:From:To:Subject:In-Reply-To:References:From;\n\tb=agKgN1OPCOpRFxcTnwkIKSPBctFeHHiW6hDyVSmZb+Hy0sIGWEGrOTYoIj4/6TZcD\n\tLkJOfJBQTUjCJAnixYnrQkwYQDa+V5m7b6obOt7hoJN5ctBldQPM00mTyzhS+xd5kc\n\tZVIQg2wYDpCHLS26xzWHUMhHSKzQ1sXAndmzKNycIus0trs0SGMIhgEfUGOYYorkC9\n\tk3mdpuAwvDIDmhKIFgB/MkdB1NOxO8iXKWfa0RQKkiNABiU+2CFc4fqCNwP8YukRXX\n\twaIix/dK/wuoD5ya+u9uuklSDwdyEsedRS6gueuqD2F1arWJ68UbHXuM7Hp9iH9qkA\n\tnTAwf8Zal/Jcw=="],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (2048-bit key; \n\tunprotected) header.d=puri.sm header.i=@puri.sm\n\theader.b=\"agKgN1OP\"; dkim-atps=neutral","Date":"Wed, 8 Jun 2022 15:49:22 +0200","To":"libcamera-devel@lists.libcamera.org","Message-ID":"<20220608154922.2a8affa5.dorota.czaplejewicz@puri.sm>","In-Reply-To":"<20220504132154.9681-4-laurent.pinchart@ideasonboard.com>","References":"<20220504132154.9681-1-laurent.pinchart@ideasonboard.com>\n\t<20220504132154.9681-4-laurent.pinchart@ideasonboard.com>","Organization":"Purism","MIME-Version":"1.0","Content-Type":"multipart/signed; boundary=\"Sig_/z6IcpXgUkiIoxOH5/fG2mNL\";\n\tprotocol=\"application/pgp-signature\"; micalg=pgp-sha256","Subject":"Re: [libcamera-devel] [PATCH 3/5] libcamera: pipeline: simple:\n\tFactor out format test to separate function","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>","From":"Dorota Czaplejewicz via libcamera-devel\n\t<libcamera-devel@lists.libcamera.org>","Reply-To":"Dorota Czaplejewicz <dorota.czaplejewicz@puri.sm>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":23356,"web_url":"https://patchwork.libcamera.org/comment/23356/","msgid":"<YqCqew0V3ARKU2V6@pendragon.ideasonboard.com>","date":"2022-06-08T13:56:11","subject":"Re: [libcamera-devel] [PATCH 3/5] libcamera: pipeline: simple:\n\tFactor out format test to separate function","submitter":{"id":2,"url":"https://patchwork.libcamera.org/api/people/2/","name":"Laurent Pinchart","email":"laurent.pinchart@ideasonboard.com"},"content":"Hi Dorota,\n\nOn Wed, Jun 08, 2022 at 03:49:22PM +0200, Dorota Czaplejewicz via libcamera-devel wrote:\n> On Wed,  4 May 2022 16:21:52 +0300 Laurent Pinchart wrote:\n> > To prepare for the implementation of a more complex format discovery\n> > method, factor out code that tries a pipeline configuration to a\n> > separate function. No functional change intended.\n> > \n> > Signed-off-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>\n> > ---\n> >  src/libcamera/pipeline/simple/simple.cpp | 110 ++++++++++++-----------\n> >  1 file changed, 59 insertions(+), 51 deletions(-)\n> > \n> > diff --git a/src/libcamera/pipeline/simple/simple.cpp b/src/libcamera/pipeline/simple/simple.cpp\n> > index 4f963df16315..19deb9447c96 100644\n> > --- a/src/libcamera/pipeline/simple/simple.cpp\n> > +++ b/src/libcamera/pipeline/simple/simple.cpp\n> > @@ -250,6 +250,9 @@ public:\n> >  \tstd::queue<std::map<unsigned int, FrameBuffer *>> converterQueue_;\n> >  \n> >  private:\n> > +\tvoid tryPipeline(unsigned int code, const Size &size);\n> > +\tstatic std::vector<const MediaPad *> routedSourcePads(MediaPad *sink);\n> \n> This doesn't seem to be used in this patch.\n\nIndeed, that belongs to a subsequent patch. I'll fix it.\n\n> > +\n> >  \tvoid converterInputDone(FrameBuffer *buffer);\n> >  \tvoid converterOutputDone(FrameBuffer *buffer);\n> >  };\n> > @@ -466,58 +469,11 @@ int SimpleCameraData::init()\n> >  \t\treturn ret;\n> >  \n> >  \t/*\n> > -\t * Enumerate the possible pipeline configurations. For each media bus\n> > -\t * format supported by the sensor, propagate the formats through the\n> > -\t * pipeline, and enumerate the corresponding possible V4L2 pixel\n> > -\t * formats on the video node.\n> > +\t * Generate the list of possible pipeline configurations by trying each\n> > +\t * media bus format supported by the sensor.\n> >  \t */\n> > -\tfor (unsigned int code : sensor_->mbusCodes()) {\n> > -\t\tV4L2SubdeviceFormat format{};\n> > -\t\tformat.mbus_code = code;\n> > -\t\tformat.size = sensor_->resolution();\n> > -\n> > -\t\tret = setupFormats(&format, V4L2Subdevice::TryFormat);\n> > -\t\tif (ret < 0) {\n> > -\t\t\tLOG(SimplePipeline, Debug)\n> > -\t\t\t\t<< \"Media bus code \" << utils::hex(code, 4)\n> > -\t\t\t\t<< \" not supported for this pipeline\";\n> > -\t\t\t/* Try next mbus_code supported by the sensor */\n> > -\t\t\tcontinue;\n> > -\t\t}\n> > -\n> > -\t\tV4L2VideoDevice::Formats videoFormats =\n> > -\t\t\tvideo_->formats(format.mbus_code);\n> > -\n> > -\t\tLOG(SimplePipeline, Debug)\n> > -\t\t\t<< \"Adding configuration for \" << format.size\n> > -\t\t\t<< \" in pixel formats [ \"\n> > -\t\t\t<< utils::join(videoFormats, \", \",\n> > -\t\t\t\t       [](const auto &f) {\n> > -\t\t\t\t\t       return f.first.toString();\n> > -\t\t\t\t       })\n> > -\t\t\t<< \" ]\";\n> > -\n> > -\t\tfor (const auto &videoFormat : videoFormats) {\n> > -\t\t\tPixelFormat pixelFormat = videoFormat.first.toPixelFormat();\n> > -\t\t\tif (!pixelFormat)\n> > -\t\t\t\tcontinue;\n> > -\n> > -\t\t\tConfiguration config;\n> > -\t\t\tconfig.code = code;\n> > -\t\t\tconfig.captureFormat = pixelFormat;\n> > -\t\t\tconfig.captureSize = format.size;\n> > -\n> > -\t\t\tif (!converter_) {\n> > -\t\t\t\tconfig.outputFormats = { pixelFormat };\n> > -\t\t\t\tconfig.outputSizes = config.captureSize;\n> > -\t\t\t} else {\n> > -\t\t\t\tconfig.outputFormats = converter_->formats(pixelFormat);\n> > -\t\t\t\tconfig.outputSizes = converter_->sizes(format.size);\n> > -\t\t\t}\n> > -\n> > -\t\t\tconfigs_.push_back(config);\n> > -\t\t}\n> > -\t}\n> > +\tfor (unsigned int code : sensor_->mbusCodes())\n> > +\t\ttryPipeline(code, sensor_->resolution());\n> >  \n> >  \tif (configs_.empty()) {\n> >  \t\tLOG(SimplePipeline, Error) << \"No valid configuration found\";\n> > @@ -541,6 +497,58 @@ int SimpleCameraData::init()\n> >  \treturn 0;\n> >  }\n> >  \n> > +void SimpleCameraData::tryPipeline(unsigned int code, const Size &size)\n> > +{\n> > +\t/*\n> > +\t * Propagate the format through the pipeline, and enumerate the\n> > +\t * corresponding possible V4L2 pixel formats on the video node.\n> > +\t */\n> \n> What are the output values/effects of this call? I can't easily track\n> them, despite having rewritten this method twice in the past.\n\nI'll add a comment block above the function to explain this.\n\n> > +\tV4L2SubdeviceFormat format{};\n> > +\tformat.mbus_code = code;\n> > +\tformat.size = size;\n> > +\n> > +\tint ret = setupFormats(&format, V4L2Subdevice::TryFormat);\n> > +\tif (ret < 0) {\n> > +\t\t/* Pipeline configuration failed, skip this configuration. */\n> > +\t\tLOG(SimplePipeline, Debug)\n> > +\t\t\t<< \"Media bus code \" << utils::hex(code, 4)\n> > +\t\t\t<< \" not supported for this pipeline\";\n> > +\t\treturn;\n> > +\t}\n> > +\n> > +\tV4L2VideoDevice::Formats videoFormats = video_->formats(format.mbus_code);\n> > +\n> > +\tLOG(SimplePipeline, Debug)\n> > +\t\t<< \"Adding configuration for \" << format.size\n> > +\t\t<< \" in pixel formats [ \"\n> > +\t\t<< utils::join(videoFormats, \", \",\n> > +\t\t\t       [](const auto &f) {\n> > +\t\t\t\t       return f.first.toString();\n> > +\t\t\t       })\n> > +\t\t<< \" ]\";\n> > +\n> > +\tfor (const auto &videoFormat : videoFormats) {\n> > +\t\tPixelFormat pixelFormat = videoFormat.first.toPixelFormat();\n> > +\t\tif (!pixelFormat)\n> > +\t\t\tcontinue;\n> > +\n> > +\t\tConfiguration config;\n> > +\t\tconfig.code = code;\n> > +\t\tconfig.captureFormat = pixelFormat;\n> > +\t\tconfig.captureSize = format.size;\n> > +\n> > +\t\tif (!converter_) {\n> > +\t\t\tconfig.outputFormats = { pixelFormat };\n> > +\t\t\tconfig.outputSizes = config.captureSize;\n> > +\t\t} else {\n> > +\t\t\tconfig.outputFormats = converter_->formats(pixelFormat);\n> > +\t\t\tconfig.outputSizes = converter_->sizes(format.size);\n> > +\t\t}\n> > +\n> > +\t\tconfigs_.push_back(config);\n> > +\t}\n> > +}\n> > +\n> >  int SimpleCameraData::setupLinks()\n> >  {\n> >  \tint ret;","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 E9761C326B\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed,  8 Jun 2022 13:56:19 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 80C566563D;\n\tWed,  8 Jun 2022 15:56:18 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 4910465635\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed,  8 Jun 2022 15:56:17 +0200 (CEST)","from pendragon.ideasonboard.com (62-78-145-57.bb.dnainternet.fi\n\t[62.78.145.57])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id DD57B6CF;\n\tWed,  8 Jun 2022 15:56:16 +0200 (CEST)"],"DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org;\n\ts=mail; t=1654696578;\n\tbh=uKBMGfp9GaZlHrFKXGf2lxqbCPFSDlACTnJTpb5o0oI=;\n\th=Date:To:References:In-Reply-To:Subject:List-Id:List-Unsubscribe:\n\tList-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To:Cc:\n\tFrom;\n\tb=yK8w23pbuCdmRs6GNecX55qYog+sr0g1hDKWVl4zahwnBfUedl8UB9HEQUcRbRqPK\n\t8CBhljggCKxYkhbQuilcPoCVLCphnSW68XCJY0LNzGf4MnSIKtTiSr8nJBnX1Xmiey\n\tOf//M2XK8yF5n96ivKiCvvXnY9QkxD1ut3VWbX17RcwGMi8VChTcVZy1HrFaJot/V6\n\timdsSPdY4a+Jpp/jZkN+lsjjMAlrrzbN9WE+XjbFTT4Uw8GXYNARl2UyqjdLHKgPeP\n\t2gGMU+afdypd8EbHz3oZknRWFFdU/wD7HFUln/umWcwYQLc7qFkSdon7PbbiXR9byx\n\tQGbHBHAPzjEjg==","v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1654696577;\n\tbh=uKBMGfp9GaZlHrFKXGf2lxqbCPFSDlACTnJTpb5o0oI=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=r4e47Dio+z8RCdkye1eJ86tERs9M5F0jI+wcuohw/SZzcLfQWptSFGmUSOYgo7jBB\n\t5TevsiYKIet9KUrNJtD9SRqyYY5QGo5Ai7djaThZfQhd09svRMOGthUok7TzArx7QM\n\tW0TQd28SEbpZkQwyHs3jysqwi9bPFVzqbPNhiqR8="],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key; \n\tunprotected) header.d=ideasonboard.com\n\theader.i=@ideasonboard.com\n\theader.b=\"r4e47Dio\"; dkim-atps=neutral","Date":"Wed, 8 Jun 2022 16:56:11 +0300","To":"Dorota Czaplejewicz <dorota.czaplejewicz@puri.sm>","Message-ID":"<YqCqew0V3ARKU2V6@pendragon.ideasonboard.com>","References":"<20220504132154.9681-1-laurent.pinchart@ideasonboard.com>\n\t<20220504132154.9681-4-laurent.pinchart@ideasonboard.com>\n\t<20220608154922.2a8affa5.dorota.czaplejewicz@puri.sm>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","In-Reply-To":"<20220608154922.2a8affa5.dorota.czaplejewicz@puri.sm>","Subject":"Re: [libcamera-devel] [PATCH 3/5] libcamera: pipeline: simple:\n\tFactor out format test to separate function","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>","From":"Laurent Pinchart via libcamera-devel\n\t<libcamera-devel@lists.libcamera.org>","Reply-To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","Cc":"libcamera-devel@lists.libcamera.org","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}}]