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 *****************************************************************************/
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"
37 vlc_atomic_float brightness
;
38 vlc_atomic_float contrast
;
39 vlc_atomic_float saturation
;
43 static float vlc_to_vdp_brightness(float brightness
)
46 if (brightness
> +1.f
)
48 if (brightness
< -1.f
)
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
;
61 static float vlc_to_vdp_contrast(float 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
;
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
;
88 static float vlc_to_vdp_hue(float hue
)
93 hue
= modff(hue
, &dummy
);
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
;
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
))
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
);
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
)
136 if (!video_format_IsSimilar(&filter
->fmt_in
.video
, &filter
->fmt_out
.video
))
139 filter_sys_t
*sys
= malloc(sizeof (*sys
));
140 if (unlikely(sys
== NULL
))
143 filter
->pf_video_filter
= Adjust
;
146 config_ChainParse(filter
, "", options
, filter
->p_cfg
);
151 f
= var_CreateGetFloatCommand(filter
, "brightness");
152 var_AddCallback(filter
, "brightness", BrightnessCallback
,
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
,
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
));
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
,
180 var_DelCallback(filter
, "contrast", ContrastCallback
, &sys
->contrast
);
181 var_DelCallback(filter
, "brightness", BrightnessCallback
,
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
)