Browse Source

Output floats in the AAA code

Martijn Braam 1 year ago
parent
commit
3985eee5f6
2 changed files with 45 additions and 32 deletions
  1. 3 3
      include/libmegapixels.h
  2. 42 29
      src/aaa.c

+ 3 - 3
include/libmegapixels.h

@@ -106,8 +106,8 @@ typedef struct _lmp_device_config libmegapixels_devconfig;
 
 typedef struct _lmp_aaa {
 		int exposure;
-		int whitebalance;
-		int tint;
+		float temp;
+		float tint;
 		int focus;
 		int blacklevel;
 } libmegapixels_aaa_stats;
@@ -167,4 +167,4 @@ EXPORT void
 libmegapixels_aaa_software_statistics(unsigned int *frame, int width, int height,
 	libmegapixels_aaa_stats *stats);
 
-#endif
+#endif

+ 42 - 29
src/aaa.c

@@ -1,6 +1,19 @@
 #include <stdio.h>
 #include "libmegapixels.h"
 
+
+float
+clamp_float(float value, float min, float max)
+{
+	if (value > max)
+		return max;
+
+	if (value < min)
+		return min;
+
+	return value;
+}
+
 void
 libmegapixels_aaa_software_statistics(unsigned int *frame, const int width, const int height,
 	libmegapixels_aaa_stats *stats)
@@ -12,22 +25,28 @@ libmegapixels_aaa_software_statistics(unsigned int *frame, const int width, cons
 	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] >> 16 & 0xff;
-		unsigned int g = frame[p] >> 8 & 0xff;
-		unsigned int b = frame[p] & 0xff;
-		if (g > 220 || r > 220) {
+		unsigned int r = (frame[p] >> 0) & 0xff;
+		unsigned int g = (frame[p] >> 8) & 0xff;
+		unsigned int b = (frame[p] >> 16) & 0xff;
+		unsigned int y = (r + g + b) / 3;
+
+		if (y > 220) {
 			too_bright++;
 		}
 
-		if (g > 180 || r > 180) {
+		if (y > 180) {
 			bright++;
 		}
-		if (g < 2) {
+		if (y < 2) {
 			too_dark++;
 		}
-		sum_r += r;
-		sum_g += g;
-		sum_b += b;
+
+		// Whitebalance on the midrange pixels only
+		if (y > 75 && y < 200) {
+			sum_r += r;
+			sum_g += g;
+			sum_b += b;
+		}
 	}
 	unsigned int p_bright = (bright * 100) / total;
 	unsigned int p_too_bright = (too_bright * 100) / total;
@@ -40,29 +59,23 @@ libmegapixels_aaa_software_statistics(unsigned int *frame, const int width, cons
 		stats->exposure = -1;
 	}
 	stats->blacklevel = 0;
-	if (p_dark == 0) {
+	if (p_dark < 1) {
 		stats->blacklevel = -1;
 	}
-	if (p_dark > 8) {
+	if (p_dark > 3) {
 		stats->blacklevel = 1;
 	}
 
-	float y = (float) (sum_r + sum_g + sum_b) / 3.0f;
-	float r = (float) sum_r / y - 1.0f;
-	float g = (float) sum_g / y - 1.0f;
-	float b = (float) sum_b / y - 1.0f;
-	stats->whitebalance = 0;
-	stats->tint = 0;
-	if (g > 0.1f) {
-		stats->tint = 1;
-	}
-	if (g < 0.1f) {
-		stats->tint = -1;
-	}
-	if (r > b * 1.3) {
-		stats->whitebalance = -1;
-	}
-	if (b > r * 1.3) {
-		stats->whitebalance = 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);
+}