[vlc-devel] commit: xspf: new playlist design (Jakob Leben )
git version control
git at videolan.org
Tue Feb 2 06:56:59 CET 2010
vlc | branch: master | Jakob Leben <jleben at videolan.org> | Tue Feb 2 04:18:41 2010 +0100| [decef1e783b31a6b81772dbd2424419830860b2d] | committer: Jakob Leben
xspf: new playlist design
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=decef1e783b31a6b81772dbd2424419830860b2d
---
modules/demux/playlist/xspf.c | 40 +++++++++++++++++++++++++++++-----------
modules/demux/playlist/xspf.h | 8 ++++----
2 files changed, 33 insertions(+), 15 deletions(-)
diff --git a/modules/demux/playlist/xspf.c b/modules/demux/playlist/xspf.c
index ec5f9f6..84df57d 100644
--- a/modules/demux/playlist/xspf.c
+++ b/modules/demux/playlist/xspf.c
@@ -118,7 +118,10 @@ int Demux( demux_t *p_demux )
}
free( psz_name );
- i_ret = parse_playlist_node( p_demux, p_current_input,
+ input_item_node_t *p_subitems =
+ input_item_node_Create( p_current_input );
+
+ i_ret = parse_playlist_node( p_demux, p_subitems,
p_xml_reader, "playlist" ) ? 0 : -1;
for( int i = 0 ; i < p_demux->p_sys->i_tracklist_entries ; i++ )
@@ -127,9 +130,13 @@ int Demux( demux_t *p_demux )
if( p_new_input )
{
input_item_AddSubItem( p_current_input, p_new_input );
+ input_item_node_AppendItem( p_subitems, p_new_input );
}
}
+ input_item_AddSubItemTree( p_subitems );
+ input_item_node_Delete( p_subitems );
+
end:
vlc_gc_decref(p_current_input);
if( p_xml_reader )
@@ -155,6 +162,7 @@ static int Control( demux_t *p_demux, int i_query, va_list args )
*/
static bool parse_playlist_node COMPLEX_INTERFACE
{
+ input_item_t *p_input_item = p_input_node->p_item;
char *psz_name = NULL;
char *psz_value = NULL;
bool b_version_found = false;
@@ -248,7 +256,7 @@ static bool parse_playlist_node COMPLEX_INTERFACE
{
FREE_VALUE();
if( p_handler->pf_handler.cmplx( p_demux,
- p_input_item,
+ p_input_node,
p_xml_reader,
p_handler->name ) )
{
@@ -349,8 +357,8 @@ static bool parse_tracklist_node COMPLEX_INTERFACE
free( psz_eltname );
/* parse the track data in a separate function */
- if( parse_track_node( p_demux, p_input_item, p_xml_reader,
- "track" ) )
+ if( parse_track_node( p_demux, p_input_node,
+ p_xml_reader, "track" ) )
i_ntracks++;
}
else if( i_node == XML_READER_ENDELEM )
@@ -382,6 +390,7 @@ static bool parse_tracklist_node COMPLEX_INTERFACE
*/
static bool parse_track_node COMPLEX_INTERFACE
{
+ input_item_t *p_input_item = p_input_node->p_item;
char *psz_name = NULL;
char *psz_value = NULL;
xml_elem_hnd_t *p_handler = NULL;
@@ -406,6 +415,7 @@ static bool parse_track_node COMPLEX_INTERFACE
};
input_item_t *p_new_input = input_item_New( p_demux, NULL, NULL );
+ input_item_node_t *p_new_node = input_item_node_Create( p_new_input );
if( !p_new_input )
{
@@ -446,10 +456,12 @@ static bool parse_track_node COMPLEX_INTERFACE
if( p_handler->type == COMPLEX_CONTENT )
{
FREE_VALUE();
- if( p_handler->pf_handler.cmplx( p_demux,
- p_new_input,
- p_xml_reader,
- p_handler->name ) )
+
+ bool b_res = p_handler->pf_handler.cmplx( p_demux,
+ p_new_node,
+ p_xml_reader,
+ p_handler->name );
+ if( b_res )
{
p_handler = NULL;
}
@@ -497,6 +509,7 @@ static bool parse_track_node COMPLEX_INTERFACE
if( p_sys->i_track_id < 0 )
{
input_item_AddSubItem( p_input_item, p_new_input );
+ input_item_node_AppendNode( p_input_node, p_new_node );
vlc_gc_decref( p_new_input );
return true;
}
@@ -647,6 +660,7 @@ static bool set_option SIMPLE_INTERFACE
*/
static bool parse_extension_node COMPLEX_INTERFACE
{
+ input_item_t *p_input_item = p_input_node->p_item;
char *psz_name = NULL;
char *psz_value = NULL;
char *psz_title = NULL;
@@ -711,6 +725,8 @@ static bool parse_extension_node COMPLEX_INTERFACE
if( p_new_input )
{
input_item_AddSubItem( p_input_item, p_new_input );
+ p_input_node =
+ input_item_node_AppendItem( p_input_node, p_new_input );
p_input_item = p_new_input;
b_release_input_item = true;
}
@@ -732,6 +748,7 @@ static bool parse_extension_node COMPLEX_INTERFACE
}
free( psz_application );
+
/* parse the child elements */
while( xml_ReaderRead( p_xml_reader ) == 1 )
{
@@ -766,7 +783,7 @@ static bool parse_extension_node COMPLEX_INTERFACE
if( p_handler->type == COMPLEX_CONTENT )
{
if( p_handler->pf_handler.cmplx( p_demux,
- p_input_item,
+ p_input_node,
p_xml_reader,
p_handler->name ) )
{
@@ -900,7 +917,8 @@ static bool parse_extitem_node COMPLEX_INTERFACE
p_new_input = p_demux->p_sys->pp_tracklist[ i_tid ];
if( p_new_input )
{
- input_item_AddSubItem( p_input_item, p_new_input );
+ input_item_AddSubItem( p_input_node->p_item, p_new_input );
+ input_item_node_AppendItem( p_input_node, p_new_input );
vlc_gc_decref( p_new_input );
p_demux->p_sys->pp_tracklist[i_tid] = NULL;
}
@@ -917,7 +935,7 @@ static bool parse_extitem_node COMPLEX_INTERFACE
*/
static bool skip_element COMPLEX_INTERFACE
{
- VLC_UNUSED(p_demux); VLC_UNUSED(p_input_item);
+ VLC_UNUSED(p_demux); VLC_UNUSED(p_input_node);
while( xml_ReaderRead( p_xml_reader ) == 1 )
{
diff --git a/modules/demux/playlist/xspf.h b/modules/demux/playlist/xspf.h
index 041bef0..00750b2 100644
--- a/modules/demux/playlist/xspf.h
+++ b/modules/demux/playlist/xspf.h
@@ -34,10 +34,10 @@ enum {
#define SIMPLE_INTERFACE (input_item_t *p_input,\
const char *psz_name,\
char *psz_value)
-#define COMPLEX_INTERFACE (demux_t *p_demux,\
- input_item_t *p_input_item,\
- xml_reader_t *p_xml_reader,\
- const char *psz_element)
+#define COMPLEX_INTERFACE (demux_t *p_demux,\
+ input_item_node_t *p_input_node,\
+ xml_reader_t *p_xml_reader,\
+ const char *psz_element)
/* prototypes */
static bool parse_playlist_node COMPLEX_INTERFACE;
More information about the vlc-devel
mailing list