lib: add libvlc_media_get_tracklist()

This commit is contained in:
Thomas Guillem 2020-06-02 19:06:18 +02:00
parent e1f25a73af
commit 40c14fbee4
5 changed files with 93 additions and 1 deletions

View File

@ -573,7 +573,7 @@ LIBVLC_API libvlc_time_t
*
* \see libvlc_MediaParsedChanged
* \see libvlc_media_get_meta
* \see libvlc_media_tracks_get
* \see libvlc_media_get_tracklist
* \see libvlc_media_get_parsed_status
* \see libvlc_media_parse_flag_t
*
@ -661,6 +661,29 @@ LIBVLC_API
unsigned libvlc_media_tracks_get( libvlc_media_t *p_md,
libvlc_media_track_t ***tracks );
/**
* Get the track list for one type
*
* \version LibVLC 4.0.0 and later.
*
* \note You need to call libvlc_media_parse_with_options() or play the media
* at least once before calling this function. Not doing this will result in
* an empty list.
*
* \see libvlc_media_parse_with_options
* \see libvlc_media_tracklist_count
* \see libvlc_media_tracklist_at
*
* \param p_md media descriptor object
* \param type type of the track list to request
*
* \return a valid libvlc_media_tracklist_t or NULL in case of error, if there
* is no track for a category, the returned list will have a size of 0, delete
* with libvlc_media_tracklist_delete()
*/
LIBVLC_API libvlc_media_tracklist_t *
libvlc_media_get_tracklist( libvlc_media_t *p_md, libvlc_track_type_t type );
/**
* Get codec description from media elementary stream
*

View File

@ -77,6 +77,7 @@ libvlc_media_get_meta
libvlc_media_get_mrl
libvlc_media_get_state
libvlc_media_get_stats
libvlc_media_get_tracklist
libvlc_media_get_type
libvlc_media_get_user_data
libvlc_media_is_parsed

View File

@ -895,6 +895,22 @@ libvlc_media_tracks_get( libvlc_media_t *p_md, libvlc_media_track_t *** pp_es )
return i_es;
}
libvlc_media_tracklist_t *
libvlc_media_get_tracklist( libvlc_media_t *p_md, libvlc_track_type_t type )
{
assert( p_md );
input_item_t *p_input_item = p_md->p_input_item;
vlc_mutex_lock( &p_input_item->lock );
libvlc_media_tracklist_t *list =
libvlc_media_tracklist_from_es_array( p_input_item->es,
p_input_item->i_es, type );
vlc_mutex_unlock( &p_input_item->lock );
return list;
}
// Get codec description from media elementary stream
const char *
libvlc_media_get_codec_description( libvlc_track_type_t i_type,

View File

@ -87,6 +87,11 @@ void
libvlc_media_trackpriv_from_es( libvlc_media_trackpriv_t *trackpriv,
const es_format_t *es );
libvlc_media_tracklist_t *
libvlc_media_tracklist_from_es_array( es_format_t **es_array,
size_t es_count,
libvlc_track_type_t type );
void
libvlc_media_track_clean( libvlc_media_track_t *track );

View File

@ -125,6 +125,53 @@ libvlc_media_track_clean( libvlc_media_track_t *track )
}
}
static libvlc_media_tracklist_t *
libvlc_media_tracklist_alloc( size_t count )
{
size_t size;
if( mul_overflow( count, sizeof(libvlc_media_trackpriv_t), &size) )
return NULL;
if( add_overflow( size, sizeof(libvlc_media_tracklist_t), &size) )
return NULL;
libvlc_media_tracklist_t *list = malloc( size );
if( list == NULL )
return NULL;
list->count = count;
return list;
}
libvlc_media_tracklist_t *
libvlc_media_tracklist_from_es_array( es_format_t **es_array,
size_t es_count,
libvlc_track_type_t type )
{
size_t count = 0;
const enum es_format_category_e cat = libvlc_track_type_to_escat( type );
for( size_t i = 0; i < es_count; ++i )
{
if( es_array[i]->i_cat == cat )
count++;
}
libvlc_media_tracklist_t *list = libvlc_media_tracklist_alloc( count );
if( count == 0 )
return list;
count = 0;
for( size_t i = 0; i < es_count; ++i )
{
if( es_array[i]->i_cat == cat )
libvlc_media_trackpriv_from_es( &list->tracks[count++],
es_array[i] );
}
return list;
}
size_t
libvlc_media_tracklist_count( const libvlc_media_tracklist_t *list )
{