contrib: soxr: enable by default
[vlc.git] / modules / hw / vdpau / adjust.c
blobf7905d65d69e219ad482ecc19ff8fc91c7f52c18
1 /*****************************************************************************
2 * adjust.c: VDPAU colour adjust video filter
3 *****************************************************************************
4 * Copyright (C) 2013 RĂ©mi Denis-Courmont
6 * This program is free software; you can redistribute it and/or modify it
7 * under the terms of the GNU Lesser General Public License as published by
8 * the Free Software Foundation; either version 2.1 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public License
17 * along with this program; if not, write to the Free Software Foundation,
18 * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
19 *****************************************************************************/
21 #ifdef HAVE_CONFIG_H
22 # include "config.h"
23 #endif
25 #include <stdlib.h>
26 #include <math.h>
28 #include <vlc_common.h>
29 #include <vlc_plugin.h>
30 #include <vlc_filter.h>
31 #include <vlc_atomic.h>
32 #include <vlc_picture.h>
33 #include "vlc_vdpau.h"
35 struct filter_sys_t
37 vlc_atomic_float brightness;
38 vlc_atomic_float contrast;
39 vlc_atomic_float saturation;
40 vlc_atomic_float hue;
43 static float vlc_to_vdp_brightness(float brightness)
45 brightness -= 1.f;
46 if (brightness > +1.f)
47 brightness = +1.f;
48 if (brightness < -1.f)
49 brightness = -1.f;
50 return brightness;
53 static int BrightnessCallback(vlc_object_t *obj, const char *varname,
54 vlc_value_t prev, vlc_value_t cur, void *data)
56 vlc_atomic_store_float(data, vlc_to_vdp_brightness(cur.f_float));
57 (void) obj; (void) varname; (void) prev;
58 return VLC_SUCCESS;
61 static float vlc_to_vdp_contrast(float contrast)
63 if (contrast > 10.f)
64 contrast = 10.f;
65 if (contrast < 0.f)
66 contrast = 0.f;
67 return contrast;
70 static int ContrastCallback(vlc_object_t *obj, const char *varname,
71 vlc_value_t prev, vlc_value_t cur, void *data)
73 vlc_atomic_store_float(data, vlc_to_vdp_contrast(cur.f_float));
74 (void) obj; (void) varname; (void) prev;
75 return VLC_SUCCESS;
78 #define vlc_to_vdp_saturation vlc_to_vdp_contrast
80 static int SaturationCallback(vlc_object_t *obj, const char *varname,
81 vlc_value_t prev, vlc_value_t cur, void *data)
83 vlc_atomic_store_float(data, vlc_to_vdp_saturation(cur.f_float));
84 (void) obj; (void) varname; (void) prev;
85 return VLC_SUCCESS;
88 static float vlc_to_vdp_hue(float hue)
90 float dummy;
92 hue /= 360.f;
93 hue = modff(hue, &dummy);
94 if (hue > .5f)
95 hue -= 1.f;
96 return hue * (float)(2. * M_PI);
99 static int HueCallback(vlc_object_t *obj, const char *varname,
100 vlc_value_t prev, vlc_value_t cur, void *data)
103 vlc_atomic_store_float(data, vlc_to_vdp_hue(cur.f_float));
104 (void) obj; (void) varname; (void) prev;
105 return VLC_SUCCESS;
108 static picture_t *Adjust(filter_t *filter, picture_t *pic)
110 filter_sys_t *sys = filter->p_sys;
111 vlc_vdp_video_field_t *f = (vlc_vdp_video_field_t *)pic->context;
113 if (unlikely(f == NULL))
114 return pic;
116 f->procamp.brightness = vlc_atomic_load_float(&sys->brightness);
117 f->procamp.contrast = vlc_atomic_load_float(&sys->contrast);
118 f->procamp.saturation = vlc_atomic_load_float(&sys->saturation);
119 f->procamp.hue = vlc_atomic_load_float(&sys->hue);
121 return pic;
124 static const char *const options[] = {
125 "brightness", "contrast", "saturation", "hue", NULL
128 static int Open(vlc_object_t *obj)
130 filter_t *filter = (filter_t *)obj;
132 if (filter->fmt_in.video.i_chroma != VLC_CODEC_VDPAU_VIDEO_420
133 && filter->fmt_in.video.i_chroma != VLC_CODEC_VDPAU_VIDEO_422
134 && filter->fmt_in.video.i_chroma != VLC_CODEC_VDPAU_VIDEO_444)
135 return VLC_EGENERIC;
136 if (!video_format_IsSimilar(&filter->fmt_in.video, &filter->fmt_out.video))
137 return VLC_EGENERIC;
139 filter_sys_t *sys = malloc(sizeof (*sys));
140 if (unlikely(sys == NULL))
141 return VLC_ENOMEM;
143 filter->pf_video_filter = Adjust;
144 filter->p_sys = sys;
146 config_ChainParse(filter, "", options, filter->p_cfg);
148 float f;
149 int i;
151 f = var_CreateGetFloatCommand(filter, "brightness");
152 var_AddCallback(filter, "brightness", BrightnessCallback,
153 &sys->brightness);
154 vlc_atomic_init_float(&sys->brightness, vlc_to_vdp_brightness(f));
156 f = var_CreateGetFloatCommand(filter, "contrast");
157 var_AddCallback(filter, "contrast", ContrastCallback, &sys->contrast);
158 vlc_atomic_init_float(&sys->contrast, vlc_to_vdp_contrast(f));
160 f = var_CreateGetFloatCommand(filter, "saturation");
161 var_AddCallback(filter, "saturation", SaturationCallback,
162 &sys->saturation);
163 vlc_atomic_init_float(&sys->saturation, vlc_to_vdp_saturation(f));
165 i = var_CreateGetFloatCommand(filter, "hue");
166 var_AddCallback(filter, "hue", HueCallback, &sys->hue);
167 vlc_atomic_init_float(&sys->hue, vlc_to_vdp_hue(i));
169 return VLC_SUCCESS;
172 static void Close(vlc_object_t *obj)
174 filter_t *filter = (filter_t *)obj;
175 filter_sys_t *sys = filter->p_sys;
177 var_DelCallback(filter, "hue", HueCallback, &sys->hue);
178 var_DelCallback(filter, "saturation", SaturationCallback,
179 &sys->saturation);
180 var_DelCallback(filter, "contrast", ContrastCallback, &sys->contrast);
181 var_DelCallback(filter, "brightness", BrightnessCallback,
182 &sys->brightness);
183 free(sys);
186 vlc_module_begin()
187 set_description(N_("VDPAU adjust video filter"))
188 set_category(CAT_VIDEO)
189 set_subcategory(SUBCAT_VIDEO_VFILTER)
190 set_capability("video filter", 0)
191 add_shortcut("adjust")
192 set_callbacks(Open, Close)
193 vlc_module_end()