/*****************************************************************************
* video.c: libvlc new API video functions
*****************************************************************************
- * Copyright (C) 2005 the VideoLAN team
+ * Copyright (C) 2005-2010 the VideoLAN team
*
* $Id$
*
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
*****************************************************************************/
-#include "libvlc_internal.h"
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
#include <vlc/libvlc.h>
+#include <vlc/libvlc_media.h>
+#include <vlc/libvlc_media_player.h>
+
+#include <vlc_common.h>
#include <vlc_input.h>
#include <vlc_vout.h>
+#include "media_player_internal.h"
+#include <vlc_osd.h>
+#include <assert.h>
+
/*
* Remember to release the returned vout_thread_t.
*/
p_vout = input_GetVout( p_input );
if( !p_vout )
{
- libvlc_exception_raise( p_exception, "No active video output" );
+ libvlc_exception_raise( p_exception );
+ libvlc_printerr( "No active video output" );
}
vlc_object_release( p_input );
}
{
/* We only work on the first vout */
vout_thread_t *p_vout = GetVout( p_mi, p_e );
- bool ret;
/* GetVout will raise the exception for us */
if( !p_vout ) return;
- ret = var_GetBool( p_vout, "fullscreen" );
- var_SetBool( p_vout, "fullscreen", !ret );
+ var_ToggleBool( p_vout, "fullscreen" );
vlc_object_release( p_vout );
}
+void libvlc_video_set_key_input( libvlc_media_player_t *p_mi, unsigned on )
+{
+ p_mi->keyboard_events = !!on;
+}
+
+void libvlc_video_set_mouse_input( libvlc_media_player_t *p_mi, unsigned on )
+{
+ p_mi->mouse_events = !!on;
+}
+
void
libvlc_video_take_snapshot( libvlc_media_player_t *p_mi, const char *psz_filepath,
unsigned int i_width, unsigned int i_height, libvlc_exception_t *p_e )
{
vout_thread_t *p_vout;
- /* The filepath must be not NULL */
- if( !psz_filepath )
- {
- libvlc_exception_raise( p_e, "filepath is null" );
- return;
- }
+ assert( psz_filepath );
+
/* We must have an input */
if( !p_mi->p_input_thread )
{
- libvlc_exception_raise( p_e, "Input does not exist" );
+ libvlc_exception_raise( p_e );
+ libvlc_printerr( "Input does not exist" );
return;
}
char *libvlc_video_get_aspect_ratio( libvlc_media_player_t *p_mi,
libvlc_exception_t *p_e )
{
- char *psz_aspect = 0;
+ char *psz_aspect = NULL;
vout_thread_t *p_vout = GetVout( p_mi, p_e );
- if( !p_vout ) return 0;
+ if( !p_vout ) return NULL;
psz_aspect = var_GetNonEmptyString( p_vout, "aspect-ratio" );
vlc_object_release( p_vout );
}
void libvlc_video_set_aspect_ratio( libvlc_media_player_t *p_mi,
- char *psz_aspect, libvlc_exception_t *p_e )
+ const char *psz_aspect, libvlc_exception_t *p_e )
{
vout_thread_t *p_vout = GetVout( p_mi, p_e );
int i_ret = -1;
if( !p_vout ) return;
i_ret = var_SetString( p_vout, "aspect-ratio", psz_aspect );
- if( i_ret )
- libvlc_exception_raise( p_e,
- "Unexpected error while setting aspect-ratio value" );
-
vlc_object_release( p_vout );
+ if( i_ret )
+ {
+ libvlc_exception_raise( p_e );
+ libvlc_printerr( "Bad or unsupported aspect ratio" );
+ }
}
int libvlc_video_get_spu( libvlc_media_player_t *p_mi,
i_ret = var_Get( p_input_thread, "spu-es", &val );
if( i_ret < 0 )
{
- libvlc_exception_raise( p_e, "Getting subtitle information failed" );
vlc_object_release( p_input_thread );
+ libvlc_exception_raise( p_e );
+ libvlc_printerr( "Subtitle informations not found" );
return i_ret;
}
var_Change( p_input_thread, "spu-es", VLC_VAR_GETCHOICES, &val_list, NULL );
- if( val_list.p_list->i_count == 0 )
- {
- libvlc_exception_raise( p_e, "Subtitle value out of range" );
- goto end;
- }
-
- if( (i_spu < 0) && (i_spu > val_list.p_list->i_count) )
+ if( ( val_list.p_list->i_count == 0 )
+ || (i_spu < 0) || (i_spu > val_list.p_list->i_count) )
{
- libvlc_exception_raise( p_e, "Subtitle value out of range" );
+ libvlc_exception_raise( p_e );
+ libvlc_printerr( "Subtitle number out of range" );
goto end;
}
i_ret = var_Set( p_input_thread, "spu-es", newval );
if( i_ret < 0 )
{
- libvlc_exception_raise( p_e, "Setting subtitle value failed" );
+ libvlc_exception_raise( p_e );
+ libvlc_printerr( "Subtitle selection error" );
}
end:
}
int libvlc_video_set_subtitle_file( libvlc_media_player_t *p_mi,
- char *psz_subtitle,
+ const char *psz_subtitle,
libvlc_exception_t *p_e )
{
input_thread_t *p_input_thread = libvlc_get_input_thread ( p_mi, p_e );
}
void libvlc_video_set_crop_geometry( libvlc_media_player_t *p_mi,
- char *psz_geometry, libvlc_exception_t *p_e )
+ const char *psz_geometry, libvlc_exception_t *p_e )
{
vout_thread_t *p_vout = GetVout( p_mi, p_e );
int i_ret = -1;
if( !p_vout ) return;
i_ret = var_SetString( p_vout, "crop", psz_geometry );
- if( i_ret )
- libvlc_exception_raise( p_e,
- "Unexpected error while setting crop geometry" );
-
vlc_object_release( p_vout );
+
+ if( i_ret )
+ {
+ libvlc_exception_raise( p_e );
+ libvlc_printerr( "Bad or unsupported cropping geometry" );
+ }
}
int libvlc_video_get_teletext( libvlc_media_player_t *p_mi,
libvlc_exception_t *p_e )
{
+#if 0
vout_thread_t *p_vout = GetVout( p_mi, p_e );
vlc_object_t *p_vbi;
int i_ret = -1;
vlc_object_release( p_vout );
return i_ret;
+#else
+ VLC_UNUSED( p_mi );
+ VLC_UNUSED( p_e );
+ return -1;
+#endif
}
void libvlc_video_set_teletext( libvlc_media_player_t *p_mi, int i_page,
libvlc_exception_t *p_e )
{
+#if 0
vout_thread_t *p_vout = GetVout( p_mi, p_e );
vlc_object_t *p_vbi;
int i_ret = -1;
"Unexpected error while setting teletext page" );
}
vlc_object_release( p_vout );
+#else
+ VLC_UNUSED( p_mi );
+ VLC_UNUSED( p_e );
+ VLC_UNUSED( i_page );
+#endif
}
void libvlc_toggle_teletext( libvlc_media_player_t *p_mi,
libvlc_exception_t *p_e )
{
input_thread_t *p_input_thread;
- vlc_object_t *p_vbi;
- int i_ret;
p_input_thread = libvlc_get_input_thread(p_mi, p_e);
if( !p_input_thread ) return;
return;
}
const bool b_selected = var_GetInteger( p_input_thread, "teletext-es" ) >= 0;
-
+#if 0
+ int i_ret;
+ vlc_object_t *p_vbi;
p_vbi = (vlc_object_t *)vlc_object_find_name( p_input_thread, "zvbi",
FIND_CHILD );
if( p_vbi )
}
vlc_object_release( p_vbi );
}
- else if( b_selected )
+ else
+#endif
+ if( b_selected )
{
var_SetInteger( p_input_thread, "spu-es", -1 );
}
i_ret = var_Get( p_input_thread, "video-es", &val );
if( i_ret < 0 )
{
- libvlc_exception_raise( p_e, "Getting Video track information failed" );
+ libvlc_exception_raise( p_e );
+ libvlc_printerr( "Video track information not found" );
vlc_object_release( p_input_thread );
return i_ret;
}
var_Change( p_input_thread, "video-es", VLC_VAR_GETCHOICES, &val_list, NULL );
for( i = 0; i < val_list.p_list->i_count; i++ )
{
- vlc_value_t val = val_list.p_list->p_values[i];
- if( i_track == val.i_int )
+ if( i_track == val_list.p_list->p_values[i].i_int )
{
- i_ret = var_Set( p_input_thread, "audio-es", val );
+ i_ret = var_SetInteger( p_input_thread, "video-es", i_track );
if( i_ret < 0 )
- libvlc_exception_raise( p_e, "Setting video track failed" );
+ break;
goto end;
}
}
- libvlc_exception_raise( p_e, "Video track out of range" );
-
+ libvlc_exception_raise( p_e );
+ libvlc_printerr( "Video track number out of range" );
end:
var_FreeList( &val_list, NULL );
vlc_object_release( p_input_thread );
}
+
+/******************************************************************************
+ * libvlc_video_set_deinterlace : enable deinterlace
+ *****************************************************************************/
+void libvlc_video_set_deinterlace( libvlc_media_player_t *p_mi, int b_enable,
+ const char *psz_mode,
+ libvlc_exception_t *p_e )
+{
+ vout_thread_t *p_vout = GetVout( p_mi, p_e );
+
+ if( !p_vout )
+ return;
+
+ if( b_enable )
+ {
+ /* be sure that the filter name given is supported */
+ if( !strcmp(psz_mode, "blend") || !strcmp(psz_mode, "bob")
+ || !strcmp(psz_mode, "discard") || !strcmp(psz_mode, "linear")
+ || !strcmp(psz_mode, "mean") || !strcmp(psz_mode, "x")
+ || !strcmp(psz_mode, "yadif") || !strcmp(psz_mode, "yadif2x") )
+ {
+ /* set deinterlace filter chosen */
+ var_SetString( p_vout, "deinterlace-mode", psz_mode );
+ var_SetInteger( p_vout, "deinterlace", 1 );
+ }
+ else
+ {
+ libvlc_exception_raise( p_e );
+ libvlc_printerr( "Bad or unsupported deinterlacing mode" );
+ }
+ }
+ else
+ {
+ /* disable deinterlace filter */
+ var_SetInteger( p_vout, "deinterlace", 0 );
+ }
+
+ vlc_object_release( p_vout );
+}
+
+/*****************************************************************************
+ * Marquee: FIXME: That implementation has no persistent state and requires
+ * a vout
+ *****************************************************************************/
+
+static const char *get_marquee_int_option_identifier(unsigned option)
+{
+ static const char tab[][16] =
+ {
+ "marq",
+ "marq-color",
+ "marq-opacity",
+ "marq-position",
+ "marq-refresh",
+ "marq-size",
+ "marq-timeout",
+ "marq-x",
+ "marq-y",
+ };
+ if( option >= sizeof( tab ) / sizeof( tab[0] ) )
+ return NULL;
+ return tab[option];
+}
+
+static const char *get_marquee_string_option_identifier(unsigned option)
+{
+ static const char tab[][16] =
+ {
+ "marq-marquee",
+ };
+ if( option >= sizeof( tab ) / sizeof( tab[0] ) )
+ return NULL;
+ return tab[option];
+}
+
+
+static 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_int : get a marq option value
+ *****************************************************************************/
+int libvlc_video_get_marquee_int( libvlc_media_player_t *p_mi,
+ unsigned option, libvlc_exception_t *p_e )
+{
+ const char * identifier = get_marquee_int_option_identifier(option);
+ if(!identifier)
+ {
+ libvlc_exception_raise( p_e );
+ libvlc_printerr( "Unknown marquee option" );
+ return 0;
+ }
+ vlc_object_t * marquee = get_marquee_object(p_mi);
+
+ /* Handle the libvlc_marquee_Enable separately */
+ if(option == libvlc_marquee_Enable)
+ {
+ bool isEnabled = marquee != NULL;
+ vlc_object_release(marquee);
+ return isEnabled;
+ }
+
+ /* Generic case */
+ if(!identifier)
+ {
+ libvlc_exception_raise( p_e );
+ libvlc_printerr( "Marquee not enabled" );
+ return 0;
+ }
+#warning This and the next function may crash due to type checking!
+ int ret = var_GetInteger(marquee, identifier);
+ vlc_object_release(marquee);
+ return ret;
+}
+
+/*****************************************************************************
+ * libvlc_video_get_marquee_string : get a marq option value
+ *****************************************************************************/
+char * libvlc_video_get_marquee_string( libvlc_media_player_t *p_mi,
+ unsigned option, libvlc_exception_t *p_e )
+{
+ const char * identifier = get_marquee_string_option_identifier(option);
+ if(!identifier)
+ {
+ libvlc_exception_raise( p_e );
+ libvlc_printerr( "Unknown marquee option" );
+ return NULL;
+ }
+
+ vlc_object_t * marquee = get_marquee_object(p_mi);
+ if(!marquee)
+ {
+ libvlc_exception_raise( p_e );
+ libvlc_printerr( "Marquee not enabled" );
+ return NULL;
+ }
+ char *ret = var_GetString(marquee, identifier);
+ vlc_object_release(marquee);
+ return ret;
+}
+
+/*****************************************************************************
+ * libvlc_video_set_marquee_int: enable, disable or set an int option
+ *****************************************************************************/
+void libvlc_video_set_marquee_int( libvlc_media_player_t *p_mi,
+ unsigned option, int value, libvlc_exception_t *p_e )
+{
+ const char * identifier = get_marquee_int_option_identifier(option);
+ if(!identifier)
+ {
+ libvlc_exception_raise( p_e );
+ libvlc_printerr( "Unknown marquee option" );
+ return;
+ }
+
+ /* Handle the libvlc_marquee_Enable separately */
+ if(option == libvlc_marquee_Enable)
+ {
+ 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);
+ vlc_object_release(vout);
+ }
+ return;
+ }
+
+ vlc_object_t * marquee = get_marquee_object(p_mi);
+ if(!marquee)
+ {
+ libvlc_exception_raise( p_e );
+ libvlc_printerr( "Marquee not enabled" );
+ return;
+ }
+ var_SetInteger(marquee, identifier, value);
+ vlc_object_release(marquee);
+}
+
+/*****************************************************************************
+ * libvlc_video_set_marquee_string: set a string option
+ *****************************************************************************/
+void libvlc_video_set_marquee_string( libvlc_media_player_t *p_mi,
+ unsigned 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 );
+ libvlc_printerr( "Unknown marquee option" );
+ return;
+ }
+ vlc_object_t * marquee = get_marquee_object(p_mi);
+ if(!marquee)
+ {
+ libvlc_exception_raise( p_e );
+ libvlc_printerr( "Marquee not enabled" );
+ return;
+ }
+ var_SetString(marquee, identifier, value);
+ vlc_object_release(marquee);
+}
+
+
+/* logo module support */
+
+static vlc_object_t *get_logo_object( libvlc_media_player_t * p_mi,
+ libvlc_exception_t *p_e )
+{
+ vlc_object_t *object = NULL;
+ vout_thread_t *vout = GetVout( p_mi, p_e );
+ libvlc_exception_clear( p_e );
+ if( vout )
+ {
+ object = vlc_object_find_name( vout, "logo", FIND_CHILD );
+ vlc_object_release(vout);
+ }
+ if( !object )
+ {
+ libvlc_exception_raise( p_e );
+ libvlc_printerr( "Logo not enabled" );
+ }
+ return object;
+}
+
+
+typedef const struct vlogo_opt {
+ const char name[16];
+ unsigned type;
+} vlogo_opt_t;
+
+
+static vlogo_opt_t *
+logo_option_bynumber( unsigned option, libvlc_exception_t *p_e )
+{
+# define CFG_PREFIX "logo-"
+ vlogo_opt_t vlogo_optlist[] = /* depends on libvlc_video_logo_option_t */
+ {
+ { "logo", 0 },
+ { "logo-file", VLC_VAR_STRING },
+ { "logo-x", VLC_VAR_INTEGER },
+ { "logo-y", VLC_VAR_INTEGER },
+ { "logo-delay", VLC_VAR_INTEGER },
+ { "logo-repeat", VLC_VAR_INTEGER },
+ { "logo-opacity", VLC_VAR_INTEGER },
+ { "logo-position", VLC_VAR_INTEGER },
+ };
+# undef CFG_PREFIX
+ enum { num_vlogo_opts = sizeof(vlogo_optlist) / sizeof(*vlogo_optlist) };
+
+ vlogo_opt_t *r = option < num_vlogo_opts ? vlogo_optlist+option : NULL;
+ if( !r )
+ {
+ libvlc_exception_raise( p_e );
+ libvlc_printerr( "Unknown marquee option" );
+ }
+ return r;
+}
+
+
+void libvlc_video_set_logo_string( libvlc_media_player_t *p_mi,
+ unsigned option, const char *psz_value,
+ libvlc_exception_t *p_e )
+{
+ vlogo_opt_t *opt = logo_option_bynumber( option, p_e );
+ printf("logo set string (%u)%s = %s.\n", option,
+ (opt?(opt->name):"<unkn>"),(psz_value?psz_value:"<null>"));
+ if( !opt ) return;
+ vlc_object_t *logo = get_logo_object( p_mi, p_e );
+ if( !logo ) return;
+
+ switch( opt->type )
+ {
+ case VLC_VAR_STRING:
+ var_SetString( logo, opt->name, psz_value );
+ break;
+ default:
+ libvlc_exception_raise( p_e );
+ libvlc_printerr( "Invalid argument" );
+ break;
+ }
+ vlc_object_release(logo);
+}
+
+
+void libvlc_video_set_logo_int( libvlc_media_player_t *p_mi,
+ unsigned option, int value,
+ libvlc_exception_t *p_e )
+{
+ vlogo_opt_t *opt = logo_option_bynumber( option, p_e );
+ printf("logo set integer (%u)%s = %i.\n",
+ option, (opt?(opt->name):"<unkn>"),value);
+ if( !opt ) return;
+
+ if( !opt->type ) /* libvlc_logo_enable */
+ {
+ vout_thread_t *vout = GetVout( p_mi, p_e );
+ libvlc_exception_clear( p_e );
+ if (vout)
+ {
+ vout_EnableFilter(vout, opt->name, value, false);
+ vlc_object_release(vout);
+ }
+ return;
+ }
+
+ vlc_object_t *logo = get_logo_object( p_mi, p_e );
+ if( !logo ) return;
+
+ switch( opt->type )
+ {
+ case VLC_VAR_INTEGER:
+ var_SetInteger(logo, opt->name, value);
+ break;
+ default:
+ libvlc_exception_raise( p_e );
+ libvlc_printerr( "Invalid argument" );
+ break;
+ }
+ vlc_object_release(logo);
+}
+
+
+int libvlc_video_get_logo_int( libvlc_media_player_t *p_mi,
+ unsigned option, libvlc_exception_t *p_e )
+{
+ vlogo_opt_t *opt = logo_option_bynumber( option, p_e );
+ printf("logo get integer (%u)%s.\n", option, opt?opt->name:"<unkn>");
+ if( !opt ) return 0;
+
+ vlc_object_t *logo = get_logo_object( p_mi, p_e );
+ if( !logo ) return 0;
+
+ int ret;
+ switch( opt->type )
+ {
+ case 0: /* libvlc_logo_enable */
+ ret = NULL != logo;
+ break;
+ case VLC_VAR_INTEGER:
+ ret = var_GetInteger(logo, opt->name);
+ break;
+ default:
+ libvlc_exception_raise( p_e );
+ libvlc_printerr( "Invalid argument" );
+ ret = 0;
+ break;
+ }
+ vlc_object_release(logo);
+ return ret;
+}