]> git.sesse.net Git - vlc/blobdiff - src/input/item.c
input: add b_net variable in item
[vlc] / src / input / item.c
index 30c6d3ad48133169d996cac851f02265e0b1e818..f90797404307f76b50c6bfdd329307d676bd134a 100644 (file)
@@ -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 )