X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Finput%2Fitem.c;h=f90797404307f76b50c6bfdd329307d676bd134a;hb=4089c841ccaade63169fbb723a4107eddafc31b0;hp=30c6d3ad48133169d996cac851f02265e0b1e818;hpb=ba82f10c7108719e85413ee518e53249a549db85;p=vlc diff --git a/src/input/item.c b/src/input/item.c index 30c6d3ad48..f907974043 100644 --- a/src/input/item.c +++ b/src/input/item.c @@ -35,7 +35,7 @@ #include "item.h" #include "info.h" -static int GuessType( const input_item_t *p_item ); +static int GuessType( const input_item_t *p_item, bool *p_net ); void input_item_SetErrorWhenReading( input_item_t *p_i, bool b_error ) { @@ -57,6 +57,13 @@ void input_item_SetErrorWhenReading( input_item_t *p_i, bool b_error ) vlc_event_send( &p_i->event_manager, &event ); } } +void input_item_SignalPreparseEnded( input_item_t *p_i ) +{ + vlc_event_t event; + event.type = vlc_InputItemPreparseEnded; + vlc_event_send( &p_i->event_manager, &event ); +} + void input_item_SetPreparsed( input_item_t *p_i, bool b_preparsed ) { bool b_send_event = false; @@ -299,7 +306,7 @@ void input_item_SetURI( input_item_t *p_i, const char *psz_uri ) free( p_i->psz_uri ); p_i->psz_uri = strdup( psz_uri ); - p_i->i_type = GuessType( p_i ); + p_i->i_type = GuessType( p_i, &p_i->b_net ); if( p_i->psz_name ) ; @@ -386,6 +393,17 @@ void input_item_SetDuration( input_item_t *p_i, mtime_t i_duration ) } } +char *input_item_GetNowPlayingFb( input_item_t *p_item ) +{ + char *psz_meta = input_item_GetMeta( p_item, vlc_meta_NowPlaying ); + if( !psz_meta || strlen( psz_meta ) == 0 ) + { + free( psz_meta ); + return input_item_GetMeta( p_item, vlc_meta_ESNowPlaying ); + } + + return psz_meta; +} bool input_item_IsPreparsed( input_item_t *p_item ) { @@ -473,28 +491,6 @@ int input_item_AddOption( input_item_t *p_input, const char *psz_option, goto out; } - if (flags & VLC_INPUT_OPTION_REPLACE) - { - /* search for option format "option=value" */ - - const char *psz_found = strchr( psz_option, '=' ); - if( likely( psz_found ) ) - { - for( int i = 0 ; i < p_input->i_options; i++ ) - { - if( !strncmp( p_input->ppsz_options[i], psz_option, - psz_found - psz_option + 1 /* = */ ) ) - { - free( p_input->ppsz_options[i] ); - p_input->ppsz_options[i] = strdup( psz_option ); - - goto out; - } - } - } - - } - uint8_t *flagv = realloc (p_input->optflagv, p_input->optflagc + 1); if (flagv == NULL) { @@ -835,9 +831,10 @@ input_item_t *input_item_NewExt( const char *psz_uri, input_item_t * -input_item_NewWithType( const char *psz_uri, const char *psz_name, - int i_options, const char *const *ppsz_options, - unsigned flags, mtime_t duration, int type ) +input_item_NewWithTypeExt( const char *psz_uri, const char *psz_name, + int i_options, const char *const *ppsz_options, + unsigned flags, mtime_t duration, int type, + int i_net ) { static atomic_uint last_input_id = ATOMIC_VAR_INIT(0); @@ -873,7 +870,6 @@ input_item_NewWithType( const char *psz_uri, const char *psz_name, TAB_INIT( p_input->i_categories, p_input->pp_categories ); TAB_INIT( p_input->i_es, p_input->es ); p_input->p_stats = NULL; - p_input->i_nb_played = 0; p_input->p_meta = NULL; TAB_INIT( p_input->i_epg, p_input->pp_epg ); @@ -886,14 +882,29 @@ input_item_NewWithType( const char *psz_uri, const char *psz_name, vlc_event_manager_register_event_type( p_em, vlc_InputItemNameChanged ); vlc_event_manager_register_event_type( p_em, vlc_InputItemInfoChanged ); vlc_event_manager_register_event_type( p_em, vlc_InputItemErrorWhenReadingChanged ); + vlc_event_manager_register_event_type( p_em, vlc_InputItemPreparseEnded ); if( type != ITEM_TYPE_UNKNOWN ) p_input->i_type = type; - p_input->b_fixed_name = false; p_input->b_error_when_reading = false; + + if( i_net != -1 ) + p_input->b_net = !!i_net; + else if( p_input->i_type == ITEM_TYPE_STREAM ) + p_input->b_net = true; return p_input; } +input_item_t * +input_item_NewWithType( const char *psz_uri, const char *psz_name, + int i_options, const char *const *ppsz_options, + unsigned flags, mtime_t duration, int type ) +{ + return input_item_NewWithTypeExt( psz_uri, psz_name, i_options, + ppsz_options, flags, duration, type, + -1 ); +} + input_item_t *input_item_Copy( input_item_t *p_input ) { vlc_mutex_lock( &p_input->lock ); @@ -928,6 +939,7 @@ struct item_type_entry { const char psz_scheme[7]; uint8_t i_type; + bool b_net; }; static int typecmp( const void *key, const void *entry ) @@ -939,61 +951,61 @@ static int typecmp( const void *key, const void *entry ) } /* Guess the type of the item using the beginning of the mrl */ -static int GuessType( const input_item_t *p_item ) +static int GuessType( const input_item_t *p_item, bool *p_net ) { static const struct item_type_entry tab[] = { /* /!\ Alphabetical order /!\ */ /* Short match work, not just exact match */ - { "alsa", ITEM_TYPE_CARD }, - { "atsc", ITEM_TYPE_CARD }, - { "bd", ITEM_TYPE_DISC }, - { "cable", ITEM_TYPE_CARD }, - { "cdda", ITEM_TYPE_CDDA }, - { "cqam", ITEM_TYPE_CARD }, - { "dc1394", ITEM_TYPE_CARD }, - { "dccp", ITEM_TYPE_NET }, - { "deckli", ITEM_TYPE_CARD }, /* decklink */ - { "dir", ITEM_TYPE_DIRECTORY }, - { "dshow", ITEM_TYPE_CARD }, - { "dv", ITEM_TYPE_CARD }, - { "dvb", ITEM_TYPE_CARD }, - { "dvd", ITEM_TYPE_DISC }, - { "dtv", ITEM_TYPE_CARD }, - { "eyetv", ITEM_TYPE_CARD }, - { "fd", ITEM_TYPE_UNKNOWN }, - { "ftp", ITEM_TYPE_NET }, - { "http", ITEM_TYPE_NET }, - { "icyx", ITEM_TYPE_NET }, - { "imem", ITEM_TYPE_UNKNOWN }, - { "itpc", ITEM_TYPE_NET }, - { "jack", ITEM_TYPE_CARD }, - { "linsys", ITEM_TYPE_CARD }, - { "live", ITEM_TYPE_NET }, /* livedotcom */ - { "mms", ITEM_TYPE_NET }, - { "mtp", ITEM_TYPE_DISC }, - { "ofdm", ITEM_TYPE_CARD }, - { "oss", ITEM_TYPE_CARD }, - { "pnm", ITEM_TYPE_NET }, - { "qam", ITEM_TYPE_CARD }, - { "qpsk", ITEM_TYPE_CARD }, - { "qtcapt", ITEM_TYPE_CARD }, /* qtcapture */ - { "raw139", ITEM_TYPE_CARD }, /* raw1394 */ - { "rt", ITEM_TYPE_NET }, /* rtp, rtsp, rtmp */ - { "satell", ITEM_TYPE_CARD }, /* sattelite */ - { "screen", ITEM_TYPE_CARD }, - { "sdp", ITEM_TYPE_NET }, - { "sftp", ITEM_TYPE_NET }, - { "shm", ITEM_TYPE_CARD }, - { "smb", ITEM_TYPE_NET }, - { "svcd", ITEM_TYPE_DISC }, - { "tcp", ITEM_TYPE_NET }, - { "terres", ITEM_TYPE_CARD }, /* terrestrial */ - { "udp", ITEM_TYPE_NET }, /* udplite too */ - { "unsv", ITEM_TYPE_NET }, - { "usdigi", ITEM_TYPE_CARD }, /* usdigital */ - { "v4l", ITEM_TYPE_CARD }, - { "vcd", ITEM_TYPE_DISC }, - { "window", ITEM_TYPE_CARD }, + { "alsa", ITEM_TYPE_CARD, false }, + { "atsc", ITEM_TYPE_CARD, false }, + { "bd", ITEM_TYPE_DISC, false }, + { "cable", ITEM_TYPE_CARD, false }, + { "cdda", ITEM_TYPE_CDDA, false }, + { "cqam", ITEM_TYPE_CARD, false }, + { "dc1394", ITEM_TYPE_CARD, false }, + { "dccp", ITEM_TYPE_STREAM, true }, + { "deckli", ITEM_TYPE_CARD, false }, /* decklink */ + { "dir", ITEM_TYPE_DIRECTORY, false }, + { "dshow", ITEM_TYPE_CARD, false }, + { "dv", ITEM_TYPE_CARD, false }, + { "dvb", ITEM_TYPE_CARD, false }, + { "dvd", ITEM_TYPE_DISC, false }, + { "dtv", ITEM_TYPE_CARD, false }, + { "eyetv", ITEM_TYPE_CARD, false }, + { "fd", ITEM_TYPE_UNKNOWN, false }, + { "ftp", ITEM_TYPE_FILE, true }, + { "http", ITEM_TYPE_FILE, true }, + { "icyx", ITEM_TYPE_STREAM, true }, + { "imem", ITEM_TYPE_UNKNOWN, false }, + { "itpc", ITEM_TYPE_PLAYLIST, true }, + { "jack", ITEM_TYPE_CARD, false }, + { "linsys", ITEM_TYPE_CARD, false }, + { "live", ITEM_TYPE_STREAM, true }, /* livedotcom */ + { "mms", ITEM_TYPE_STREAM, true }, + { "mtp", ITEM_TYPE_DISC, false }, + { "ofdm", ITEM_TYPE_CARD, false }, + { "oss", ITEM_TYPE_CARD, false }, + { "pnm", ITEM_TYPE_STREAM, true }, + { "qam", ITEM_TYPE_CARD, false }, + { "qpsk", ITEM_TYPE_CARD, false }, + { "qtcapt", ITEM_TYPE_CARD, false }, /* qtcapture */ + { "raw139", ITEM_TYPE_CARD, false }, /* raw1394 */ + { "rt", ITEM_TYPE_STREAM, true }, /* rtp, rtsp, rtmp */ + { "satell", ITEM_TYPE_CARD, false }, /* sattelite */ + { "screen", ITEM_TYPE_CARD, false }, + { "sdp", ITEM_TYPE_STREAM, true }, + { "sftp", ITEM_TYPE_FILE, true }, + { "shm", ITEM_TYPE_CARD, false }, + { "smb", ITEM_TYPE_FILE, true }, + { "svcd", ITEM_TYPE_DISC, false }, + { "tcp", ITEM_TYPE_STREAM, true }, + { "terres", ITEM_TYPE_CARD, false }, /* terrestrial */ + { "udp", ITEM_TYPE_STREAM, true }, /* udplite too */ + { "unsv", ITEM_TYPE_STREAM, true }, + { "usdigi", ITEM_TYPE_CARD, false }, /* usdigital */ + { "v4l", ITEM_TYPE_CARD, false }, + { "vcd", ITEM_TYPE_DISC, false }, + { "window", ITEM_TYPE_CARD, false }, }; const struct item_type_entry *e; @@ -1002,7 +1014,15 @@ static int GuessType( const input_item_t *p_item ) e = bsearch( p_item->psz_uri, tab, sizeof( tab ) / sizeof( tab[0] ), sizeof( tab[0] ), typecmp ); - return e ? e->i_type : ITEM_TYPE_FILE; + if( e ) + { + *p_net = e->b_net; + return e->i_type; + } else + { + *p_net = false; + return ITEM_TYPE_FILE; + } } input_item_node_t *input_item_node_Create( input_item_t *p_input )