Files
Megapixels/src/dcp.c
2025-03-12 12:08:42 +00:00

64 lines
2.0 KiB
C

#include "dcp.h"
#include <libdng.h>
#include <libmegapixels.h>
#include <malloc.h>
#include <stdbool.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#ifndef SYSCONFDIR
#include "config.h"
#endif
bool
find_calibration_by_model(char *conffile, char *model, const char *sensor)
{
static const char *paths[] = {
"config/%s,%s.dcp",
SYSCONFDIR "/megapixels/config/%s,%s.dcp",
DATADIR "/megapixels/config/%s,%s.dcp",
NULL
};
for (const char *fmt = paths[0]; fmt; fmt++) {
sprintf(conffile, fmt, model, sensor);
if (access(conffile, F_OK) != -1) {
printf("Found calibration file at %s\n", conffile);
return true;
}
}
printf("No calibration found for %s,%s\n", model, sensor);
return false;
}
bool
find_calibration(char *conffile, const char *sensor)
{
char model[512];
int model_found = libmegapixels_get_model(sizeof(model), model);
if (!model_found)
return false;
return find_calibration_by_model(conffile, model, sensor);
}
struct MPCameraCalibration
parse_calibration_file(const char *path)
{
struct MPCameraCalibration result;
libdng_info temp = { 0 };
libdng_new(&temp);
libdng_load_calibration_file(&temp, path);
memcpy(result.color_matrix_1, temp.color_matrix_1, 9 * sizeof(float));
memcpy(result.color_matrix_2, temp.color_matrix_2, 9 * sizeof(float));
memcpy(result.forward_matrix_1, temp.forward_matrix_1, 9 * sizeof(float));
memcpy(result.forward_matrix_2, temp.forward_matrix_2, 9 * sizeof(float));
result.tone_curve_length = temp.tone_curve_length;
result.tone_curve = malloc(temp.tone_curve_length * sizeof(float));
memcpy(result.tone_curve,
temp.tone_curve,
temp.tone_curve_length * sizeof(float));
return result;
}