Commit 4089c841 authored by Thomas Guillem's avatar Thomas Guillem Committed by Jean-Baptiste Kempf

input: add b_net variable in item

When an item was a NET/STREAM type, there was no way to distinguish if the item
was a file, a playlist or directory.

Add a new variable, b_net in addition to i_type. This variable is automatically
set when creating a new Item (set to true for ITEM_TYPE_STREAM). It can be
overridden via the new input_item_NewWithTypeExt function. This new function
will allow accesses to create FILE, or DIRECTORY items with b_net set to true.

Unless forced, the preparser won't parse items with b_net == true.
Signed-off-by: default avatarJean-Baptiste Kempf <jb@videolan.org>
parent bd669141
...@@ -85,6 +85,8 @@ struct input_item_t ...@@ -85,6 +85,8 @@ struct input_item_t
vlc_mutex_t lock; /**< Lock for the item */ vlc_mutex_t lock; /**< Lock for the item */
uint8_t i_type; /**< Type (file, disc, ... see input_item_type_e) */ uint8_t i_type; /**< Type (file, disc, ... see input_item_type_e) */
bool b_net; /**< Net: always true for TYPE_STREAM, it
depends for others types */
bool b_error_when_reading;/**< Error When Reading */ bool b_error_when_reading;/**< Error When Reading */
}; };
...@@ -255,6 +257,16 @@ VLC_API void input_item_MergeInfos( input_item_t *, info_category_t * ); ...@@ -255,6 +257,16 @@ VLC_API void input_item_MergeInfos( input_item_t *, info_category_t * );
*/ */
VLC_API input_item_t * input_item_NewWithType( const char *psz_uri, const char *psz_name, int i_options, const char *const *ppsz_options, unsigned i_option_flags, mtime_t i_duration, int i_type ) VLC_USED; VLC_API input_item_t * input_item_NewWithType( const char *psz_uri, const char *psz_name, int i_options, const char *const *ppsz_options, unsigned i_option_flags, mtime_t i_duration, int i_type ) VLC_USED;
/**
* This function creates a new input_item_t with the provided information.
*
* \param i_net 1/0: force b_net to true/false, -1: default (guess it)
*
* XXX You may also use input_item_New, input_item_NewExt, or
* input_item_NewWithType as they need less arguments.
*/
VLC_API input_item_t * input_item_NewWithTypeExt( const char *psz_uri, const char *psz_name, int i_options, const char *const *ppsz_options, unsigned i_option_flags, mtime_t i_duration, int i_type, int i_net ) VLC_USED;
/** /**
* This function creates a new input_item_t with the provided information. * This function creates a new input_item_t with the provided information.
* *
......
...@@ -644,6 +644,7 @@ static int Demux( demux_t *p_demux ) ...@@ -644,6 +644,7 @@ static int Demux( demux_t *p_demux )
vlc_mutex_lock( &p_parent_input->lock ); vlc_mutex_lock( &p_parent_input->lock );
p_parent_input->i_type = ITEM_TYPE_STREAM; p_parent_input->i_type = ITEM_TYPE_STREAM;
p_parent_input->b_net = true;
vlc_mutex_unlock( &p_parent_input->lock ); vlc_mutex_unlock( &p_parent_input->lock );
vlc_object_release( p_input ); vlc_object_release( p_input );
......
...@@ -35,7 +35,7 @@ ...@@ -35,7 +35,7 @@
#include "item.h" #include "item.h"
#include "info.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 ) void input_item_SetErrorWhenReading( input_item_t *p_i, bool b_error )
{ {
...@@ -306,7 +306,7 @@ void input_item_SetURI( input_item_t *p_i, const char *psz_uri ) ...@@ -306,7 +306,7 @@ void input_item_SetURI( input_item_t *p_i, const char *psz_uri )
free( p_i->psz_uri ); free( p_i->psz_uri );
p_i->psz_uri = strdup( 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 ) if( p_i->psz_name )
; ;
...@@ -831,9 +831,10 @@ input_item_t *input_item_NewExt( const char *psz_uri, ...@@ -831,9 +831,10 @@ input_item_t *input_item_NewExt( const char *psz_uri,
input_item_t * input_item_t *
input_item_NewWithType( const char *psz_uri, const char *psz_name, input_item_NewWithTypeExt( const char *psz_uri, const char *psz_name,
int i_options, const char *const *ppsz_options, int i_options, const char *const *ppsz_options,
unsigned flags, mtime_t duration, int type ) unsigned flags, mtime_t duration, int type,
int i_net )
{ {
static atomic_uint last_input_id = ATOMIC_VAR_INIT(0); static atomic_uint last_input_id = ATOMIC_VAR_INIT(0);
...@@ -886,9 +887,24 @@ input_item_NewWithType( const char *psz_uri, const char *psz_name, ...@@ -886,9 +887,24 @@ input_item_NewWithType( const char *psz_uri, const char *psz_name,
if( type != ITEM_TYPE_UNKNOWN ) if( type != ITEM_TYPE_UNKNOWN )
p_input->i_type = type; p_input->i_type = type;
p_input->b_error_when_reading = 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; 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 ) input_item_t *input_item_Copy( input_item_t *p_input )
{ {
vlc_mutex_lock( &p_input->lock ); vlc_mutex_lock( &p_input->lock );
...@@ -923,6 +939,7 @@ struct item_type_entry ...@@ -923,6 +939,7 @@ struct item_type_entry
{ {
const char psz_scheme[7]; const char psz_scheme[7];
uint8_t i_type; uint8_t i_type;
bool b_net;
}; };
static int typecmp( const void *key, const void *entry ) static int typecmp( const void *key, const void *entry )
...@@ -934,61 +951,61 @@ static int typecmp( const void *key, const void *entry ) ...@@ -934,61 +951,61 @@ static int typecmp( const void *key, const void *entry )
} }
/* Guess the type of the item using the beginning of the mrl */ /* 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[] = static const struct item_type_entry tab[] =
{ /* /!\ Alphabetical order /!\ */ { /* /!\ Alphabetical order /!\ */
/* Short match work, not just exact match */ /* Short match work, not just exact match */
{ "alsa", ITEM_TYPE_CARD }, { "alsa", ITEM_TYPE_CARD, false },
{ "atsc", ITEM_TYPE_CARD }, { "atsc", ITEM_TYPE_CARD, false },
{ "bd", ITEM_TYPE_DISC }, { "bd", ITEM_TYPE_DISC, false },
{ "cable", ITEM_TYPE_CARD }, { "cable", ITEM_TYPE_CARD, false },
{ "cdda", ITEM_TYPE_CDDA }, { "cdda", ITEM_TYPE_CDDA, false },
{ "cqam", ITEM_TYPE_CARD }, { "cqam", ITEM_TYPE_CARD, false },
{ "dc1394", ITEM_TYPE_CARD }, { "dc1394", ITEM_TYPE_CARD, false },
{ "dccp", ITEM_TYPE_STREAM }, { "dccp", ITEM_TYPE_STREAM, true },
{ "deckli", ITEM_TYPE_CARD }, /* decklink */ { "deckli", ITEM_TYPE_CARD, false }, /* decklink */
{ "dir", ITEM_TYPE_DIRECTORY }, { "dir", ITEM_TYPE_DIRECTORY, false },
{ "dshow", ITEM_TYPE_CARD }, { "dshow", ITEM_TYPE_CARD, false },
{ "dv", ITEM_TYPE_CARD }, { "dv", ITEM_TYPE_CARD, false },
{ "dvb", ITEM_TYPE_CARD }, { "dvb", ITEM_TYPE_CARD, false },
{ "dvd", ITEM_TYPE_DISC }, { "dvd", ITEM_TYPE_DISC, false },
{ "dtv", ITEM_TYPE_CARD }, { "dtv", ITEM_TYPE_CARD, false },
{ "eyetv", ITEM_TYPE_CARD }, { "eyetv", ITEM_TYPE_CARD, false },
{ "fd", ITEM_TYPE_UNKNOWN }, { "fd", ITEM_TYPE_UNKNOWN, false },
{ "ftp", ITEM_TYPE_STREAM }, { "ftp", ITEM_TYPE_FILE, true },
{ "http", ITEM_TYPE_STREAM }, { "http", ITEM_TYPE_FILE, true },
{ "icyx", ITEM_TYPE_STREAM }, { "icyx", ITEM_TYPE_STREAM, true },
{ "imem", ITEM_TYPE_UNKNOWN }, { "imem", ITEM_TYPE_UNKNOWN, false },
{ "itpc", ITEM_TYPE_STREAM }, { "itpc", ITEM_TYPE_PLAYLIST, true },
{ "jack", ITEM_TYPE_CARD }, { "jack", ITEM_TYPE_CARD, false },
{ "linsys", ITEM_TYPE_CARD }, { "linsys", ITEM_TYPE_CARD, false },
{ "live", ITEM_TYPE_STREAM }, /* livedotcom */ { "live", ITEM_TYPE_STREAM, true }, /* livedotcom */
{ "mms", ITEM_TYPE_STREAM }, { "mms", ITEM_TYPE_STREAM, true },
{ "mtp", ITEM_TYPE_DISC }, { "mtp", ITEM_TYPE_DISC, false },
{ "ofdm", ITEM_TYPE_CARD }, { "ofdm", ITEM_TYPE_CARD, false },
{ "oss", ITEM_TYPE_CARD }, { "oss", ITEM_TYPE_CARD, false },
{ "pnm", ITEM_TYPE_STREAM }, { "pnm", ITEM_TYPE_STREAM, true },
{ "qam", ITEM_TYPE_CARD }, { "qam", ITEM_TYPE_CARD, false },
{ "qpsk", ITEM_TYPE_CARD }, { "qpsk", ITEM_TYPE_CARD, false },
{ "qtcapt", ITEM_TYPE_CARD }, /* qtcapture */ { "qtcapt", ITEM_TYPE_CARD, false }, /* qtcapture */
{ "raw139", ITEM_TYPE_CARD }, /* raw1394 */ { "raw139", ITEM_TYPE_CARD, false }, /* raw1394 */
{ "rt", ITEM_TYPE_STREAM }, /* rtp, rtsp, rtmp */ { "rt", ITEM_TYPE_STREAM, true }, /* rtp, rtsp, rtmp */
{ "satell", ITEM_TYPE_CARD }, /* sattelite */ { "satell", ITEM_TYPE_CARD, false }, /* sattelite */
{ "screen", ITEM_TYPE_CARD }, { "screen", ITEM_TYPE_CARD, false },
{ "sdp", ITEM_TYPE_STREAM }, { "sdp", ITEM_TYPE_STREAM, true },
{ "sftp", ITEM_TYPE_STREAM }, { "sftp", ITEM_TYPE_FILE, true },
{ "shm", ITEM_TYPE_CARD }, { "shm", ITEM_TYPE_CARD, false },
{ "smb", ITEM_TYPE_STREAM }, { "smb", ITEM_TYPE_FILE, true },
{ "svcd", ITEM_TYPE_DISC }, { "svcd", ITEM_TYPE_DISC, false },
{ "tcp", ITEM_TYPE_STREAM }, { "tcp", ITEM_TYPE_STREAM, true },
{ "terres", ITEM_TYPE_CARD }, /* terrestrial */ { "terres", ITEM_TYPE_CARD, false }, /* terrestrial */
{ "udp", ITEM_TYPE_STREAM }, /* udplite too */ { "udp", ITEM_TYPE_STREAM, true }, /* udplite too */
{ "unsv", ITEM_TYPE_STREAM }, { "unsv", ITEM_TYPE_STREAM, true },
{ "usdigi", ITEM_TYPE_CARD }, /* usdigital */ { "usdigi", ITEM_TYPE_CARD, false }, /* usdigital */
{ "v4l", ITEM_TYPE_CARD }, { "v4l", ITEM_TYPE_CARD, false },
{ "vcd", ITEM_TYPE_DISC }, { "vcd", ITEM_TYPE_DISC, false },
{ "window", ITEM_TYPE_CARD }, { "window", ITEM_TYPE_CARD, false },
}; };
const struct item_type_entry *e; const struct item_type_entry *e;
...@@ -997,7 +1014,15 @@ static int GuessType( const input_item_t *p_item ) ...@@ -997,7 +1014,15 @@ static int GuessType( const input_item_t *p_item )
e = bsearch( p_item->psz_uri, tab, sizeof( tab ) / sizeof( tab[0] ), e = bsearch( p_item->psz_uri, tab, sizeof( tab ) / sizeof( tab[0] ),
sizeof( tab[0] ), typecmp ); 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 ) input_item_node_t *input_item_node_Create( input_item_t *p_input )
......
...@@ -199,6 +199,7 @@ input_item_MetaMatch ...@@ -199,6 +199,7 @@ input_item_MetaMatch
input_item_MergeInfos input_item_MergeInfos
input_item_NewExt input_item_NewExt
input_item_NewWithType input_item_NewWithType
input_item_NewWithTypeExt
input_item_Hold input_item_Hold
input_item_Release input_item_Release
input_item_node_AppendItem input_item_node_AppendItem
......
...@@ -147,6 +147,7 @@ static void Preparse( vlc_object_t *obj, input_item_t *p_item, ...@@ -147,6 +147,7 @@ static void Preparse( vlc_object_t *obj, input_item_t *p_item,
{ {
vlc_mutex_lock( &p_item->lock ); vlc_mutex_lock( &p_item->lock );
int i_type = p_item->i_type; int i_type = p_item->i_type;
bool b_net = p_item->b_net;
vlc_mutex_unlock( &p_item->lock ); vlc_mutex_unlock( &p_item->lock );
bool b_preparse = false; bool b_preparse = false;
...@@ -155,10 +156,7 @@ static void Preparse( vlc_object_t *obj, input_item_t *p_item, ...@@ -155,10 +156,7 @@ static void Preparse( vlc_object_t *obj, input_item_t *p_item,
case ITEM_TYPE_DIRECTORY: case ITEM_TYPE_DIRECTORY:
case ITEM_TYPE_PLAYLIST: case ITEM_TYPE_PLAYLIST:
case ITEM_TYPE_NODE: case ITEM_TYPE_NODE:
b_preparse = true; if (!b_net || i_options & META_REQUEST_OPTION_SCOPE_NETWORK)
break;
case ITEM_TYPE_STREAM:
if (i_options & META_REQUEST_OPTION_SCOPE_NETWORK)
b_preparse = true; b_preparse = true;
break; break;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment