[vlc-commits] lib: media_track: allocate medias separately
Thomas Guillem
git at videolan.org
Wed Jun 17 10:14:50 CEST 2020
vlc | branch: master | Thomas Guillem <thomas at gllm.fr> | Mon Jun 15 14:29:59 2020 +0200| [057f3ef9e8b6bef1db79c1824daf667f4e777283] | committer: Thomas Guillem
lib: media_track: allocate medias separately
Since libvlc_media_track_t will be refcounted.
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=057f3ef9e8b6bef1db79c1824daf667f4e777283
---
lib/media_track.c | 52 +++++++++++++++++++++++++++++++++++++++-------------
1 file changed, 39 insertions(+), 13 deletions(-)
diff --git a/lib/media_track.c b/lib/media_track.c
index cb0585b413..515970a531 100644
--- a/lib/media_track.c
+++ b/lib/media_track.c
@@ -36,7 +36,7 @@
struct libvlc_media_tracklist_t
{
size_t count;
- libvlc_media_trackpriv_t tracks[];
+ libvlc_media_trackpriv_t *tracks[];
};
void
@@ -45,8 +45,6 @@ libvlc_media_trackpriv_from_es( libvlc_media_trackpriv_t *trackpriv,
{
libvlc_media_track_t *track = &trackpriv->t;
- trackpriv->es_id = NULL;
-
track->i_codec = es->i_codec;
track->i_original_fourcc = es->i_original_fourcc;
track->i_id = es->i_id;
@@ -111,6 +109,19 @@ libvlc_media_trackpriv_from_es( libvlc_media_trackpriv_t *trackpriv,
}
}
+static libvlc_media_trackpriv_t *
+libvlc_media_trackpriv_new( void )
+{
+ libvlc_media_trackpriv_t *trackpriv =
+ malloc( sizeof (libvlc_media_trackpriv_t ) );
+
+ if( trackpriv == NULL )
+ return NULL;
+
+ trackpriv->es_id = NULL;
+ return trackpriv;
+}
+
void
libvlc_media_track_clean( libvlc_media_track_t *track )
{
@@ -147,7 +158,7 @@ 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) )
+ if( mul_overflow( count, sizeof(libvlc_media_trackpriv_t *), &size) )
return NULL;
if( add_overflow( size, sizeof(libvlc_media_tracklist_t), &size) )
return NULL;
@@ -156,7 +167,7 @@ libvlc_media_tracklist_alloc( size_t count )
if( list == NULL )
return NULL;
- list->count = count;
+ list->count = 0;
return list;
}
@@ -179,12 +190,19 @@ libvlc_media_tracklist_from_es_array( es_format_t **es_array,
if( count == 0 || list == NULL )
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] );
+ {
+ libvlc_media_trackpriv_t *trackpriv = libvlc_media_trackpriv_new();
+ if( trackpriv == NULL )
+ {
+ libvlc_media_tracklist_delete( list );
+ return NULL;
+ }
+ list->tracks[list->count++] = trackpriv;
+ libvlc_media_trackpriv_from_es( trackpriv, es_array[i] );
+ }
}
return list;
@@ -207,7 +225,7 @@ libvlc_media_trackpriv_from_player_track( libvlc_media_trackpriv_t *trackpriv,
libvlc_media_track_t *
libvlc_media_track_create_from_player_track( const struct vlc_player_track *track )
{
- libvlc_media_trackpriv_t *trackpriv = malloc( sizeof(*trackpriv) );
+ libvlc_media_trackpriv_t *trackpriv = libvlc_media_trackpriv_new();
if( trackpriv == NULL )
return NULL;
libvlc_media_trackpriv_from_player_track( trackpriv, track );
@@ -223,7 +241,7 @@ libvlc_media_tracklist_from_player( vlc_player_t *player,
size_t count = vlc_player_GetTrackCount( player, cat );
libvlc_media_tracklist_t *list = libvlc_media_tracklist_alloc( count );
- if( !list )
+ if( count == 0 || list == NULL )
return NULL;
for( size_t i = 0; i < count; ++i )
@@ -232,7 +250,13 @@ libvlc_media_tracklist_from_player( vlc_player_t *player,
vlc_player_GetTrackAt( player, cat, i );
assert( track );
- libvlc_media_trackpriv_t *trackpriv = &list->tracks[i];
+ libvlc_media_trackpriv_t *trackpriv = libvlc_media_trackpriv_new();
+ if( trackpriv == NULL )
+ {
+ libvlc_media_tracklist_delete( list );
+ return NULL;
+ }
+ list->tracks[list->count++] = trackpriv;
libvlc_media_trackpriv_from_player_track( trackpriv, track );
}
@@ -249,7 +273,7 @@ libvlc_media_track_t *
libvlc_media_tracklist_at( libvlc_media_tracklist_t *list, size_t idx )
{
assert( idx < list->count );
- return &list->tracks[idx].t;
+ return &list->tracks[idx]->t;
}
void
@@ -257,11 +281,13 @@ libvlc_media_tracklist_delete( libvlc_media_tracklist_t *list )
{
for( size_t i = 0; i < list->count; ++i )
{
- libvlc_media_trackpriv_t *trackpriv = &list->tracks[i];
+ libvlc_media_trackpriv_t *trackpriv = list->tracks[i];
libvlc_media_track_clean( &trackpriv->t );
if( trackpriv->es_id != NULL )
vlc_es_id_Release( trackpriv->es_id );
+
+ free( trackpriv );
}
free( list );
}
More information about the vlc-commits
mailing list