static int SnapshotTakenCallback( vlc_object_t *p_this, char const *psz_cmd,
vlc_value_t oldval, vlc_value_t newval, void *p_data );
-static const libvlc_state_t vlc_to_libvlc_state_array[] =
-{
- [INIT_S] = libvlc_NothingSpecial,
- [OPENING_S] = libvlc_Opening,
- [PLAYING_S] = libvlc_Playing,
- [PAUSE_S] = libvlc_Paused,
- [END_S] = libvlc_Ended,
- [ERROR_S] = libvlc_Error,
-};
-
-static inline libvlc_state_t vlc_to_libvlc_state( int vlc_state )
-{
- if( vlc_state < 0 || vlc_state > 6 )
- return libvlc_Ended;
-
- return vlc_to_libvlc_state_array[vlc_state];
-}
+static void libvlc_media_player_destroy( libvlc_media_player_t *p_mi );
/*
* Release the associated input thread.
/* We owned this one */
input_Stop( p_input_thread, b_input_abort );
+
vlc_thread_join( p_input_thread );
+ assert( p_mi->p_input_resource == NULL );
+ assert( p_input_thread->b_dead );
+ /* Store the input resource for future use. */
+ p_mi->p_input_resource = input_DetachResource( p_input_thread );
+
var_Destroy( p_input_thread, "drawable-hwnd" );
var_Destroy( p_input_thread, "drawable-xid" );
var_Destroy( p_input_thread, "drawable-agl" );
libvlc_media_set_state( p_mi->p_md, libvlc_state, NULL );
libvlc_event_send( p_mi->p_event_manager, &event );
}
+ else if( newval.i_int == INPUT_EVENT_ABORT )
+ {
+ libvlc_state_t libvlc_state = libvlc_Stopped;
+ event.type = libvlc_MediaPlayerStopped;
+
+ libvlc_media_set_state( p_mi->p_md, libvlc_state, NULL );
+ libvlc_event_send( p_mi->p_event_manager, &event );
+ }
else if( newval.i_int == INPUT_EVENT_POSITION )
{
if( var_GetInteger( p_input, "state" ) != PLAYING_S )
{
libvlc_media_player_t * p_mi;
- if( !p_libvlc_instance )
- {
- libvlc_exception_raise( p_e, "invalid libvlc instance" );
- return NULL;
- }
+ assert( p_libvlc_instance );
p_mi = malloc( sizeof(libvlc_media_player_t) );
if( !p_mi )
{
- libvlc_exception_raise( p_e, "Not enough memory" );
+ libvlc_exception_raise( p_e );
+ libvlc_printerr( "Not enough memory" );
return NULL;
}
p_mi->p_md = NULL;
p_mi->drawable.nsobject = NULL;
p_mi->p_libvlc_instance = p_libvlc_instance;
p_mi->p_input_thread = NULL;
+ p_mi->p_input_resource = NULL;
p_mi->i_refcount = 1;
vlc_mutex_init( &p_mi->object_lock );
p_mi->p_event_manager = libvlc_event_manager_new( p_mi,
vout_thread that generates the event and media_player that re-emits it
with its own event manager
*/
- var_Create( p_libvlc_instance->p_libvlc_int, "vout-snapshottaken",
- VLC_VAR_STRING | VLC_VAR_ISCOMMAND );
- var_AddCallback( p_libvlc_instance->p_libvlc_int, "vout-snapshottaken",
+ var_AddCallback( p_libvlc_instance->p_libvlc_int, "snapshot-file",
SnapshotTakenCallback, p_mi );
return p_mi;
**************************************************************************/
static void libvlc_media_player_destroy( libvlc_media_player_t *p_mi )
{
- input_thread_t *p_input_thread;
- libvlc_exception_t p_e;
-
assert( p_mi );
/* Detach Callback from the main libvlc object */
var_DelCallback( p_mi->p_libvlc_instance->p_libvlc_int,
- "vout-snapshottaken", SnapshotTakenCallback, p_mi );
+ "snapshot-file", SnapshotTakenCallback, p_mi );
- libvlc_exception_init( &p_e );
- p_input_thread = libvlc_get_input_thread( p_mi, &p_e );
+ /* Release the input thread */
+ release_input_thread( p_mi, true );
- if( libvlc_exception_raised( &p_e ) )
- /* no need to worry about no input thread */
- libvlc_exception_clear( &p_e );
- else
- release_input_thread( p_mi, true );
+ if( p_mi->p_input_resource )
+ {
+ input_resource_Delete( p_mi->p_input_resource );
+ p_mi->p_input_resource = NULL;
+ }
libvlc_event_manager_release( p_mi->p_event_manager );
libvlc_media_release( p_mi->p_md );
libvlc_media_player_t *p_mi,
libvlc_exception_t *p_e )
{
+ libvlc_media_t *p_m;
VLC_UNUSED(p_e);
- if( !p_mi->p_md )
- return NULL;
-
- libvlc_media_retain( p_mi->p_md );
+ vlc_mutex_lock( &p_mi->object_lock );
+ p_m = p_mi->p_md;
+ if( p_m )
+ libvlc_media_retain( p_mi->p_md );
+ vlc_mutex_unlock( &p_mi->object_lock );
return p_mi->p_md;
}
if( !p_mi->p_md )
{
- libvlc_exception_raise( p_e, "no associated media descriptor" );
vlc_mutex_unlock( &p_mi->object_lock );
+ libvlc_exception_raise( p_e );
+ libvlc_printerr( "No associated media descriptor" );
return;
}
p_mi->p_input_thread = input_Create( p_mi->p_libvlc_instance->p_libvlc_int,
- p_mi->p_md->p_input_item, NULL, NULL );
+ p_mi->p_md->p_input_item, NULL, p_mi->p_input_resource );
if( !p_mi->p_input_thread )
{
return;
}
+ p_mi->p_input_resource = NULL;
p_input_thread = p_mi->p_input_thread;
var_Create( p_input_thread, "drawable-agl", VLC_VAR_INTEGER );
var_Create( p_input_thread, "drawable-hwnd", VLC_VAR_ADDRESS );
if( p_mi->drawable.hwnd != NULL )
- {
- vlc_value_t val = { .p_address = p_mi->drawable.hwnd };
- var_Set( p_input_thread, "drawable-hwnd", val );
- }
+ var_SetAddress( p_input_thread, "drawable-hwnd", p_mi->drawable.hwnd );
- var_Create( p_input_thread, "drawable-nsobject", VLC_VAR_ADDRESS );
+ var_Create( p_input_thread, "drawable-nsobject", VLC_VAR_ADDRESS );
if( p_mi->drawable.nsobject != NULL )
- {
- vlc_value_t val = { .p_address = p_mi->drawable.nsobject };
- var_Set( p_input_thread, "drawable-nsobject", val );
- }
-
+ var_SetAddress( p_input_thread, "drawable-nsobject", p_mi->drawable.nsobject );
+
var_AddCallback( p_input_thread, "can-seek", input_seekable_changed, p_mi );
var_AddCallback( p_input_thread, "can-pause", input_pausable_changed, p_mi );
var_AddCallback( p_input_thread, "intf-event", input_event_changed, p_mi );
{
/* Send a stop notification event only if we are in playing,
* buffering or paused states */
- libvlc_media_set_state( p_mi->p_md, libvlc_Ended, p_e );
+ libvlc_media_set_state( p_mi->p_md, libvlc_Stopped, p_e );
/* Construct and send the event */
libvlc_event_t event;
return p_mi->drawable.hwnd;
}
-/**************************************************************************
- * Set Drawable
- **************************************************************************/
-void libvlc_media_player_set_drawable( libvlc_media_player_t *p_mi,
- libvlc_drawable_t drawable,
- libvlc_exception_t *p_e )
-{
-#ifdef WIN32
- if (sizeof (HWND) <= sizeof (libvlc_drawable_t))
- p_mi->drawable.hwnd = (HWND)drawable;
- else
- libvlc_exception_raise(p_e, "Operation not supported");
-#elif defined(__APPLE__)
- p_mi->drawable.agl = drawable;
- (void) p_e;
-#else
- p_mi->drawable.xid = drawable;
- (void) p_e;
-#endif
-}
-
-/**************************************************************************
- * Get Drawable
- **************************************************************************/
-libvlc_drawable_t
-libvlc_media_player_get_drawable ( libvlc_media_player_t *p_mi,
- libvlc_exception_t *p_e )
-{
- VLC_UNUSED(p_e);
-
-#ifdef WIN32
- if (sizeof (HWND) <= sizeof (libvlc_drawable_t))
- return (libvlc_drawable_t)p_mi->drawable.hwnd;
- else
- return 0;
-#elif defined(__APPLE__)
- return p_mi->drawable.agl;
-#else
- return p_mi->drawable.xid;
-#endif
-}
-
/**************************************************************************
* Getters for stream information
**************************************************************************/
libvlc_exception_t *p_e )
{
input_thread_t *p_input_thread;
- vlc_value_t val;
+ libvlc_time_t i_time;
p_input_thread = libvlc_get_input_thread ( p_mi, p_e);
if( !p_input_thread )
return -1;
- var_Get( p_input_thread, "length", &val );
+ i_time = var_GetTime( p_input_thread, "length" );
vlc_object_release( p_input_thread );
- return (val.i_time+500LL)/1000LL;
+ return (i_time+500LL)/1000LL;
}
libvlc_time_t libvlc_media_player_get_time(
libvlc_exception_t *p_e )
{
input_thread_t *p_input_thread;
- vlc_value_t val;
+ libvlc_time_t i_time;
p_input_thread = libvlc_get_input_thread ( p_mi, p_e );
if( !p_input_thread )
return -1;
- var_Get( p_input_thread , "time", &val );
+ i_time = var_GetTime( p_input_thread , "time" );
vlc_object_release( p_input_thread );
- return (val.i_time+500LL)/1000LL;
+ return (i_time+500LL)/1000LL;
}
void libvlc_media_player_set_time(
libvlc_media_player_t *p_mi,
- libvlc_time_t time,
+ libvlc_time_t i_time,
libvlc_exception_t *p_e )
{
input_thread_t *p_input_thread;
if( !p_input_thread )
return;
- var_SetTime( p_input_thread, "time", time*1000LL );
+ var_SetTime( p_input_thread, "time", i_time*1000LL );
vlc_object_release( p_input_thread );
}
libvlc_exception_t *p_e )
{
input_thread_t *p_input_thread;
- vlc_value_t val;
+ float f_position;
p_input_thread = libvlc_get_input_thread ( p_mi, p_e );
if( !p_input_thread )
return -1.0;
- var_Get( p_input_thread, "position", &val );
+ f_position = var_GetFloat( p_input_thread, "position" );
vlc_object_release( p_input_thread );
- return val.f_float;
+ return f_position;
}
void libvlc_media_player_set_chapter(
libvlc_exception_t *p_e )
{
input_thread_t *p_input_thread;
- vlc_value_t val;
+ int i_chapter;
p_input_thread = libvlc_get_input_thread ( p_mi, p_e );
if( !p_input_thread )
return -1;
- var_Get( p_input_thread, "chapter", &val );
+ i_chapter = var_GetInteger( p_input_thread, "chapter" );
vlc_object_release( p_input_thread );
- return val.i_int;
+ return i_chapter;
}
int libvlc_media_player_get_chapter_count(
libvlc_exception_t *p_e )
{
input_thread_t *p_input_thread;
- vlc_value_t val;
+ int i_title;
p_input_thread = libvlc_get_input_thread ( p_mi, p_e );
if( !p_input_thread )
return -1;
- var_Get( p_input_thread, "title", &val );
+ i_title = var_GetInteger( p_input_thread, "title" );
vlc_object_release( p_input_thread );
- return val.i_int;
+ return i_title;
}
int libvlc_media_player_get_title_count(
if( (rate < 0.0) && !b_can_rewind )
{
vlc_object_release( p_input_thread );
- libvlc_exception_raise( p_e, "Rate value is invalid" );
+ libvlc_exception_raise( p_e );
+ libvlc_printerr( "Invalid playback rate" );
return;
}
libvlc_exception_t *p_e )
{
input_thread_t *p_input_thread;
- vlc_value_t val;
+ int i_rate;
bool b_can_rewind;
p_input_thread = libvlc_get_input_thread ( p_mi, p_e );
if( !p_input_thread )
return 0.0; /* rate < 0 indicates rewind */
- var_Get( p_input_thread, "rate", &val );
+ i_rate = var_GetInteger( p_input_thread, "rate" );
b_can_rewind = var_GetBool( p_input_thread, "can-rewind" );
- if( (val.i_int < 0) && !b_can_rewind )
+ if( i_rate < 0 && !b_can_rewind )
{
- libvlc_exception_raise( p_e, "invalid rate" );
+ vlc_object_release( p_input_thread );
return 0.0;
}
vlc_object_release( p_input_thread );
- return (float)1000.0f/val.i_int;
+ return (float)1000.0f/i_rate;
}
libvlc_state_t libvlc_media_player_get_state(
{
input_thread_t *p_input_thread;
libvlc_state_t state = libvlc_Ended;
- vlc_value_t val;
p_input_thread = libvlc_get_input_thread ( p_mi, p_e );
if( !p_input_thread )
return state;
}
- var_Get( p_input_thread, "state", &val );
- state = vlc_to_libvlc_state(val.i_int);
-
+ state = libvlc_media_get_state( p_mi->p_md, NULL );
if( state == libvlc_Playing )
{
float caching;
libvlc_exception_t *p_e )
{
input_thread_t *p_input_thread;
- vlc_value_t val;
+ bool b_seekable;
p_input_thread = libvlc_get_input_thread ( p_mi, p_e );
if ( !p_input_thread )
libvlc_exception_clear( p_e );
return false;
}
- var_Get( p_input_thread, "can-seek", &val );
+ b_seekable = var_GetBool( p_input_thread, "can-seek" );
vlc_object_release( p_input_thread );
- return val.b_bool;
+ return b_seekable;
}
/* internal function, used by audio, video */
malloc( sizeof( libvlc_track_description_t ) );
if ( !p_track_description )
{
- libvlc_exception_raise( p_e, "no enough memory" );
+ libvlc_exception_raise( p_e );
+ libvlc_printerr( "Not enough memory" );
goto end;
}
p_actual = p_track_description;
if ( !p_actual )
{
libvlc_track_description_release( p_track_description );
- libvlc_exception_raise( p_e, "no enough memory" );
+ libvlc_exception_raise( p_e );
+ libvlc_printerr( "Not enough memory" );
goto end;
}
}
libvlc_exception_t *p_e )
{
input_thread_t *p_input_thread;
- vlc_value_t val;
+ bool b_can_pause;
p_input_thread = libvlc_get_input_thread ( p_mi, p_e );
if ( !p_input_thread )
libvlc_exception_clear( p_e );
return false;
}
- var_Get( p_input_thread, "can-pause", &val );
+ b_can_pause = var_GetBool( p_input_thread, "can-pause" );
vlc_object_release( p_input_thread );
- return val.b_bool;
+ return b_can_pause;
+}
+
+void libvlc_media_player_next_frame( libvlc_media_player_t *p_mi, libvlc_exception_t *p_e )
+{
+ input_thread_t *p_input_thread = libvlc_get_input_thread ( p_mi, p_e );
+ if( p_input_thread != NULL )
+ {
+ var_TriggerCallback( p_input_thread, "frame-next" );
+ vlc_object_release( p_input_thread );
+ }
+ else
+ {
+ libvlc_exception_raise( p_e );
+ libvlc_printerr( "No active input" );
+ }
}