Commit ea0b76fe authored by Laurent Aimar's avatar Laurent Aimar

Improved the way input-list is given to stream_AccessNew.

parent 8e2e5e13
...@@ -98,8 +98,9 @@ static void SlaveSeek( input_thread_t *p_input ); ...@@ -98,8 +98,9 @@ static void SlaveSeek( input_thread_t *p_input );
static void InputMetaUser( input_thread_t *p_input, vlc_meta_t *p_meta ); static void InputMetaUser( input_thread_t *p_input, vlc_meta_t *p_meta );
static void InputUpdateMeta( input_thread_t *p_input, vlc_meta_t *p_meta ); static void InputUpdateMeta( input_thread_t *p_input, vlc_meta_t *p_meta );
static char *InputGetExtraFiles( input_thread_t *p_input, static void InputGetExtraFiles( input_thread_t *p_input,
const char *psz_access, const char *psz_path ); int *pi_list, char ***pppsz_list,
const char *psz_access, const char *psz_path );
static void AppendAttachment( int *pi_attachment, input_attachment_t ***ppp_attachment, static void AppendAttachment( int *pi_attachment, input_attachment_t ***ppp_attachment,
int i_new, input_attachment_t **pp_new ); int i_new, input_attachment_t **pp_new );
...@@ -2482,27 +2483,55 @@ static int InputSourceInit( input_thread_t *p_input, ...@@ -2482,27 +2483,55 @@ static int InputSourceInit( input_thread_t *p_input,
var_Set( p_input, "can-seek", val ); var_Set( p_input, "can-seek", val );
} }
/* TODO (maybe) /* */
* do not let stream_AccessNew access input-list int i_input_list;
* but give it a list of access ? */ char **ppsz_input_list;
TAB_INIT( i_input_list, ppsz_input_list );
/* On master stream only, use input-list */
if( &p_input->p->input == in )
{
char *psz_list;
char *psz_parser;
psz_list =
psz_parser = var_CreateGetNonEmptyString( p_input, "input-list" );
while( psz_parser && *psz_parser )
{
char *p = strchr( psz_parser, ',' );
if( p )
*p++ = '\0';
if( *psz_parser )
{
char *psz_name = strdup( psz_parser );
if( psz_name )
TAB_APPEND( i_input_list, ppsz_input_list, psz_name );
}
psz_parser = p;
}
free( psz_list );
}
/* Autodetect extra files if none specified */ /* Autodetect extra files if none specified */
char *psz_input_list = var_CreateGetNonEmptyString( p_input, "input-list" ); if( i_input_list <= 0 )
if( !psz_input_list )
{ {
char *psz_extra_files = InputGetExtraFiles( p_input, psz_access, psz_path ); InputGetExtraFiles( p_input, &i_input_list, &ppsz_input_list,
if( psz_extra_files ) psz_access, psz_path );
var_SetString( p_input, "input-list", psz_extra_files );
free( psz_extra_files );
} }
if( i_input_list > 0 )
TAB_APPEND( i_input_list, ppsz_input_list, NULL );
/* Create the stream_t */ /* Create the stream_t */
in->p_stream = stream_AccessNew( in->p_access ); in->p_stream = stream_AccessNew( in->p_access, ppsz_input_list );
if( ppsz_input_list )
/* Restore old value */ {
if( !psz_input_list ) for( int i = 0; ppsz_input_list[i] != NULL; i++ )
var_SetString( p_input, "input-list", "" ); free( ppsz_input_list[i] );
free( psz_input_list ); TAB_CLEAN( i_input_list, ppsz_input_list );
}
if( in->p_stream == NULL ) if( in->p_stream == NULL )
{ {
...@@ -2875,22 +2904,26 @@ static void AppendAttachment( int *pi_attachment, input_attachment_t ***ppp_atta ...@@ -2875,22 +2904,26 @@ static void AppendAttachment( int *pi_attachment, input_attachment_t ***ppp_atta
* InputGetExtraFiles * InputGetExtraFiles
* Autodetect extra input list * Autodetect extra input list
*****************************************************************************/ *****************************************************************************/
static char *InputGetExtraFiles( input_thread_t *p_input, static void InputGetExtraFiles( input_thread_t *p_input,
const char *psz_access, const char *psz_path ) int *pi_list, char ***pppsz_list,
const char *psz_access, const char *psz_path )
{ {
char *psz_list = NULL; int i_list;
char **ppsz_list;
TAB_INIT( i_list, ppsz_list );
if( ( psz_access && *psz_access && strcmp( psz_access, "file" ) ) || !psz_path ) if( ( psz_access && *psz_access && strcmp( psz_access, "file" ) ) || !psz_path )
return NULL; goto exit;
const char *psz_ext = strrchr( psz_path, '.' ); const char *psz_ext = strrchr( psz_path, '.' );
if( !psz_ext || strcmp( psz_ext, ".001" ) ) if( !psz_ext || strcmp( psz_ext, ".001" ) )
return NULL; goto exit;
char *psz_file = strdup( psz_path ); char *psz_file = strdup( psz_path );
if( !psz_file ) if( !psz_file )
return NULL; goto exit;
/* Try to list .xyz files */ /* Try to list .xyz files */
for( int i = 2; i < 999; i++ ) for( int i = 2; i < 999; i++ )
...@@ -2900,30 +2933,20 @@ static char *InputGetExtraFiles( input_thread_t *p_input, ...@@ -2900,30 +2933,20 @@ static char *InputGetExtraFiles( input_thread_t *p_input,
snprintf( psz_ext, 5, ".%.3d", i ); snprintf( psz_ext, 5, ".%.3d", i );
if( utf8_stat( psz_file, &st ) if( utf8_stat( psz_file, &st ) ||
|| !S_ISREG( st.st_mode ) || !st.st_size ) !S_ISREG( st.st_mode ) || !st.st_size )
continue; continue;
msg_Dbg( p_input, "Detected extra file `%s'", psz_file ); msg_Dbg( p_input, "Detected extra file `%s'", psz_file );
char *psz_tmp = strdup( psz_file );
if( psz_list ) if( psz_tmp )
{ TAB_APPEND( i_list, ppsz_list, psz_tmp );
char *psz_old = psz_list;
/* FIXME how to handle file with ',' ?*/
if( asprintf( &psz_list, "%s,%s", psz_old, psz_file ) < 0 )
{
psz_list = psz_old;
break;
}
}
else
{
psz_list = strdup( psz_file );
}
} }
free( psz_file ); free( psz_file );
return psz_list; exit:
*pi_list = i_list;
*pppsz_list = ppsz_list;
} }
......
...@@ -266,7 +266,7 @@ stream_t *__stream_UrlNew( vlc_object_t *p_parent, const char *psz_url ) ...@@ -266,7 +266,7 @@ stream_t *__stream_UrlNew( vlc_object_t *p_parent, const char *psz_url )
return NULL; return NULL;
} }
if( !( p_res = stream_AccessNew( p_access ) ) ) if( !( p_res = stream_AccessNew( p_access, NULL ) ) )
{ {
access_Delete( p_access ); access_Delete( p_access );
return NULL; return NULL;
...@@ -276,16 +276,15 @@ stream_t *__stream_UrlNew( vlc_object_t *p_parent, const char *psz_url ) ...@@ -276,16 +276,15 @@ stream_t *__stream_UrlNew( vlc_object_t *p_parent, const char *psz_url )
return p_res; return p_res;
} }
stream_t *stream_AccessNew( access_t *p_access ) stream_t *stream_AccessNew( access_t *p_access, char **ppsz_list )
{ {
stream_t *s = stream_CommonNew( VLC_OBJECT(p_access) ); stream_t *s = stream_CommonNew( VLC_OBJECT(p_access) );
stream_sys_t *p_sys; stream_sys_t *p_sys;
char *psz_list = NULL;
if( !s ) if( !s )
return NULL; return NULL;
s->p_sys = p_sys = malloc( sizeof( stream_sys_t ) ); s->p_sys = p_sys = malloc( sizeof( *p_sys ) );
if( !p_sys ) if( !p_sys )
{ {
stream_CommonDelete( s ); stream_CommonDelete( s );
...@@ -317,67 +316,54 @@ stream_t *stream_AccessNew( access_t *p_access ) ...@@ -317,67 +316,54 @@ stream_t *stream_AccessNew( access_t *p_access )
p_sys->stat.i_seek_count = 0; p_sys->stat.i_seek_count = 0;
p_sys->stat.i_seek_time = 0; p_sys->stat.i_seek_time = 0;
p_sys->i_list = 0; TAB_INIT( p_sys->i_list, p_sys->list );
p_sys->list = 0;
p_sys->i_list_index = 0; p_sys->i_list_index = 0;
p_sys->p_list_access = 0; p_sys->p_list_access = NULL;
/* Get the additional list of inputs if any (for concatenation) */ /* Get the additional list of inputs if any (for concatenation) */
if( (psz_list = var_CreateGetString( s, "input-list" )) && *psz_list ) if( ppsz_list && ppsz_list[0] )
{ {
access_entry_t *p_entry = malloc( sizeof(access_entry_t) ); access_entry_t *p_entry = malloc( sizeof(*p_entry) );
if( p_entry == NULL ) if( !p_entry )
goto error; goto error;
char *psz_name, *psz_parser = psz_name = psz_list;
p_sys->p_list_access = p_access;
p_entry->i_size = p_access->info.i_size; p_entry->i_size = p_access->info.i_size;
p_entry->psz_path = strdup( p_access->psz_path ); p_entry->psz_path = strdup( p_access->psz_path );
if( p_entry->psz_path == NULL ) if( !p_entry->psz_path )
{ {
free( p_entry ); free( p_entry );
goto error; goto error;
} }
p_sys->p_list_access = p_access;
TAB_APPEND( p_sys->i_list, p_sys->list, p_entry ); TAB_APPEND( p_sys->i_list, p_sys->list, p_entry );
msg_Dbg( p_access, "adding file `%s', (%"PRId64" bytes)", msg_Dbg( p_access, "adding file `%s', (%"PRId64" bytes)",
p_entry->psz_path, p_access->info.i_size ); p_entry->psz_path, p_access->info.i_size );
while( psz_name && *psz_name ) for( int i = 0; ppsz_list[i] != NULL; i++ )
{ {
psz_parser = strchr( psz_name, ',' ); char *psz_name = strdup( ppsz_list[i] );
if( psz_parser ) *psz_parser = 0;
psz_name = strdup( psz_name ); if( !psz_name )
if( psz_name ) break;
{
access_t *p_tmp = access_New( p_access, p_access->psz_access,
"", psz_name );
if( !p_tmp ) access_t *p_tmp = access_New( p_access,
{ p_access->psz_access, "", psz_name );
psz_name = psz_parser; if( !p_tmp )
if( psz_name ) psz_name++; continue;
continue;
}
msg_Dbg( p_access, "adding file `%s', (%"PRId64" bytes)", msg_Dbg( p_access, "adding file `%s', (%"PRId64" bytes)",
psz_name, p_tmp->info.i_size ); psz_name, p_tmp->info.i_size );
p_entry = malloc( sizeof(access_entry_t) ); p_entry = malloc( sizeof(*p_entry) );
if( p_entry == NULL ) if( p_entry )
goto error; {
p_entry->i_size = p_tmp->info.i_size; p_entry->i_size = p_tmp->info.i_size;
p_entry->psz_path = psz_name; p_entry->psz_path = psz_name;
TAB_APPEND( p_sys->i_list, p_sys->list, p_entry ); TAB_APPEND( p_sys->i_list, p_sys->list, p_entry );
access_Delete( p_tmp );
} }
access_Delete( p_tmp );
psz_name = psz_parser;
if( psz_name ) psz_name++;
} }
} }
FREENULL( psz_list );
/* Peek */ /* Peek */
p_sys->i_peek = 0; p_sys->i_peek = 0;
...@@ -464,7 +450,6 @@ error: ...@@ -464,7 +450,6 @@ error:
while( p_sys->i_list > 0 ) while( p_sys->i_list > 0 )
free( p_sys->list[--(p_sys->i_list)] ); free( p_sys->list[--(p_sys->i_list)] );
free( p_sys->list ); free( p_sys->list );
free( psz_list );
free( s->p_sys ); free( s->p_sys );
vlc_object_detach( s ); vlc_object_detach( s );
stream_CommonDelete( s ); stream_CommonDelete( s );
......
...@@ -44,14 +44,35 @@ struct stream_text_t ...@@ -44,14 +44,35 @@ struct stream_text_t
stream_t *stream_CommonNew( vlc_object_t * ); stream_t *stream_CommonNew( vlc_object_t * );
void stream_CommonDelete( stream_t * ); void stream_CommonDelete( stream_t * );
/* */ /**
stream_t *stream_AccessNew( access_t *p_access ); * This function creates a stream_t from a provided access_t.
*
* An optional NULL terminated list of file may be provided. The content
* of these extra files will be concatenated after to the main access.
*
* XXX ppsz_list is treated as const (I failed to avoid a warning when
* using const keywords for pointer of pointers)
*/
stream_t *stream_AccessNew( access_t *p_access, char **ppsz_list );
/* */ /**
* This function creates a new stream_t filter.
*
* You must release it using stream_Delete unless it is used as a
* source to another filter.
*/
stream_t *stream_FilterNew( stream_t *p_source, stream_t *stream_FilterNew( stream_t *p_source,
const char *psz_stream_filter ); const char *psz_stream_filter );
/* */ /**
* This function creates a chain of filters:
* - first, automatic probed stream filters are inserted.
* - then, optional user filters (configured by psz_chain) are inserted.
* - finaly, an optional record filter is inserted if b_record is true.
*
* You must release the returned value using stream_Delete unless it is used as a
* source to another filter.
*/
stream_t *stream_FilterChainNew( stream_t *p_source, stream_t *stream_FilterChainNew( stream_t *p_source,
const char *psz_chain, const char *psz_chain,
bool b_record ); bool b_record );
......
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