WIP AAA stuff

This commit is contained in:
Martijn Braam
2023-12-05 14:57:22 +01:00
parent f766e71935
commit 48320f4efc
2 changed files with 43 additions and 18 deletions

View File

@@ -108,6 +108,11 @@ typedef struct _lmp_device_config libmegapixels_devconfig;
typedef struct _lmp_aaa {
float matrix1[9];
float matrix2[9];
float avg_r;
float avg_g;
float avg_b;
int exposure;
float temp;
float tint;
@@ -166,8 +171,15 @@ libmegapixels_format_bits_per_pixel(int format);
EXPORT int
libmegapixels_mode_equals(libmegapixels_mode *a, libmegapixels_mode *b);
EXPORT void
libmegapixels_aaa_software_statistics(unsigned int *frame, int width, int height,
libmegapixels_aaa_stats *stats);
libmegapixels_aaa_init(libmegapixels_aaa_stats *stats);
EXPORT void
libmegapixels_aaa_set_matrix(libmegapixels_aaa_stats *stats, const float matrix1[9], const float matrix2[9]);
EXPORT void
libmegapixels_aaa_software_statistics(libmegapixels_aaa_stats *stats, const unsigned int *frame, int width, int height);
#endif

View File

@@ -15,16 +15,31 @@ clamp_float(float value, float min, float max)
}
void
libmegapixels_aaa_software_statistics(unsigned int *frame, const int width, const int height,
libmegapixels_aaa_stats *stats)
libmegapixels_aaa_init(libmegapixels_aaa_stats *stats)
{
float identity[] = {1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f};
libmegapixels_aaa_set_matrix(stats, identity, identity);
}
void
libmegapixels_aaa_set_matrix(libmegapixels_aaa_stats *stats, const float *matrix1, const float *matrix2)
{
for (size_t i = 0; i < 9; i++) {
stats->matrix1[i] = matrix1[i];
stats->matrix2[i] = matrix2[i];
}
}
void
libmegapixels_aaa_software_statistics(libmegapixels_aaa_stats *stats, const unsigned int *frame, const int width,
const int height)
{
unsigned int bright = 0;
unsigned int too_bright = 0;
unsigned int too_dark = 0;
unsigned int total = 0;
unsigned int total = width * height;
unsigned long long sum_r = 0, sum_g = 0, sum_b = 0;
for (ssize_t p = 0; p < width * height; p++) {
total++;
unsigned int r = (frame[p] >> 0) & 0xff;
unsigned int g = (frame[p] >> 8) & 0xff;
unsigned int b = (frame[p] >> 16) & 0xff;
@@ -48,6 +63,8 @@ libmegapixels_aaa_software_statistics(unsigned int *frame, const int width, cons
sum_b += b;
}
}
// Exposure calculations
unsigned int p_bright = (bright * 100) / total;
unsigned int p_too_bright = (too_bright * 100) / total;
unsigned int p_dark = (too_dark * 100) / total;
@@ -66,16 +83,12 @@ libmegapixels_aaa_software_statistics(unsigned int *frame, const int width, cons
stats->blacklevel = 1;
}
float y = (float) (sum_r * 0.2126 + sum_g * 0.7175 + sum_b * 0.0722);
float r = (float) sum_r / y;
float g = (float) sum_g / y;
float b = (float) sum_b / y;
if (y < 1) {
r = 0;
g = 0;
b = 0;
}
float m = (r + b) / 2.0f;
stats->temp = clamp_float(b - r, 0, 2);
stats->tint = clamp_float(g - m, 0, 2);
// Whitebalance calculations
float r = (float) sum_r / total;
float g = (float) sum_g / total;
float b = (float) sum_b / total;
stats->avg_r = (r * stats->matrix1[0]) + (g * stats->matrix1[1]) + (b * stats->matrix1[2]);
stats->avg_g = (r * stats->matrix1[3]) + (g * stats->matrix1[4]) + (b * stats->matrix1[5]);
stats->avg_b = (r * stats->matrix1[6]) + (g * stats->matrix1[7]) + (b * stats->matrix1[8]);
}