Commit 0da465f6 authored by Rafaël Carré's avatar Rafaël Carré

libvlc: Get ES descriptions for media

parent 8f4a554c
......@@ -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
......
......@@ -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;
}
......@@ -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
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment