Commit 15752197 authored by Cyril Mathé's avatar Cyril Mathé Committed by Pierre d'Herbemont

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 <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.
parent d861c71d
......@@ -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
......
......@@ -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);
}
......@@ -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
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment