*/
VLC_PUBLIC_API int libvlc_media_player_can_pause( libvlc_media_player_t *p_mi, libvlc_exception_t *p_e );
+/**
+ * Release (free) libvlc_track_description_t
+ *
+ * \param p_track_description the structure to release
+ */
+VLC_PUBLIC_API void libvlc_track_description_release( libvlc_track_description_t *p_track_description );
+
/** \defgroup libvlc_video libvlc_video
* \ingroup libvlc_media_player
* LibVLC Video handling
*/
VLC_PUBLIC_API int libvlc_video_get_spu( libvlc_media_player_t *, libvlc_exception_t * );
+/**
+ * Get the number of available video subtitles.
+ *
+ * \param p_mediaplayer the media player
+ * \param p_e an initialized exception pointer
+ * \return the number of available video subtitles
+ */
+VLC_PUBLIC_API int libvlc_video_get_spu_count( libvlc_media_player_t *, libvlc_exception_t * );
+
+/**
+ * Get the description of available video subtitles.
+ *
+ * \param p_mediaplayer the media player
+ * \param p_e an initialized exception pointer
+ * \return list containing description of available video subtitles
+ */
+VLC_PUBLIC_API libvlc_track_description_t *
+ libvlc_video_get_spu_description( libvlc_media_player_t *, libvlc_exception_t * );
+
/**
* Set new video subtitle.
*
*/
VLC_PUBLIC_API int libvlc_video_set_subtitle_file( libvlc_media_player_t *, char *, libvlc_exception_t * );
+/**
+ * Get the description of available titles.
+ *
+ * \param p_mediaplayer the media player
+ * \param p_e an initialized exception pointer
+ * \return list containing description of available titles
+ */
+VLC_PUBLIC_API libvlc_track_description_t *
+ libvlc_video_get_title_description( libvlc_media_player_t *, libvlc_exception_t * );
+
+/**
+ * Get the description of available chapters for specific title.
+ *
+ * \param p_mediaplayer the media player
+ * \param i_title selected title
+ * \param p_e an initialized exception pointer
+ * \return list containing description of available chapter for title i_title
+ */
+VLC_PUBLIC_API libvlc_track_description_t *
+ libvlc_video_get_chapter_description( libvlc_media_player_t *, int, libvlc_exception_t * );
+
/**
* Get current crop filter geometry.
*
*/
VLC_PUBLIC_API void libvlc_video_set_teletext( libvlc_media_player_t *, int, libvlc_exception_t * );
+/**
+ * Get number of available video tracks.
+ *
+ * \param p_mi media player
+ * \param p_e an initialized exception
+ * \return the number of available video tracks (int)
+ */
+VLC_PUBLIC_API int libvlc_video_get_track_count( libvlc_media_player_t *, libvlc_exception_t * );
+
+/**
+ * Get the description of available video tracks.
+ *
+ * \param p_mi media player
+ * \param p_e an initialized exception
+ * \return list with description of available video tracks
+ */
+VLC_PUBLIC_API libvlc_track_description_t *
+ libvlc_video_get_track_description( libvlc_media_player_t *, libvlc_exception_t * );
+
+/**
+ * Get current video track.
+ *
+ * \param p_mi media player
+ * \param p_e an initialized exception pointer
+ * \return the video track (int)
+ */
+VLC_PUBLIC_API int libvlc_video_get_track( libvlc_media_player_t *, libvlc_exception_t * );
+
+/**
+ * Set video track.
+ *
+ * \param p_mi media player
+ * \param i_track the track (int)
+ * \param p_e an initialized exception pointer
+ */
+VLC_PUBLIC_API void libvlc_video_set_track( libvlc_media_player_t *, int, libvlc_exception_t * );
+
/**
* Take a snapshot of the current video window.
*
/**@} */
+/*****************************************************************************
+ * Media Player
+ *****************************************************************************/
+/** \defgroup libvlc_media_player libvlc_media_player
+ * \ingroup libvlc
+ * LibVLC Media Player, object that let you play a media
+ * in a libvlc_drawable_t
+ * @{
+ */
+
+/**
+ * Description for video, audio tracks and subtitles. It contains
+ * id, name (description string) and pointer to next record.
+ */
+typedef struct libvlc_track_description_t
+{
+ int i_id;
+ char *psz_name;
+ struct libvlc_track_description_t *p_next;
+
+} libvlc_track_description_t;
+
+/**@} */
+
/*****************************************************************************
* Video
* LibVLC Video handling
* @{
*/
-
+
/**
* Downcast to this general type as placeholder for a platform specific one, such as:
* Drawable on X11,
/*****************************************************************************
* libvlc_audio_get_track_count : Get the number of available audio tracks
*****************************************************************************/
-int libvlc_audio_get_track_count( libvlc_media_player_t *p_mi,
+int libvlc_audio_get_track_count( 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 );
return val_list.p_list->i_count;
}
+/*****************************************************************************
+ * libvlc_audio_get_track_description : Get the description of available audio tracks
+ *****************************************************************************/
+libvlc_track_description_t *
+ libvlc_audio_get_track_description( libvlc_media_player_t *p_mi,
+ libvlc_exception_t *p_e )
+{
+ return libvlc_get_track_description( p_mi, "audio-es", p_e);
+}
+
/*****************************************************************************
* libvlc_audio_get_track : Get the current audio track
*****************************************************************************/
libvlc_media_t * p_md; /* The media from which the
* mlist comes, if any. */
vlc_array_t items;
-
+
/* Other way to see that media list */
/* Used in flat_media_list.c */
libvlc_media_list_t * p_flat_mlist;
libvlc_instance_t * p_libvlc_instance;
int i_refcount;
vlc_mutex_t object_lock;
-
+
libvlc_media_list_t * p_mlist;
struct libvlc_media_list_view_private_t * p_this_view_data;
libvlc_media_t * p_md; /* current media descriptor */
libvlc_event_manager_t * p_event_manager;
libvlc_drawable_t drawable;
-
+
bool b_own_its_input_thread;
};
libvlc_event_manager_t * p_em,
libvlc_event_t * p_event );
+/* Media player - audio, video */
+libvlc_track_description_t * libvlc_get_track_description(
+ libvlc_media_player_t *p_mi,
+ const char *psz_variable,
+ libvlc_exception_t *p_e );
+
/* Exception shorcuts */
return val.b_bool;
}
+/* internal function, used by audio, video */
+libvlc_track_description_t *
+ libvlc_get_track_description( libvlc_media_player_t *p_mi,
+ const char *psz_variable,
+ libvlc_exception_t *p_e )
+{
+ input_thread_t *p_input = libvlc_get_input_thread( p_mi, p_e );
+
+ if( !p_input )
+ return NULL;
+
+ vlc_value_t val_list, text_list;
+ var_Change( p_input, psz_variable, VLC_VAR_GETLIST, &val_list, &text_list);
+
+ if( val_list.p_list->i_count <= 0 ) /* no tracks */
+ return NULL;
+
+ libvlc_track_description_t *p_track_description, *p_actual, *p_previous;
+ p_track_description = ( libvlc_track_description_t * )
+ malloc( sizeof( libvlc_track_description_t ) );
+ if ( !p_track_description )
+ {
+ var_Change( p_input, psz_variable, VLC_VAR_FREELIST, &val_list, &text_list);
+ vlc_object_release( p_input );
+ libvlc_exception_raise( p_e, "no enough memory" );
+ return NULL;
+ }
+ p_actual = p_track_description;
+ p_previous = NULL;
+ for( int i = 0; i < val_list.p_list->i_count; i++ )
+ {
+ if( !p_actual )
+ {
+ p_actual = ( libvlc_track_description_t * )
+ malloc( sizeof( libvlc_track_description_t ) );
+ if ( !p_actual )
+ {
+ libvlc_track_description_release( p_track_description );
+ var_Change( p_input, psz_variable, VLC_VAR_FREELIST, &val_list, &text_list);
+ vlc_object_release( p_input );
+ libvlc_exception_raise( p_e, "no enough memory" );
+ return NULL;
+ }
+ }
+ p_actual->i_id = val_list.p_list->p_values[i].i_int;
+ p_actual->psz_name = strdup( text_list.p_list->p_values[i].psz_string );
+ p_actual->p_next = NULL;
+ if( p_previous )
+ p_previous->p_next = p_actual;
+ p_previous = p_actual;
+ p_actual = NULL;
+ }
+ var_Change( p_input, psz_variable, VLC_VAR_FREELIST, &val_list, &text_list);
+ vlc_object_release( p_input );
+
+ return p_track_description;
+}
+
+void libvlc_track_description_release( libvlc_track_description_t *p_track_description )
+{
+ libvlc_track_description_t *p_actual, *p_before;
+ p_actual = p_track_description;
+
+ while ( p_actual )
+ {
+ free( p_actual->psz_name );
+ p_before = p_actual;
+ p_actual = p_before->p_next;
+ free( p_before );
+ }
+}
+
int libvlc_media_player_can_pause( libvlc_media_player_t *p_mi,
libvlc_exception_t *p_e )
{
return i_spu;
}
+int libvlc_video_get_spu_count( 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 );
+ vlc_value_t val_list;
+
+ if( !p_input_thread )
+ return -1;
+
+ var_Change( p_input_thread, "spu-es", VLC_VAR_GETCHOICES, &val_list, NULL );
+ vlc_object_release( p_input_thread );
+ return val_list.p_list->i_count;
+}
+
+libvlc_track_description_t *
+ libvlc_video_get_spu_description( libvlc_media_player_t *p_mi,
+ libvlc_exception_t *p_e )
+{
+ return libvlc_get_track_description( p_mi, "spu-es", p_e);
+}
+
void libvlc_video_set_spu( libvlc_media_player_t *p_mi, int i_spu,
libvlc_exception_t *p_e )
{
return b_ret;
}
+libvlc_track_description_t *
+ libvlc_video_get_title_description( libvlc_media_player_t *p_mi,
+ libvlc_exception_t * p_e )
+{
+ return libvlc_get_track_description( p_mi, "title", p_e);
+}
+
+libvlc_track_description_t *
+ libvlc_video_get_chapter_description( libvlc_media_player_t *p_mi,
+ int i_title,
+ libvlc_exception_t *p_e )
+{
+ char psz_title[12];
+ sprintf( psz_title, "title %2i", i_title );
+ return libvlc_get_track_description( p_mi, psz_title, p_e);
+}
+
char *libvlc_video_get_crop_geometry( libvlc_media_player_t *p_mi,
libvlc_exception_t *p_e )
{
vlc_object_release( p_input_thread );
}
+int libvlc_video_get_track_count( 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 );
+ vlc_value_t val_list;
+
+ if( !p_input_thread )
+ return -1;
+
+ var_Change( p_input_thread, "video-es", VLC_VAR_GETCHOICES, &val_list, NULL );
+ vlc_object_release( p_input_thread );
+ return val_list.p_list->i_count;
+}
+
+libvlc_track_description_t *
+ libvlc_video_get_track_description( libvlc_media_player_t *p_mi,
+ libvlc_exception_t *p_e )
+{
+ return libvlc_get_track_description( p_mi, "video-es", p_e);
+}
+
+int libvlc_video_get_track( 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 );
+ vlc_value_t val_list;
+ vlc_value_t val;
+ int i_track = -1;
+ int i_ret = -1;
+ int i;
+
+ if( !p_input_thread )
+ return -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" );
+ 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 track_val = val_list.p_list->p_values[i];
+ if( track_val.i_int == val.i_int )
+ {
+ i_track = i;
+ break;
+ }
+ }
+ vlc_object_release( p_input_thread );
+ return i_track;
+}
+
+void libvlc_video_set_track( libvlc_media_player_t *p_mi, int i_track,
+ libvlc_exception_t *p_e )
+{
+ input_thread_t *p_input_thread = libvlc_get_input_thread( p_mi, p_e );
+ vlc_value_t val_list;
+ int i_ret = -1;
+ int i;
+
+ if( !p_input_thread )
+ return;
+
+ 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 )
+ {
+ i_ret = var_Set( p_input_thread, "audio-es", val );
+ if( i_ret < 0 )
+ libvlc_exception_raise( p_e, "Setting video track failed" );
+ vlc_object_release( p_input_thread );
+ return;
+ }
+ }
+ libvlc_exception_raise( p_e, "Video track out of range" );
+ vlc_object_release( p_input_thread );
+}
+
int libvlc_video_destroy( libvlc_media_player_t *p_mi,
libvlc_exception_t *p_e )
{
libvlc_audio_get_mute
libvlc_audio_get_track
libvlc_audio_get_track_count
+libvlc_audio_get_track_description
libvlc_audio_get_volume
libvlc_audio_set_channel
libvlc_audio_set_mute
libvlc_set_log_verbosity
libvlc_toggle_fullscreen
libvlc_toggle_teletext
+libvlc_track_description_release
libvlc_video_destroy
libvlc_video_get_aspect_ratio
+libvlc_video_get_chapter_description
libvlc_video_get_crop_geometry
libvlc_video_get_height
libvlc_video_get_parent
libvlc_video_get_spu
+libvlc_video_get_spu_count
+libvlc_video_get_spu_description
libvlc_video_get_teletext
+libvlc_video_get_title_description
+libvlc_video_get_track
+libvlc_video_get_track_count
+libvlc_video_get_track_description
libvlc_video_get_width
libvlc_video_redraw_rectangle
libvlc_video_reparent
libvlc_video_set_spu
libvlc_video_set_subtitle_file
libvlc_video_set_teletext
+libvlc_video_set_track
libvlc_video_set_viewport
libvlc_video_take_snapshot
libvlc_vlm_add_broadcast