1 /*
2 # (C) 2008-2009 Hans de Goede <hdegoede@redhat.com>
3
4 # This program is free software; you can redistribute it and/or modify
5 # it under the terms of the GNU Lesser General Public License as published by
6 # the Free Software Foundation; either version 2.1 of the License, or
7 # (at your option) any later version.
8 #
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU Lesser General Public License for more details.
13 #
14 # You should have received a copy of the GNU Lesser General Public License
15 # along with this program; if not, write to the Free Software
16 # Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335 USA
17 */
18
19 #include <math.h>
20 #include "libv4lprocessing.h"
21 #include "libv4lprocessing-priv.h"
22
23 #define CLIP(color) (unsigned char)(((color) > 0xff) ? 0xff : (((color) < 0) ? 0 : (color)))
24
gamma_active(struct v4lprocessing_data * data)25 static int gamma_active(struct v4lprocessing_data *data)
26 {
27 int gamma = v4lcontrol_get_ctrl(data->control, V4LCONTROL_GAMMA);
28
29 return gamma && gamma != 1000;
30 }
31
gamma_calculate_lookup_tables(struct v4lprocessing_data * data,unsigned char * buf,const struct v4l2_format * fmt)32 static int gamma_calculate_lookup_tables(
33 struct v4lprocessing_data *data,
34 unsigned char *buf, const struct v4l2_format *fmt)
35 {
36 int i, x, gamma;
37
38 gamma = v4lcontrol_get_ctrl(data->control, V4LCONTROL_GAMMA);
39
40 if (gamma == 0)
41 return 0;
42
43 if (gamma != data->last_gamma) {
44 for (i = 0; i < 256; i++) {
45 x = powf(i / 255.0, 1000.0 / gamma) * 255;
46 data->gamma_table[i] = CLIP(x);
47 }
48 data->last_gamma = gamma;
49 }
50
51 for (i = 0; i < 256; i++) {
52 data->comp1[i] = data->gamma_table[data->comp1[i]];
53 data->green[i] = data->gamma_table[data->green[i]];
54 data->comp2[i] = data->gamma_table[data->comp2[i]];
55 }
56
57 return 1;
58 }
59
60 struct v4lprocessing_filter gamma_filter = {
61 gamma_active, gamma_calculate_lookup_tables
62 };
63