]> git.sesse.net Git - vlc/commitdiff
Template for profile parser
authorClément Stenac <zorglub@videolan.org>
Thu, 24 Aug 2006 17:52:35 +0000 (17:52 +0000)
committerClément Stenac <zorglub@videolan.org>
Thu, 24 Aug 2006 17:52:35 +0000 (17:52 +0000)
configure.ac
include/vlc_common.h
include/vlc_streaming.h
modules/misc/Modules.am
modules/misc/profile_parser.c [new file with mode: 0644]
src/stream_output/profiles.c

index 49f227c3eb5af0a42f066fc50bca503c94a73ab8..8d9d94e3ee579a2b7663e360a84a03f01c956631 100644 (file)
@@ -1459,6 +1459,7 @@ then
   VLC_ADD_PLUGINS([stream_out_dummy stream_out_standard stream_out_es stream_out_rtp stream_out_description vod_rtsp])
   VLC_ADD_PLUGINS([stream_out_duplicate stream_out_gather stream_out_display stream_out_transcode stream_out_bridge stream_out_mosaic_bridge])
 #  VLC_ADD_PLUGINS([stream_out_transrate])
+  VLC_ADD_PLUGINS([profile_parser])
 
   AC_DEFINE(ENABLE_SOUT, 1, Define if you want the stream output support)
 fi
index 3be65bb5c4c66c8447a6cab6f7e2f12980d8c0b3..bac99e15dd04cd9f523c62753c93de3d6e959b9c 100644 (file)
@@ -343,6 +343,7 @@ typedef struct sout_chain_t sout_chain_t;
 typedef struct streaming_profile_t streaming_profile_t;
 typedef struct sout_module_t sout_module_t;
 typedef struct sout_gui_descr_t sout_gui_descr_t;
+typedef struct profile_parser_t profile_parser_t;
 
 /* Decoders */
 typedef struct decoder_t      decoder_t;
index a7e6e8249a03f622c06b64a411cfb790737884aa..a84c73b9199457482318ed3a54948b7d73e36df2 100644 (file)
@@ -191,6 +191,15 @@ static inline sout_chain_t *streaming_ChainNew()
     return p_chain;
 }
 
+
+struct profile_parser_t
+{
+    char *psz_profile;
+    streaming_profile_t *p_profile;
+};
+
+
+
 //VLC_XEXPORT( char *, streaming_ChainToPsz, (sout_chain_t * ) );
 
 #endif
index ab26c2644f9a8a4e59e06f50f57329292695be16..2f23e17bfd2c2dc250ab3bfd4cd3e49dc75d1aa6 100644 (file)
@@ -13,3 +13,4 @@ SOURCES_svg = svg.c
 SOURCES_msn = msn.c
 SOURCES_growl = growl.c
 SOURCES_notify = notify.c
+SOURCES_profile_parser = profile_parser.c
diff --git a/modules/misc/profile_parser.c b/modules/misc/profile_parser.c
new file mode 100644 (file)
index 0000000..bb72f34
--- /dev/null
@@ -0,0 +1,104 @@
+/*****************************************************************************
+ * profile_parser.c : VLC Streaming Profile parser
+ *****************************************************************************
+ * Copyright (C) 2003-2006 the VideoLAN team
+ * $Id: rtsp.c 16204 2006-08-03 16:58:10Z zorglub $
+ *
+ * Authors: Laurent Aimar <fenrir@via.ecp.fr>
+ *          Gildas Bazin <gbazin@videolan.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
+ *****************************************************************************/
+#include <vlc/vlc.h>
+#include <vlc_streaming.h>
+#include "vlc_xml.h"
+
+/*****************************************************************************
+ * Module descriptor
+ *****************************************************************************/
+static int  Open ( vlc_object_t * );
+
+vlc_module_begin();
+    set_capability( "profile parser", 1 );
+    set_callbacks( Open, NULL );
+vlc_module_end();
+
+static int Open( vlc_object_t *p_this )
+{
+    profile_parser_t *p_parser = (profile_parser_t *)p_this->p_private;
+    stream_t *p_stream = stream_UrlNew( p_this, p_parser->psz_profile );
+    xml_t *p_xml;
+    xml_reader_t *p_reader;
+    int i_ret;
+    char *psz_elname;
+   
+    /* Open the profile and get a XML reader from it */
+    if( !p_stream )
+    {
+        msg_Err( p_this, "failed to parse profile %s", p_parser->psz_profile );
+        return VLC_EGENERIC;
+    }
+    p_xml = xml_Create( p_this );
+    if( !p_xml ) return VLC_EGENERIC;
+    p_reader = xml_ReaderCreate( p_xml, p_stream );
+
+
+    if( xml_ReaderRead( p_reader ) != 1 || 
+        xml_ReaderNodeType( p_reader ) != XML_READER_STARTELEM )
+    {
+        msg_Err( p_this, "invalid file (invalid root)" );
+        return VLC_EGENERIC;
+    }
+
+    /* Here goes the real parsing */
+
+    while( (i_ret = xml_ReaderRead( p_reader ) ) == 1 )
+    {
+        int i_type = xml_ReaderNodeType( p_reader );
+        switch( i_type )
+        {
+        case -1:
+            /* ERROR : Bail out */
+            return -1;
+
+        case XML_READER_STARTELEM:
+            FREE( psz_elname );
+            psz_elname = xml_ReaderName( p_reader );
+            if( !psz_elname ) return VLC_EGENERIC;
+            printf( "<%s", psz_elname );
+            break;
+
+        case XML_READER_TEXT:
+            break;
+        case XML_READER_ENDELEM:
+            FREE( psz_elname );
+            psz_elname = xml_ReaderName( p_reader );
+            if( !psz_elname ) return VLC_EGENERIC;
+            printf( ">" );
+            break;
+        }
+    }
+
+    if( i_ret != 0 )
+    {
+        msg_Err( p_this, "parse error" );
+        return VLC_EGENERIC;
+    }
+
+    if( p_reader ) xml_ReaderDelete( p_xml, p_reader );
+    if( p_xml ) xml_Delete( p_xml );
+
+    return VLC_SUCCESS;
+}
index 876c728ed76fc6db87554a9169b8e23fbe83cd6d..57295bf748a4cee90110625d998933784d9379fd 100644 (file)
@@ -390,55 +390,23 @@ void streaming_ProfilesList( vlc_object_t *p_this, int *pi_profiles,
 }
 
 
-//////////// DEPRECATED
-#if 0
-vlc_bool_t streaming_ChainIsGuiSupported( sout_chain_t *p_chain,
-                                          vlc_bool_t b_root )
+/** Parse a profile */
+int streaming_ProfileParse( vlc_object_t *p_this,streaming_profile_t *p_profile,
+                            const char *psz_profile )
 {
-    /* First is transcode, std/rtp or duplicate.
-     * If transcode, then std/rtp or duplicate
-     * If duplicate, each subchain is std/rtp only */
-    int j;
-    if( p_chain->i_modules == 0 || p_chain->i_modules > 2 ) return VLC_FALSE;
+    DECMALLOC_ERR( p_parser, profile_parser_t );
+    module_t *p_module;
+    assert( p_profile ); assert( psz_profile );
 
-    if( p_chain->pp_modules[0]->i_type == SOUT_MOD_TRANSCODE && b_root )
-    {
-        if( p_chain->pp_modules[1]->i_type == SOUT_MOD_DUPLICATE )
-        {
-            sout_duplicate_t *p_dup = p_chain->pp_modules[1]->typed.p_duplicate;
-            if( p_dup->i_children == 0 ) return VLC_FALSE;
-            for( j = 0 ; j<  p_dup->i_children ; j++ )
-            {
-                if( !streaming_ChainIsGuiSupported( p_dup->pp_children[j],
-                                                    VLC_FALSE))
-                    return VLC_FALSE;
-            }
-            return VLC_TRUE;
-        }
-    }
-    if( p_chain->pp_modules[0]->i_type == SOUT_MOD_DUPLICATE && b_root )
-    {
-        sout_duplicate_t *p_dup =  p_chain->pp_modules[0]->typed.p_duplicate;
-        if( p_dup->i_children == 0 ) return VLC_FALSE;
-        for( j = 0 ; j<  p_dup->i_children ; j++ )
-        {
-            if( !streaming_ChainIsSupported( p_dup->pp_children[j], VLC_FALSE))
-                return VLC_FALSE;
-        }
-        return VLC_TRUE;
-    }
-    // Now check for supported simple chain
-    if( p_chain->i_modules == 1 || b_root )
-    {
-        return p_chain->pp_modules[0]->i_type == SOUT_MOD_RTP ||
-               p_chain->pp_modules[0]->i_type == SOUT_MOD_STD;
-    }
-    else if( b_root )
+    p_parser->psz_profile = strdup( psz_profile );
+    p_parser->p_profile = p_profile;
+
+    p_this->p_private = (void *)p_parser;
+
+    /* And call the module ! All work is done now */
+    p_module = module_Need( p_this, "profile parser", "", VLC_TRUE );
+    if( !p_module )
     {
-        return p_chain->pp_modules[0]->i_type == SOUT_MOD_TRANSCODE && 
-               (p_chain->pp_modules[1]->i_type == SOUT_MOD_RTP ||
-                p_chain->pp_modules[1]->i_type == SOUT_MOD_STD );
+        msg_Warn( p_this, "parsing profile failed" );
     }
-    return VLC_FALSE;
 }
-#endif