Use libdng to write the output images
This commit is contained in:
@@ -9,18 +9,15 @@
|
|||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <gtk/gtk.h>
|
#include <gtk/gtk.h>
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
#include <tiffio.h>
|
|
||||||
#ifndef SYSCONFDIR
|
#ifndef SYSCONFDIR
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "dcp.h"
|
#include "dcp.h"
|
||||||
#include "gl_util.h"
|
#include "gl_util.h"
|
||||||
|
#include "libdng.h"
|
||||||
#include <sys/mman.h>
|
#include <sys/mman.h>
|
||||||
|
|
||||||
#define TIFFTAG_FORWARDMATRIX1 50964
|
|
||||||
#define TIFFTAG_FORWARDMATRIX2 50965
|
|
||||||
|
|
||||||
static const float colormatrix_srgb[] = { 3.2409f, -1.5373f, -0.4986f,
|
static const float colormatrix_srgb[] = { 3.2409f, -1.5373f, -0.4986f,
|
||||||
-0.9692f, 1.8759f, 0.0415f,
|
-0.9692f, 1.8759f, 0.0415f,
|
||||||
0.0556f, -0.2039f, 1.0569f };
|
0.0556f, -0.2039f, 1.0569f };
|
||||||
@@ -45,66 +42,6 @@ static char capture_fname[255];
|
|||||||
|
|
||||||
static GSettings *settings;
|
static GSettings *settings;
|
||||||
|
|
||||||
static void
|
|
||||||
register_custom_tiff_tags(TIFF *tif)
|
|
||||||
{
|
|
||||||
static const TIFFFieldInfo custom_fields[] = {
|
|
||||||
{ TIFFTAG_FORWARDMATRIX1,
|
|
||||||
-1,
|
|
||||||
-1,
|
|
||||||
TIFF_SRATIONAL,
|
|
||||||
FIELD_CUSTOM,
|
|
||||||
1,
|
|
||||||
1,
|
|
||||||
"ForwardMatrix1" },
|
|
||||||
{ TIFFTAG_FORWARDMATRIX2,
|
|
||||||
-1,
|
|
||||||
-1,
|
|
||||||
TIFF_SRATIONAL,
|
|
||||||
FIELD_CUSTOM,
|
|
||||||
1,
|
|
||||||
1,
|
|
||||||
"ForwardMatrix2" },
|
|
||||||
{ DCPTAG_PROFILE_TONE_CURVE,
|
|
||||||
-1,
|
|
||||||
-1,
|
|
||||||
TIFF_FLOAT,
|
|
||||||
FIELD_CUSTOM,
|
|
||||||
1,
|
|
||||||
1,
|
|
||||||
"ProfileToneCurve" },
|
|
||||||
{ DCPTAG_PROFILE_HUE_SAT_MAP_DIMS,
|
|
||||||
-1,
|
|
||||||
-1,
|
|
||||||
TIFF_FLOAT,
|
|
||||||
FIELD_CUSTOM,
|
|
||||||
1,
|
|
||||||
1,
|
|
||||||
"ProfileHueSatMapDims" },
|
|
||||||
{ DCPTAG_PROFILE_HUE_SAT_MAP_DATA_1,
|
|
||||||
-1,
|
|
||||||
-1,
|
|
||||||
TIFF_FLOAT,
|
|
||||||
FIELD_CUSTOM,
|
|
||||||
1,
|
|
||||||
1,
|
|
||||||
"ProfileHueSatMapData1" },
|
|
||||||
{ DCPTAG_PROFILE_HUE_SAT_MAP_DATA_2,
|
|
||||||
-1,
|
|
||||||
-1,
|
|
||||||
TIFF_FLOAT,
|
|
||||||
FIELD_CUSTOM,
|
|
||||||
1,
|
|
||||||
1,
|
|
||||||
"ProfileHueSatMapData2" },
|
|
||||||
};
|
|
||||||
|
|
||||||
// Add missing dng fields
|
|
||||||
TIFFMergeFieldInfo(tif,
|
|
||||||
custom_fields,
|
|
||||||
sizeof(custom_fields) / sizeof(custom_fields[0]));
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
mp_process_find_all_processors(GtkListStore *store)
|
mp_process_find_all_processors(GtkListStore *store)
|
||||||
{
|
{
|
||||||
@@ -212,7 +149,7 @@ mp_process_find_processor(char *script)
|
|||||||
static void
|
static void
|
||||||
setup(MPPipeline *pipeline, const void *data)
|
setup(MPPipeline *pipeline, const void *data)
|
||||||
{
|
{
|
||||||
TIFFSetTagExtender(register_custom_tiff_tags);
|
libdng_init();
|
||||||
settings = g_settings_new("org.postmarketos.Megapixels");
|
settings = g_settings_new("org.postmarketos.Megapixels");
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -554,20 +491,21 @@ process_image_for_capture(const uint8_t *image, int count)
|
|||||||
char fname[255];
|
char fname[255];
|
||||||
sprintf(fname, "%s/%d.dng", burst_dir, count);
|
sprintf(fname, "%s/%d.dng", burst_dir, count);
|
||||||
|
|
||||||
TIFF *tif = TIFFOpen(fname, "w");
|
libdng_info dng = { 0 };
|
||||||
if (!tif) {
|
libdng_new(&dng);
|
||||||
printf("Could not open tiff\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
// Define TIFF thumbnail
|
libdng_set_mode_from_pixfmt(&dng, state_proc.mode->v4l_pixfmt);
|
||||||
TIFFSetField(tif, TIFFTAG_SUBFILETYPE, 1);
|
libdng_set_make_model(&dng,
|
||||||
TIFFSetField(tif, TIFFTAG_IMAGEWIDTH, state_proc.mode->width >> 4);
|
state_proc.configuration->make,
|
||||||
TIFFSetField(tif, TIFFTAG_IMAGELENGTH, state_proc.mode->height >> 4);
|
state_proc.configuration->model);
|
||||||
TIFFSetField(tif, TIFFTAG_BITSPERSAMPLE, 8);
|
|
||||||
TIFFSetField(tif, TIFFTAG_COMPRESSION, COMPRESSION_NONE);
|
libdng_write(&dng,
|
||||||
TIFFSetField(tif, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_RGB);
|
fname,
|
||||||
TIFFSetField(tif, TIFFTAG_MAKE, state_proc.configuration->make);
|
state_proc.mode->width,
|
||||||
TIFFSetField(tif, TIFFTAG_MODEL, state_proc.configuration->model);
|
state_proc.mode->height,
|
||||||
|
image,
|
||||||
|
count);
|
||||||
|
libdng_free(&dng);
|
||||||
|
|
||||||
uint16_t orientation;
|
uint16_t orientation;
|
||||||
if (state_proc.device_rotation == 0) {
|
if (state_proc.device_rotation == 0) {
|
||||||
@@ -585,19 +523,7 @@ process_image_for_capture(const uint8_t *image, int count)
|
|||||||
}
|
}
|
||||||
TIFFSetField(tif, TIFFTAG_ORIENTATION, orientation);
|
TIFFSetField(tif, TIFFTAG_ORIENTATION, orientation);
|
||||||
TIFFSetField(tif, TIFFTAG_DATETIME, datetime);
|
TIFFSetField(tif, TIFFTAG_DATETIME, datetime);
|
||||||
TIFFSetField(tif, TIFFTAG_SAMPLESPERPIXEL, 3);
|
|
||||||
TIFFSetField(tif, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG);
|
|
||||||
TIFFSetField(tif, TIFFTAG_SOFTWARE, "Megapixels");
|
TIFFSetField(tif, TIFFTAG_SOFTWARE, "Megapixels");
|
||||||
long sub_offset = 0;
|
|
||||||
TIFFSetField(tif, TIFFTAG_SUBIFD, 1, &sub_offset);
|
|
||||||
TIFFSetField(tif, TIFFTAG_DNGVERSION, "\001\001\0\0");
|
|
||||||
TIFFSetField(tif, TIFFTAG_DNGBACKWARDVERSION, "\001\0\0\0");
|
|
||||||
char uniquecameramodel[255];
|
|
||||||
sprintf(uniquecameramodel,
|
|
||||||
"%s %s",
|
|
||||||
state_proc.configuration->make,
|
|
||||||
state_proc.configuration->model);
|
|
||||||
TIFFSetField(tif, TIFFTAG_UNIQUECAMERAMODEL, uniquecameramodel);
|
|
||||||
|
|
||||||
static float neutral[] = { 1.0f, 1.0f, 1.0f };
|
static float neutral[] = { 1.0f, 1.0f, 1.0f };
|
||||||
neutral[0] = state_proc.red;
|
neutral[0] = state_proc.red;
|
||||||
@@ -616,28 +542,6 @@ process_image_for_capture(const uint8_t *image, int count)
|
|||||||
}
|
}
|
||||||
TIFFWriteDirectory(tif);
|
TIFFWriteDirectory(tif);
|
||||||
|
|
||||||
// Define main photo
|
|
||||||
TIFFSetField(tif, TIFFTAG_SUBFILETYPE, 0);
|
|
||||||
TIFFSetField(tif, TIFFTAG_IMAGEWIDTH, state_proc.mode->width);
|
|
||||||
TIFFSetField(tif, TIFFTAG_IMAGELENGTH, state_proc.mode->height);
|
|
||||||
TIFFSetField(tif,
|
|
||||||
TIFFTAG_BITSPERSAMPLE,
|
|
||||||
libmegapixels_format_bits_per_pixel(state_proc.mode->format));
|
|
||||||
TIFFSetField(tif, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_CFA);
|
|
||||||
TIFFSetField(tif, TIFFTAG_SAMPLESPERPIXEL, 1);
|
|
||||||
TIFFSetField(tif, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG);
|
|
||||||
static const short cfapatterndim[] = { 2, 2 };
|
|
||||||
TIFFSetField(tif, TIFFTAG_CFAREPEATPATTERNDIM, cfapatterndim);
|
|
||||||
#if (TIFFLIB_VERSION < 20201219) && !LIBTIFF_CFA_PATTERN
|
|
||||||
TIFFSetField(tif,
|
|
||||||
TIFFTAG_CFAPATTERN,
|
|
||||||
mp_pixel_format_cfa_pattern(mode.pixel_format));
|
|
||||||
#else
|
|
||||||
TIFFSetField(tif,
|
|
||||||
TIFFTAG_CFAPATTERN,
|
|
||||||
4,
|
|
||||||
libmegapixels_format_cfa_pattern(state_proc.mode->format));
|
|
||||||
#endif
|
|
||||||
printf("TIFF version %d\n", TIFFLIB_VERSION);
|
printf("TIFF version %d\n", TIFFLIB_VERSION);
|
||||||
int whitelevel =
|
int whitelevel =
|
||||||
(1 << libmegapixels_format_bits_per_pixel(state_proc.mode->format)) -
|
(1 << libmegapixels_format_bits_per_pixel(state_proc.mode->format)) -
|
||||||
|
Reference in New Issue
Block a user