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 )
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;
/* 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 );
- /* Realease the input thread */
+ /* Release the input thread */
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 );
vlc_mutex_destroy( &p_mi->object_lock );
}
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 );
{
/* 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;
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(
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 )
{
+ vlc_object_release( p_input_thread );
libvlc_exception_raise( p_e, "invalid rate" );
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 */
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, "Input thread is NULL" );
}