Browse Source

codec: ttml: tag nodes with namespaces

pull/162/head
François Cartegnie 3 years ago
committed by Felix Paul Kühne
parent
commit
18800af26d
  1. 12
      modules/codec/ttml/encttml.c
  2. 9
      modules/codec/ttml/substtml.c
  3. 40
      modules/codec/ttml/ttml.c
  4. 6
      modules/codec/ttml/ttml.h
  5. 7
      modules/demux/ttml.c

12
modules/codec/ttml/encttml.c

@ -48,7 +48,7 @@ static void AddTextNode( tt_node_t *p_parent, const char *psz_text )
if( nl )
{
tt_subtextnode_New( p_parent, psz, nl - psz );
tt_node_New( p_parent, "br" );
tt_node_New( p_parent, "br", NULL );
psz += nl - psz + 1;
if( *psz == '\0' )
break;
@ -67,21 +67,21 @@ static block_t *Encode( encoder_t *p_enc, subpicture_t *p_spu )
if( p_spu == NULL )
return NULL;
tt_node_t *p_root = tt_node_New( NULL, "tt" );
tt_node_t *p_root = tt_node_New( NULL, "tt", TT_NS );
if( !p_root )
return NULL;
tt_node_AddAttribute( p_root, "xmlns", TT_NS );
tt_node_AddAttribute( p_root, "xmlns:tts", TT_NS_STYLING );
tt_node_t *p_body = tt_node_New( p_root, "body" );
tt_node_t *p_body = tt_node_New( p_root, "body", NULL );
if( !p_body )
{
tt_node_RecursiveDelete( p_root );
return NULL;
}
tt_node_t *p_div = tt_node_New( p_body, "div" );
tt_node_t *p_div = tt_node_New( p_body, "div", NULL );
if( !p_div )
{
tt_node_RecursiveDelete( p_root );
@ -96,7 +96,7 @@ static block_t *Encode( encoder_t *p_enc, subpicture_t *p_spu )
p_region->p_text->psz_text == NULL )
continue;
tt_node_t *p_par = tt_node_New( p_div, "p" );
tt_node_t *p_par = tt_node_New( p_div, "p", NULL );
if( !p_par )
continue;
@ -117,7 +117,7 @@ static block_t *Encode( encoder_t *p_enc, subpicture_t *p_spu )
const text_style_t *style = p_segment->style;
if( style && style->i_features )
{
tt_node_t *p_span = tt_node_New( p_par, "span" );
tt_node_t *p_span = tt_node_New( p_par, "span", NULL );
if( !p_span )
continue;

9
modules/codec/ttml/substtml.c

@ -710,12 +710,12 @@ static ttml_style_t * InheritTTMLStyles( ttml_context_t *p_ctx, tt_node_t *p_nod
static int ParseTTMLChunk( xml_reader_t *p_reader, tt_node_t **pp_rootnode )
{
const char* psz_node_name;
const char *psz_node_name, *psz_node_namespace;
do
{
int i_type = xml_ReaderNextNode( p_reader, &psz_node_name );
int i_type = xml_ReaderNextNodeNS( p_reader, &psz_node_name, &psz_node_namespace );
fprintf(stderr, "Parse %s %s \n", psz_node_name, psz_node_namespace);
if( i_type <= XML_READER_NONE )
break;
@ -729,7 +729,8 @@ static int ParseTTMLChunk( xml_reader_t *p_reader, tt_node_t **pp_rootnode )
*pp_rootnode != NULL )
return VLC_EGENERIC;
*pp_rootnode = tt_node_NewRead( p_reader, NULL, psz_node_name );
*pp_rootnode = tt_node_NewRead( p_reader, NULL, psz_node_name,
psz_node_namespace );
if( !*pp_rootnode ||
tt_nodes_Read( p_reader, *pp_rootnode ) != VLC_SUCCESS )
return VLC_EGENERIC;

40
modules/codec/ttml/ttml.c

@ -65,6 +65,15 @@ vlc_module_begin ()
#endif
vlc_module_end ()
static const char * tt_node_InheritNS( const tt_node_t *p_node )
{
for( ; p_node ; p_node = p_node->p_parent )
{
if( p_node->psz_namespace )
return p_node->psz_namespace;
}
return NULL;
}
int tt_node_NameCompare( const char* psz_tagname, const char* psz_pattern )
{
@ -171,6 +180,7 @@ static void tt_node_FreeDictValue( void* p_value, void* p_obj )
static void tt_node_Delete( tt_node_t *p_node )
{
free( p_node->psz_node_name );
free( p_node->psz_namespace );
vlc_dictionary_clear( &p_node->attr_dict, tt_node_FreeDictValue, NULL );
free( p_node );
}
@ -240,7 +250,9 @@ tt_textnode_t *tt_subtextnode_New( tt_node_t *p_parent, const char *psz_text, si
return tt_textnode_NewImpl( p_parent, strndup( psz_text, len ) );
}
tt_node_t * tt_node_New( tt_node_t* p_parent, const char* psz_node_name )
tt_node_t * tt_node_New( tt_node_t* p_parent,
const char* psz_node_name,
const char *psz_namespace )
{
tt_node_t *p_node = calloc( 1, sizeof( *p_node ) );
if( !p_node )
@ -248,6 +260,13 @@ tt_node_t * tt_node_New( tt_node_t* p_parent, const char* psz_node_name )
p_node->i_type = TT_NODE_TYPE_ELEMENT;
p_node->psz_node_name = strdup( psz_node_name );
const char *psz_parent_ns = tt_node_InheritNS( p_parent );
/* set new namespace if not same as parent */
if( psz_namespace &&
(!psz_parent_ns || strcmp( psz_namespace, psz_parent_ns )) )
p_node->psz_namespace = strdup( psz_namespace );
else
p_node->psz_namespace = NULL;
if( unlikely( p_node->psz_node_name == NULL ) )
{
free( p_node );
@ -264,17 +283,19 @@ tt_node_t * tt_node_New( tt_node_t* p_parent, const char* psz_node_name )
return p_node;
}
tt_node_t * tt_node_NewRead( xml_reader_t* reader, tt_node_t* p_parent, const char* psz_node_name )
tt_node_t * tt_node_NewRead( xml_reader_t* reader, tt_node_t* p_parent,
const char* psz_node_name, const char *psz_namespace )
{
tt_node_t *p_node = tt_node_New( p_parent, psz_node_name );
tt_node_t *p_node = tt_node_New( p_parent, psz_node_name, psz_namespace );
if( !p_node )
return NULL;
const char* psz_value = NULL;
for( const char* psz_key = xml_ReaderNextAttr( reader, &psz_value );
const char* psz_value = NULL, *psz_ns = NULL;
for( const char* psz_key = xml_ReaderNextAttrNS( reader, &psz_value, &psz_ns );
psz_key != NULL;
psz_key = xml_ReaderNextAttr( reader, &psz_value ) )
psz_key = xml_ReaderNextAttrNS( reader, &psz_value, &psz_ns ) )
{
fprintf(stderr,"ATTR %s %s %s\n", psz_key, psz_value, psz_ns);
char *psz_val = strdup( psz_value );
if( psz_val )
{
@ -358,8 +379,8 @@ int tt_nodes_Read( xml_reader_t *p_reader, tt_node_t *p_root_node )
do
{
const char* psz_node_name;
int i_type = xml_ReaderNextNode( p_reader, &psz_node_name );
const char *psz_node_name, *psz_node_namespace;
int i_type = xml_ReaderNextNodeNS( p_reader, &psz_node_name, &psz_node_namespace );
/* !warn read empty state now as attributes reading will **** it up */
bool b_empty = xml_ReaderIsEmptyElement( p_reader );
@ -373,7 +394,8 @@ int tt_nodes_Read( xml_reader_t *p_reader, tt_node_t *p_root_node )
case XML_READER_STARTELEM:
{
tt_node_t *p_newnode = tt_node_NewRead( p_reader, p_node, psz_node_name );
tt_node_t *p_newnode = tt_node_NewRead( p_reader, p_node, psz_node_name,
psz_node_namespace );
if( !p_newnode )
return VLC_EGENERIC;
if( !b_empty )

6
modules/codec/ttml/ttml.h

@ -94,6 +94,7 @@ struct tt_node_t
char *psz_node_name;
tt_timings_t timings;
vlc_dictionary_t attr_dict;
char *psz_namespace;
};
typedef struct
@ -104,8 +105,9 @@ typedef struct
tt_textnode_t *tt_textnode_New( tt_node_t *p_parent, const char *psz_text );
tt_textnode_t *tt_subtextnode_New( tt_node_t *p_parent, const char *psz_text, size_t );
tt_node_t * tt_node_New( tt_node_t* p_parent, const char* psz_node_name );
tt_node_t * tt_node_NewRead( xml_reader_t* reader, tt_node_t* p_parent, const char* psz_node_name );
tt_node_t * tt_node_New( tt_node_t* p_parent, const char* psz_node_name, const char *psz_namespace );
tt_node_t * tt_node_NewRead( xml_reader_t* reader, tt_node_t* p_parent, const char* psz_node_name,
const char *psz_namespace );
void tt_node_RecursiveDelete( tt_node_t *p_node );
int tt_node_NameCompare( const char* psz_tagname, const char* psz_pattern );
bool tt_node_HasChild( const tt_node_t *p_node );

7
modules/demux/ttml.c

@ -157,11 +157,11 @@ static int Control( demux_t* p_demux, int i_query, va_list args )
static int ReadTTML( demux_t* p_demux )
{
demux_sys_t* p_sys = p_demux->p_sys;
const char* psz_node_name;
const char* psz_node_name, *psz_namespace;
do
{
int i_type = xml_ReaderNextNode( p_sys->p_reader, &psz_node_name );
int i_type = xml_ReaderNextNodeNS( p_sys->p_reader, &psz_node_name, &psz_namespace );
bool b_empty = xml_ReaderIsEmptyElement( p_sys->p_reader );
if( i_type <= XML_READER_NONE )
@ -177,7 +177,8 @@ static int ReadTTML( demux_t* p_demux )
p_sys->p_rootnode != NULL )
return VLC_EGENERIC;
p_sys->p_rootnode = tt_node_NewRead( p_sys->p_reader, NULL, psz_node_name );
p_sys->p_rootnode = tt_node_NewRead( p_sys->p_reader, NULL, psz_node_name,
psz_namespace );
if( b_empty )
break;
if( !p_sys->p_rootnode ||

Loading…
Cancel
Save