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

Niklas Söderlund niklas.soderlund at ragnatech.se
Sat Jun 6 17:50:38 CEST 2020


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 at ragnatech.se>
---
 src/qcam/dng_writer.cpp | 27 +++++++++++++++++++--------
 1 file changed, 19 insertions(+), 8 deletions(-)

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);
-- 
2.26.2



More information about the libcamera-devel mailing list