[{"id":25442,"web_url":"https://patchwork.libcamera.org/comment/25442/","msgid":"<Y033K195CCplZ1m7@pendragon.ideasonboard.com>","date":"2022-10-18T00:45:31","subject":"Re: [libcamera-devel] [PATCH 2/3] cam: file_sink: Add support for\n\tDNG output","submitter":{"id":2,"url":"https://patchwork.libcamera.org/api/people/2/","name":"Laurent Pinchart","email":"laurent.pinchart@ideasonboard.com"},"content":"Hi Paul,\n\nThank you for the patch.\n\nOn Tue, Oct 18, 2022 at 02:17:40AM +0900, Paul Elder via libcamera-devel wrote:\n> Add support for outputting buffers in DNG format. It reuses the DNG\n> writer that we had previously in qcam.\n> \n> Signed-off-by: Paul Elder <paul.elder@ideasonboard.com>\n> ---\n>  src/cam/camera_session.cpp |  3 ++-\n>  src/cam/file_sink.cpp      | 31 +++++++++++++++++++++++++------\n>  src/cam/file_sink.h        |  7 +++++--\n>  3 files changed, 32 insertions(+), 9 deletions(-)\n\nShould the help text of the --file option be updated in main.cpp to\ndocument this feature ?\n\n> diff --git a/src/cam/camera_session.cpp b/src/cam/camera_session.cpp\n> index 238186a3..2557f32d 100644\n> --- a/src/cam/camera_session.cpp\n> +++ b/src/cam/camera_session.cpp\n> @@ -208,7 +208,8 @@ int CameraSession::start()\n>  \tif (options_.isSet(OptFile)) {\n>  \t\tif (!options_[OptFile].toString().empty())\n>  \t\t\tsink_ = std::make_unique<FileSink>(streamNames_,\n> -\t\t\t\t\t\t\t   options_[OptFile]);\n> +\t\t\t\t\t\t\t   options_[OptFile],\n> +\t\t\t\t\t\t\t   camera_.get());\n>  \t\telse\n>  \t\t\tsink_ = std::make_unique<FileSink>(streamNames_);\n>  \t}\n> diff --git a/src/cam/file_sink.cpp b/src/cam/file_sink.cpp\n> index 45213d4a..fabf163c 100644\n> --- a/src/cam/file_sink.cpp\n> +++ b/src/cam/file_sink.cpp\n> @@ -15,14 +15,15 @@\n>  \n>  #include <libcamera/camera.h>\n>  \n> +#include \"dng_writer.h\"\n>  #include \"file_sink.h\"\n>  #include \"image.h\"\n>  \n>  using namespace libcamera;\n>  \n>  FileSink::FileSink(const std::map<const libcamera::Stream *, std::string> &streamNames,\n> -\t\t   const std::string &pattern)\n> -\t: streamNames_(streamNames), pattern_(pattern)\n> +\t\t   const std::string &pattern, const libcamera::Camera *camera)\n> +\t: streamNames_(streamNames), pattern_(pattern), camera_(camera)\n>  {\n>  }\n>  \n> @@ -51,12 +52,13 @@ void FileSink::mapBuffer(FrameBuffer *buffer)\n>  bool FileSink::processRequest(Request *request)\n>  {\n>  \tfor (auto [stream, buffer] : request->buffers())\n> -\t\twriteBuffer(stream, buffer);\n> +\t\twriteBuffer(stream, buffer, request->metadata());\n>  \n>  \treturn true;\n>  }\n>  \n> -void FileSink::writeBuffer(const Stream *stream, FrameBuffer *buffer)\n> +void FileSink::writeBuffer(const Stream *stream, FrameBuffer *buffer,\n> +\t\t\t   [[maybe_unused]] const ControlList &metadata)\n>  {\n>  \tstd::string filename;\n>  \tsize_t pos;\n> @@ -65,6 +67,10 @@ void FileSink::writeBuffer(const Stream *stream, FrameBuffer *buffer)\n>  \tif (!pattern_.empty())\n>  \t\tfilename = pattern_;\n>  \n> +#ifdef HAVE_TIFF\n> +\tbool dng = filename.find(\".dng\", filename.size() - 4) != std::string::npos;\n\nI wish C++ had std::string::ends_width().\n\nsubstr could also be used:\n\n\tbool dng = filename.substr(filename.size() - 4) == \".dng\";\n\nbut that will result in a copy. It think std::string_view would solve\nthat:\n\n\tbool dng = std::string_view(filename).substr(filename.size() - 4) == \".dng\";\n\nbut I'm not sure that's better :-)\n\n> +#endif /* HAVE_TIFF */\n> +\n>  \tif (filename.empty() || filename.back() == '/')\n>  \t\tfilename += \"frame-#.bin\";\n>  \n> @@ -76,6 +82,21 @@ void FileSink::writeBuffer(const Stream *stream, FrameBuffer *buffer)\n>  \t\tfilename.replace(pos, 1, ss.str());\n>  \t}\n>  \n> +\tImage *image = mappedBuffers_[buffer].get();\n> +\n> +#ifdef HAVE_TIFF\n> +\tif (dng) {\n> +\t\tret = DNGWriter::write(filename.c_str(), camera_,\n> +\t\t\t\t       stream->configuration(), metadata,\n> +\t\t\t\t       buffer, image->data(0).data());\n> +\t\tif (ret < 0)\n> +\t\t\tstd::cerr << \"failed to write DNG \" << filename\n> +\t\t\t\t  << std::endl;\n> +\n> +\t\treturn;\n> +\t}\n\nHmmmm... You won't like this, but... what if the pipeline handler can\ncapture both raw and processed streams, and the user wants to write raw\nframes in DNG and processed frames as .bin files ?\n\n> +#endif /* HAVE_TIFF */\n> +\n>  \tfd = open(filename.c_str(), O_CREAT | O_WRONLY |\n>  \t\t  (pos == std::string::npos ? O_APPEND : O_TRUNC),\n>  \t\t  S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH);\n> @@ -86,8 +107,6 @@ void FileSink::writeBuffer(const Stream *stream, FrameBuffer *buffer)\n>  \t\treturn;\n>  \t}\n>  \n> -\tImage *image = mappedBuffers_[buffer].get();\n> -\n>  \tfor (unsigned int i = 0; i < buffer->planes().size(); ++i) {\n>  \t\tconst FrameMetadata::Plane &meta = buffer->metadata().planes()[i];\n>  \n> diff --git a/src/cam/file_sink.h b/src/cam/file_sink.h\n> index 067736f5..e4838b37 100644\n> --- a/src/cam/file_sink.h\n> +++ b/src/cam/file_sink.h\n> @@ -21,7 +21,7 @@ class FileSink : public FrameSink\n>  {\n>  public:\n>  \tFileSink(const std::map<const libcamera::Stream *, std::string> &streamNames,\n> -\t\t const std::string &pattern = \"\");\n> +\t\t const std::string &pattern = \"\", const libcamera::Camera *camera = nullptr);\n\nI'd pass the camera as the first argument, to avoid having to add a\ndefault value.\n\n>  \t~FileSink();\n>  \n>  \tint configure(const libcamera::CameraConfiguration &config) override;\n> @@ -32,9 +32,12 @@ public:\n>  \n>  private:\n>  \tvoid writeBuffer(const libcamera::Stream *stream,\n> -\t\t\t libcamera::FrameBuffer *buffer);\n> +\t\t\t libcamera::FrameBuffer *buffer,\n> +\t\t\t const libcamera::ControlList &metadata);\n>  \n>  \tstd::map<const libcamera::Stream *, std::string> streamNames_;\n>  \tstd::string pattern_;\n>  \tstd::map<libcamera::FrameBuffer *, std::unique_ptr<Image>> mappedBuffers_;\n> +\n> +\tconst libcamera::Camera *camera_;\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 2D16EC0DA4\n\tfor <parsemail@patchwork.libcamera.org>;\n\tTue, 18 Oct 2022 00:45:58 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 5A50061F55;\n\tTue, 18 Oct 2022 02:45:57 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 22EFB61F55\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue, 18 Oct 2022 02:45:56 +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 6AF568F8;\n\tTue, 18 Oct 2022 02:45:55 +0200 (CEST)"],"DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org;\n\ts=mail; t=1666053957;\n\tbh=oiOKQdCyEpotLSoX5n/6xBIFEaaxOtnfw8HDzGSWGB4=;\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=yUNvUimnwHMBOr8k2nzijVuJCR5VguEUZr+WaddICpOI/3VMNsilJuXlo/FJuahuR\n\tyA7CkYFM/bdFJ5dVH+4OkuUMPi3tlrEzRoG3AUN2v2t9qOGGx08lrvWj+MhNxHKTaI\n\tmkVo8XbqBc1g1mO8Qzp6IKD4IdYTRSZXGE5bCNT7X2GrHkCfZRi3D4P7P2FcZbQOq1\n\tZuyRzhq5qbP/SkMcGhiHSFkzbqp08sYgIeYgHuLOK6nxhboEK+lF3F9qbB9Hljvrke\n\tu2m+5iz+zExFhC8gdH3NUcRI6+QxeU///La7CwqV6PvGXSgON1qSYUT/HLFFPz3LmQ\n\trKIkxJukuhgSQ==","v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1666053955;\n\tbh=oiOKQdCyEpotLSoX5n/6xBIFEaaxOtnfw8HDzGSWGB4=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=Ew8J0xMTnLs1XzgP4RWUKESSYOZ3zVs7NTLcZWEbG9+Hun0R39BD6EQDCJr33BWOM\n\txjlhsdg2Cf6BKHV3zxZwwGOdhBN7Ne25yjTHecNfRn+ICMtdTNLZPNZ6ZKH8MgCVR7\n\tpwQ5yHUGIcqpAgFq0wT3d0dVlWLxDvbz1hg6d2Ek="],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key; \n\tunprotected) header.d=ideasonboard.com\n\theader.i=@ideasonboard.com\n\theader.b=\"Ew8J0xMT\"; dkim-atps=neutral","Date":"Tue, 18 Oct 2022 03:45:31 +0300","To":"Paul Elder <paul.elder@ideasonboard.com>","Message-ID":"<Y033K195CCplZ1m7@pendragon.ideasonboard.com>","References":"<20221017171741.3803909-1-paul.elder@ideasonboard.com>\n\t<20221017171741.3803909-3-paul.elder@ideasonboard.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","In-Reply-To":"<20221017171741.3803909-3-paul.elder@ideasonboard.com>","Subject":"Re: [libcamera-devel] [PATCH 2/3] cam: file_sink: Add support for\n\tDNG output","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>"}},{"id":25445,"web_url":"https://patchwork.libcamera.org/comment/25445/","msgid":"<20221018064652.GC3814735@pyrite.rasen.tech>","date":"2022-10-18T06:46:52","subject":"Re: [libcamera-devel] [PATCH 2/3] cam: file_sink: Add support for\n\tDNG output","submitter":{"id":97,"url":"https://patchwork.libcamera.org/api/people/97/","name":"Nicolas Dufresne via libcamera-devel","email":"libcamera-devel@lists.libcamera.org"},"content":"Hi Laurent,\n\nOn Tue, Oct 18, 2022 at 03:45:31AM +0300, Laurent Pinchart wrote:\n> Hi Paul,\n> \n> Thank you for the patch.\n> \n> On Tue, Oct 18, 2022 at 02:17:40AM +0900, Paul Elder via libcamera-devel wrote:\n> > Add support for outputting buffers in DNG format. It reuses the DNG\n> > writer that we had previously in qcam.\n> > \n> > Signed-off-by: Paul Elder <paul.elder@ideasonboard.com>\n> > ---\n> >  src/cam/camera_session.cpp |  3 ++-\n> >  src/cam/file_sink.cpp      | 31 +++++++++++++++++++++++++------\n> >  src/cam/file_sink.h        |  7 +++++--\n> >  3 files changed, 32 insertions(+), 9 deletions(-)\n> \n> Should the help text of the --file option be updated in main.cpp to\n> document this feature ?\n\nYeah.\n\n> \n> > diff --git a/src/cam/camera_session.cpp b/src/cam/camera_session.cpp\n> > index 238186a3..2557f32d 100644\n> > --- a/src/cam/camera_session.cpp\n> > +++ b/src/cam/camera_session.cpp\n> > @@ -208,7 +208,8 @@ int CameraSession::start()\n> >  \tif (options_.isSet(OptFile)) {\n> >  \t\tif (!options_[OptFile].toString().empty())\n> >  \t\t\tsink_ = std::make_unique<FileSink>(streamNames_,\n> > -\t\t\t\t\t\t\t   options_[OptFile]);\n> > +\t\t\t\t\t\t\t   options_[OptFile],\n> > +\t\t\t\t\t\t\t   camera_.get());\n> >  \t\telse\n> >  \t\t\tsink_ = std::make_unique<FileSink>(streamNames_);\n> >  \t}\n> > diff --git a/src/cam/file_sink.cpp b/src/cam/file_sink.cpp\n> > index 45213d4a..fabf163c 100644\n> > --- a/src/cam/file_sink.cpp\n> > +++ b/src/cam/file_sink.cpp\n> > @@ -15,14 +15,15 @@\n> >  \n> >  #include <libcamera/camera.h>\n> >  \n> > +#include \"dng_writer.h\"\n> >  #include \"file_sink.h\"\n> >  #include \"image.h\"\n> >  \n> >  using namespace libcamera;\n> >  \n> >  FileSink::FileSink(const std::map<const libcamera::Stream *, std::string> &streamNames,\n> > -\t\t   const std::string &pattern)\n> > -\t: streamNames_(streamNames), pattern_(pattern)\n> > +\t\t   const std::string &pattern, const libcamera::Camera *camera)\n> > +\t: streamNames_(streamNames), pattern_(pattern), camera_(camera)\n> >  {\n> >  }\n> >  \n> > @@ -51,12 +52,13 @@ void FileSink::mapBuffer(FrameBuffer *buffer)\n> >  bool FileSink::processRequest(Request *request)\n> >  {\n> >  \tfor (auto [stream, buffer] : request->buffers())\n> > -\t\twriteBuffer(stream, buffer);\n> > +\t\twriteBuffer(stream, buffer, request->metadata());\n> >  \n> >  \treturn true;\n> >  }\n> >  \n> > -void FileSink::writeBuffer(const Stream *stream, FrameBuffer *buffer)\n> > +void FileSink::writeBuffer(const Stream *stream, FrameBuffer *buffer,\n> > +\t\t\t   [[maybe_unused]] const ControlList &metadata)\n> >  {\n> >  \tstd::string filename;\n> >  \tsize_t pos;\n> > @@ -65,6 +67,10 @@ void FileSink::writeBuffer(const Stream *stream, FrameBuffer *buffer)\n> >  \tif (!pattern_.empty())\n> >  \t\tfilename = pattern_;\n> >  \n> > +#ifdef HAVE_TIFF\n> > +\tbool dng = filename.find(\".dng\", filename.size() - 4) != std::string::npos;\n> \n> I wish C++ had std::string::ends_width().\n> \n> substr could also be used:\n> \n> \tbool dng = filename.substr(filename.size() - 4) == \".dng\";\n> \n> but that will result in a copy. It think std::string_view would solve\n> that:\n> \n> \tbool dng = std::string_view(filename).substr(filename.size() - 4) == \".dng\";\n> \n> but I'm not sure that's better :-)\n\nI'll keep the original :)\n\n> \n> > +#endif /* HAVE_TIFF */\n> > +\n> >  \tif (filename.empty() || filename.back() == '/')\n> >  \t\tfilename += \"frame-#.bin\";\n> >  \n> > @@ -76,6 +82,21 @@ void FileSink::writeBuffer(const Stream *stream, FrameBuffer *buffer)\n> >  \t\tfilename.replace(pos, 1, ss.str());\n> >  \t}\n> >  \n> > +\tImage *image = mappedBuffers_[buffer].get();\n> > +\n> > +#ifdef HAVE_TIFF\n> > +\tif (dng) {\n> > +\t\tret = DNGWriter::write(filename.c_str(), camera_,\n> > +\t\t\t\t       stream->configuration(), metadata,\n> > +\t\t\t\t       buffer, image->data(0).data());\n> > +\t\tif (ret < 0)\n> > +\t\t\tstd::cerr << \"failed to write DNG \" << filename\n> > +\t\t\t\t  << std::endl;\n> > +\n> > +\t\treturn;\n> > +\t}\n> \n> Hmmmm... You won't like this, but... what if the pipeline handler can\n> capture both raw and processed streams, and the user wants to write raw\n> frames in DNG and processed frames as .bin files ?\n\nI don't like this.\n\nqcam behaved like this, so I thought it was fine to just mimick it.\n\nEh, I guess I could expand it, shouldn't be *that* bad (famous last\nwords).\n\n> \n> > +#endif /* HAVE_TIFF */\n> > +\n> >  \tfd = open(filename.c_str(), O_CREAT | O_WRONLY |\n> >  \t\t  (pos == std::string::npos ? O_APPEND : O_TRUNC),\n> >  \t\t  S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH);\n> > @@ -86,8 +107,6 @@ void FileSink::writeBuffer(const Stream *stream, FrameBuffer *buffer)\n> >  \t\treturn;\n> >  \t}\n> >  \n> > -\tImage *image = mappedBuffers_[buffer].get();\n> > -\n> >  \tfor (unsigned int i = 0; i < buffer->planes().size(); ++i) {\n> >  \t\tconst FrameMetadata::Plane &meta = buffer->metadata().planes()[i];\n> >  \n> > diff --git a/src/cam/file_sink.h b/src/cam/file_sink.h\n> > index 067736f5..e4838b37 100644\n> > --- a/src/cam/file_sink.h\n> > +++ b/src/cam/file_sink.h\n> > @@ -21,7 +21,7 @@ class FileSink : public FrameSink\n> >  {\n> >  public:\n> >  \tFileSink(const std::map<const libcamera::Stream *, std::string> &streamNames,\n> > -\t\t const std::string &pattern = \"\");\n> > +\t\t const std::string &pattern = \"\", const libcamera::Camera *camera = nullptr);\n> \n> I'd pass the camera as the first argument, to avoid having to add a\n> default value.\n\nIt's only needed for DNG writing, though. I guess it is good\nfuture-proofing though :/\n\n\nPaul\n\n> \n> >  \t~FileSink();\n> >  \n> >  \tint configure(const libcamera::CameraConfiguration &config) override;\n> > @@ -32,9 +32,12 @@ public:\n> >  \n> >  private:\n> >  \tvoid writeBuffer(const libcamera::Stream *stream,\n> > -\t\t\t libcamera::FrameBuffer *buffer);\n> > +\t\t\t libcamera::FrameBuffer *buffer,\n> > +\t\t\t const libcamera::ControlList &metadata);\n> >  \n> >  \tstd::map<const libcamera::Stream *, std::string> streamNames_;\n> >  \tstd::string pattern_;\n> >  \tstd::map<libcamera::FrameBuffer *, std::unique_ptr<Image>> mappedBuffers_;\n> > +\n> > +\tconst libcamera::Camera *camera_;\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 4E1F0C0DA4\n\tfor <parsemail@patchwork.libcamera.org>;\n\tTue, 18 Oct 2022 06:47:02 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 7EB5362E0C;\n\tTue, 18 Oct 2022 08:47:01 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id CA97F61F55\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue, 18 Oct 2022 08:46:59 +0200 (CEST)","from pyrite.rasen.tech (h175-177-042-159.catv02.itscom.jp\n\t[175.177.42.159])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 463268CC;\n\tTue, 18 Oct 2022 08:46:58 +0200 (CEST)"],"DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org;\n\ts=mail; t=1666075621;\n\tbh=nOxjbVu7RH7wV26o20tQxiXLNxsKzusxNm5bboj6l/k=;\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=h1kRTUvGDrmtKku23JtDp2Q5eppNQFiE/PDMufxIoBEL0w4A/9gaU7UZnxxvmxIeG\n\tAkwTC5Bp0g8jm/jyKjOwoyufpe0eALN+JPkXIgl3cOhQlFINUYB5o9adEvQUdyefMz\n\t/u50G+bpNZNJuI5+OpNXm1kOzSpStiaLoMer5tzq27LxFXzb3xGu2PEJmT9YZlEhSI\n\t0iDXGWYt6KaTPO/m8MslHtR+grh2kFg52IB5UABdB60NMWdO88g/rXVUp+KNfYAc2z\n\tffJNjkafgYrmIND+sxxys9ZF24bXNSELpX1paZ4r3LGHU69LJuaAgocuAlzdgcfRyr\n\tmQ+8BKZ38KdKw==","v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1666075619;\n\tbh=nOxjbVu7RH7wV26o20tQxiXLNxsKzusxNm5bboj6l/k=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=GWvoIW3cJgkyomDlkb6Ah0kA3iXnPS+PCX5LlaGOcH176OooNDzZbxBX4fs5x3f2u\n\tRc0CFsElCLKxdm8RCqdJZRGsQk/ozuCQM7sta9Ep8sr4mr6SAoUL249Me0TrBNDFXb\n\tUcfPcrQT2RJ/bnqLavRWaX/bRKL7xG8ATJkf+rHo="],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key; \n\tunprotected) header.d=ideasonboard.com\n\theader.i=@ideasonboard.com\n\theader.b=\"GWvoIW3c\"; dkim-atps=neutral","Date":"Tue, 18 Oct 2022 15:46:52 +0900","To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","Message-ID":"<20221018064652.GC3814735@pyrite.rasen.tech>","References":"<20221017171741.3803909-1-paul.elder@ideasonboard.com>\n\t<20221017171741.3803909-3-paul.elder@ideasonboard.com>\n\t<Y033K195CCplZ1m7@pendragon.ideasonboard.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=us-ascii","Content-Disposition":"inline","In-Reply-To":"<Y033K195CCplZ1m7@pendragon.ideasonboard.com>","Subject":"Re: [libcamera-devel] [PATCH 2/3] cam: file_sink: Add support for\n\tDNG output","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":"Paul Elder via libcamera-devel <libcamera-devel@lists.libcamera.org>","Reply-To":"paul.elder@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>"}}]