From patchwork Mon Oct 17 17:17:39 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paul Elder X-Patchwork-Id: 17613 Return-Path: X-Original-To: parsemail@patchwork.libcamera.org Delivered-To: parsemail@patchwork.libcamera.org Received: from lancelot.ideasonboard.com (lancelot.ideasonboard.com [92.243.16.209]) by patchwork.libcamera.org (Postfix) with ESMTPS id 12238BD16B for ; Mon, 17 Oct 2022 17:17:58 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id CA3F462E06; Mon, 17 Oct 2022 19:17:57 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org; s=mail; t=1666027077; bh=Dynt4aSTrF/HPAJjzwj+8JFdVMDMnt0Iv/0JnnaSnPE=; h=To:Date:In-Reply-To:References:Subject:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To: From; b=0mdu2ALML+xwEVgeDMEyLtawsjBbSIqfz1JHZXTY5EP8MiJ8sC8sMF1h/hDkSMLlR Y27V+Z7pYwuxrRF5ehuNtlwL+PAB+tkxIFfkPPWm3t5d9d6Cc0jRbR77L8RdirqwKz reexLUgKZNB9U0VcQlfH5QKjr9JChwJDQpOtw1TRvAO1kg56tuUe1QkNA1vdItw4/B JBcwg+cha/bwRODHLrKFEejy11rbXZ23TRUIcZiKcl6qWGqNarvKEqFtEPa503frZ/ rHkCupV5onaqZgia8U3dWEGfjFAQJHvVWWCeIFIoqlaBzLnJs0m192bq2a+/7lQvSk /xjFEWqcLa3ug== Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id D95BC62DF7 for ; Mon, 17 Oct 2022 19:17:55 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="mRwWkaJ3"; dkim-atps=neutral Received: from pyrite.rasen.tech (h175-177-042-159.catv02.itscom.jp [175.177.42.159]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 618071056; Mon, 17 Oct 2022 19:17:54 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1666027075; bh=Dynt4aSTrF/HPAJjzwj+8JFdVMDMnt0Iv/0JnnaSnPE=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=mRwWkaJ3evt19j2hszmi5ZBlSQXLrFH0QE3V87pv9Gmj5i3WCNFt8wyQGgrAl5nPA BlfakBZpMAkBaMwPyLOxnptTbfxfrpNOjy+x7ByV/1V/KKngYgHIDBcD7X9oDVCV0y ypYuJSVQCtmzq13UvWrDySxo4gumZUTL5zOmn6So= To: libcamera-devel@lists.libcamera.org Date: Tue, 18 Oct 2022 02:17:39 +0900 Message-Id: <20221017171741.3803909-2-paul.elder@ideasonboard.com> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20221017171741.3803909-1-paul.elder@ideasonboard.com> References: <20221017171741.3803909-1-paul.elder@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH 1/3] qcam, cam: Move DNGWriter from qcam to cam X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Paul Elder via libcamera-devel From: Paul Elder Reply-To: Paul Elder Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" To prepare for adding DNG support to cam, move DNGWriter from qcam to cam so that we only have inclusions from qcam to cam and not the other way around. Signed-off-by: Paul Elder Reviewed-by: Laurent Pinchart --- src/{qcam => cam}/dng_writer.cpp | 0 src/{qcam => cam}/dng_writer.h | 0 src/cam/meson.build | 9 +++++++++ src/qcam/main_window.cpp | 2 +- src/qcam/meson.build | 2 +- 5 files changed, 11 insertions(+), 2 deletions(-) rename src/{qcam => cam}/dng_writer.cpp (100%) rename src/{qcam => cam}/dng_writer.h (100%) diff --git a/src/qcam/dng_writer.cpp b/src/cam/dng_writer.cpp similarity index 100% rename from src/qcam/dng_writer.cpp rename to src/cam/dng_writer.cpp diff --git a/src/qcam/dng_writer.h b/src/cam/dng_writer.h similarity index 100% rename from src/qcam/dng_writer.h rename to src/cam/dng_writer.h diff --git a/src/cam/meson.build b/src/cam/meson.build index 8259239f..06dbea06 100644 --- a/src/cam/meson.build +++ b/src/cam/meson.build @@ -26,6 +26,7 @@ cam_cpp_args = [] libdrm = dependency('libdrm', required : false) libjpeg = dependency('libjpeg', required : false) libsdl2 = dependency('SDL2', required : false) +libtiff = dependency('libtiff-4', required : false) if libdrm.found() cam_cpp_args += [ '-DHAVE_KMS' ] @@ -51,6 +52,13 @@ if libsdl2.found() endif endif +if libtiff.found() + cam_cpp_args += ['-DHAVE_TIFF'] + cam_sources += files([ + 'dng_writer.cpp', + ]) +endif + cam = executable('cam', cam_sources, dependencies : [ libatomic, @@ -59,6 +67,7 @@ cam = executable('cam', cam_sources, libevent, libjpeg, libsdl2, + libtiff, libyaml, ], cpp_args : cam_cpp_args, diff --git a/src/qcam/main_window.cpp b/src/qcam/main_window.cpp index e0e5092e..f553ccb0 100644 --- a/src/qcam/main_window.cpp +++ b/src/qcam/main_window.cpp @@ -26,10 +26,10 @@ #include #include +#include "../cam/dng_writer.h" #include "../cam/image.h" #include "cam_select_dialog.h" -#include "dng_writer.h" #ifndef QT_NO_OPENGL #include "viewfinder_gl.h" #endif diff --git a/src/qcam/meson.build b/src/qcam/meson.build index 61861ea6..9f5759ff 100644 --- a/src/qcam/meson.build +++ b/src/qcam/meson.build @@ -49,7 +49,7 @@ if tiff_dep.found() qt5_cpp_args += ['-DHAVE_TIFF'] qcam_deps += [tiff_dep] qcam_sources += files([ - 'dng_writer.cpp', + '../cam/dng_writer.cpp', ]) endif From patchwork Mon Oct 17 17:17:40 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paul Elder X-Patchwork-Id: 17614 Return-Path: X-Original-To: parsemail@patchwork.libcamera.org Delivered-To: parsemail@patchwork.libcamera.org Received: from lancelot.ideasonboard.com (lancelot.ideasonboard.com [92.243.16.209]) by patchwork.libcamera.org (Postfix) with ESMTPS id C8B11BD16B for ; Mon, 17 Oct 2022 17:18:01 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 7BE2262E0B; Mon, 17 Oct 2022 19:18:01 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org; s=mail; t=1666027081; bh=OB8Nx/5WhI+4P+Q7brDY0+UAXS+POsdPKzTcvVI9/kU=; h=To:Date:In-Reply-To:References:Subject:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To: From; b=2HuRobIt27rBsyCtBfedcP3YLYJBIN/NN4XxqzkVPwP4NC7AnmOy0pCBdyzL9DjeW qRJjmKYyfR+K76FRPLH8S7rb3pm0MOu1EvLE7XX226pe/VipNXsKD2xxSxXcKYu8aa Ykaf5Db1xnGtEhyCNjE/rVuTXRRyWd5jQYRaAjunvr1j0p5nzVEWVvez28QwkzdLNC jVo/5tfaLlozcWLltZXtKSDC2Dzj+Sbt5Rvb2n63V5lhMxsofEfJ8mjfSAw3uGbmMK B/zcGzpgsyIzpmmaSGgbeVljqZNU5ieESTn8l+0biDfnD0ldai3NKBKkKZtaK4AooG I3YeILQGlpMJA== Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id AAEF562DEE for ; Mon, 17 Oct 2022 19:17:57 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="Xi7dNPm5"; dkim-atps=neutral Received: from pyrite.rasen.tech (h175-177-042-159.catv02.itscom.jp [175.177.42.159]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 3BF0BCCF; Mon, 17 Oct 2022 19:17:55 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1666027077; bh=OB8Nx/5WhI+4P+Q7brDY0+UAXS+POsdPKzTcvVI9/kU=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Xi7dNPm54MDa/00mYhyKkQnGxUSQjy1J3X+v6qOHwPGbyXEwH+lJArSyyHxMeN5XV L4JlzUZKoHHdWp0Qpo/0An+GngE2s2KCI/3rWHp8QHTG3vluyYVByPKLtsTu+/1YAY GlUusnFIF4MmJz0Lo2d8HJW59zB4gOCsCWl+zJSs= To: libcamera-devel@lists.libcamera.org Date: Tue, 18 Oct 2022 02:17:40 +0900 Message-Id: <20221017171741.3803909-3-paul.elder@ideasonboard.com> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20221017171741.3803909-1-paul.elder@ideasonboard.com> References: <20221017171741.3803909-1-paul.elder@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH 2/3] cam: file_sink: Add support for DNG output X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Paul Elder via libcamera-devel From: Paul Elder Reply-To: Paul Elder Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" Add support for outputting buffers in DNG format. It reuses the DNG writer that we had previously in qcam. Signed-off-by: Paul Elder --- src/cam/camera_session.cpp | 3 ++- src/cam/file_sink.cpp | 31 +++++++++++++++++++++++++------ src/cam/file_sink.h | 7 +++++-- 3 files changed, 32 insertions(+), 9 deletions(-) diff --git a/src/cam/camera_session.cpp b/src/cam/camera_session.cpp index 238186a3..2557f32d 100644 --- a/src/cam/camera_session.cpp +++ b/src/cam/camera_session.cpp @@ -208,7 +208,8 @@ int CameraSession::start() if (options_.isSet(OptFile)) { if (!options_[OptFile].toString().empty()) sink_ = std::make_unique(streamNames_, - options_[OptFile]); + options_[OptFile], + camera_.get()); else sink_ = std::make_unique(streamNames_); } diff --git a/src/cam/file_sink.cpp b/src/cam/file_sink.cpp index 45213d4a..fabf163c 100644 --- a/src/cam/file_sink.cpp +++ b/src/cam/file_sink.cpp @@ -15,14 +15,15 @@ #include +#include "dng_writer.h" #include "file_sink.h" #include "image.h" using namespace libcamera; FileSink::FileSink(const std::map &streamNames, - const std::string &pattern) - : streamNames_(streamNames), pattern_(pattern) + const std::string &pattern, const libcamera::Camera *camera) + : streamNames_(streamNames), pattern_(pattern), camera_(camera) { } @@ -51,12 +52,13 @@ void FileSink::mapBuffer(FrameBuffer *buffer) bool FileSink::processRequest(Request *request) { for (auto [stream, buffer] : request->buffers()) - writeBuffer(stream, buffer); + writeBuffer(stream, buffer, request->metadata()); return true; } -void FileSink::writeBuffer(const Stream *stream, FrameBuffer *buffer) +void FileSink::writeBuffer(const Stream *stream, FrameBuffer *buffer, + [[maybe_unused]] const ControlList &metadata) { std::string filename; size_t pos; @@ -65,6 +67,10 @@ void FileSink::writeBuffer(const Stream *stream, FrameBuffer *buffer) if (!pattern_.empty()) filename = pattern_; +#ifdef HAVE_TIFF + bool dng = filename.find(".dng", filename.size() - 4) != std::string::npos; +#endif /* HAVE_TIFF */ + if (filename.empty() || filename.back() == '/') filename += "frame-#.bin"; @@ -76,6 +82,21 @@ void FileSink::writeBuffer(const Stream *stream, FrameBuffer *buffer) filename.replace(pos, 1, ss.str()); } + Image *image = mappedBuffers_[buffer].get(); + +#ifdef HAVE_TIFF + if (dng) { + ret = DNGWriter::write(filename.c_str(), camera_, + stream->configuration(), metadata, + buffer, image->data(0).data()); + if (ret < 0) + std::cerr << "failed to write DNG " << filename + << std::endl; + + return; + } +#endif /* HAVE_TIFF */ + fd = open(filename.c_str(), O_CREAT | O_WRONLY | (pos == std::string::npos ? O_APPEND : O_TRUNC), S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH); @@ -86,8 +107,6 @@ void FileSink::writeBuffer(const Stream *stream, FrameBuffer *buffer) return; } - Image *image = mappedBuffers_[buffer].get(); - for (unsigned int i = 0; i < buffer->planes().size(); ++i) { const FrameMetadata::Plane &meta = buffer->metadata().planes()[i]; diff --git a/src/cam/file_sink.h b/src/cam/file_sink.h index 067736f5..e4838b37 100644 --- a/src/cam/file_sink.h +++ b/src/cam/file_sink.h @@ -21,7 +21,7 @@ class FileSink : public FrameSink { public: FileSink(const std::map &streamNames, - const std::string &pattern = ""); + const std::string &pattern = "", const libcamera::Camera *camera = nullptr); ~FileSink(); int configure(const libcamera::CameraConfiguration &config) override; @@ -32,9 +32,12 @@ public: private: void writeBuffer(const libcamera::Stream *stream, - libcamera::FrameBuffer *buffer); + libcamera::FrameBuffer *buffer, + const libcamera::ControlList &metadata); std::map streamNames_; std::string pattern_; std::map> mappedBuffers_; + + const libcamera::Camera *camera_; }; From patchwork Mon Oct 17 17:17:41 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paul Elder X-Patchwork-Id: 17615 Return-Path: X-Original-To: parsemail@patchwork.libcamera.org Delivered-To: parsemail@patchwork.libcamera.org Received: from lancelot.ideasonboard.com (lancelot.ideasonboard.com [92.243.16.209]) by patchwork.libcamera.org (Postfix) with ESMTPS id 6C909C327C for ; Mon, 17 Oct 2022 17:18:02 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 0112462DFD; Mon, 17 Oct 2022 19:18:01 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org; s=mail; t=1666027082; bh=yWMZlKKxakElN4P5m/AypOUOMmMKUoojjuJiOQu1ldE=; h=To:Date:In-Reply-To:References:Subject:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To: From; b=03dSjfrsl/Se21wsuRYvQLJSD+4CUglNsMh+GLK6g5N996Bl5mbB2wPmdeunw8LJM 88EeQYLBJYHCr4I1mXOpfXaUrNhfE28CyNTlg/5V9AlCdahMVihgjocZZ1EEYSYCHI iwBe7vjLW6jThS/1H3bBUvSkQSRzlExc5b6o855Jb1+9n7ddfeZoJxdyXhfIqdEcpg PMzUVVqkMzoyBkoMoLdJ9hwy2oik3IDm6oGI2tffhFywIlCanrTUmok/y0+qXXknoS af0+GN+Cre91AOClgqfDtpJbdbdz/4B5fXhcNJuc6wAUO0fgQT2rsYPb1Q1d3C2m5z Y1uuO5SDJE8AA== Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 7929C62DEE for ; Mon, 17 Oct 2022 19:17:59 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="X5M+Co3B"; dkim-atps=neutral Received: from pyrite.rasen.tech (h175-177-042-159.catv02.itscom.jp [175.177.42.159]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 14D5ECCF; Mon, 17 Oct 2022 19:17:57 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1666027079; bh=yWMZlKKxakElN4P5m/AypOUOMmMKUoojjuJiOQu1ldE=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=X5M+Co3BSMKir927m0/TvnoF64/rUeMW1y6zuDvsWJA8giAuXEs6WI3Nx2xG3NiYG qB7iQGp4fxjiiSqkrW5dhagI/hsg3IOTeglk2ZnKssmYlwOPUd/Y6hLhUHEjfvEcU/ vcE7vNBJc3kO5/72FHmH8N6JJxg6jQbDhzPxkGEM= To: libcamera-devel@lists.libcamera.org Date: Tue, 18 Oct 2022 02:17:41 +0900 Message-Id: <20221017171741.3803909-4-paul.elder@ideasonboard.com> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20221017171741.3803909-1-paul.elder@ideasonboard.com> References: <20221017171741.3803909-1-paul.elder@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH 3/3] cam: dng_writer: Add support for 8-bit raw formats X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Paul Elder via libcamera-devel From: Paul Elder Reply-To: Paul Elder Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" Add support for 8-bit raw formats in DNGWriter. Signed-off-by: Paul Elder Reviewed-by: Laurent Pinchart --- src/cam/dng_writer.cpp | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/src/cam/dng_writer.cpp b/src/cam/dng_writer.cpp index 6dd7d0f4..47ebe033 100644 --- a/src/cam/dng_writer.cpp +++ b/src/cam/dng_writer.cpp @@ -126,6 +126,15 @@ struct Matrix3d { float m[9]; }; +void packScanlineSBGGR8(void *output, const void *input, unsigned int width) +{ + const uint8_t *in = static_cast(input); + uint8_t *out = static_cast(output); + + for (unsigned int i = 0; i < width; i++) + out[i] = in[i]; +} + void packScanlineSBGGR10P(void *output, const void *input, unsigned int width) { const uint8_t *in = static_cast(input); @@ -274,6 +283,30 @@ void thumbScanlineIPU3([[maybe_unused]] const FormatInfo &info, void *output, } static const std::map formatInfo = { + { formats::SBGGR8, { + .bitsPerSample = 8, + .pattern = { CFAPatternBlue, CFAPatternGreen, CFAPatternGreen, CFAPatternRed }, + .packScanline = packScanlineSBGGR8, + .thumbScanline = thumbScanlineSBGGRxxP, + } }, + { formats::SGBRG8, { + .bitsPerSample = 8, + .pattern = { CFAPatternGreen, CFAPatternBlue, CFAPatternRed, CFAPatternGreen }, + .packScanline = packScanlineSBGGR8, + .thumbScanline = thumbScanlineSBGGRxxP, + } }, + { formats::SGRBG8, { + .bitsPerSample = 8, + .pattern = { CFAPatternGreen, CFAPatternRed, CFAPatternBlue, CFAPatternGreen }, + .packScanline = packScanlineSBGGR8, + .thumbScanline = thumbScanlineSBGGRxxP, + } }, + { formats::SRGGB8, { + .bitsPerSample = 8, + .pattern = { CFAPatternRed, CFAPatternGreen, CFAPatternGreen, CFAPatternBlue }, + .packScanline = packScanlineSBGGR8, + .thumbScanline = thumbScanlineSBGGRxxP, + } }, { formats::SBGGR10_CSI2P, { .bitsPerSample = 10, .pattern = { CFAPatternBlue, CFAPatternGreen, CFAPatternGreen, CFAPatternRed },