From 0da465f60460f5a78fc3430b8f1e18b56f7d6fb7 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Rafa=C3=ABl=20Carr=C3=A9?= Date: Fri, 22 Jan 2010 14:52:20 +0100 Subject: [PATCH] libvlc: Get ES descriptions for media --- include/vlc/libvlc_media.h | 42 ++++++++++++++++++++++++++ src/control/media.c | 61 ++++++++++++++++++++++++++++++++++++++ src/libvlc.sym | 1 + 3 files changed, 104 insertions(+) diff --git a/include/vlc/libvlc_media.h b/include/vlc/libvlc_media.h index 637d115bb0..68917a8ee3 100644 --- a/include/vlc/libvlc_media.h +++ b/include/vlc/libvlc_media.h @@ -103,6 +103,13 @@ typedef enum libvlc_media_option_t libvlc_media_option_unique = 0x100 } libvlc_media_option_t; +typedef enum libvlc_es_type_t +{ + libvlc_es_unknown = -1, + libvlc_es_audio = 0, + libvlc_es_video = 1, + libvlc_es_text = 2, +} libvlc_es_type_t; /** defgroup libvlc_media_stats_t libvlc_media_stats_t * \ingroup libvlc_media @@ -140,6 +147,26 @@ typedef struct libvlc_media_stats_t } libvlc_media_stats_t; /** @}*/ +typedef struct libvlc_media_es_t +{ + /* Codec fourcc */ + uint32_t i_codec; + libvlc_es_type_t i_type; + + /* Codec specific */ + int i_profile; + int i_level; + + /* Audio specific */ + unsigned i_channels; + unsigned i_rate; + + /* Video specific */ + unsigned i_height; + unsigned i_width; + +} libvlc_media_es_t; + /** * Create a media with the given MRL. @@ -363,6 +390,21 @@ VLC_PUBLIC_API void VLC_PUBLIC_API void * libvlc_media_get_user_data( libvlc_media_t * p_md ); +/** + * Get media descriptor's elementary streams description + * + * Note, you need to play the media _one_ time with --sout="#description" + * Not doing this will result in an empty array, and doing it more than once + * will duplicate the entries in the array each time. + * + * \param p_md media descriptor object + * \param p_es adress to store an allocated array of Elementary Streams descriptions (must be freed by the caller) + * + * return the number of Elementary Streams + */ +VLC_PUBLIC_API int + libvlc_media_get_es( libvlc_media_t * p_md, libvlc_media_es_t ** pp_es ); + /** @}*/ # ifdef __cplusplus diff --git a/src/control/media.c b/src/control/media.c index 3d8da310c8..a947dec84e 100644 --- a/src/control/media.c +++ b/src/control/media.c @@ -636,3 +636,64 @@ libvlc_media_get_user_data( libvlc_media_t * p_md ) assert( p_md ); return p_md->p_user_data; } + +/************************************************************************** + * Get media descriptor's elementary streams description + **************************************************************************/ +int +libvlc_media_get_es( libvlc_media_t *p_md, libvlc_media_es_t ** pp_es ) +{ + assert( p_md ); + + input_item_t *p_input_item = p_md->p_input_item; + vlc_mutex_lock( &p_input_item->lock ); + + const int i_es = p_input_item->i_es; + *pp_es = (i_es > 0) ? malloc( i_es * sizeof(libvlc_media_es_t) ) : NULL; + + if( !pp_es ) /* no ES, or OOM */ + { + vlc_mutex_unlock( &p_input_item->lock ); + return 0; + } + + /* Fill array */ + for( int i = 0; i < i_es; i++ ) + { + libvlc_media_es_t *p_mes = *pp_es+i; + const es_format_t *p_es = p_input_item->es[i]; + + p_mes->i_channels = p_mes->i_rate = 0; + p_mes->i_width = p_mes->i_height = 0; + + + p_mes->i_codec = p_es->i_codec; + + p_mes->i_profile = p_es->i_profile; + p_mes->i_level = p_es->i_level; + + switch(p_es->i_cat) + { + case UNKNOWN_ES: + default: + p_mes->i_type = libvlc_es_unknown; + break; + case VIDEO_ES: + p_mes->i_type = libvlc_es_video; + p_mes->i_height = p_es->video.i_height; + p_mes->i_width = p_es->video.i_width; + break; + case AUDIO_ES: + p_mes->i_type = libvlc_es_audio; + p_mes->i_channels = p_es->audio.i_channels; + p_mes->i_rate = p_es->audio.i_rate; + break; + case SPU_ES: + p_mes->i_type = libvlc_es_text; + break; + } + } + + vlc_mutex_unlock( &p_input_item->lock ); + return i_es; +} diff --git a/src/libvlc.sym b/src/libvlc.sym index 78d2878b57..5183ed30ba 100644 --- a/src/libvlc.sym +++ b/src/libvlc.sym @@ -61,6 +61,7 @@ libvlc_media_discoverer_release libvlc_media_duplicate libvlc_media_event_manager libvlc_media_get_duration +libvlc_media_get_es libvlc_media_get_meta libvlc_media_get_mrl libvlc_media_get_state -- 2.39.2