From 1575219755355e174589cb4e108e703f94fb973b Mon Sep 17 00:00:00 2001 From: =?utf8?q?Cyril=20Math=C3=A9?= Date: Tue, 23 Jun 2009 09:46:00 +0200 Subject: [PATCH] libvlc API: Add Marquee Filter to libvlc in video.c -libvlc_video_get_marquee_option_as_int : get an option int value -libvlc_video_get_marquee_option_as_string : get an option string value -libvlc_video_set_marquee_option_as_int : enable, disable or set an int value -libvlc_video_set_marquee_option_as_string : set a string value to marq Modified patch from Cyril Mathe This API implementation is very limitied, as no presistent state is preserved, and settings can only be set when a vout is around. This makes the whole thing very limitating. Hopefuly we'll get a better implementation over the time. --- include/vlc/libvlc_media_player.h | 69 ++++++++++++ src/control/video.c | 174 ++++++++++++++++++++++++++++++ src/libvlc.sym | 4 + 3 files changed, 247 insertions(+) diff --git a/include/vlc/libvlc_media_player.h b/include/vlc/libvlc_media_player.h index 4b811a09f0..d44c006255 100644 --- a/include/vlc/libvlc_media_player.h +++ b/include/vlc/libvlc_media_player.h @@ -76,6 +76,28 @@ typedef struct libvlc_rectangle_t int bottom, right; } libvlc_rectangle_t; +/** + * Marq int options definition + */ +typedef enum libvlc_video_marquee_int_option_t { + libvlc_marquee_Enabled = 0, + libvlc_marquee_Color, + libvlc_marquee_Opacity, + libvlc_marquee_Position, + libvlc_marquee_Refresh, + libvlc_marquee_Size, + libvlc_marquee_Timeout, + libvlc_marquee_X, + libvlc_marquee_Y +} libvlc_video_marquee_int_option_t; + +/** + * Marq string options definition + */ +typedef enum libvlc_video_marquee_string_option_t { + libvlc_marquee_Text = 0 +} libvlc_video_marquee_string_option_t; + /** * Create an empty Media Player object @@ -726,6 +748,53 @@ VLC_PUBLIC_API void libvlc_video_set_deinterlace( libvlc_media_player_t *, int , const char *, libvlc_exception_t *); +/** + * Get an option value (option which return an int) + * + * \param p_mi libvlc media player + * \param option marq option to get + * \param p_e an initialized exception pointer + */ +VLC_PUBLIC_API int libvlc_video_get_marquee_option_as_int( libvlc_media_player_t *, + libvlc_video_marquee_int_option_t, + libvlc_exception_t * ); + +/** + * Get an option value (option which return a string) + * + * \param p_mi libvlc media player + * \param option marq option to get + * \param p_e an initialized exception pointer + */ +VLC_PUBLIC_API char *libvlc_video_get_marquee_option_as_string( libvlc_media_player_t *, + libvlc_video_marquee_string_option_t, + libvlc_exception_t * ); + +/** + * Enable, disable or set a marq option (only int) + * + * \param p_mi libvlc media player + * \param option marq option to set + * \param i_val marq option value + * \param p_e an initialized exception pointer + */ +VLC_PUBLIC_API void libvlc_video_set_marquee_option_as_int( libvlc_media_player_t *, + libvlc_video_marquee_int_option_t, + int, libvlc_exception_t * ); + +/** + * Set a marq option (only string) + * + * \param p_mi libvlc media player + * \param option marq option to set + * \param psz_text marq option value + * \param p_e an initialized exception pointer + */ +VLC_PUBLIC_API void libvlc_video_set_marquee_option_as_string( libvlc_media_player_t *, + libvlc_video_marquee_string_option_t, + const char *, + libvlc_exception_t * ); + /** @} video */ /** \defgroup libvlc_audio libvlc_audio diff --git a/src/control/video.c b/src/control/video.c index d90b1a4115..330637d951 100644 --- a/src/control/video.c +++ b/src/control/video.c @@ -34,6 +34,7 @@ #include #include "media_player_internal.h" +#include /* * Remember to release the returned vout_thread_t. @@ -628,3 +629,176 @@ void libvlc_video_set_deinterlace( libvlc_media_player_t *p_mi, int b_enable, vlc_object_release( p_vout ); } + +/***************************************************************************** + * Marquee: FIXME: That implementation has not persistent state and requires + * a vout + *****************************************************************************/ + +static inline const char * get_marquee_int_option_identifier(unsigned option) +{ + static const char * marquee_table[] = + { + "marq", + "marq-color", + "marq-opacity", + "marq-position", + "marq-refresh", + "marq-size", + "marq-timeout", + "marq-x", + "marq-y" + }; + static const unsigned marquee_table_size = sizeof(marquee_table)/sizeof(*marquee_table); + if( option >= marquee_table_size ) + return NULL; + return marquee_table[option]; +} + +static inline const char * get_marquee_string_option_identifier(unsigned option) +{ + static const char * marquee_table[] = + { + "marq-marquee" + }; + static const unsigned marquee_table_size = sizeof(marquee_table)/sizeof(*marquee_table); + if( option >= marquee_table_size ) + return NULL; + return marquee_table[option]; +} + + +static inline vlc_object_t * get_marquee_object( libvlc_media_player_t * p_mi ) +{ + libvlc_exception_t e; + libvlc_exception_init(&e); + vout_thread_t * vout = GetVout( p_mi, &e ); + libvlc_exception_clear(&e); + if( !vout ) + return NULL; + vlc_object_t * object = vlc_object_find_name( vout, "marq", FIND_CHILD ); + vlc_object_release(vout); + return object; +} + +/***************************************************************************** + * libvlc_video_get_marquee_option_as_int : get a marq option value + *****************************************************************************/ +int libvlc_video_get_marquee_option_as_int( libvlc_media_player_t *p_mi, + libvlc_video_marquee_int_option_t option, + libvlc_exception_t *p_e ) +{ + const char * identifier = get_marquee_int_option_identifier(option); + if(!identifier) + { + libvlc_exception_raise( p_e, "This option is not available" ); + return 0; + } + vlc_object_t * marquee = get_marquee_object(p_mi); + + /* Handle the libvlc_marquee_Enabled separately */ + if(option == libvlc_marquee_Enabled) + { + bool isEnabled = marquee != NULL; + vlc_object_release(marquee); + return isEnabled; + } + + /* Generic case */ + if(!identifier) + { + libvlc_exception_raise( p_e, "Marquee is not enabled" ); + return 0; + } + int ret = var_GetInteger(marquee, identifier); + vlc_object_release(marquee); + return ret; +} + +/***************************************************************************** + * libvlc_video_get_marquee_option_as_string : get a marq option value + *****************************************************************************/ +char * libvlc_video_get_marquee_option_as_string( libvlc_media_player_t *p_mi, + libvlc_video_marquee_string_option_t option, + libvlc_exception_t *p_e ) +{ + const char * identifier = get_marquee_string_option_identifier(option); + if(!identifier) + { + libvlc_exception_raise( p_e, "This option is not available" ); + return 0; + } + + vlc_object_t * marquee = get_marquee_object(p_mi); + if(!marquee) + { + libvlc_exception_raise( p_e, "Marquee is not enabled" ); + return 0; + } + char *ret = var_GetString(marquee, identifier); + vlc_object_release(marquee); + return ret; +} + +/***************************************************************************** + * libvlc_video_set_marquee_option_as_int: enable, disable or set an int option + *****************************************************************************/ +void libvlc_video_set_marquee_option_as_int( libvlc_media_player_t *p_mi, + libvlc_video_marquee_int_option_t option, + int value, libvlc_exception_t *p_e ) +{ + const char * identifier = get_marquee_string_option_identifier(option); + if(!identifier) + { + libvlc_exception_raise( p_e, "This option is not available" ); + return; + } + + /* Handle the libvlc_marquee_Enabled separately */ + if(option == libvlc_marquee_Enabled) + { + libvlc_exception_t e; + libvlc_exception_init(&e); + vout_thread_t * vout = GetVout( p_mi, &e ); + libvlc_exception_clear(&e); + if (vout) + vout_EnableFilter(vout, identifier, value, false); + else + libvlc_exception_raise( p_e, "No Vout" ); + vlc_object_release(vout); + return; + } + + vlc_object_t * marquee = get_marquee_object(p_mi); + if(!marquee) + { + libvlc_exception_raise( p_e, "Marquee is not enabled" ); + return; + } + var_SetInteger(marquee, identifier, value); + vlc_object_release(marquee); +} + +/***************************************************************************** + * libvlc_video_set_marquee_option_as_string: set a string option + *****************************************************************************/ +void libvlc_video_set_marquee_option_as_string( libvlc_media_player_t *p_mi, + libvlc_video_marquee_string_option_t option, + const char * value, + libvlc_exception_t *p_e ) +{ + const char * identifier = get_marquee_string_option_identifier(option); + if(!identifier) + { + libvlc_exception_raise( p_e, "This option is not available" ); + return; + } + vlc_object_t * marquee = get_marquee_object(p_mi); + if(!marquee) + { + libvlc_exception_raise( p_e, "Marquee is not enabled" ); + return; + } + var_SetString(marquee, identifier, value); + vlc_object_release(marquee); +} diff --git a/src/libvlc.sym b/src/libvlc.sym index cfffb3b78a..1583c31de9 100644 --- a/src/libvlc.sym +++ b/src/libvlc.sym @@ -179,6 +179,8 @@ libvlc_video_get_aspect_ratio libvlc_video_get_chapter_description libvlc_video_get_crop_geometry libvlc_video_get_height +libvlc_video_get_marquee_option_as_int +libvlc_video_get_marquee_option_as_string libvlc_video_get_scale libvlc_video_get_spu libvlc_video_get_spu_count @@ -192,6 +194,8 @@ libvlc_video_get_width libvlc_video_set_aspect_ratio libvlc_video_set_crop_geometry libvlc_video_set_deinterlace +libvlc_video_set_marquee_option_as_int +libvlc_video_set_marquee_option_as_string libvlc_video_set_scale libvlc_video_set_spu libvlc_video_set_subtitle_file -- 2.39.2