[libcamera-devel,1/2] qcam: dng_writer: Make thumbnail downscaling format dependent

Message ID 20200606155039.1874519-2-niklas.soderlund@ragnatech.se
State Superseded
Headers show
Series
  • qcam: dng_writer: Add support for IPU3 Bayer formats
Related show

Commit Message

Niklas Söderlund June 6, 2020, 3:50 p.m. UTC
Some RAW formats are easier to generate thumbnails for if the
downscaling factor for the thumbnail is configurable. Prepare for
addition of such formats by allowing the downscale to differ between
formats.

Signed-off-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
---
 src/qcam/dng_writer.cpp | 27 +++++++++++++++++++--------
 1 file changed, 19 insertions(+), 8 deletions(-)

Patch

diff --git a/src/qcam/dng_writer.cpp b/src/qcam/dng_writer.cpp
index cbd8bed3e6d02269..9435eeec5438f158 100644
--- a/src/qcam/dng_writer.cpp
+++ b/src/qcam/dng_writer.cpp
@@ -28,6 +28,7 @@  struct FormatInfo {
 	CFAPatternColour pattern[4];
 	void (*packScanline)(void *output, const void *input,
 			     unsigned int width);
+	unsigned int thumbDownscaleFactor;
 	void (*thumbScanline)(const FormatInfo &info, void *output,
 			      const void *input, unsigned int width,
 			      unsigned int stride);
@@ -87,48 +88,56 @@  static const std::map<PixelFormat, FormatInfo> formatInfo = {
 		.bitsPerSample = 10,
 		.pattern = { CFAPatternBlue, CFAPatternGreen, CFAPatternGreen, CFAPatternRed },
 		.packScanline = packScanlineSBGGR10P,
+		.thumbDownscaleFactor = 16,
 		.thumbScanline = thumbScanlineSBGGRxxP,
 	} },
 	{ PixelFormat(DRM_FORMAT_SGBRG10, MIPI_FORMAT_MOD_CSI2_PACKED), {
 		.bitsPerSample = 10,
 		.pattern = { CFAPatternGreen, CFAPatternBlue, CFAPatternRed, CFAPatternGreen },
 		.packScanline = packScanlineSBGGR10P,
+		.thumbDownscaleFactor = 16,
 		.thumbScanline = thumbScanlineSBGGRxxP,
 	} },
 	{ PixelFormat(DRM_FORMAT_SGRBG10, MIPI_FORMAT_MOD_CSI2_PACKED), {
 		.bitsPerSample = 10,
 		.pattern = { CFAPatternGreen, CFAPatternRed, CFAPatternBlue, CFAPatternGreen },
 		.packScanline = packScanlineSBGGR10P,
+		.thumbDownscaleFactor = 16,
 		.thumbScanline = thumbScanlineSBGGRxxP,
 	} },
 	{ PixelFormat(DRM_FORMAT_SRGGB10, MIPI_FORMAT_MOD_CSI2_PACKED), {
 		.bitsPerSample = 10,
 		.pattern = { CFAPatternRed, CFAPatternGreen, CFAPatternGreen, CFAPatternBlue },
 		.packScanline = packScanlineSBGGR10P,
+		.thumbDownscaleFactor = 16,
 		.thumbScanline = thumbScanlineSBGGRxxP,
 	} },
 	{ PixelFormat(DRM_FORMAT_SBGGR12, MIPI_FORMAT_MOD_CSI2_PACKED), {
 		.bitsPerSample = 12,
 		.pattern = { CFAPatternBlue, CFAPatternGreen, CFAPatternGreen, CFAPatternRed },
 		.packScanline = packScanlineSBGGR12P,
+		.thumbDownscaleFactor = 16,
 		.thumbScanline = thumbScanlineSBGGRxxP,
 	} },
 	{ PixelFormat(DRM_FORMAT_SGBRG12, MIPI_FORMAT_MOD_CSI2_PACKED), {
 		.bitsPerSample = 12,
 		.pattern = { CFAPatternGreen, CFAPatternBlue, CFAPatternRed, CFAPatternGreen },
 		.packScanline = packScanlineSBGGR12P,
+		.thumbDownscaleFactor = 16,
 		.thumbScanline = thumbScanlineSBGGRxxP,
 	} },
 	{ PixelFormat(DRM_FORMAT_SGRBG12, MIPI_FORMAT_MOD_CSI2_PACKED), {
 		.bitsPerSample = 12,
 		.pattern = { CFAPatternGreen, CFAPatternRed, CFAPatternBlue, CFAPatternGreen },
 		.packScanline = packScanlineSBGGR12P,
+		.thumbDownscaleFactor = 16,
 		.thumbScanline = thumbScanlineSBGGRxxP,
 	} },
 	{ PixelFormat(DRM_FORMAT_SRGGB12, MIPI_FORMAT_MOD_CSI2_PACKED), {
 		.bitsPerSample = 12,
 		.pattern = { CFAPatternRed, CFAPatternGreen, CFAPatternGreen, CFAPatternBlue },
 		.packScanline = packScanlineSBGGR12P,
+		.thumbDownscaleFactor = 16,
 		.thumbScanline = thumbScanlineSBGGRxxP,
 	} },
 };
@@ -178,13 +187,14 @@  int DNGWriter::write(const char *filename, const Camera *camera,
 	TIFFSetField(tif, TIFFTAG_ORIENTATION, ORIENTATION_TOPLEFT);
 
 	/*
-	 * Thumbnail-specific tags. The thumbnail is stored as an RGB image
-	 * with 1/16 of the raw image resolution. Greyscale would save space,
-	 * but doesn't seem well supported by RawTherapee.
+	 * Thumbnail-specific tags. The thumbnail is stored as an RGB image with
+	 * format dependet downscaling of the raw image resolution. Greyscale
+	 * would save space, but doesn't seem well supported by RawTherapee.
 	 */
+	const unsigned int thumbScale = info->thumbDownscaleFactor;
 	TIFFSetField(tif, TIFFTAG_SUBFILETYPE, FILETYPE_REDUCEDIMAGE);
-	TIFFSetField(tif, TIFFTAG_IMAGEWIDTH, config.size.width / 16);
-	TIFFSetField(tif, TIFFTAG_IMAGELENGTH, config.size.height / 16);
+	TIFFSetField(tif, TIFFTAG_IMAGEWIDTH, config.size.width / thumbScale);
+	TIFFSetField(tif, TIFFTAG_IMAGELENGTH, config.size.height / thumbScale);
 	TIFFSetField(tif, TIFFTAG_BITSPERSAMPLE, 8);
 	TIFFSetField(tif, TIFFTAG_COMPRESSION, COMPRESSION_NONE);
 	TIFFSetField(tif, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_RGB);
@@ -202,9 +212,10 @@  int DNGWriter::write(const char *filename, const Camera *camera,
 
 	/* Write the thumbnail. */
 	const uint8_t *row = static_cast<const uint8_t *>(data);
-	for (unsigned int y = 0; y < config.size.height / 16; y++) {
+	for (unsigned int y = 0; y < config.size.height / thumbScale; y++) {
 		info->thumbScanline(*info, &scanline, row,
-				    config.size.width / 16, config.stride);
+				    config.size.width / thumbScale,
+				    config.stride);
 
 		if (TIFFWriteScanline(tif, &scanline, y, 0) != 1) {
 			std::cerr << "Failed to write thumbnail scanline"
@@ -213,7 +224,7 @@  int DNGWriter::write(const char *filename, const Camera *camera,
 			return -EINVAL;
 		}
 
-		row += config.stride * 16;
+		row += config.stride * thumbScale;
 	}
 
 	TIFFWriteDirectory(tif);