[{"id":4711,"web_url":"https://patchwork.libcamera.org/comment/4711/","msgid":"<20200501173338.GN5951@pendragon.ideasonboard.com>","date":"2020-05-01T17:33:38","subject":"Re: [libcamera-devel] [PATCH v2 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 Fri, May 01, 2020 at 05:27:45PM +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>  src/qcam/assets/feathericons/feathericons.qrc |  1 +\n>  src/qcam/main_window.cpp                      | 40 ++++++++++++++++++-\n>  src/qcam/main_window.h                        |  6 +++\n>  3 files changed, 46 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 dc8824dae4669a7e..1c9948b98a231e05 100644\n> --- a/src/qcam/main_window.cpp\n> +++ b/src/qcam/main_window.cpp\n> @@ -48,7 +48,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: options_(options), cm_(cm), allocator_(nullptr), isCapturing_(false),\n> +\t  captureRaw_(false)\n>  {\n>  \tint ret;\n>  \n> @@ -144,6 +145,14 @@ int MainWindow::createToolbars()\n>  \taction->setShortcut(QKeySequence::SaveAs);\n>  \tconnect(action, &QAction::triggered, this, &MainWindow::saveImageAs);\n>  \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::saveRaw);\n> +\tsaveRaw_ = action;\n> +\n>  \treturn 0;\n>  }\n>  \n> @@ -369,6 +378,9 @@ int MainWindow::startCapture()\n>  \n>  \tadjustSize();\n>  \n> +\t/* Configure the raw capture button. */\n> +\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 +486,7 @@ void MainWindow::stopCapture()\n>  \t\treturn;\n>  \n>  \tviewfinder_->stop();\n> +\tsaveRaw_->setEnabled(false);\n\nI think I mentioned in my previous review that captureRaw_ should be set\nto false here. Did you disagree with that ?\n\n>  \n>  \tint ret = camera_->stop();\n>  \tif (ret)\n> @@ -524,6 +537,11 @@ void MainWindow::saveImageAs()\n>  \twriter.write(image);\n>  }\n>  \n> +void MainWindow::saveRaw()\n> +{\n> +\tcaptureRaw_ = true;\n> +}\n> +\n>  /* -----------------------------------------------------------------------------\n>   * Request Completion Handling\n>   */\n> @@ -567,6 +585,9 @@ void MainWindow::processCapture()\n>  \tif (buffers.count(vfStream_))\n>  \t\tprocessViewfinder(buffers[vfStream_]);\n>  \n> +\tif (buffers.count(rawStream_))\n> +\t\tprocessRaw(buffers[rawStream_]);\n> +\n>  \t/*\n>  \t * Return buffers so they can be reused. No processing involving\n>  \t * a buffer can happen after they are returned to the free list.\n> @@ -603,6 +624,13 @@ void MainWindow::processViewfinder(FrameBuffer *buffer)\n>  \tviewfinder_->render(buffer, &mappedBuffers_[buffer]);\n>  }\n>  \n> +void MainWindow::processRaw(FrameBuffer *buffer)\n> +{\n> +\tconst MappedBuffer &mapped = mappedBuffers_[buffer];\n> +\n> +\tdngWriter_.write(camera_.get(), rawStream_, buffer, mapped.memory);\n> +}\n> +\n>  void MainWindow::queueRequest(FrameBuffer *buffer)\n>  {\n>  \tRequest *request = camera_->createRequest();\n> @@ -613,5 +641,15 @@ 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}\n\n\t\t} else {\n\t\t\tqWarning() << \"No free buffer available for RAW capture\";\n\t\t}\n\nOtherwise this looks OK, but should be adapted to move filename\ngeneration out of DNGWriter, and to make DNG optional (with appropriate\n#ifdef HAVE_TIFF, or maybe s/HAVE_TIFF/HAVE_DNG/ ?).\n\nWe should also pop up a dialog box to pick the file name. This can be\ndone in MainWindow::saveRaw() after captureRaw_ I believe, as processing\nof captureRaw_ happens in a separate thread (if I'm not mistaken), but\nwe then need to wait until the file name is available before writing the\nfile. This is more complex, and can be done on top of this patch.\n\n> +\t}\n> +\n>  \tcamera_->queueRequest(request);\n>  }\n> diff --git a/src/qcam/main_window.h b/src/qcam/main_window.h\n> index 4856ecc10729159c..068eb2e38277768e 100644\n> --- a/src/qcam/main_window.h\n> +++ b/src/qcam/main_window.h\n> @@ -24,6 +24,7 @@\n>  #include <libcamera/stream.h>\n>  \n>  #include \"../cam/stream_options.h\"\n> +#include \"dng_writer.h\"\n>  #include \"viewfinder.h\"\n>  \n>  using namespace libcamera;\n> @@ -55,6 +56,7 @@ private Q_SLOTS:\n>  \tvoid toggleCapture(bool start);\n>  \n>  \tvoid saveImageAs();\n> +\tvoid saveRaw();\n>  \n>  \tvoid queueRequest(FrameBuffer *buffer);\n>  \n> @@ -70,11 +72,13 @@ private:\n>  \tvoid requestComplete(Request *request);\n>  \tvoid processCapture();\n>  \tvoid processViewfinder(FrameBuffer *buffer);\n> +\tvoid processRaw(FrameBuffer *buffer);\n>  \n>  \t/* UI elements */\n>  \tQToolBar *toolbar_;\n>  \tQAction *startStopAction_;\n>  \tQComboBox *cameraCombo_;\n> +\tQAction *saveRaw_;\n>  \tViewFinder *viewfinder_;\n>  \n>  \tQIcon iconPlay_;\n> @@ -96,11 +100,13 @@ 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>  \tQQueue<std::map<Stream *, FrameBuffer *>> doneQueue_;\n>  \tQMutex mutex_; /* Protects freeBuffers_ and doneQueue_ */\n> +\tDNGWriter dngWriter_;\n>  \n>  \tuint64_t lastBufferTime_;\n>  \tQElapsedTimer frameRateInterval_;","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 7F110603F3\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri,  1 May 2020 19:33:41 +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 E924B72C;\n\tFri,  1 May 2020 19:33:40 +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=\"pNPqiQ16\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1588354421;\n\tbh=otH50Jnbb8RLWl0P2VoX6DL9OxVUxr/6f2HHatXNb1s=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=pNPqiQ16fowT/Cs6GOXXzABKXl9UjkDWnvUM51hxl1qQBtXjyPa+RXCyedjTlMhZJ\n\twaforICqwn5Pck9ZH7wEtSqIX3N2wvbVQoLy15KXoichAWL1E2rYq3m5EoK3k7wOwM\n\tTUPDVhuPAJXPbBINSltv7uedb/gWWdbYoX8TuWw0=","Date":"Fri, 1 May 2020 20:33:38 +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":"<20200501173338.GN5951@pendragon.ideasonboard.com>","References":"<20200501152745.437777-1-niklas.soderlund@ragnatech.se>\n\t<20200501152745.437777-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":"<20200501152745.437777-4-niklas.soderlund@ragnatech.se>","Subject":"Re: [libcamera-devel] [PATCH v2 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":"Fri, 01 May 2020 17:33:41 -0000"}},{"id":4715,"web_url":"https://patchwork.libcamera.org/comment/4715/","msgid":"<20200502015904.GE2569889@oden.dyn.berto.se>","date":"2020-05-02T01:59:04","subject":"Re: [libcamera-devel] [PATCH v2 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-01 20:33:38 +0300, Laurent Pinchart wrote:\n> Hi Niklas,\n> \n> Thank you for the patch.\n> \n> On Fri, May 01, 2020 at 05:27:45PM +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> >  src/qcam/assets/feathericons/feathericons.qrc |  1 +\n> >  src/qcam/main_window.cpp                      | 40 ++++++++++++++++++-\n> >  src/qcam/main_window.h                        |  6 +++\n> >  3 files changed, 46 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 dc8824dae4669a7e..1c9948b98a231e05 100644\n> > --- a/src/qcam/main_window.cpp\n> > +++ b/src/qcam/main_window.cpp\n> > @@ -48,7 +48,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: options_(options), cm_(cm), allocator_(nullptr), isCapturing_(false),\n> > +\t  captureRaw_(false)\n> >  {\n> >  \tint ret;\n> >  \n> > @@ -144,6 +145,14 @@ int MainWindow::createToolbars()\n> >  \taction->setShortcut(QKeySequence::SaveAs);\n> >  \tconnect(action, &QAction::triggered, this, &MainWindow::saveImageAs);\n> >  \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::saveRaw);\n> > +\tsaveRaw_ = action;\n> > +\n> >  \treturn 0;\n> >  }\n> >  \n> > @@ -369,6 +378,9 @@ int MainWindow::startCapture()\n> >  \n> >  \tadjustSize();\n> >  \n> > +\t/* Configure the raw capture button. */\n> > +\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 +486,7 @@ void MainWindow::stopCapture()\n> >  \t\treturn;\n> >  \n> >  \tviewfinder_->stop();\n> > +\tsaveRaw_->setEnabled(false);\n> \n> I think I mentioned in my previous review that captureRaw_ should be set\n> to false here. Did you disagree with that ?\n\nIf you did I missed it, sorry about that. But I agree it should be set \nto false here.\n\n> \n> >  \n> >  \tint ret = camera_->stop();\n> >  \tif (ret)\n> > @@ -524,6 +537,11 @@ void MainWindow::saveImageAs()\n> >  \twriter.write(image);\n> >  }\n> >  \n> > +void MainWindow::saveRaw()\n> > +{\n> > +\tcaptureRaw_ = true;\n> > +}\n> > +\n> >  /* -----------------------------------------------------------------------------\n> >   * Request Completion Handling\n> >   */\n> > @@ -567,6 +585,9 @@ void MainWindow::processCapture()\n> >  \tif (buffers.count(vfStream_))\n> >  \t\tprocessViewfinder(buffers[vfStream_]);\n> >  \n> > +\tif (buffers.count(rawStream_))\n> > +\t\tprocessRaw(buffers[rawStream_]);\n> > +\n> >  \t/*\n> >  \t * Return buffers so they can be reused. No processing involving\n> >  \t * a buffer can happen after they are returned to the free list.\n> > @@ -603,6 +624,13 @@ void MainWindow::processViewfinder(FrameBuffer *buffer)\n> >  \tviewfinder_->render(buffer, &mappedBuffers_[buffer]);\n> >  }\n> >  \n> > +void MainWindow::processRaw(FrameBuffer *buffer)\n> > +{\n> > +\tconst MappedBuffer &mapped = mappedBuffers_[buffer];\n> > +\n> > +\tdngWriter_.write(camera_.get(), rawStream_, buffer, mapped.memory);\n> > +}\n> > +\n> >  void MainWindow::queueRequest(FrameBuffer *buffer)\n> >  {\n> >  \tRequest *request = camera_->createRequest();\n> > @@ -613,5 +641,15 @@ 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}\n> \n> \t\t} else {\n> \t\t\tqWarning() << \"No free buffer available for RAW capture\";\n> \t\t}\n> \n> Otherwise this looks OK, but should be adapted to move filename\n> generation out of DNGWriter, and to make DNG optional (with appropriate\n> #ifdef HAVE_TIFF, or maybe s/HAVE_TIFF/HAVE_DNG/ ?).\n> \n> We should also pop up a dialog box to pick the file name. This can be\n> done in MainWindow::saveRaw() after captureRaw_ I believe, as processing\n> of captureRaw_ happens in a separate thread (if I'm not mistaken), but\n> we then need to wait until the file name is available before writing the\n> file. This is more complex, and can be done on top of this patch.\n> \n> > +\t}\n> > +\n> >  \tcamera_->queueRequest(request);\n> >  }\n> > diff --git a/src/qcam/main_window.h b/src/qcam/main_window.h\n> > index 4856ecc10729159c..068eb2e38277768e 100644\n> > --- a/src/qcam/main_window.h\n> > +++ b/src/qcam/main_window.h\n> > @@ -24,6 +24,7 @@\n> >  #include <libcamera/stream.h>\n> >  \n> >  #include \"../cam/stream_options.h\"\n> > +#include \"dng_writer.h\"\n> >  #include \"viewfinder.h\"\n> >  \n> >  using namespace libcamera;\n> > @@ -55,6 +56,7 @@ private Q_SLOTS:\n> >  \tvoid toggleCapture(bool start);\n> >  \n> >  \tvoid saveImageAs();\n> > +\tvoid saveRaw();\n> >  \n> >  \tvoid queueRequest(FrameBuffer *buffer);\n> >  \n> > @@ -70,11 +72,13 @@ private:\n> >  \tvoid requestComplete(Request *request);\n> >  \tvoid processCapture();\n> >  \tvoid processViewfinder(FrameBuffer *buffer);\n> > +\tvoid processRaw(FrameBuffer *buffer);\n> >  \n> >  \t/* UI elements */\n> >  \tQToolBar *toolbar_;\n> >  \tQAction *startStopAction_;\n> >  \tQComboBox *cameraCombo_;\n> > +\tQAction *saveRaw_;\n> >  \tViewFinder *viewfinder_;\n> >  \n> >  \tQIcon iconPlay_;\n> > @@ -96,11 +100,13 @@ 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> >  \tQQueue<std::map<Stream *, FrameBuffer *>> doneQueue_;\n> >  \tQMutex mutex_; /* Protects freeBuffers_ and doneQueue_ */\n> > +\tDNGWriter dngWriter_;\n> >  \n> >  \tuint64_t lastBufferTime_;\n> >  \tQElapsedTimer frameRateInterval_;\n> \n> -- \n> Regards,\n> \n> Laurent Pinchart","headers":{"Return-Path":"<niklas.soderlund@ragnatech.se>","Received":["from mail-lf1-x141.google.com (mail-lf1-x141.google.com\n\t[IPv6:2a00:1450:4864:20::141])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 56064603F1\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tSat,  2 May 2020 03:59:08 +0200 (CEST)","by mail-lf1-x141.google.com with SMTP id h26so2234237lfg.6\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri, 01 May 2020 18:59:08 -0700 (PDT)","from localhost (h-209-203.A463.priv.bahnhof.se. [155.4.209.203])\n\tby smtp.gmail.com with ESMTPSA id\n\tg3sm2917447ljj.13.2020.05.01.18.59.05\n\t(version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n\tFri, 01 May 2020 18:59:06 -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=\"eUO2fvV2\"; \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=1y5AwKRl2BMbpcaMqll5bVmyURB4Ra/wgQ+BBBfJo6U=;\n\tb=eUO2fvV2NggMWLFQ8RSHFEpXKWD51kC/utV6r61mNhv2j0ljOQQYEytEiv96BStr/9\n\ttZYEGAfeovD2Mn3B9jOPI3VuNx2hUatx01EzRuXnHoLxV8jIG4kw8drw0kchK7Hgb4tp\n\tAgyE1bWUaDhVRnhahpw76WxdTe5Z1JOhFV0yHAFax8ygPzQ+xnIwSB1W5uMqbewJ8qbW\n\tBFe/oQ/FRBWKlBBCp8AvLTGcyJ6ZvbXlSnhfgmPhTI5QrqZJE572tS0qLGGbfRzEXr7q\n\tdyACdmW8g30G/LgXkp8ACz/VZQRab3aQt7+dbYAg4hOJU4BZ0wyicpexzGb3ETzYYyWK\n\tlppA==","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=1y5AwKRl2BMbpcaMqll5bVmyURB4Ra/wgQ+BBBfJo6U=;\n\tb=p1rGr+6jQytUz9Rb7Uqkk+UaZNNc8d1uuMcZGealA73g9xuqH8HcXDwXtuCQDCVTe9\n\tncnk4Gg/8kmWeh/1HWntbl4Aej/enf18htOUrz6fzTF5NorCeM4s60N0deb+DxA9PDPX\n\tO7Vbt9ayurKPh0s8INrz2MtljSg/GUA0uZG3LnU8QsEuiSaVA1wcK/+wJjBhE6xRduDM\n\tkeUI2rmn+NjaLjwdTOuRvmVzHVmpSSGaF2joh+WQP8VJ4BbHV6TAB7Tpd8gJP1ZY/yN+\n\tzgpoo7+yyMTv9zJPfF6PE8pTDy7SGUZnO9sqRzwfS8XVYUszh1MD6IuMZRO2jZlx4GHc\n\tl78A==","X-Gm-Message-State":"AGi0PuZzs0AMWiyoR1mg4IPojX1g/i5Lv169LYBK2PlUP+7kA9+FT07S\n\tKbr3355ZnuEulSXZdEUR/WTp7haeySk=","X-Google-Smtp-Source":"APiQypKcdVdK/M+JLq+nU8ITq9okzGpd8VSkrepAmEJvkKHbbeNL0FSj4IJBWF2I+rVPcAoi31VBaQ==","X-Received":"by 2002:a05:6512:108a:: with SMTP id\n\tj10mr4287038lfg.38.1588384747368; \n\tFri, 01 May 2020 18:59:07 -0700 (PDT)","Date":"Sat, 2 May 2020 03:59:04 +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":"<20200502015904.GE2569889@oden.dyn.berto.se>","References":"<20200501152745.437777-1-niklas.soderlund@ragnatech.se>\n\t<20200501152745.437777-4-niklas.soderlund@ragnatech.se>\n\t<20200501173338.GN5951@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":"<20200501173338.GN5951@pendragon.ideasonboard.com>","Subject":"Re: [libcamera-devel] [PATCH v2 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 01:59:08 -0000"}}]