[{"id":4717,"web_url":"https://patchwork.libcamera.org/comment/4717/","msgid":"<20200502023816.GT5951@pendragon.ideasonboard.com>","date":"2020-05-02T02:38:16","subject":"Re: [libcamera-devel] [PATCH v3 3/3] qcam: Add RAW capture support","submitter":{"id":2,"url":"https://patchwork.libcamera.org/api/people/2/","name":"Laurent Pinchart","email":"laurent.pinchart@ideasonboard.com"},"content":"Hi Niklas,\n\nThank you for the patch.\n\nOn Sat, May 02, 2020 at 04:10:45AM +0200, Niklas Söderlund wrote:\n> Add a toolbar button that captures RAW data to disk. The button is only\n> enabled if the camera is configured to provide a raw stream to the\n> application.\n> \n> Only when the capture action is triggered will a request with a raw\n> buffer be queued to the camera.\n> \n> Signed-off-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>\n> ---\n> * Changes since v2\n> - Use a file dialog\n> - Make DNG optional depending on libtiff\n> ---\n>  src/qcam/assets/feathericons/feathericons.qrc |  1 +\n>  src/qcam/main_window.cpp                      | 64 ++++++++++++++++++-\n>  src/qcam/main_window.h                        |  4 ++\n>  3 files changed, 68 insertions(+), 1 deletion(-)\n> \n> diff --git a/src/qcam/assets/feathericons/feathericons.qrc b/src/qcam/assets/feathericons/feathericons.qrc\n> index c4eb7a0be6884373..fc8213928ece70ea 100644\n> --- a/src/qcam/assets/feathericons/feathericons.qrc\n> +++ b/src/qcam/assets/feathericons/feathericons.qrc\n> @@ -1,5 +1,6 @@\n>  <!DOCTYPE RCC><RCC version=\"1.0\">\n>  <qresource>\n> +<file>./aperture.svg</file>\n>  <file>./camera-off.svg</file>\n>  <file>./play-circle.svg</file>\n>  <file>./save.svg</file>\n> diff --git a/src/qcam/main_window.cpp b/src/qcam/main_window.cpp\n> index 0bd9f3583ea4f6d4..458da479a9b21b73 100644\n> --- a/src/qcam/main_window.cpp\n> +++ b/src/qcam/main_window.cpp\n> @@ -27,6 +27,10 @@\n>  #include <libcamera/camera_manager.h>\n>  #include <libcamera/version.h>\n>  \n> +#if HAVE_TIFF\n\nI wonder if this shouldn't be called HAVE_DNG, as the dependency on\nlibtiff is internal to the DNGWriter class.\n\n> +#include \"dng_writer.h\"\n> +#endif\n> +\n>  using namespace libcamera;\n>  \n>  /**\n> @@ -48,7 +52,8 @@ public:\n>  };\n>  \n>  MainWindow::MainWindow(CameraManager *cm, const OptionsParser::Options &options)\n> -\t: options_(options), cm_(cm), allocator_(nullptr), isCapturing_(false)\n> +\t: saveRaw_(nullptr), options_(options), cm_(cm), allocator_(nullptr),\n> +\t  isCapturing_(false), captureRaw_(false)\n>  {\n>  \tint ret;\n>  \n> @@ -144,6 +149,16 @@ int MainWindow::createToolbars()\n>  \taction->setShortcut(QKeySequence::SaveAs);\n>  \tconnect(action, &QAction::triggered, this, &MainWindow::saveImageAs);\n>  \n> +#if HAVE_TIFF\n> +\t/* Save Raw action. */\n> +\taction = toolbar_->addAction(QIcon::fromTheme(\"camera-photo\",\n> +\t\t\t\t\t\t      QIcon(\":aperture.svg\")),\n> +\t\t\t\t     \"Save Raw\");\n> +\taction->setEnabled(false);\n> +\tconnect(action, &QAction::triggered, this, &MainWindow::captureRaw);\n> +\tsaveRaw_ = action;\n> +#endif\n\nI wonder if we should still have the button, but never enable it. If we\ndon't, users may wonder why the button isn't there. But if we do, they\nmay wonder why it's never enabled :-)\n\nMaybe the tooltip text could be set to\n\n- \"RAW capture not available (missing libtiff)\"\n- \"RAW capture not enabled on the command line\"\n- \"Save RAW\"\n\ndepending on the situation. Or maybe all of this is overkill :-)\n\n> +\n>  \treturn 0;\n>  }\n>  \n> @@ -369,6 +384,10 @@ int MainWindow::startCapture()\n>  \n>  \tadjustSize();\n>  \n> +\t/* Configure the raw capture button. */\n> +\tif (saveRaw_)\n> +\t\tsaveRaw_->setEnabled(config_->size() == 2);\n> +\n>  \t/* Allocate and map buffers. */\n>  \tallocator_ = new FrameBufferAllocator(camera_);\n>  \tfor (StreamConfiguration &config : *config_) {\n> @@ -474,6 +493,9 @@ void MainWindow::stopCapture()\n>  \t\treturn;\n>  \n>  \tviewfinder_->stop();\n> +\tif (saveRaw_)\n> +\t\tsaveRaw_->setEnabled(false);\n> +\tcaptureRaw_ = false;\n>  \n>  \tint ret = camera_->stop();\n>  \tif (ret)\n> @@ -524,6 +546,31 @@ void MainWindow::saveImageAs()\n>  \twriter.write(image);\n>  }\n>  \n> +void MainWindow::captureRaw()\n> +{\n> +\tcaptureRaw_ = true;\n> +}\n> +\n> +void MainWindow::processRaw(FrameBuffer *buffer)\n> +{\n> +#if HAVE_TIFF\n> +\tQString defaultPath = QStandardPaths::writableLocation(QStandardPaths::PicturesLocation);\n> +\tQString filename = QFileDialog::getSaveFileName(this, \"Save DNG\", defaultPath,\n> +\t\t\t\t\t\t\t\"DNG Files (*.dng)\");\n> +\n> +\tif (filename != \"\") {\n\n\tif (!filename.isEmpty()) {\n\n> +\t\tconst MappedBuffer &mapped = mappedBuffers_[buffer];\n> +\t\tDNGWriter::write(filename.toStdString().c_str(), camera_.get(),\n> +\t\t\t\t rawStream_->configuration(), buffer,\n> +\t\t\t\t mapped.memory);\n> +\t}\n> +#endif\n\nBlank line here ?\n\n> +\t{\n> +\t\tQMutexLocker locker(&mutex_);\n> +\t\tfreeBuffers_[rawStream_].enqueue(buffer);\n> +\t}\n> +}\n> +\n>  /* -----------------------------------------------------------------------------\n>   * Request Completion Handling\n>   */\n> @@ -566,6 +613,9 @@ void MainWindow::processCapture()\n>  \t/* Process buffers. */\n>  \tif (buffers.count(vfStream_))\n>  \t\tprocessViewfinder(buffers[vfStream_]);\n> +\n> +\tif (buffers.count(rawStream_))\n> +\t\tprocessRaw(buffers[rawStream_]);\n>  }\n>  \n>  void MainWindow::processViewfinder(FrameBuffer *buffer)\n> @@ -598,5 +648,17 @@ void MainWindow::queueRequest(FrameBuffer *buffer)\n>  \n>  \trequest->addBuffer(vfStream_, buffer);\n>  \n> +\tif (captureRaw_) {\n> +\t\tQMutexLocker locker(&mutex_);\n> +\n> +\t\tif (!freeBuffers_[rawStream_].isEmpty()) {\n> +\t\t\trequest->addBuffer(rawStream_,\n> +\t\t\t\t\t   freeBuffers_[rawStream_].dequeue());\n> +\t\t\tcaptureRaw_ = false;\n> +\t\t} else {\n> +\t\t\tqWarning() << \"No free buffer available for RAW capture\";\n> +\t\t}\n> +\t}\n\nWe can minimize the amount of code covered by the lock.\n\n\tif (captureRaw_) {\n\t\tFrameBuffer *buffer;\n\n\t\t{\n\t\t\tQMutexLocker locker(&mutex_);\n\t\t\tbuffer = !freeBuffers_[rawStream_].isEmpty())\n\t\t\t       ? freeBuffers_[rawStream_].dequeue() : nullptr;\n\t\t}\n\n\t\tif (buffer) {\n\t\t\trequest->addBuffer(rawStream_, buffer);\n\t\t\tcaptureRaw_ = false;\n\t\t} else {\n\t\t\tqWarning() << \"No free buffer available for RAW capture\";\n\t\t}\n\t}\n\nReviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n\n> +\n>  \tcamera_->queueRequest(request);\n>  }\n> diff --git a/src/qcam/main_window.h b/src/qcam/main_window.h\n> index 4856ecc10729159c..295ecc537e9d45bf 100644\n> --- a/src/qcam/main_window.h\n> +++ b/src/qcam/main_window.h\n> @@ -55,6 +55,8 @@ private Q_SLOTS:\n>  \tvoid toggleCapture(bool start);\n>  \n>  \tvoid saveImageAs();\n> +\tvoid captureRaw();\n> +\tvoid processRaw(FrameBuffer *buffer);\n>  \n>  \tvoid queueRequest(FrameBuffer *buffer);\n>  \n> @@ -75,6 +77,7 @@ private:\n>  \tQToolBar *toolbar_;\n>  \tQAction *startStopAction_;\n>  \tQComboBox *cameraCombo_;\n> +\tQAction *saveRaw_;\n>  \tViewFinder *viewfinder_;\n>  \n>  \tQIcon iconPlay_;\n> @@ -96,6 +99,7 @@ private:\n>  \n>  \t/* Capture state, buffers queue and statistics */\n>  \tbool isCapturing_;\n> +\tbool captureRaw_;\n>  \tStream *vfStream_;\n>  \tStream *rawStream_;\n>  \tstd::map<Stream *, QQueue<FrameBuffer *>> freeBuffers_;","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 D49F3603F2\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tSat,  2 May 2020 04:38:19 +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 49EB9521;\n\tSat,  2 May 2020 04:38:19 +0200 (CEST)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key; \n\tunprotected) header.d=ideasonboard.com\n\theader.i=@ideasonboard.com\n\theader.b=\"RUwJRa/2\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1588387099;\n\tbh=DEFG5h2t0OFgeCIWrgbHI5Zm2HMGlapecjFlZNvjaH8=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=RUwJRa/2eUn9t1lcr4nuSYaMxQ6CIwuI3Y7zFP5eyLAOcAUxSQSU/5Gv9GI+FISrs\n\tK0SXrGoCUqhrABcxtNlQSYs1OsmTeUNrorHVmR0dYr3KUGlFFlW+AOQsXKAHLF/Yp5\n\tkfIoR6MAjDBw2AxgWrkElYDwK3/PsM7zDnNjJDxs=","Date":"Sat, 2 May 2020 05:38:16 +0300","From":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","To":"Niklas =?utf-8?q?S=C3=B6derlund?= <niklas.soderlund@ragnatech.se>","Cc":"libcamera-devel@lists.libcamera.org","Message-ID":"<20200502023816.GT5951@pendragon.ideasonboard.com>","References":"<20200502021045.785979-1-niklas.soderlund@ragnatech.se>\n\t<20200502021045.785979-4-niklas.soderlund@ragnatech.se>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","Content-Transfer-Encoding":"8bit","In-Reply-To":"<20200502021045.785979-4-niklas.soderlund@ragnatech.se>","Subject":"Re: [libcamera-devel] [PATCH v3 3/3] qcam: Add RAW capture support","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>","X-List-Received-Date":"Sat, 02 May 2020 02:38:20 -0000"}},{"id":4719,"web_url":"https://patchwork.libcamera.org/comment/4719/","msgid":"<20200502115246.GB2730095@oden.dyn.berto.se>","date":"2020-05-02T11:52:46","subject":"Re: [libcamera-devel] [PATCH v3 3/3] qcam: Add RAW capture support","submitter":{"id":5,"url":"https://patchwork.libcamera.org/api/people/5/","name":"Niklas Söderlund","email":"niklas.soderlund@ragnatech.se"},"content":"Hi Laurent,\n\nThanks for your feedback.\n\nOn 2020-05-02 05:38:16 +0300, Laurent Pinchart wrote:\n> Hi Niklas,\n> \n> Thank you for the patch.\n> \n> On Sat, May 02, 2020 at 04:10:45AM +0200, Niklas Söderlund wrote:\n> > Add a toolbar button that captures RAW data to disk. The button is only\n> > enabled if the camera is configured to provide a raw stream to the\n> > application.\n> > \n> > Only when the capture action is triggered will a request with a raw\n> > buffer be queued to the camera.\n> > \n> > Signed-off-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>\n> > ---\n> > * Changes since v2\n> > - Use a file dialog\n> > - Make DNG optional depending on libtiff\n> > ---\n> >  src/qcam/assets/feathericons/feathericons.qrc |  1 +\n> >  src/qcam/main_window.cpp                      | 64 ++++++++++++++++++-\n> >  src/qcam/main_window.h                        |  4 ++\n> >  3 files changed, 68 insertions(+), 1 deletion(-)\n> > \n> > diff --git a/src/qcam/assets/feathericons/feathericons.qrc b/src/qcam/assets/feathericons/feathericons.qrc\n> > index c4eb7a0be6884373..fc8213928ece70ea 100644\n> > --- a/src/qcam/assets/feathericons/feathericons.qrc\n> > +++ b/src/qcam/assets/feathericons/feathericons.qrc\n> > @@ -1,5 +1,6 @@\n> >  <!DOCTYPE RCC><RCC version=\"1.0\">\n> >  <qresource>\n> > +<file>./aperture.svg</file>\n> >  <file>./camera-off.svg</file>\n> >  <file>./play-circle.svg</file>\n> >  <file>./save.svg</file>\n> > diff --git a/src/qcam/main_window.cpp b/src/qcam/main_window.cpp\n> > index 0bd9f3583ea4f6d4..458da479a9b21b73 100644\n> > --- a/src/qcam/main_window.cpp\n> > +++ b/src/qcam/main_window.cpp\n> > @@ -27,6 +27,10 @@\n> >  #include <libcamera/camera_manager.h>\n> >  #include <libcamera/version.h>\n> >  \n> > +#if HAVE_TIFF\n> \n> I wonder if this shouldn't be called HAVE_DNG, as the dependency on\n> libtiff is internal to the DNGWriter class.\n\nI have reworked this to always include dng_writer.h here. And then set \nHAVE_DNG in dng_writer.h if HAVE_TIFF is set (by meson).\n\n> \n> > +#include \"dng_writer.h\"\n> > +#endif\n> > +\n> >  using namespace libcamera;\n> >  \n> >  /**\n> > @@ -48,7 +52,8 @@ public:\n> >  };\n> >  \n> >  MainWindow::MainWindow(CameraManager *cm, const OptionsParser::Options &options)\n> > -\t: options_(options), cm_(cm), allocator_(nullptr), isCapturing_(false)\n> > +\t: saveRaw_(nullptr), options_(options), cm_(cm), allocator_(nullptr),\n> > +\t  isCapturing_(false), captureRaw_(false)\n> >  {\n> >  \tint ret;\n> >  \n> > @@ -144,6 +149,16 @@ int MainWindow::createToolbars()\n> >  \taction->setShortcut(QKeySequence::SaveAs);\n> >  \tconnect(action, &QAction::triggered, this, &MainWindow::saveImageAs);\n> >  \n> > +#if HAVE_TIFF\n> > +\t/* Save Raw action. */\n> > +\taction = toolbar_->addAction(QIcon::fromTheme(\"camera-photo\",\n> > +\t\t\t\t\t\t      QIcon(\":aperture.svg\")),\n> > +\t\t\t\t     \"Save Raw\");\n> > +\taction->setEnabled(false);\n> > +\tconnect(action, &QAction::triggered, this, &MainWindow::captureRaw);\n> > +\tsaveRaw_ = action;\n> > +#endif\n> \n> I wonder if we should still have the button, but never enable it. If we\n> don't, users may wonder why the button isn't there. But if we do, they\n> may wonder why it's never enabled :-)\n> \n> Maybe the tooltip text could be set to\n> \n> - \"RAW capture not available (missing libtiff)\"\n> - \"RAW capture not enabled on the command line\"\n> - \"Save RAW\"\n> \n> depending on the situation. Or maybe all of this is overkill :-)\n\nI think this is overkill and have kept it as is. My reasoning is that we \nshall not clutter the GUI with buttons for features the user have opted \nto not have. Also I think making this code more complex is a bad idea as \nwe already know we need to redisgen the whole UI to support multiple \nstreams properly.\n\n> \n> > +\n> >  \treturn 0;\n> >  }\n> >  \n> > @@ -369,6 +384,10 @@ int MainWindow::startCapture()\n> >  \n> >  \tadjustSize();\n> >  \n> > +\t/* Configure the raw capture button. */\n> > +\tif (saveRaw_)\n> > +\t\tsaveRaw_->setEnabled(config_->size() == 2);\n> > +\n> >  \t/* Allocate and map buffers. */\n> >  \tallocator_ = new FrameBufferAllocator(camera_);\n> >  \tfor (StreamConfiguration &config : *config_) {\n> > @@ -474,6 +493,9 @@ void MainWindow::stopCapture()\n> >  \t\treturn;\n> >  \n> >  \tviewfinder_->stop();\n> > +\tif (saveRaw_)\n> > +\t\tsaveRaw_->setEnabled(false);\n> > +\tcaptureRaw_ = false;\n> >  \n> >  \tint ret = camera_->stop();\n> >  \tif (ret)\n> > @@ -524,6 +546,31 @@ void MainWindow::saveImageAs()\n> >  \twriter.write(image);\n> >  }\n> >  \n> > +void MainWindow::captureRaw()\n> > +{\n> > +\tcaptureRaw_ = true;\n> > +}\n> > +\n> > +void MainWindow::processRaw(FrameBuffer *buffer)\n> > +{\n> > +#if HAVE_TIFF\n> > +\tQString defaultPath = QStandardPaths::writableLocation(QStandardPaths::PicturesLocation);\n> > +\tQString filename = QFileDialog::getSaveFileName(this, \"Save DNG\", defaultPath,\n> > +\t\t\t\t\t\t\t\"DNG Files (*.dng)\");\n> > +\n> > +\tif (filename != \"\") {\n> \n> \tif (!filename.isEmpty()) {\n> \n> > +\t\tconst MappedBuffer &mapped = mappedBuffers_[buffer];\n> > +\t\tDNGWriter::write(filename.toStdString().c_str(), camera_.get(),\n> > +\t\t\t\t rawStream_->configuration(), buffer,\n> > +\t\t\t\t mapped.memory);\n> > +\t}\n> > +#endif\n> \n> Blank line here ?\n> \n> > +\t{\n> > +\t\tQMutexLocker locker(&mutex_);\n> > +\t\tfreeBuffers_[rawStream_].enqueue(buffer);\n> > +\t}\n> > +}\n> > +\n> >  /* -----------------------------------------------------------------------------\n> >   * Request Completion Handling\n> >   */\n> > @@ -566,6 +613,9 @@ void MainWindow::processCapture()\n> >  \t/* Process buffers. */\n> >  \tif (buffers.count(vfStream_))\n> >  \t\tprocessViewfinder(buffers[vfStream_]);\n> > +\n> > +\tif (buffers.count(rawStream_))\n> > +\t\tprocessRaw(buffers[rawStream_]);\n> >  }\n> >  \n> >  void MainWindow::processViewfinder(FrameBuffer *buffer)\n> > @@ -598,5 +648,17 @@ void MainWindow::queueRequest(FrameBuffer *buffer)\n> >  \n> >  \trequest->addBuffer(vfStream_, buffer);\n> >  \n> > +\tif (captureRaw_) {\n> > +\t\tQMutexLocker locker(&mutex_);\n> > +\n> > +\t\tif (!freeBuffers_[rawStream_].isEmpty()) {\n> > +\t\t\trequest->addBuffer(rawStream_,\n> > +\t\t\t\t\t   freeBuffers_[rawStream_].dequeue());\n> > +\t\t\tcaptureRaw_ = false;\n> > +\t\t} else {\n> > +\t\t\tqWarning() << \"No free buffer available for RAW capture\";\n> > +\t\t}\n> > +\t}\n> \n> We can minimize the amount of code covered by the lock.\n> \n> \tif (captureRaw_) {\n> \t\tFrameBuffer *buffer;\n> \n> \t\t{\n> \t\t\tQMutexLocker locker(&mutex_);\n> \t\t\tbuffer = !freeBuffers_[rawStream_].isEmpty())\n> \t\t\t       ? freeBuffers_[rawStream_].dequeue() : nullptr;\n> \t\t}\n> \n> \t\tif (buffer) {\n> \t\t\trequest->addBuffer(rawStream_, buffer);\n> \t\t\tcaptureRaw_ = false;\n> \t\t} else {\n> \t\t\tqWarning() << \"No free buffer available for RAW capture\";\n> \t\t}\n> \t}\n\nGood idea, thanks.\n\n> \n> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n> \n> > +\n> >  \tcamera_->queueRequest(request);\n> >  }\n> > diff --git a/src/qcam/main_window.h b/src/qcam/main_window.h\n> > index 4856ecc10729159c..295ecc537e9d45bf 100644\n> > --- a/src/qcam/main_window.h\n> > +++ b/src/qcam/main_window.h\n> > @@ -55,6 +55,8 @@ private Q_SLOTS:\n> >  \tvoid toggleCapture(bool start);\n> >  \n> >  \tvoid saveImageAs();\n> > +\tvoid captureRaw();\n> > +\tvoid processRaw(FrameBuffer *buffer);\n> >  \n> >  \tvoid queueRequest(FrameBuffer *buffer);\n> >  \n> > @@ -75,6 +77,7 @@ private:\n> >  \tQToolBar *toolbar_;\n> >  \tQAction *startStopAction_;\n> >  \tQComboBox *cameraCombo_;\n> > +\tQAction *saveRaw_;\n> >  \tViewFinder *viewfinder_;\n> >  \n> >  \tQIcon iconPlay_;\n> > @@ -96,6 +99,7 @@ private:\n> >  \n> >  \t/* Capture state, buffers queue and statistics */\n> >  \tbool isCapturing_;\n> > +\tbool captureRaw_;\n> >  \tStream *vfStream_;\n> >  \tStream *rawStream_;\n> >  \tstd::map<Stream *, QQueue<FrameBuffer *>> freeBuffers_;\n> \n> -- \n> Regards,\n> \n> Laurent Pinchart","headers":{"Return-Path":"<niklas.soderlund@ragnatech.se>","Received":["from mail-lj1-x241.google.com (mail-lj1-x241.google.com\n\t[IPv6:2a00:1450:4864:20::241])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 92DF1603F4\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tSat,  2 May 2020 13:52:48 +0200 (CEST)","by mail-lj1-x241.google.com with SMTP id w20so5032426ljj.0\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tSat, 02 May 2020 04:52:48 -0700 (PDT)","from localhost (h-209-203.A463.priv.bahnhof.se. [155.4.209.203])\n\tby smtp.gmail.com with ESMTPSA id\n\tt19sm4324000lfl.53.2020.05.02.04.52.46\n\t(version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n\tSat, 02 May 2020 04:52:46 -0700 (PDT)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (2048-bit key; \n\tunprotected)\n\theader.d=ragnatech-se.20150623.gappssmtp.com\n\theader.i=@ragnatech-se.20150623.gappssmtp.com header.b=\"HkH8hWKk\"; \n\tdkim-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=qYVChjT4dko6pBJVcfhL8/RH/oA4KDLGta29zkJalyA=;\n\tb=HkH8hWKkLuo821cVSsw8a+0fW3nSApX2LnLBuNSnZ0U7iPgL1LbOYZLbAza8eud1GC\n\t5wtn6zAGhOwFF/HrukBslOFA9NBbmZk3aHq/uuQAcUB/fK0XptsNfdaTnWnpgO1tUVAJ\n\tKcvxHYG2BnYkb6RrnNxsHoho1jCFfCcW5Hwiy+yk5FatYePfTeia6x8DzmBIxF4J9Jv/\n\t3jtFBPDTFuyUtfgXUtJNtYQpItqR0236euSA9IGimLgjSZIeKCD/RKqbg9+tJAgiS4j1\n\ta3d3PGZy0wxdxGOI660JvZneKbgpYwgdWezO7iBaWzYzGHyJLdhlEv+yWK2S2h1S8+E4\n\t7XsQ==","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=qYVChjT4dko6pBJVcfhL8/RH/oA4KDLGta29zkJalyA=;\n\tb=PZwSSG8iuizbsYBOLpLNoJWRfQ8H7RAWdtBms6tRr4lsOxpFSGTm9mGytN2UCBDtI7\n\t1vvop71dbBV0bu0xqMmpXO4j974iOxUr+p4bJ4zqeBtfOf5vd05hdx18hWU+n6wlTYuT\n\tzT0oDUP/zAvgfFC+rHNYtFX6vea+POwJ5OCs7XnNsuym3uE25B2uVbQ/XAPEtsox0+Rj\n\tJ+7aMv6AP5ihDiCJx7pkHS8oo4CNs+dehMv7Gn2VhTuk/SCQSCwBXrIcLAm0D6ohameq\n\tBxtGjntrKejSVVaqeaPCE6mHcgtQtst56L3Zgb2saRQkij1suPBLYT4JUAnL68zPPq59\n\tpw+A==","X-Gm-Message-State":"AGi0PuY9m+7WjDkHDrtkfUKc9R1Im0zPgHhhWB8D63x4rXz6ZZGImo1N\n\tUEHkd22mVsFJXY2HlRvMl3PB0/NJVOY=","X-Google-Smtp-Source":"APiQypLw8rW3092mTTlxSxPU2rVtrd0Q0IQmPuJJG/Jt0vTr3c667VdAsvSiHy1GcE0nkWmo79MUlw==","X-Received":"by 2002:a2e:9996:: with SMTP id w22mr5036324lji.59.1588420367647;\n\tSat, 02 May 2020 04:52:47 -0700 (PDT)","Date":"Sat, 2 May 2020 13:52:46 +0200","From":"Niklas =?iso-8859-1?q?S=F6derlund?= <niklas.soderlund@ragnatech.se>","To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","Cc":"libcamera-devel@lists.libcamera.org","Message-ID":"<20200502115246.GB2730095@oden.dyn.berto.se>","References":"<20200502021045.785979-1-niklas.soderlund@ragnatech.se>\n\t<20200502021045.785979-4-niklas.soderlund@ragnatech.se>\n\t<20200502023816.GT5951@pendragon.ideasonboard.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=iso-8859-1","Content-Disposition":"inline","Content-Transfer-Encoding":"8bit","In-Reply-To":"<20200502023816.GT5951@pendragon.ideasonboard.com>","Subject":"Re: [libcamera-devel] [PATCH v3 3/3] qcam: Add RAW capture support","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>","X-List-Received-Date":"Sat, 02 May 2020 11:52:48 -0000"}}]