[vlc-commits] ttml demux: add namespaces support

Stanislas Plessia git at videolan.org
Wed Sep 14 18:39:43 CEST 2016


vlc | branch: master | Stanislas Plessia <stplessia at gmail.com> | Mon Aug 29 16:01:01 2016 +0200| [bfe6c25b7644a1f6136f854b6b00e123a65995f5] | committer: Hugo Beauzée-Luyssen

ttml demux: add namespaces support

To support namespaces, we add the tt root node in each fragment
of the ttml file to define them because  every fragment is
seen as individual ttml files.

Signed-off-by: Hugo Beauzée-Luyssen <hugo at beauzee.fr>

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=bfe6c25b7644a1f6136f854b6b00e123a65995f5
---

 modules/demux/ttml.c | 98 ++++++++++++++++++++++++++++++++++++----------------
 1 file changed, 68 insertions(+), 30 deletions(-)

diff --git a/modules/demux/ttml.c b/modules/demux/ttml.c
index 6394cb1..a8c6e54 100644
--- a/modules/demux/ttml.c
+++ b/modules/demux/ttml.c
@@ -617,6 +617,8 @@ static void ParseHead( demux_t* p_demux )
 
 static int Open( vlc_object_t* p_this )
 {
+    char        *psz_root_node = NULL;
+    char        *psz_end_root_node = NULL;
     demux_t     *p_demux = (demux_t*)p_this;
     demux_sys_t *p_sys;
     p_demux->p_sys = p_sys = calloc( 1, sizeof( *p_sys ) );
@@ -640,46 +642,55 @@ static int Open( vlc_object_t* p_this )
     }
 
     p_sys->p_xml = xml_Create( p_demux );
-    if ( !p_sys->p_xml )
-    {
-        Close( p_demux );
-        vlc_stream_Delete( p_probestream );
-        return VLC_EGENERIC;
-    }
+    if( !p_sys->p_xml )
+        goto error;
+
     p_sys->p_reader = xml_ReaderCreate( p_sys->p_xml, p_probestream );
-    if ( !p_sys->p_reader )
-    {
-        Close( p_demux );
-        vlc_stream_Delete( p_probestream );
-        return VLC_EGENERIC;
-    }
+    if( !p_sys->p_reader )
+        goto error;
 
     const int i_flags = p_sys->p_reader->obj.flags;
     p_sys->p_reader->obj.flags |= OBJECT_FLAGS_QUIET;
     const char* psz_name;
     int i_type = xml_ReaderNextNode( p_sys->p_reader, &psz_name );
     p_sys->p_reader->obj.flags = i_flags;
-    if ( i_type != XML_READER_STARTELEM || ( strcmp( psz_name, "tt" ) && strcmp( psz_name, "tt:tt" ) ) )
+    /*
+    * We store the tt root node to wrap it around every ttml
+    * pieces sent to the codec to define the namespaces.
+    */
+    if( i_type != XML_READER_STARTELEM || ( strcasecmp( psz_name, "tt" ) && strcasecmp( psz_name, "tt:tt" ) ) )
     {
-        Close( p_demux );
-        vlc_stream_Delete( p_probestream );
-        return VLC_EGENERIC;
+        goto error;
     }
+    node_t* p_root_node = calloc( 1, sizeof( *p_root_node ) );
+    if( unlikely( p_root_node == NULL ) )
+        goto error;
 
-    p_sys->p_reader = xml_ReaderReset( p_sys->p_reader, p_demux->s );
-    vlc_stream_Delete( p_probestream );
-    if ( !p_sys->p_reader )
+    if( ReadAttrNode( p_sys->p_reader, p_root_node, psz_name ) != VLC_SUCCESS )
     {
-        Close( p_demux );
-        return VLC_EGENERIC;
+        ClearNode( p_root_node );
+        goto error;
     }
 
-    if ( ReadTTML( p_demux ) != VLC_SUCCESS )
-    {
-        Close( p_demux );
-        return VLC_EGENERIC;
-    }
-    if ( p_sys->b_has_head )
+    psz_root_node = NodeToStr( p_root_node );
+    ClearNode( p_root_node );
+    if( unlikely( psz_root_node == NULL ) )
+        goto error;
+
+    psz_end_root_node = strdup( psz_name );
+    if( unlikely( psz_end_root_node == NULL ) )
+        goto error;
+
+    p_sys->p_reader = xml_ReaderReset( p_sys->p_reader, p_demux->s );
+    vlc_stream_Delete( p_probestream );
+    p_probestream = NULL;
+    if( !p_sys->p_reader )
+        goto error;
+
+    if( ReadTTML( p_demux ) != VLC_SUCCESS )
+        goto error;
+
+    if( p_sys->b_has_head )
         ParseHead( p_demux );
 
     p_demux->pf_demux = Demux;
@@ -687,20 +698,47 @@ static int Open( vlc_object_t* p_this )
 
     es_format_t fmt;
     es_format_Init( &fmt, SPU_ES, VLC_CODEC_TTML );
-    if ( p_sys->i_head_len > 0 )
+    if( p_sys->i_head_len > 0 )
     {
+        char* psz_head = NULL;
+        if( asprintf( &psz_head, "%s%s</%s>", psz_root_node, p_sys->psz_head, psz_end_root_node ) < 0 )
+            goto error;
+
+        free( p_sys->psz_head );
+        p_sys->psz_head = psz_head;
         fmt.p_extra = p_sys->psz_head;
-        fmt.i_extra = p_sys->i_head_len;
+        fmt.i_extra = strlen( psz_head );
     }
     p_sys->p_es = es_out_Add( p_demux->out, &fmt );
     es_format_Clean( &fmt );
 
-    if ( p_sys->i_subtitles > 0 )
+    if( p_sys->i_subtitles > 0 )
+    {
+        for( int i = 0; i < p_sys->i_subtitles; i++ )
+        {
+            char* p_sub = NULL;
+            if( asprintf( &p_sub, "%s%s</%s>", psz_root_node, p_sys->subtitle[i].psz_text, psz_end_root_node ) < 0 )
+                goto error;
+
+            free( p_sys->subtitle[i].psz_text );
+            p_sys->subtitle[i].psz_text = p_sub;
+        }
         p_sys->i_length = p_sys->subtitle[ p_sys->i_subtitles - 1 ].i_stop;
+    }
     else
         p_sys->i_length = 0;
 
+    free( psz_end_root_node );
+    free( psz_root_node );
     return VLC_SUCCESS;
+
+error:
+    free( p_sys->psz_head );
+    Close( p_demux );
+    free( psz_end_root_node );
+    free( psz_root_node );
+    if( p_probestream ) vlc_stream_Delete( p_probestream );
+    return VLC_EGENERIC;
 }
 
 static void Close( demux_t* p_demux )



More information about the vlc-commits mailing list