Browse Source

input_item: change es_format_t list handling

Use an intermediate struct that will hold a future paramater.
Use a vlc_vector instead of the ARRAY API.
pull/162/head
Thomas Guillem 3 years ago
committed by Felix Paul Kühne
parent
commit
c2cebc3d36
  1. 11
      include/vlc_input_item.h
  2. 3
      lib/media.c
  3. 4
      lib/media_internal.h
  4. 17
      lib/media_track.c
  5. 6
      modules/gui/ncurses.c
  6. 4
      modules/misc/medialibrary/MetadataExtractor.cpp
  7. 33
      src/input/item.c

11
include/vlc_input_item.h

@ -33,7 +33,9 @@
#include <vlc_epg.h>
#include <vlc_events.h>
#include <vlc_list.h>
#include <vlc_vector.h>
#include <vlc_threads.h>
#include <vlc_es.h>
#include <string.h>
@ -81,6 +83,12 @@ enum input_item_type_e
ITEM_TYPE_NUMBER
};
struct input_item_es
{
es_format_t es;
};
typedef struct VLC_VECTOR(struct input_item_es) input_item_es_vector;
/**
* Describes an input and is used to spawn input_thread_t objects.
*/
@ -100,8 +108,7 @@ struct input_item_t
struct vlc_list categories; /**< List of categories */
int i_es; /**< Number of es format descriptions */
es_format_t **es; /**< Es formats */
input_item_es_vector es_vec; /**< ES formats */
input_stats_t *p_stats; /**< Statistics */

3
lib/media.c

@ -950,8 +950,7 @@ libvlc_media_get_tracklist( libvlc_media_t *p_md, libvlc_track_type_t type )
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 );
libvlc_media_tracklist_from_item( p_input_item, type );
vlc_mutex_unlock( &p_input_item->lock );
return list;

4
lib/media_internal.h

@ -100,9 +100,7 @@ libvlc_media_track_t *
libvlc_media_track_create_from_player_track( const struct vlc_player_track *track );
libvlc_media_tracklist_t *
libvlc_media_tracklist_from_es_array( es_format_t **es_array,
size_t es_count,
libvlc_track_type_t type );
libvlc_media_tracklist_from_item( input_item_t *item, libvlc_track_type_t type );
libvlc_media_tracklist_t *
libvlc_media_tracklist_from_player( vlc_player_t *player,

17
lib/media_track.c

@ -185,16 +185,15 @@ libvlc_media_tracklist_alloc( size_t count )
}
libvlc_media_tracklist_t *
libvlc_media_tracklist_from_es_array( es_format_t **es_array,
size_t es_count,
libvlc_track_type_t type )
libvlc_media_tracklist_from_item( input_item_t *item, 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 )
for( size_t i = 0; i < item->es_vec.size; ++i )
{
if( es_array[i]->i_cat == cat )
const es_format_t *es_fmt = &item->es_vec.data[i].es;
if( es_fmt->i_cat == cat )
count++;
}
@ -203,9 +202,11 @@ libvlc_media_tracklist_from_es_array( es_format_t **es_array,
if( count == 0 || list == NULL )
return list;
for( size_t i = 0; i < es_count; ++i )
for( size_t i = 0; i < item->es_vec.size; ++i )
{
if( es_array[i]->i_cat == cat )
const struct input_item_es *item_es = &item->es_vec.data[i];
const es_format_t *es_fmt = &item_es->es;
if( es_fmt->i_cat == cat )
{
libvlc_media_trackpriv_t *trackpriv = libvlc_media_trackpriv_new();
if( trackpriv == NULL )
@ -214,7 +215,7 @@ libvlc_media_tracklist_from_es_array( es_format_t **es_array,
return NULL;
}
list->tracks[list->count++] = trackpriv;
libvlc_media_trackpriv_from_es( trackpriv, es_array[i] );
libvlc_media_trackpriv_from_es( trackpriv, es_fmt );
}
}

6
modules/gui/ncurses.c

@ -688,9 +688,9 @@ static int DrawStats(intf_thread_t *intf)
vlc_mutex_lock(&item->lock);
p_stats = item->p_stats;
for (int i = 0; i < item->i_es ; i++) {
i_audio += (item->es[i]->i_cat == AUDIO_ES);
i_video += (item->es[i]->i_cat == VIDEO_ES);
for (int i = 0; i < item->es_vec.size ; i++) {
i_audio += (item->es_vec.data[i].es.i_cat == AUDIO_ES);
i_video += (item->es_vec.data[i].es.i_cat == VIDEO_ES);
}
/* Input */

4
modules/misc/medialibrary/MetadataExtractor.cpp

@ -136,10 +136,10 @@ void MetadataExtractor::populateItem( medialibrary::parser::IItem& item, input_i
item.setDuration( MS_FROM_VLC_TICK(inputItem->i_duration) );
for ( auto i = 0; i < inputItem->i_es; ++i )
for ( auto i = 0; i < inputItem->es_vec.size; ++i )
{
medialibrary::parser::IItem::Track t;
const es_format_t *p_es = inputItem->es[i];
const es_format_t *p_es = &inputItem->es_vec.data[i].es;
switch ( p_es->i_cat )
{

33
src/input/item.c

@ -500,12 +500,12 @@ void input_item_Release( input_item_t *p_item )
TAB_CLEAN( p_item->i_options, p_item->ppsz_options );
free( p_item->optflagv );
for( int i = 0; i < p_item->i_es; i++ )
for( size_t i = 0; i < p_item->es_vec.size; ++i )
{
es_format_Clean( p_item->es[i] );
free( p_item->es[i] );
struct input_item_es *item_es = &p_item->es_vec.data[i];
es_format_Clean( &item_es->es );
}
TAB_CLEAN( p_item->i_es, p_item->es );
vlc_vector_destroy( &p_item->es_vec );
for( int i = 0; i < p_item->i_epg; i++ )
vlc_epg_Delete( p_item->pp_epg[i] );
@ -1100,7 +1100,7 @@ input_item_NewExt( const char *psz_uri, const char *psz_name,
p_input->i_duration = duration;
vlc_list_init( &p_input->categories );
TAB_INIT( p_input->i_es, p_input->es );
vlc_vector_init( &p_input->es_vec );
p_input->p_stats = NULL;
TAB_INIT( p_input->i_epg, p_input->pp_epg );
TAB_INIT( p_input->i_slaves, p_input->pp_slaves );
@ -1322,30 +1322,27 @@ void input_item_node_RemoveNode( input_item_node_t *parent,
/* Called by es_out when a new Elementary Stream is added or updated. */
void input_item_UpdateTracksInfo(input_item_t *item, const es_format_t *fmt)
{
int i;
es_format_t *fmt_copy = malloc(sizeof *fmt_copy);
if (!fmt_copy)
return;
es_format_Copy(fmt_copy, fmt);
vlc_mutex_lock( &item->lock );
for( i = 0; i < item->i_es; i++ )
for( size_t i = 0; i < item->es_vec.size; ++i )
{
if (item->es[i]->i_id != fmt->i_id)
struct input_item_es *item_es = &item->es_vec.data[i];
if (item_es->es.i_id != fmt->i_id)
continue;
/* We've found the right ES, replace it */
es_format_Clean(item->es[i]);
free(item->es[i]);
item->es[i] = fmt_copy;
es_format_Clean(&item_es->es);
es_format_Copy(&item_es->es, fmt);
vlc_mutex_unlock( &item->lock );
return;
}
/* ES not found, insert it */
TAB_APPEND(item->i_es, item->es, fmt_copy);
if (vlc_vector_push_hole( &item->es_vec, 1 ))
{
struct input_item_es *item_es = &item->es_vec.data[item->es_vec.size - 1];
es_format_Copy( &item_es->es, fmt );
}
vlc_mutex_unlock( &item->lock );
}

Loading…
Cancel
Save