From c03fade3cdde3967b218a8124b40482abaef9cbf Mon Sep 17 00:00:00 2001 From: Sebastian Krzyszkowiak Date: Sat, 19 Jun 2021 19:42:32 +0200 Subject: [PATCH 1/2] process_pipeline: Store a default whitelevel in the DNG file This helps unpacked 10-bit formats, as otherwise applications assume the image to be 16-bit because of TIFFTAG_BITSPERSAMPLE. --- src/camera.c | 22 ++++++++++++++++++++++ src/camera.h | 1 + src/process_pipeline.c | 6 ++++-- 3 files changed, 27 insertions(+), 2 deletions(-) diff --git a/src/camera.c b/src/camera.c index 9f9fd2c..f8b0e93 100644 --- a/src/camera.c +++ b/src/camera.c @@ -122,6 +122,28 @@ mp_pixel_format_bits_per_pixel(MPPixelFormat pixel_format) } } +uint32_t +mp_pixel_format_pixel_depth(MPPixelFormat pixel_format) +{ + g_return_val_if_fail(pixel_format < MP_PIXEL_FMT_MAX, 0); + switch (pixel_format) { + case MP_PIXEL_FMT_BGGR8: + case MP_PIXEL_FMT_GBRG8: + case MP_PIXEL_FMT_GRBG8: + case MP_PIXEL_FMT_RGGB8: + case MP_PIXEL_FMT_UYVY: + case MP_PIXEL_FMT_YUYV: + return 8; + case MP_PIXEL_FMT_GBRG10P: + case MP_PIXEL_FMT_GRBG10P: + case MP_PIXEL_FMT_RGGB10P: + case MP_PIXEL_FMT_BGGR10P: + return 10; + default: + return 0; + } +} + uint32_t mp_pixel_format_width_to_bytes(MPPixelFormat pixel_format, uint32_t width) { diff --git a/src/camera.h b/src/camera.h index f1973eb..c15b254 100644 --- a/src/camera.h +++ b/src/camera.h @@ -30,6 +30,7 @@ uint32_t mp_pixel_format_to_v4l_pixel_format(MPPixelFormat pixel_format); uint32_t mp_pixel_format_to_v4l_bus_code(MPPixelFormat pixel_format); uint32_t mp_pixel_format_bits_per_pixel(MPPixelFormat pixel_format); +uint32_t mp_pixel_format_pixel_depth(MPPixelFormat pixel_format); uint32_t mp_pixel_format_width_to_bytes(MPPixelFormat pixel_format, uint32_t width); uint32_t mp_pixel_format_width_to_colors(MPPixelFormat pixel_format, uint32_t width); uint32_t mp_pixel_format_height_to_colors(MPPixelFormat pixel_format, diff --git a/src/process_pipeline.c b/src/process_pipeline.c index 606b714..a5d6bfb 100644 --- a/src/process_pipeline.c +++ b/src/process_pipeline.c @@ -427,9 +427,11 @@ process_image_for_capture(const uint8_t *image, int count) TIFFSetField(tif, TIFFTAG_CFAPATTERN, 4, "\002\001\001\000"); // BGGR #endif printf("TIFF version %d\n", TIFFLIB_VERSION); - if (camera->whitelevel) { - TIFFSetField(tif, TIFFTAG_WHITELEVEL, 1, &camera->whitelevel); + int whitelevel = camera->whitelevel; + if (!whitelevel) { + whitelevel = (1 << mp_pixel_format_pixel_depth(mode.pixel_format)) - 1; } + TIFFSetField(tif, TIFFTAG_WHITELEVEL, 1, &whitelevel); if (camera->blacklevel) { const float blacklevel = camera->blacklevel; TIFFSetField(tif, TIFFTAG_BLACKLEVEL, 1, &blacklevel); From 35b212b11e0acf47f9886dbf61c155a75988af96 Mon Sep 17 00:00:00 2001 From: Sebastian Krzyszkowiak Date: Sun, 20 Jun 2021 13:34:02 +0200 Subject: [PATCH 2/2] process_pipeline: Don't store unspecified ISO values in metadata When the camera config does not specify ISO range, all we get there is garbage. --- src/process_pipeline.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/process_pipeline.c b/src/process_pipeline.c index a5d6bfb..945c426 100644 --- a/src/process_pipeline.c +++ b/src/process_pipeline.c @@ -457,10 +457,11 @@ process_image_for_capture(const uint8_t *image, int count) (mode.frame_interval.numerator / (float)mode.frame_interval.denominator) / ((float)mode.height / (float)exposure)); - uint16_t isospeed[1]; - isospeed[0] = (uint16_t)remap(gain - 1, 0, gain_max, camera->iso_min, - camera->iso_max); - TIFFSetField(tif, EXIFTAG_ISOSPEEDRATINGS, 1, isospeed); + if (camera->iso_min && camera->iso_max) { + uint16_t isospeed = remap(gain - 1, 0, gain_max, camera->iso_min, + camera->iso_max); + TIFFSetField(tif, EXIFTAG_ISOSPEEDRATINGS, 1, &isospeed); + } TIFFSetField(tif, EXIFTAG_FLASH, 0); TIFFSetField(tif, EXIFTAG_DATETIMEORIGINAL, datetime);