|
|
|
@ -218,7 +218,8 @@ se_InitStream( struct stream_extractor_private* priv, stream_t* s ) |
|
|
|
s->pf_control = se_StreamControl; |
|
|
|
s->psz_url = StreamExtractorCreateMRL( priv->extractor.source->psz_url, |
|
|
|
priv->extractor.identifier, |
|
|
|
NULL, 0 ); |
|
|
|
(char const **) priv->extractor.volumes, |
|
|
|
priv->extractor.volumes_count ); |
|
|
|
if( unlikely( !s->psz_url ) ) |
|
|
|
return VLC_ENOMEM; |
|
|
|
|
|
|
|
@ -226,9 +227,20 @@ se_InitStream( struct stream_extractor_private* priv, stream_t* s ) |
|
|
|
} |
|
|
|
|
|
|
|
static void |
|
|
|
se_CleanStream( struct stream_extractor_private* priv ) |
|
|
|
se_CleanStreamExtractor( struct stream_extractor_private* priv ) |
|
|
|
{ |
|
|
|
free( (char*)priv->extractor.identifier ); |
|
|
|
for( size_t i=0; i<priv->extractor.volumes_count; i++ ) |
|
|
|
free( priv->extractor.volumes[i] ); |
|
|
|
free( priv->extractor.volumes ); |
|
|
|
} |
|
|
|
|
|
|
|
static void |
|
|
|
se_CleanStreamDirectory( struct stream_extractor_private* priv ) |
|
|
|
{ |
|
|
|
for( size_t i=0; i<priv->directory.volumes_count; i++ ) |
|
|
|
free( priv->directory.volumes[i] ); |
|
|
|
free( priv->directory.volumes ); |
|
|
|
} |
|
|
|
|
|
|
|
static int |
|
|
|
@ -288,7 +300,7 @@ se_AttachWrapper( struct stream_extractor_private* priv, stream_t* source ) |
|
|
|
|
|
|
|
static int |
|
|
|
StreamExtractorAttach( stream_t** source, char const* identifier, |
|
|
|
char const* module_name ) |
|
|
|
char const* module_name, const char **volumes, size_t volumes_count ) |
|
|
|
{ |
|
|
|
const bool extractor = identifier != NULL; |
|
|
|
char const* capability = extractor ? "stream_extractor" |
|
|
|
@ -300,27 +312,49 @@ StreamExtractorAttach( stream_t** source, char const* identifier, |
|
|
|
if( unlikely( !priv ) ) |
|
|
|
return VLC_ENOMEM; |
|
|
|
|
|
|
|
char ***dst_volumes; |
|
|
|
size_t * dst_volumes_count; |
|
|
|
|
|
|
|
if( extractor ) |
|
|
|
{ |
|
|
|
priv->object = VLC_OBJECT( &priv->extractor ); |
|
|
|
|
|
|
|
priv->pf_init = se_InitStream; |
|
|
|
priv->pf_clean = se_CleanStream; |
|
|
|
priv->pf_clean = se_CleanStreamExtractor; |
|
|
|
|
|
|
|
priv->extractor.source = *source; |
|
|
|
priv->extractor.identifier = strdup( identifier ); |
|
|
|
|
|
|
|
if( unlikely( !priv->extractor.identifier ) ) |
|
|
|
goto error; |
|
|
|
|
|
|
|
dst_volumes = &priv->extractor.volumes; |
|
|
|
dst_volumes_count = &priv->extractor.volumes_count; |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
priv->object = VLC_OBJECT( &priv->directory ); |
|
|
|
|
|
|
|
priv->pf_init = se_InitDirectory; |
|
|
|
priv->pf_clean = NULL; |
|
|
|
priv->pf_clean = se_CleanStreamDirectory; |
|
|
|
|
|
|
|
priv->directory.source = *source; |
|
|
|
|
|
|
|
dst_volumes = &priv->directory.volumes; |
|
|
|
dst_volumes_count = &priv->directory.volumes_count; |
|
|
|
} |
|
|
|
|
|
|
|
if( volumes_count ) |
|
|
|
{ |
|
|
|
*dst_volumes = malloc(volumes_count * sizeof(char *)); |
|
|
|
if( unlikely(!*dst_volumes) ) |
|
|
|
goto error; |
|
|
|
for( *dst_volumes_count=0; *dst_volumes_count<volumes_count; (*dst_volumes_count)++ ) |
|
|
|
{ |
|
|
|
(*dst_volumes)[*dst_volumes_count] = strdup(volumes[*dst_volumes_count]); |
|
|
|
if( unlikely(!(*dst_volumes)[*dst_volumes_count]) ) |
|
|
|
goto error; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
priv->module = module_need( priv->object, capability, module_name, true ); |
|
|
|
@ -337,16 +371,17 @@ error: |
|
|
|
} |
|
|
|
|
|
|
|
int |
|
|
|
vlc_stream_directory_Attach( stream_t** source, char const* module_name ) |
|
|
|
vlc_stream_directory_Attach( stream_t** source, char const* module_name, |
|
|
|
const char **volumes, size_t volumes_count ) |
|
|
|
{ |
|
|
|
return StreamExtractorAttach( source, NULL, module_name ); |
|
|
|
return StreamExtractorAttach( source, NULL, module_name, volumes, volumes_count ); |
|
|
|
} |
|
|
|
|
|
|
|
int |
|
|
|
vlc_stream_extractor_Attach( stream_t** source, char const* identifier, |
|
|
|
char const* module_name ) |
|
|
|
char const* module_name, const char **volumes, size_t volumes_count ) |
|
|
|
{ |
|
|
|
return StreamExtractorAttach( source, identifier, module_name ); |
|
|
|
return StreamExtractorAttach( source, identifier, module_name, volumes, volumes_count ); |
|
|
|
} |
|
|
|
|
|
|
|
int |
|
|
|
@ -359,7 +394,9 @@ stream_extractor_AttachParsed( stream_t** source, const struct mrl_info *mrli ) |
|
|
|
{ |
|
|
|
char* id = vlc_array_item_at_index( &mrli->identifiers, idx ); |
|
|
|
|
|
|
|
if( vlc_stream_extractor_Attach( source, id, NULL ) ) |
|
|
|
if( vlc_stream_extractor_Attach( source, id, NULL, |
|
|
|
(char const **) mrli->volumes.pp_elems, |
|
|
|
mrli->volumes.i_count ) ) |
|
|
|
break; |
|
|
|
|
|
|
|
++idx; |
|
|
|
|