[vlc-devel] [PATCH] libvlc: Add a new more extensible struct libvlc_media_track_t
Rémi Denis-Courmont
remi at remlab.net
Mon Feb 11 22:53:05 CET 2013
> diff --git a/lib/media.c b/lib/media.c
> index 600e10a..e96caae 100644
> --- a/lib/media.c
> +++ b/lib/media.c
> @@ -734,3 +734,105 @@ libvlc_media_get_tracks_info( libvlc_media_t *p_md,
> libvlc_media_track_info_t ** vlc_mutex_unlock( &p_input_item->lock );
> return i_es;
> }
> +
> +int
> +libvlc_media_get_tracks( libvlc_media_t *p_md, libvlc_media_track_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) ? calloc( i_es, sizeof(**pp_es) ) : NULL;
Why calloc()? This does not need to be initialized twice. Same afterward.
> +
> + 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_track_t *p_mes = calloc( 1, sizeof(*p_mes) );
> + if ( p_mes )
> + {
> + p_mes->audio = calloc( 1, __MAX(__MAX(sizeof(*p_mes->audio),
> + sizeof(*p_mes->video)),
> +
> sizeof(*p_mes->subtitle)) ); + }
> + if ( !p_mes || !p_mes->audio )
> + {
> + libvlc_media_tracks_release( *pp_es, i_es );
(except for this nearly impossible error.)
> + *pp_es = NULL;
> + return 0;
> + }
> + (*pp_es)[i] = p_mes;
> +
> + const es_format_t *p_es = p_input_item->es[i];
> +
> + p_mes->i_codec = p_es->i_codec;
> + p_mes->i_original_fourcc = p_es->i_original_fourcc;
> + p_mes->i_id = p_es->i_id;
> +
> + p_mes->i_profile = p_es->i_profile;
> + p_mes->i_level = p_es->i_level;
> +
> + p_mes->i_bitrate = p_es->i_bitrate;
> + p_mes->psz_language = p_es->psz_language != NULL ?
> strdup(p_es->psz_language) : NULL; + p_mes->psz_description =
> p_es->psz_description != NULL ? strdup(p_es->psz_description) : NULL; +
> + switch(p_es->i_cat)
> + {
> + case UNKNOWN_ES:
> + default:
> + p_mes->i_type = libvlc_track_unknown;
> + break;
> + case VIDEO_ES:
> + p_mes->i_type = libvlc_track_video;
> + p_mes->video->i_height = p_es->video.i_height;
> + p_mes->video->i_width = p_es->video.i_width;
> + p_mes->video->i_sar_num = p_es->video.i_sar_num;
> + p_mes->video->i_sar_den = p_es->video.i_sar_den;
> + p_mes->video->f_frame_rate = (float)p_es->video.i_frame_rate /
> +
> p_es->video.i_frame_rate_base;
Might be a separate patch, but this should be num/den too.
> + break;
> + case AUDIO_ES:
> + p_mes->i_type = libvlc_track_audio;
> + p_mes->audio->i_channels = p_es->audio.i_channels;
> + p_mes->audio->i_rate = p_es->audio.i_rate;
> + break;
> + case SPU_ES:
> + p_mes->i_type = libvlc_track_text;
> + p_mes->subtitle->psz_encoding = p_es->subs.psz_encoding !=
> NULL ? +
> strdup(p_es->subs.psz_encoding) : NULL; + break;
> + }
> + }
> +
> + vlc_mutex_unlock( &p_input_item->lock );
> + return i_es;
> +}
> +
> +
> +/*************************************************************************
> * + * Release media descriptor's elementary streams description array +
> **************************************************************************
> / +void libvlc_media_tracks_release( libvlc_media_track_t **p_tracks, int
> i_count ) +{
> + if( !p_tracks )
> + return;
> + for( int i = 0; i < i_count; ++i )
> + {
> + if ( !p_tracks[i] )
> + continue;
> + free( p_tracks[i]->psz_language );
> + free( p_tracks[i]->psz_description );
> + if( p_tracks[i]->i_type == libvlc_track_text )
> + free( p_tracks[i]->subtitle->psz_encoding );
It might be a bit verbose as yet, but that should logically be a switch.
> + free( p_tracks[i]->audio );
> + free( p_tracks[i] );
> + }
> + free( p_tracks );
> +}
I don't really understand why it's From JB.
--
Rémi Denis-Courmont
http://www.remlab.net/
More information about the vlc-devel
mailing list