Browse Source

stream_extractor: store volumes in MRL fragments

pull/162/head
François Cartegnie 3 years ago
committed by Steve Lhomme
parent
commit
b84d09bd98
  1. 5
      include/vlc_stream_extractor.h
  2. 2
      modules/stream_extractor/archive.c
  3. 23
      src/input/mrl_helpers.h
  4. 18
      src/input/stream_extractor.c

5
include/vlc_stream_extractor.h

@ -123,11 +123,14 @@ VLC_USED;
* *
* \param extractor the stream_directory_t for which the entity belongs * \param extractor the stream_directory_t for which the entity belongs
* \param subentry the name of the entity in question * \param subentry the name of the entity in question
* \param volumes media additional volumes MRLs
* \param volumes_count number of additional volumes
* *
* \return a pointer to the resulting MRL on success, NULL on failure * \return a pointer to the resulting MRL on success, NULL on failure
**/ **/
VLC_API char* vlc_stream_extractor_CreateMRL( stream_directory_t *extractor, VLC_API char* vlc_stream_extractor_CreateMRL( stream_directory_t *extractor,
char const* subentry ); char const* subentry,
char const **volumes, size_t volumes_count );
/** /**
* \name Attach a stream-extractor to the passed stream * \name Attach a stream-extractor to the passed stream

2
modules/stream_extractor/archive.c

@ -551,7 +551,7 @@ static int ReadDir( stream_directory_t* p_directory, input_item_node_t* p_node )
if( unlikely( !path ) ) if( unlikely( !path ) )
break; break;
char* mrl = vlc_stream_extractor_CreateMRL( p_directory, path ); char* mrl = vlc_stream_extractor_CreateMRL( p_directory, path, NULL, 0 );
if( unlikely( !mrl ) ) if( unlikely( !mrl ) )
break; break;

23
src/input/mrl_helpers.h

@ -92,6 +92,7 @@ mrl_EscapeFragmentIdentifier( char const* payload )
struct mrl_info struct mrl_info
{ {
vlc_array_t identifiers; vlc_array_t identifiers;
vlc_array_t volumes;
char const *extra; char const *extra;
}; };
@ -101,12 +102,16 @@ mrl_info_Clean( struct mrl_info *mrli )
for( size_t i = 0; i < vlc_array_count( &mrli->identifiers ); ++i ) for( size_t i = 0; i < vlc_array_count( &mrli->identifiers ); ++i )
free( vlc_array_item_at_index( &mrli->identifiers, i ) ); free( vlc_array_item_at_index( &mrli->identifiers, i ) );
vlc_array_clear( &mrli->identifiers ); vlc_array_clear( &mrli->identifiers );
for( size_t i = 0; i < vlc_array_count( &mrli->volumes ); ++i )
free( vlc_array_item_at_index( &mrli->volumes, i ) );
vlc_array_clear( &mrli->volumes );
} }
static inline void static inline void
mrl_info_Init( struct mrl_info *mrli ) mrl_info_Init( struct mrl_info *mrli )
{ {
vlc_array_init( &mrli->identifiers ); vlc_array_init( &mrli->identifiers );
vlc_array_init( &mrli->volumes );
mrli->extra = NULL; mrli->extra = NULL;
} }
@ -151,6 +156,24 @@ mrl_FragmentSplit( struct mrl_info *mrli,
payload += len; payload += len;
} }
while( strncmp( payload, "!+", 2 ) == 0 )
{
payload += 2;
int len = strcspn( payload, "!?" );
char* decoded = strndup( payload, len );
if( unlikely( !decoded ) || !vlc_uri_decode( decoded ) )
goto error;
if( vlc_array_append( &mrli->volumes, decoded ) )
{
free( decoded );
goto error;
}
payload += len;
}
if( *payload ) if( *payload )
{ {
if( *payload == '!' ) if( *payload == '!' )

18
src/input/stream_extractor.c

@ -87,7 +87,8 @@ struct stream_extractor_private {
**/ **/
VLC_MALLOC static char* VLC_MALLOC static char*
StreamExtractorCreateMRL( char const* base, char const* subentry ) StreamExtractorCreateMRL( char const* base, char const* subentry,
char const** volumes, size_t volumes_count )
{ {
struct vlc_memstream buffer; struct vlc_memstream buffer;
char* escaped; char* escaped;
@ -110,6 +111,12 @@ StreamExtractorCreateMRL( char const* base, char const* subentry )
vlc_memstream_puts( &buffer, "!/" ); vlc_memstream_puts( &buffer, "!/" );
vlc_memstream_puts( &buffer, escaped ); vlc_memstream_puts( &buffer, escaped );
for( size_t i=0; i<volumes_count; i++ )
{
vlc_memstream_puts( &buffer, "!+" );
vlc_memstream_puts( &buffer, volumes[i] );
}
free( escaped ); free( escaped );
return vlc_memstream_close( &buffer ) ? NULL : buffer.ptr; return vlc_memstream_close( &buffer ) ? NULL : buffer.ptr;
} }
@ -210,7 +217,8 @@ se_InitStream( struct stream_extractor_private* priv, stream_t* s )
s->pf_seek = se_StreamSeek; s->pf_seek = se_StreamSeek;
s->pf_control = se_StreamControl; s->pf_control = se_StreamControl;
s->psz_url = StreamExtractorCreateMRL( priv->extractor.source->psz_url, s->psz_url = StreamExtractorCreateMRL( priv->extractor.source->psz_url,
priv->extractor.identifier ); priv->extractor.identifier,
NULL, 0 );
if( unlikely( !s->psz_url ) ) if( unlikely( !s->psz_url ) )
return VLC_ENOMEM; return VLC_ENOMEM;
@ -362,9 +370,11 @@ stream_extractor_AttachParsed( stream_t** source, const struct mrl_info *mrli )
char* char*
vlc_stream_extractor_CreateMRL( stream_directory_t* directory, vlc_stream_extractor_CreateMRL( stream_directory_t* directory,
char const* subentry ) char const* subentry,
char const **volumes, size_t volumes_count )
{ {
return StreamExtractorCreateMRL( directory->source->psz_url, subentry ); return StreamExtractorCreateMRL( directory->source->psz_url, subentry,
volumes, volumes_count );
} }
/** /**

Loading…
Cancel
Save