libvlc API: Add Marquee Filter to libvlc in video.c
authorCyril Mathé <cmathe@actech-innovation.com>
Tue, 23 Jun 2009 07:46:00 +0000 (09:46 +0200)
committerPierre d'Herbemont <pdherbemont@free.fr>
Mon, 29 Jun 2009 04:16:12 +0000 (21:16 -0700)
-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 <cmathe@actech-innovation.com>

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
src/control/video.c
src/libvlc.sym

index 4b811a0..d44c006 100644 (file)
@@ -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
index d90b1a4..330637d 100644 (file)
@@ -34,6 +34,7 @@
 #include <vlc_vout.h>
 
 #include "media_player_internal.h"
+#include <vlc_osd.h>
 
 /*
  * 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);
+}
index cfffb3b..1583c31 100644 (file)
@@ -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