vlc | branch: master | Rémi Denis-Courmont <[email protected]> | Mon May 22 20:42:37 2017 +0300| [d6bd3c5a3dae29875e8a92a6670030b6a92c4a65] | committer: Rémi Denis-Courmont
wpl: convert to stream filter > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=d6bd3c5a3dae29875e8a92a6670030b6a92c4a65 --- modules/demux/playlist/playlist.c | 4 +- modules/demux/playlist/wpl.c | 112 +++++++++++++++----------------------- 2 files changed, 45 insertions(+), 71 deletions(-) diff --git a/modules/demux/playlist/playlist.c b/modules/demux/playlist/playlist.c index bff5e477e2..80432d2113 100644 --- a/modules/demux/playlist/playlist.c +++ b/modules/demux/playlist/playlist.c @@ -127,8 +127,8 @@ vlc_module_begin () set_callbacks( Import_iTML, NULL ) add_submodule () set_description( N_("WPL playlist import") ) - add_shortcut( "playlist", "wpl" ) - set_capability( "demux", 10 ) + add_shortcut( "wpl" ) + set_capability( "stream_filter", 10 ) set_callbacks( Import_WPL, Close_WPL ) vlc_module_end () diff --git a/modules/demux/playlist/wpl.c b/modules/demux/playlist/wpl.c index 12c5cf8e8a..82622fb181 100644 --- a/modules/demux/playlist/wpl.c +++ b/modules/demux/playlist/wpl.c @@ -25,17 +25,11 @@ #endif #include <vlc_common.h> -#include <vlc_demux.h> +#include <vlc_access.h> #include <vlc_xml.h> #include "playlist.h" -struct demux_sys_t -{ - xml_reader_t* p_reader; - char* psz_prefix; -}; - static int consume_tag( xml_reader_t* p_reader, char const* psz_tag ) { int i_type, i_depth = 0; @@ -61,21 +55,21 @@ static int consume_tag( xml_reader_t* p_reader, char const* psz_tag ) return VLC_EGENERIC; } -static int consume_volatile_tag( demux_t* p_demux, char const* psz_tag ) +static int consume_volatile_tag( stream_t* p_demux, char const* psz_tag ) { char* psz_copy = strdup( psz_tag ); int ret = VLC_ENOMEM; if( likely( psz_copy ) ) - ret = consume_tag( p_demux->p_sys->p_reader, psz_copy ); + ret = consume_tag( p_demux->p_sys, psz_copy ); free( psz_copy ); return ret; } -static void parse_meta( demux_t* p_demux, input_item_t* p_input ) +static void parse_meta( stream_t* p_demux, input_item_t* p_input ) { - xml_reader_t* p_reader = p_demux->p_sys->p_reader; + xml_reader_t *p_reader = p_demux->p_sys; bool const b_empty = xml_ReaderIsEmptyElement( p_reader ) == 1; char *psz_meta_name = NULL, *psz_meta_content = NULL; @@ -121,9 +115,9 @@ done: free( psz_meta_content ); } -static int parse_title_element( demux_t* p_demux, input_item_t* p_input ) +static int parse_title_element( stream_t* p_demux, input_item_t* p_input ) { - xml_reader_t* p_reader = p_demux->p_sys->p_reader; + xml_reader_t *p_reader = p_demux->p_sys; char const* psz_title; if( xml_ReaderIsEmptyElement( p_reader ) ) @@ -138,9 +132,9 @@ static int parse_title_element( demux_t* p_demux, input_item_t* p_input ) return VLC_SUCCESS; } -static void read_head( demux_t* p_demux, input_item_t* p_input ) +static void read_head( stream_t* p_demux, input_item_t* p_input ) { - xml_reader_t* p_reader = p_demux->p_sys->p_reader; + xml_reader_t *p_reader = p_demux->p_sys; char const* psz_name; int i_type; @@ -170,23 +164,23 @@ static void read_head( demux_t* p_demux, input_item_t* p_input ) } } -static void read_body( demux_t* p_demux, input_item_node_t* p_node ) +static void read_body( stream_t* p_demux, input_item_node_t* p_node ) { - demux_sys_t* p_sys = p_demux->p_sys; + xml_reader_t *p_reader = p_demux->p_sys; const char* psz_name; int i_type; - i_type = xml_ReaderNextNode( p_sys->p_reader, &psz_name ); + i_type = xml_ReaderNextNode( p_reader, &psz_name ); if ( i_type != XML_READER_STARTELEM || strcasecmp( psz_name, "seq" ) ) { msg_Err( p_demux, "Expected opening <seq> tag. Got <%s> with type %d", psz_name, i_type ); return; } - if( xml_ReaderIsEmptyElement( p_sys->p_reader ) == 1 ) + if( xml_ReaderIsEmptyElement( p_reader ) == 1 ) return; - while ( ( i_type = xml_ReaderNextNode( p_sys->p_reader, &psz_name ) ) > 0 ) + while ( ( i_type = xml_ReaderNextNode( p_reader, &psz_name ) ) > 0 ) { if ( i_type == XML_READER_ENDELEM && !strcasecmp( psz_name, "seq" ) ) break; @@ -195,16 +189,16 @@ static void read_body( demux_t* p_demux, input_item_node_t* p_node ) { if( !strcasecmp( psz_name, "media" ) ) { - const bool b_empty = xml_ReaderIsEmptyElement( p_sys->p_reader ); + const bool b_empty = xml_ReaderIsEmptyElement( p_reader ); const char *psz_attr = NULL, *psz_val = NULL; - while ((psz_attr = xml_ReaderNextAttr( p_sys->p_reader, &psz_val ))) + while ((psz_attr = xml_ReaderNextAttr( p_reader, &psz_val ))) { if ( !psz_val || *psz_val == '\0' ) continue; if (!strcasecmp( psz_attr, "src" ) ) { - char* mrl = ProcessMRL( psz_val, p_sys->psz_prefix ); + char* mrl = ProcessMRL( psz_val, p_demux->psz_url ); if ( unlikely( !mrl ) ) return; input_item_t* p_item = input_item_New( mrl, NULL ); @@ -218,7 +212,7 @@ static void read_body( demux_t* p_demux, input_item_node_t* p_node ) } if( b_empty == false ) - consume_tag( p_sys->p_reader, "media" ); + consume_tag( p_reader, "media" ); continue; } @@ -228,34 +222,26 @@ static void read_body( demux_t* p_demux, input_item_node_t* p_node ) } } - i_type = xml_ReaderNextNode( p_sys->p_reader, &psz_name ); + i_type = xml_ReaderNextNode( p_reader, &psz_name ); if ( i_type != XML_READER_ENDELEM || strcasecmp( psz_name, "body" ) ) msg_Err( p_demux, "Expected closing <body> tag. Got: <%s> with type %d", psz_name, i_type ); } -static int Demux( demux_t* p_demux ) +static int Demux( stream_t* p_demux, input_item_node_t *p_node ) { + xml_reader_t *p_reader = p_demux->p_sys; const char* psz_name; int i_type; - demux_sys_t* p_sys = p_demux->p_sys; - p_sys->psz_prefix = FindPrefix( p_demux ); - if( unlikely(p_sys->psz_prefix == NULL) ) - return VLC_DEMUXER_EOF; - - if( xml_ReaderNextNode( p_sys->p_reader, &psz_name ) != XML_READER_STARTELEM || - strcasecmp( psz_name, "smil" ) || xml_ReaderIsEmptyElement( p_sys->p_reader ) == 1 ) + if( xml_ReaderNextNode( p_reader, &psz_name ) != XML_READER_STARTELEM || + strcasecmp( psz_name, "smil" ) || xml_ReaderIsEmptyElement( p_reader ) == 1 ) { - return VLC_DEMUXER_EOF; + return VLC_EGENERIC; } input_item_t* p_input = GetCurrentItem( p_demux ); - input_item_node_t* p_node = input_item_node_Create( p_input ); - - if( unlikely( !p_node ) ) - return VLC_DEMUXER_EOF; - while( ( i_type = xml_ReaderNextNode( p_sys->p_reader, &psz_name ) ) > 0 ) + while( ( i_type = xml_ReaderNextNode( p_reader, &psz_name ) ) > 0 ) { if( i_type == XML_READER_ENDELEM && !strcasecmp( psz_name, "smil" ) ) break; @@ -279,62 +265,48 @@ static int Demux( demux_t* p_demux ) } } - input_item_node_PostAndDelete( p_node ); - return 0; + return VLC_SUCCESS; } void Close_WPL( vlc_object_t* p_this ) { - demux_t *p_demux = (demux_t*)p_this; - demux_sys_t* p_sys = p_demux->p_sys; + stream_t *p_demux = (stream_t*)p_this; - free( p_sys->psz_prefix ); - if ( p_sys->p_reader ) - xml_ReaderDelete( p_sys->p_reader ); - free( p_sys ); + xml_ReaderDelete( p_demux->p_sys ); } int Import_WPL( vlc_object_t* p_this ) { - demux_t* p_demux = (demux_t*)p_this; + stream_t* p_demux = (stream_t*)p_this; CHECK_FILE(p_demux); - if( !demux_IsPathExtension( p_demux, ".wpl" ) && - !demux_IsPathExtension( p_demux, ".zpl" ) ) + if( !stream_HasExtension( p_demux, ".wpl" ) && + !stream_HasExtension( p_demux, ".zpl" ) ) return VLC_EGENERIC; - DEMUX_INIT_COMMON(); - - demux_sys_t* p_sys = p_demux->p_sys; uint8_t *p_peek; - ssize_t i_peek = vlc_stream_Peek( p_demux->s, (const uint8_t **) &p_peek, 2048 ); + ssize_t i_peek = vlc_stream_Peek( p_demux->p_source, (const uint8_t **) &p_peek, 2048 ); if( unlikely( i_peek <= 0 ) ) - { - Close_WPL( p_this ); return VLC_EGENERIC; - } - stream_t *p_probestream = vlc_stream_MemoryNew( p_demux->s, p_peek, i_peek, true ); + stream_t *p_probestream = vlc_stream_MemoryNew( p_demux->p_source, p_peek, i_peek, true ); if( unlikely( !p_probestream ) ) - { - Close_WPL( p_this ); return VLC_EGENERIC; - } - p_sys->p_reader = xml_ReaderCreate( p_this, p_probestream ); - if ( !p_sys->p_reader ) + xml_reader_t *p_reader = xml_ReaderCreate( p_this, p_probestream ); + if ( p_reader == NULL ) { msg_Err( p_demux, "Failed to create an XML reader" ); - Close_WPL( p_this ); vlc_stream_Delete( p_probestream ); return VLC_EGENERIC; } + p_demux->p_sys = p_reader; - const int i_flags = p_sys->p_reader->obj.flags; - p_sys->p_reader->obj.flags |= OBJECT_FLAGS_QUIET; + const int i_flags = p_reader->obj.flags; + p_reader->obj.flags |= OBJECT_FLAGS_QUIET; const char* psz_name; - int type = xml_ReaderNextNode( p_sys->p_reader, &psz_name ); - p_sys->p_reader->obj.flags = i_flags; + int type = xml_ReaderNextNode( p_reader, &psz_name ); + p_reader->obj.flags = i_flags; if ( type != XML_READER_STARTELEM || strcasecmp( psz_name, "smil" ) ) { msg_Err( p_demux, "Invalid WPL playlist. Root element should have been <smil>" ); @@ -343,10 +315,12 @@ int Import_WPL( vlc_object_t* p_this ) return VLC_EGENERIC; } - p_sys->p_reader = xml_ReaderReset( p_sys->p_reader, p_demux->s ); + p_demux->p_sys = xml_ReaderReset( p_reader, p_demux->p_source ); vlc_stream_Delete( p_probestream ); msg_Dbg( p_demux, "Found valid WPL playlist" ); + p_demux->pf_readdir = Demux; + p_demux->pf_control = access_vaDirectoryControlHelper; return VLC_SUCCESS; } _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
