gboolean auto_whitebalance_cam (const auto_sample_points* data, rgb_tripel* wb ) { rgb_tripel old_wb = *wb; if (wb->R < WB_IDENTITY) wb->R = WB_IDENTITY; if (wb->G < WB_IDENTITY) wb->G = WB_IDENTITY; if (wb->B < WB_IDENTITY) wb->B = WB_IDENTITY; if (old_wb.R != wb->R || old_wb.G != wb->G || old_wb.B != wb->B) return FALSE; while ((wb->R > WB_IDENTITY) && (wb->G > WB_IDENTITY) && (wb->B > WB_IDENTITY)) { wb->R -= 1; wb->G -= 1; wb->B -= 1; } rgb_tripel averageColor = average_color_cam( data); if (wb_auto_step(&averageColor, wb)) { return TRUE; } wb->R = clip( wb->R, WB_MAX ); wb->G = clip( wb->G, WB_MAX ); wb->B = clip( wb->B, WB_MAX ); GST_INFO("Calculated white balance R:%d G:%d B:%d", wb->R, wb->G, wb->B); return FALSE; }
gboolean auto_whitebalance (const auto_sample_points* data, rgb_tripel* wb, guint* resulting_brightness) { rgb_tripel old_wb = *wb; if (wb->R < WB_IDENTITY) wb->R = WB_IDENTITY; if (wb->G < WB_IDENTITY) wb->G = WB_IDENTITY; if (wb->B < WB_IDENTITY) wb->B = WB_IDENTITY; if (old_wb.R != wb->R || old_wb.G != wb->G || old_wb.B != wb->B) return FALSE; while ((wb->R > WB_IDENTITY) && (wb->G > WB_IDENTITY) && (wb->B > WB_IDENTITY)) { wb->R -= 1; wb->G -= 1; wb->B -= 1; } unsigned int steps = 0; while (steps++ < MAX_STEPS) { rgb_tripel tmp = simulate_whitebalance( data, wb, TRUE ); // Simulate white balance once more, this time always on the whole image rgb_tripel tmp2 = simulate_whitebalance( data, wb, FALSE ); *resulting_brightness = calc_brightness_from_clr_avg( tmp2.R, tmp2.G, tmp2.B ); if (wb_auto_step(&tmp, wb)) { return TRUE; } } wb->R = clip( wb->R, WB_MAX ); wb->G = clip( wb->G, WB_MAX ); wb->B = clip( wb->B, WB_MAX ); return FALSE; }