X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fcontrol%2Fmedia.c;h=2456a49feb59b01662e828777e84fffd7077d690;hb=b0a1ac2e6378b0b86dd8086cdc8eced01195f098;hp=3d8da310c8e6b73838c736c22d9f4ca23a2ea522;hpb=478ff4e11c65ce9a84539d7cdb9b8ee3048b0734;p=vlc diff --git a/src/control/media.c b/src/control/media.c index 3d8da310c8..2456a49feb 100644 --- a/src/control/media.c +++ b/src/control/media.c @@ -96,13 +96,13 @@ static void input_item_subitem_added( const vlc_event_t *p_event, p_md_child = libvlc_media_new_from_input_item( p_md->p_libvlc_instance, - p_event->u.input_item_subitem_added.p_new_child, NULL ); + p_event->u.input_item_subitem_added.p_new_child ); /* Add this to our media list */ if( !p_md->p_subitems ) { - p_md->p_subitems = libvlc_media_list_new( p_md->p_libvlc_instance, NULL ); - libvlc_media_list_set_media( p_md->p_subitems, p_md, NULL ); + p_md->p_subitems = libvlc_media_list_new( p_md->p_libvlc_instance ); + libvlc_media_list_set_media( p_md->p_subitems, p_md ); } if( p_md->p_subitems ) { @@ -240,14 +240,12 @@ static void preparse_if_needed( libvlc_media_t *p_md ) **************************************************************************/ libvlc_media_t * libvlc_media_new_from_input_item( libvlc_instance_t *p_instance, - input_item_t *p_input_item, - libvlc_exception_t *p_e ) + input_item_t *p_input_item ) { libvlc_media_t * p_md; if (!p_input_item) { - libvlc_exception_raise( p_e ); libvlc_printerr( "No input item given" ); return NULL; } @@ -255,7 +253,6 @@ libvlc_media_t * libvlc_media_new_from_input_item( p_md = calloc( 1, sizeof(libvlc_media_t) ); if( !p_md ) { - libvlc_exception_raise( p_e ); libvlc_printerr( "Not enough memory" ); return NULL; } @@ -270,17 +267,22 @@ libvlc_media_t * libvlc_media_new_from_input_item( * It can give a bunch of item to read. */ p_md->p_subitems = NULL; - p_md->p_event_manager = libvlc_event_manager_new( p_md, p_instance, p_e ); + p_md->p_event_manager = libvlc_event_manager_new( p_md, p_instance ); + if( unlikely(p_md->p_event_manager == NULL) ) + { + free(p_md); + return NULL; + } libvlc_event_manager_register_event_type( p_md->p_event_manager, - libvlc_MediaMetaChanged, p_e ); + libvlc_MediaMetaChanged ); libvlc_event_manager_register_event_type( p_md->p_event_manager, - libvlc_MediaSubItemAdded, p_e ); + libvlc_MediaSubItemAdded ); libvlc_event_manager_register_event_type( p_md->p_event_manager, - libvlc_MediaFreed, p_e ); + libvlc_MediaFreed ); libvlc_event_manager_register_event_type( p_md->p_event_manager, - libvlc_MediaDurationChanged, p_e ); + libvlc_MediaDurationChanged ); libvlc_event_manager_register_event_type( p_md->p_event_manager, - libvlc_MediaStateChanged, p_e ); + libvlc_MediaStateChanged ); vlc_gc_incref( p_md->p_input_item ); @@ -292,10 +294,8 @@ libvlc_media_t * libvlc_media_new_from_input_item( /************************************************************************** * Create a new media descriptor object **************************************************************************/ -libvlc_media_t * libvlc_media_new( - libvlc_instance_t *p_instance, - const char * psz_mrl, - libvlc_exception_t *p_e ) +libvlc_media_t * libvlc_media_new( libvlc_instance_t *p_instance, + const char * psz_mrl ) { input_item_t * p_input_item; libvlc_media_t * p_md; @@ -304,13 +304,11 @@ libvlc_media_t * libvlc_media_new( if (!p_input_item) { - libvlc_exception_raise( p_e ); libvlc_printerr( "Not enough memory" ); return NULL; } - p_md = libvlc_media_new_from_input_item( p_instance, - p_input_item, p_e ); + p_md = libvlc_media_new_from_input_item( p_instance, p_input_item ); /* The p_input_item is retained in libvlc_media_new_from_input_item */ vlc_gc_decref( p_input_item ); @@ -321,10 +319,8 @@ libvlc_media_t * libvlc_media_new( /************************************************************************** * Create a new media descriptor object **************************************************************************/ -libvlc_media_t * libvlc_media_new_as_node( - libvlc_instance_t *p_instance, - const char * psz_name, - libvlc_exception_t *p_e ) +libvlc_media_t * libvlc_media_new_as_node( libvlc_instance_t *p_instance, + const char * psz_name ) { input_item_t * p_input_item; libvlc_media_t * p_md; @@ -333,15 +329,13 @@ libvlc_media_t * libvlc_media_new_as_node( if (!p_input_item) { - libvlc_exception_raise( p_e ); libvlc_printerr( "Not enough memory" ); return NULL; } - p_md = libvlc_media_new_from_input_item( p_instance, - p_input_item, p_e ); + p_md = libvlc_media_new_from_input_item( p_instance, p_input_item ); - p_md->p_subitems = libvlc_media_list_new( p_md->p_libvlc_instance, NULL ); + p_md->p_subitems = libvlc_media_list_new( p_md->p_libvlc_instance ); return p_md; } @@ -422,7 +416,7 @@ libvlc_media_t * libvlc_media_duplicate( libvlc_media_t *p_md_orig ) { return libvlc_media_new_from_input_item( - p_md_orig->p_libvlc_instance, p_md_orig->p_input_item, NULL ); + p_md_orig->p_libvlc_instance, p_md_orig->p_input_item ); } /************************************************************************** @@ -580,13 +574,12 @@ libvlc_media_event_manager( libvlc_media_t * p_md ) * Get duration of media object (in ms) **************************************************************************/ int64_t -libvlc_media_get_duration( libvlc_media_t * p_md, libvlc_exception_t *p_e ) +libvlc_media_get_duration( libvlc_media_t * p_md ) { assert( p_md ); if( !p_md->p_input_item ) { - libvlc_exception_raise( p_e ); libvlc_printerr( "No input item" ); return -1; } @@ -636,3 +629,65 @@ 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_id = p_es->i_id; + + 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; +}