[{"id":519,"web_url":"https://patchwork.libcamera.org/comment/519/","msgid":"<20190123103630.GH4485@pendragon.ideasonboard.com>","date":"2019-01-23T10:36:30","subject":"Re: [libcamera-devel] [RFC 2/2] libcamera: ipu3: Create CIO2 V4L2\n\tdevices","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 Tue, Jan 22, 2019 at 07:12:25PM +0100, Jacopo Mondi wrote:\n> Create V4L2 devices for the CIO2 capture video nodes.\n> \n> Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>\n> ---\n>  src/libcamera/pipeline/ipu3/ipu3.cpp | 42 ++++++++++++++++++++++++++++\n>  1 file changed, 42 insertions(+)\n> \n> diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp\n> index 8cbc10a..58053ea 100644\n> --- a/src/libcamera/pipeline/ipu3/ipu3.cpp\n> +++ b/src/libcamera/pipeline/ipu3/ipu3.cpp\n> @@ -15,11 +15,25 @@\n>  #include \"log.h\"\n>  #include \"media_device.h\"\n>  #include \"pipeline_handler.h\"\n> +#include \"v4l2_device.h\"\n>  \n>  namespace libcamera {\n>  \n>  LOG_DEFINE_CATEGORY(IPU3)\n>  \n> +class IPU3CameraData : public CameraData\n> +{\n> +public:\n> +\tIPU3CameraData() : dev_(nullptr) { }\n> +\t~IPU3CameraData() { delete dev_; }\n> +\n> +\tvoid setV4L2Device(V4L2Device *dev) { dev_ = dev; }\n> +\tV4L2Device *device() const { return dev_; }\n> +\n\nAs this class is only used internally by the IPU3 pipeline manager I\nwould just make dev_ public and remove the accessors, especially given\nthat you implement both direct read and write without any side effect.\n\n> +private:\n> +\tV4L2Device *dev_;\n> +};\n> +\n>  class PipelineHandlerIPU3 : public PipelineHandler\n>  {\n>  public:\n> @@ -32,6 +46,7 @@ private:\n>  \tMediaDevice *cio2_;\n>  \tMediaDevice *imgu_;\n>  \n> +\tV4L2Device *createVideoDevice(unsigned int id);\n>  \tvoid registerCameras(CameraManager *manager);\n>  };\n>  \n> @@ -122,6 +137,24 @@ error_release_mdev:\n>  \treturn false;\n>  }\n>  \n> +/* Create video devices for the CIO2 unit associated with a camera. */\n> +V4L2Device *PipelineHandlerIPU3::createVideoDevice(unsigned int id)\n> +{\n> +\tstd::string cio2Name = \"ipu3-cio2 \" + std::to_string(id);\n> +\tMediaEntity *cio2 = cio2_->getEntityByName(cio2Name);\n> +\tif (!cio2)\n> +\t\treturn nullptr;\n> +\n> +\tV4L2Device *dev = new V4L2Device(*cio2);\n> +\tif (dev->open()) {\n> +\t\tdelete dev;\n> +\t\treturn nullptr;\n> +\t}\n> +\tdev->close();\n\nUnrelated to this patch, I wonder if we should have a V4L2Device::init()\nmethod that would perform the open + close.\n\n> +\n> +\treturn dev;\n> +}\n> +\n>  /*\n>   * Cameras are created associating an image sensor (represented by a\n>   * media entity with function MEDIA_ENT_F_CAM_SENSOR) to one of the four\n> @@ -172,6 +205,15 @@ void PipelineHandlerIPU3::registerCameras(CameraManager *manager)\n>  \n>  \t\tstd::string cameraName = sensor->name() + \" \" + std::to_string(id);\n>  \t\tstd::shared_ptr<Camera> camera = Camera::create(cameraName);\n> +\n> +\t\t/* Store pipeline private data in the Camera object. */\n> +\t\tV4L2Device *videoDev = createVideoDevice(id);\n> +\t\tif (videoDev) {\n> +\t\t\tIPU3CameraData *ipu3Data = new IPU3CameraData();\n> +\t\t\tipu3Data->setV4L2Device(videoDev);\n> +\t\t\tcamera->setCameraData(ipu3Data);\n> +\t\t}\n> +\n\nI think you can do it the other way around, creating the camera data\nfirst, and then the V4L2 device, as you will have more than just a V4L2\ndevice to associate with the camera.\n\n\t\tcamera->setCameraData(std::move(utils::make_unique<IPU3CameraData>()));\n\t\tIPU3CameraData *data = camera->cameraData();\n\n\t\tV4L2Device *videoDev = createVideoDevice(id);\n\t\tif (!videoDev) {\n\t\t\t/* Error handling */\n\t\t}\n\n\t\tdata->videoDev = createVideoDevice(id);\n\n>  \t\tmanager->addCamera(std::move(camera));\n>  \n>  \t\tLOG(IPU3, Info)","headers":{"Return-Path":"<laurent.pinchart@ideasonboard.com>","Received":["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 6E59E60B1B\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 23 Jan 2019 11:36:31 +0100 (CET)","from pendragon.ideasonboard.com\n\t(dfj612yhrgyx302h3jwwy-3.rev.dnainternet.fi\n\t[IPv6:2001:14ba:21f5:5b00:ce28:277f:58d7:3ca4])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id C17D323D;\n\tWed, 23 Jan 2019 11:36:30 +0100 (CET)"],"DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1548239790;\n\tbh=iKLUD1gID5TF//3/0OdrpUOTB7YtzgCy/gX6+ixhfqM=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=DNN5OFOV15PKnySBkbG5EuuCGF56pize/ItQWDu7XPykTNGttTHQCKGs3gsGSWdUR\n\tYFUTVNwMUBDfRvPsm7kE5iAX7AyXI2YV3cBaCiLvyKVeXHx87W78g1Y/0+boUlRCvg\n\tKy9il4v1hGVBfPZI4pfOYK8WmmE4F7cYwBy+XOQc=","Date":"Wed, 23 Jan 2019 12:36:30 +0200","From":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","To":"Jacopo Mondi <jacopo@jmondi.org>","Cc":"libcamera-devel@lists.libcamera.org","Message-ID":"<20190123103630.GH4485@pendragon.ideasonboard.com>","References":"<20190122181225.12922-1-jacopo@jmondi.org>\n\t<20190122181225.12922-3-jacopo@jmondi.org>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","In-Reply-To":"<20190122181225.12922-3-jacopo@jmondi.org>","User-Agent":"Mutt/1.10.1 (2018-07-13)","Subject":"Re: [libcamera-devel] [RFC 2/2] libcamera: ipu3: Create CIO2 V4L2\n\tdevices","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.23","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":"Wed, 23 Jan 2019 10:36:31 -0000"}},{"id":532,"web_url":"https://patchwork.libcamera.org/comment/532/","msgid":"<20190123142651.jv5qfqnfsg2ml6n3@uno.localdomain>","date":"2019-01-23T14:26:51","subject":"Re: [libcamera-devel] [RFC 2/2] libcamera: ipu3: Create CIO2 V4L2\n\tdevices","submitter":{"id":3,"url":"https://patchwork.libcamera.org/api/people/3/","name":"Jacopo Mondi","email":"jacopo@jmondi.org"},"content":"Hi Laurent,\n\nOn Wed, Jan 23, 2019 at 12:36:30PM +0200, Laurent Pinchart wrote:\n> Hi Jacopo,\n>\n> Thank you for the patch.\n>\n> On Tue, Jan 22, 2019 at 07:12:25PM +0100, Jacopo Mondi wrote:\n> > Create V4L2 devices for the CIO2 capture video nodes.\n> >\n> > Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>\n> > ---\n> >  src/libcamera/pipeline/ipu3/ipu3.cpp | 42 ++++++++++++++++++++++++++++\n> >  1 file changed, 42 insertions(+)\n> >\n> > diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp\n> > index 8cbc10a..58053ea 100644\n> > --- a/src/libcamera/pipeline/ipu3/ipu3.cpp\n> > +++ b/src/libcamera/pipeline/ipu3/ipu3.cpp\n> > @@ -15,11 +15,25 @@\n> >  #include \"log.h\"\n> >  #include \"media_device.h\"\n> >  #include \"pipeline_handler.h\"\n> > +#include \"v4l2_device.h\"\n> >\n> >  namespace libcamera {\n> >\n> >  LOG_DEFINE_CATEGORY(IPU3)\n> >\n> > +class IPU3CameraData : public CameraData\n> > +{\n> > +public:\n> > +\tIPU3CameraData() : dev_(nullptr) { }\n> > +\t~IPU3CameraData() { delete dev_; }\n> > +\n> > +\tvoid setV4L2Device(V4L2Device *dev) { dev_ = dev; }\n> > +\tV4L2Device *device() const { return dev_; }\n> > +\n>\n> As this class is only used internally by the IPU3 pipeline manager I\n> would just make dev_ public and remove the accessors, especially given\n> that you implement both direct read and write without any side effect.\n>\n> > +private:\n> > +\tV4L2Device *dev_;\n> > +};\n> > +\n> >  class PipelineHandlerIPU3 : public PipelineHandler\n> >  {\n> >  public:\n> > @@ -32,6 +46,7 @@ private:\n> >  \tMediaDevice *cio2_;\n> >  \tMediaDevice *imgu_;\n> >\n> > +\tV4L2Device *createVideoDevice(unsigned int id);\n> >  \tvoid registerCameras(CameraManager *manager);\n> >  };\n> >\n> > @@ -122,6 +137,24 @@ error_release_mdev:\n> >  \treturn false;\n> >  }\n> >\n> > +/* Create video devices for the CIO2 unit associated with a camera. */\n> > +V4L2Device *PipelineHandlerIPU3::createVideoDevice(unsigned int id)\n> > +{\n> > +\tstd::string cio2Name = \"ipu3-cio2 \" + std::to_string(id);\n> > +\tMediaEntity *cio2 = cio2_->getEntityByName(cio2Name);\n> > +\tif (!cio2)\n> > +\t\treturn nullptr;\n> > +\n> > +\tV4L2Device *dev = new V4L2Device(*cio2);\n> > +\tif (dev->open()) {\n> > +\t\tdelete dev;\n> > +\t\treturn nullptr;\n> > +\t}\n> > +\tdev->close();\n>\n> Unrelated to this patch, I wonder if we should have a V4L2Device::init()\n> method that would perform the open + close.\n>\n> > +\n> > +\treturn dev;\n> > +}\n> > +\n> >  /*\n> >   * Cameras are created associating an image sensor (represented by a\n> >   * media entity with function MEDIA_ENT_F_CAM_SENSOR) to one of the four\n> > @@ -172,6 +205,15 @@ void PipelineHandlerIPU3::registerCameras(CameraManager *manager)\n> >\n> >  \t\tstd::string cameraName = sensor->name() + \" \" + std::to_string(id);\n> >  \t\tstd::shared_ptr<Camera> camera = Camera::create(cameraName);\n> > +\n> > +\t\t/* Store pipeline private data in the Camera object. */\n> > +\t\tV4L2Device *videoDev = createVideoDevice(id);\n> > +\t\tif (videoDev) {\n> > +\t\t\tIPU3CameraData *ipu3Data = new IPU3CameraData();\n> > +\t\t\tipu3Data->setV4L2Device(videoDev);\n> > +\t\t\tcamera->setCameraData(ipu3Data);\n> > +\t\t}\n> > +\n>\n> I think you can do it the other way around, creating the camera data\n> first, and then the V4L2 device, as you will have more than just a V4L2\n> device to associate with the camera.\n>\n> \t\tcamera->setCameraData(std::move(utils::make_unique<IPU3CameraData>()));\n> \t\tIPU3CameraData *data = camera->cameraData();\n>\n> \t\tV4L2Device *videoDev = createVideoDevice(id);\n> \t\tif (!videoDev) {\n> \t\t\t/* Error handling */\n> \t\t}\n>\n> \t\tdata->videoDev = createVideoDevice(id);\n\nIs this intentional? Why Call createVideoDevice() twice? Can't I just\nre-use videoDev?\n\nBy the way, my intention was originally to skip creating pipeline data\nand associate them at all, if videoDev creation fails. In future we\nmight have more data, but for now we don't. I will change it anyway.\n\nThanks\n  j\n\n>\n> >  \t\tmanager->addCamera(std::move(camera));\n> >\n> >  \t\tLOG(IPU3, Info)\n>\n> --\n> Regards,\n>\n> Laurent Pinchart","headers":{"Return-Path":"<jacopo@jmondi.org>","Received":["from relay11.mail.gandi.net (relay11.mail.gandi.net\n\t[217.70.178.231])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id D657360C7D\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 23 Jan 2019 15:26:38 +0100 (CET)","from uno.localdomain (unknown [37.176.170.194])\n\t(Authenticated sender: jacopo@jmondi.org)\n\tby relay11.mail.gandi.net (Postfix) with ESMTPSA id 48855100005;\n\tWed, 23 Jan 2019 14:26:38 +0000 (UTC)"],"Date":"Wed, 23 Jan 2019 15:26:51 +0100","From":"Jacopo Mondi <jacopo@jmondi.org>","To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","Cc":"libcamera-devel@lists.libcamera.org","Message-ID":"<20190123142651.jv5qfqnfsg2ml6n3@uno.localdomain>","References":"<20190122181225.12922-1-jacopo@jmondi.org>\n\t<20190122181225.12922-3-jacopo@jmondi.org>\n\t<20190123103630.GH4485@pendragon.ideasonboard.com>","MIME-Version":"1.0","Content-Type":"multipart/signed; micalg=pgp-sha256;\n\tprotocol=\"application/pgp-signature\"; boundary=\"beaxwixfitxv2fai\"","Content-Disposition":"inline","In-Reply-To":"<20190123103630.GH4485@pendragon.ideasonboard.com>","User-Agent":"NeoMutt/20180716","Subject":"Re: [libcamera-devel] [RFC 2/2] libcamera: ipu3: Create CIO2 V4L2\n\tdevices","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.23","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":"Wed, 23 Jan 2019 14:26:39 -0000"}},{"id":548,"web_url":"https://patchwork.libcamera.org/comment/548/","msgid":"<20190123170320.GL31885@pendragon.ideasonboard.com>","date":"2019-01-23T17:03:20","subject":"Re: [libcamera-devel] [RFC 2/2] libcamera: ipu3: Create CIO2 V4L2\n\tdevices","submitter":{"id":2,"url":"https://patchwork.libcamera.org/api/people/2/","name":"Laurent Pinchart","email":"laurent.pinchart@ideasonboard.com"},"content":"Hi Jacopo,\n\nOn Wed, Jan 23, 2019 at 03:26:51PM +0100, Jacopo Mondi wrote:\n> On Wed, Jan 23, 2019 at 12:36:30PM +0200, Laurent Pinchart wrote:\n> > On Tue, Jan 22, 2019 at 07:12:25PM +0100, Jacopo Mondi wrote:\n> >> Create V4L2 devices for the CIO2 capture video nodes.\n> >>\n> >> Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>\n> >> ---\n> >>  src/libcamera/pipeline/ipu3/ipu3.cpp | 42 ++++++++++++++++++++++++++++\n> >>  1 file changed, 42 insertions(+)\n> >>\n> >> diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp\n> >> index 8cbc10a..58053ea 100644\n> >> --- a/src/libcamera/pipeline/ipu3/ipu3.cpp\n> >> +++ b/src/libcamera/pipeline/ipu3/ipu3.cpp\n> >> @@ -15,11 +15,25 @@\n> >>  #include \"log.h\"\n> >>  #include \"media_device.h\"\n> >>  #include \"pipeline_handler.h\"\n> >> +#include \"v4l2_device.h\"\n> >>\n> >>  namespace libcamera {\n> >>\n> >>  LOG_DEFINE_CATEGORY(IPU3)\n> >>\n> >> +class IPU3CameraData : public CameraData\n> >> +{\n> >> +public:\n> >> +\tIPU3CameraData() : dev_(nullptr) { }\n> >> +\t~IPU3CameraData() { delete dev_; }\n> >> +\n> >> +\tvoid setV4L2Device(V4L2Device *dev) { dev_ = dev; }\n> >> +\tV4L2Device *device() const { return dev_; }\n> >> +\n> >\n> > As this class is only used internally by the IPU3 pipeline manager I\n> > would just make dev_ public and remove the accessors, especially given\n> > that you implement both direct read and write without any side effect.\n> >\n> >> +private:\n> >> +\tV4L2Device *dev_;\n> >> +};\n> >> +\n> >>  class PipelineHandlerIPU3 : public PipelineHandler\n> >>  {\n> >>  public:\n> >> @@ -32,6 +46,7 @@ private:\n> >>  \tMediaDevice *cio2_;\n> >>  \tMediaDevice *imgu_;\n> >>\n> >> +\tV4L2Device *createVideoDevice(unsigned int id);\n> >>  \tvoid registerCameras(CameraManager *manager);\n> >>  };\n> >>\n> >> @@ -122,6 +137,24 @@ error_release_mdev:\n> >>  \treturn false;\n> >>  }\n> >>\n> >> +/* Create video devices for the CIO2 unit associated with a camera. */\n> >> +V4L2Device *PipelineHandlerIPU3::createVideoDevice(unsigned int id)\n> >> +{\n> >> +\tstd::string cio2Name = \"ipu3-cio2 \" + std::to_string(id);\n> >> +\tMediaEntity *cio2 = cio2_->getEntityByName(cio2Name);\n> >> +\tif (!cio2)\n> >> +\t\treturn nullptr;\n> >> +\n> >> +\tV4L2Device *dev = new V4L2Device(*cio2);\n> >> +\tif (dev->open()) {\n> >> +\t\tdelete dev;\n> >> +\t\treturn nullptr;\n> >> +\t}\n> >> +\tdev->close();\n> >\n> > Unrelated to this patch, I wonder if we should have a V4L2Device::init()\n> > method that would perform the open + close.\n> >\n> >> +\n> >> +\treturn dev;\n> >> +}\n> >> +\n> >>  /*\n> >>   * Cameras are created associating an image sensor (represented by a\n> >>   * media entity with function MEDIA_ENT_F_CAM_SENSOR) to one of the four\n> >> @@ -172,6 +205,15 @@ void PipelineHandlerIPU3::registerCameras(CameraManager *manager)\n> >>\n> >>  \t\tstd::string cameraName = sensor->name() + \" \" + std::to_string(id);\n> >>  \t\tstd::shared_ptr<Camera> camera = Camera::create(cameraName);\n> >> +\n> >> +\t\t/* Store pipeline private data in the Camera object. */\n> >> +\t\tV4L2Device *videoDev = createVideoDevice(id);\n> >> +\t\tif (videoDev) {\n> >> +\t\t\tIPU3CameraData *ipu3Data = new IPU3CameraData();\n> >> +\t\t\tipu3Data->setV4L2Device(videoDev);\n> >> +\t\t\tcamera->setCameraData(ipu3Data);\n> >> +\t\t}\n> >> +\n> >\n> > I think you can do it the other way around, creating the camera data\n> > first, and then the V4L2 device, as you will have more than just a V4L2\n> > device to associate with the camera.\n> >\n> > \t\tcamera->setCameraData(std::move(utils::make_unique<IPU3CameraData>()));\n> > \t\tIPU3CameraData *data = camera->cameraData();\n> >\n> > \t\tV4L2Device *videoDev = createVideoDevice(id);\n> > \t\tif (!videoDev) {\n> > \t\t\t/* Error handling */\n> > \t\t}\n> >\n> > \t\tdata->videoDev = createVideoDevice(id);\n> \n> Is this intentional? Why Call createVideoDevice() twice? Can't I just\n> re-use videoDev?\n\nClearly not intentional :-) I meant data->videoDev = videoDev;\n\n> By the way, my intention was originally to skip creating pipeline data\n> and associate them at all, if videoDev creation fails. In future we\n> might have more data, but for now we don't. I will change it anyway.\n\nFailure to create a V4L2Device for the camera is fatal, isn't it ? The\ncamera shouldn't be added to the camera manager in that case, and all\ncreated objects should be properly destroyed, but it's an error path so\nwe don't need to optimize it.\n\nOn a side note, using std::unique_ptr<> as proposed ensures that the\nIPU3CameraData gets destroyed in case of failure (assuming that the\ncamera itself gets destroyed of course), so the pattern shouldn't be too\ndifficult for pipeline handlers, even if it required calling\ncamera->data() right after camera->setData().\n\n> >>  \t\tmanager->addCamera(std::move(camera));\n> >>\n> >>  \t\tLOG(IPU3, Info)","headers":{"Return-Path":"<laurent.pinchart@ideasonboard.com>","Received":["from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 606E760C7D\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 23 Jan 2019 18:03:21 +0100 (CET)","from pendragon.ideasonboard.com\n\t(dfj612yhrgyx302h3jwwy-3.rev.dnainternet.fi\n\t[IPv6:2001:14ba:21f5:5b00:ce28:277f:58d7:3ca4])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id CB43D23D;\n\tWed, 23 Jan 2019 18:03:20 +0100 (CET)"],"DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1548263001;\n\tbh=2P33UBlan2PMqgZomOouyVQo+5VJiieasdMtoxkb57s=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=sU67cpbBNUHvmomjxCz3JJqUqjMY917gcbmhy+8j4c0Vb6hrRw0tvfTI5FxWtz3c0\n\tPo9DGLFhQWBf9YhdzUmzG0LeHeISh0sh1EZkH/Sjzioo5BpnCucvbNi+Ia00npmJHz\n\trZHXxLqgJ5lRdAniGzzyYQ4AGSiBVJCfpdSwd1qU=","Date":"Wed, 23 Jan 2019 19:03:20 +0200","From":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","To":"Jacopo Mondi <jacopo@jmondi.org>","Cc":"libcamera-devel@lists.libcamera.org","Message-ID":"<20190123170320.GL31885@pendragon.ideasonboard.com>","References":"<20190122181225.12922-1-jacopo@jmondi.org>\n\t<20190122181225.12922-3-jacopo@jmondi.org>\n\t<20190123103630.GH4485@pendragon.ideasonboard.com>\n\t<20190123142651.jv5qfqnfsg2ml6n3@uno.localdomain>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","In-Reply-To":"<20190123142651.jv5qfqnfsg2ml6n3@uno.localdomain>","User-Agent":"Mutt/1.10.1 (2018-07-13)","Subject":"Re: [libcamera-devel] [RFC 2/2] libcamera: ipu3: Create CIO2 V4L2\n\tdevices","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.23","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":"Wed, 23 Jan 2019 17:03:21 -0000"}}]