From a8fbe67ffbd0299169317074bdab82a84d35dc3b Mon Sep 17 00:00:00 2001 From: Frank Enderle Date: Thu, 24 Jun 2010 03:16:04 +0300 Subject: [PATCH] Add adjust filter features to libvlc_media_player/libvlc_video MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit This patch exposes the adjust module to libvlc_media_player/libvlc_video and adds a frequently requested featureset: to manipulate brightness, contrast, gamma, saturation and hue through libvlc. The patch introduces a new set of functions analogous to libvlc_video_{get,set}_{marq,logo}_*, hence the use of the function set should be self explanatory. New Functions: * value = libvlc_video_get_adjust_int( p_mi, option ); * libvlc_video_set_adjust_int( p_mi, option, value ); * value = libvlc_video_get_adjust_float( p_mi, option ); * libvlc_video_set_adjust_float( p_mi, option, value ); New Options: * libvlc_adjust_Enable * libvlc_adjust_Contrast * libvlc_adjust_Brightness * libvlc_adjust_Hue * libvlc_adjust_Saturation * libvlc_adjust_Gamma Signed-off-by: Rémi Denis-Courmont --- include/vlc/libvlc_media_player.h | 52 ++++++++++++++++++ src/control/media_player.c | 6 +++ src/control/video.c | 90 +++++++++++++++++++++++++++++++ src/libvlc.sym | 6 +++ 4 files changed, 154 insertions(+) diff --git a/include/vlc/libvlc_media_player.h b/include/vlc/libvlc_media_player.h index 788197129b..0c1a4ef17b 100644 --- a/include/vlc/libvlc_media_player.h +++ b/include/vlc/libvlc_media_player.h @@ -925,6 +925,58 @@ VLC_PUBLIC_API void libvlc_video_set_logo_string( libvlc_media_player_t *p_mi, unsigned option, const char *psz_value ); +/** option values for libvlc_video_{get,set}_adjust_{int,float,bool} */ +enum libvlc_video_adjust_option_t { + libvlc_adjust_Enable = 0, + libvlc_adjust_Contrast, + libvlc_adjust_Brightness, + libvlc_adjust_Hue, + libvlc_adjust_Saturation, + libvlc_adjust_Gamma, +}; + +/** + * Get integer adjust option. + * + * \param p_mi libvlc media player instance + * \param option adjust option to get, values of libvlc_video_adjust_option_t + */ +VLC_PUBLIC_API int libvlc_video_get_adjust_int( libvlc_media_player_t *p_mi, + unsigned option ); + +/** + * Set adjust option as integer. Options that take a different type value + * are ignored. + * Passing libvlc_adjust_enable as option value has the side effect of + * starting (arg !0) or stopping (arg 0) the adjust filter. + * + * \param p_mi libvlc media player instance + * \param option adust option to set, values of libvlc_video_adjust_option_t + * \param value adjust option value + */ +VLC_PUBLIC_API void libvlc_video_set_adjust_int( libvlc_media_player_t *p_mi, + unsigned option, int value ); + +/** + * Get float adjust option. + * + * \param p_mi libvlc media player instance + * \param option adjust option to get, values of libvlc_video_adjust_option_t + */ +VLC_PUBLIC_API float libvlc_video_get_adjust_float( libvlc_media_player_t *p_mi, + unsigned option ); + +/** + * Set adjust option as float. Options that take a different type value + * are ignored. + * + * \param p_mi libvlc media player instance + * \param option adust option to set, values of libvlc_video_adjust_option_t + * \param value adjust option value + */ +VLC_PUBLIC_API void libvlc_video_set_adjust_float( libvlc_media_player_t *p_mi, + unsigned option, float value ); + /** @} video */ /** \defgroup libvlc_audio LibVLC audio controls diff --git a/src/control/media_player.c b/src/control/media_player.c index 5b33293aaf..a9104eeb34 100644 --- a/src/control/media_player.c +++ b/src/control/media_player.c @@ -411,6 +411,12 @@ libvlc_media_player_new( libvlc_instance_t *instance ) var_Create (mp, "logo-opacity", VLC_VAR_INTEGER | VLC_VAR_DOINHERIT); var_Create (mp, "logo-position", VLC_VAR_INTEGER | VLC_VAR_DOINHERIT); + var_Create (mp, "contrast", VLC_VAR_FLOAT | VLC_VAR_DOINHERIT); + var_Create (mp, "brightness", VLC_VAR_FLOAT | VLC_VAR_DOINHERIT); + var_Create (mp, "hue", VLC_VAR_INTEGER | VLC_VAR_DOINHERIT); + var_Create (mp, "saturation", VLC_VAR_FLOAT | VLC_VAR_DOINHERIT); + var_Create (mp, "gamma", VLC_VAR_FLOAT | VLC_VAR_DOINHERIT); + /* Audio */ var_Create (mp, "aout", VLC_VAR_STRING | VLC_VAR_DOINHERIT); var_Create (mp, "volume-muted", VLC_VAR_BOOL); diff --git a/src/control/video.c b/src/control/video.c index ebdafa1ea7..09070e3c02 100644 --- a/src/control/video.c +++ b/src/control/video.c @@ -671,6 +671,46 @@ get_int( libvlc_media_player_t *p_mi, const char *restrict name, } +static void +set_float( libvlc_media_player_t *p_mi, const char *restrict name, + const opt_t *restrict opt, float value ) +{ + if( !opt ) return; + + if( opt->type != VLC_VAR_FLOAT ) + { + libvlc_printerr( "Invalid argument to %s in %s", name, "set float" ); + return; + } + + var_SetFloat( p_mi, opt->name, value ); + + vlc_object_t *object = get_object( p_mi, name ); + if( object ) + { + var_SetFloat(object, opt->name, value ); + vlc_object_release( object ); + } +} + + +static float +get_float( libvlc_media_player_t *p_mi, const char *restrict name, + const opt_t *restrict opt ) +{ + if( !opt ) return 0.0; + + + if( opt->type != VLC_VAR_FLOAT ) + { + libvlc_printerr( "Invalid argument to %s in %s", name, "get float" ); + return 0.0; + } + + return var_GetFloat( p_mi, opt->name ); +} + + static void set_string( libvlc_media_player_t *p_mi, const char *restrict name, const opt_t *restrict opt, const char *restrict psz_value ) @@ -821,3 +861,53 @@ int libvlc_video_get_logo_int( libvlc_media_player_t *p_mi, } +/* adjust module support */ + + +static opt_t * +adjust_option_bynumber( unsigned option ) +{ + static const opt_t optlist[] = + { + { "adjust", 0 }, + { "contrast", VLC_VAR_FLOAT }, + { "brightness", VLC_VAR_FLOAT }, + { "hue", VLC_VAR_INTEGER }, + { "saturation", VLC_VAR_FLOAT }, + { "gamma", VLC_VAR_FLOAT }, + }; + enum { num_opts = sizeof(optlist) / sizeof(*optlist) }; + + opt_t *r = option < num_opts ? optlist+option : NULL; + if( !r ) + libvlc_printerr( "Unknown adjust option" ); + return r; +} + + +void libvlc_video_set_adjust_int( libvlc_media_player_t *p_mi, + unsigned option, int value ) +{ + set_int( p_mi, "adjust", adjust_option_bynumber(option), value ); +} + + +int libvlc_video_get_adjust_int( libvlc_media_player_t *p_mi, + unsigned option ) +{ + return get_int( p_mi, "adjust", adjust_option_bynumber(option) ); +} + + +void libvlc_video_set_adjust_float( libvlc_media_player_t *p_mi, + unsigned option, float value ) +{ + set_float( p_mi, "adjust", adjust_option_bynumber(option), value ); +} + + +float libvlc_video_get_adjust_float( libvlc_media_player_t *p_mi, + unsigned option ) +{ + return get_float( p_mi, "adjust", adjust_option_bynumber(option) ); +} diff --git a/src/libvlc.sym b/src/libvlc.sym index d46a177cc8..0cddd65991 100644 --- a/src/libvlc.sym +++ b/src/libvlc.sym @@ -162,6 +162,9 @@ libvlc_set_log_verbosity libvlc_toggle_fullscreen libvlc_toggle_teletext libvlc_track_description_release +libvlc_video_get_adjust_bool +libvlc_video_get_adjust_float +libvlc_video_get_adjust_int libvlc_video_get_aspect_ratio libvlc_video_get_chapter_description libvlc_video_get_crop_geometry @@ -181,6 +184,9 @@ libvlc_video_get_track libvlc_video_get_track_count libvlc_video_get_track_description libvlc_video_get_width +libvlc_video_set_adjust_bool +libvlc_video_set_adjust_float +libvlc_video_set_adjust_int libvlc_video_set_aspect_ratio libvlc_video_set_crop_geometry libvlc_video_set_deinterlace -- 2.39.2