vlc | branch: master | Francois Cartegnie <fcvlc...@free.fr> | Thu Feb 15 14:43:57 2018 +0100| [65b4b3a76cdc3a7b7138addc32deac3fc32051c8] | committer: Francois Cartegnie
codec: webvtt: fill ruby info > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=65b4b3a76cdc3a7b7138addc32deac3fc32051c8 --- modules/codec/webvtt/subsvtt.c | 39 +++++++++++++++++++++++++++++++++++++-- 1 file changed, 37 insertions(+), 2 deletions(-) diff --git a/modules/codec/webvtt/subsvtt.c b/modules/codec/webvtt/subsvtt.c index c2dc42cbc0..667482c133 100644 --- a/modules/codec/webvtt/subsvtt.c +++ b/modules/codec/webvtt/subsvtt.c @@ -1481,6 +1481,38 @@ struct render_variables_s float i_top; }; +static text_segment_t *ConvertRubyNodeToSegment( const webvtt_dom_node_t *p_node ) +{ + text_segment_ruby_t *p_ruby = NULL; + text_segment_ruby_t **pp_rt_append = &p_ruby; + + const char *psz_base = NULL; + + for( ; p_node ; p_node = p_node->p_next ) + { + if( p_node->type == NODE_TEXT ) + { + const webvtt_dom_text_t *p_textnode = (const webvtt_dom_text_t *) p_node; + psz_base = p_textnode->psz_text; + } + else if( p_node->type == NODE_TAG ) + { + const webvtt_dom_tag_t *p_tag = (const webvtt_dom_tag_t *)p_node; + if( !strcmp(p_tag->psz_tag, "rt") && p_tag->p_child && + p_tag->p_child->type == NODE_TEXT ) + { + const webvtt_dom_text_t *p_rttext = (const webvtt_dom_text_t *)p_tag->p_child; + *pp_rt_append = text_segment_ruby_New( psz_base, p_rttext->psz_text ); + if( *pp_rt_append ) + pp_rt_append = &(*pp_rt_append)->p_next; + } + psz_base = NULL; + } + } + + return ( p_ruby ) ? text_segment_FromRuby( p_ruby ) : NULL; +} + static text_segment_t *ConvertNodesToSegments( decoder_t *p_dec, struct render_variables_s *p_vars, const webvtt_dom_cue_t *p_cue, @@ -1510,8 +1542,11 @@ static text_segment_t *ConvertNodesToSegments( decoder_t *p_dec, else if( p_node->type == NODE_TAG ) { const webvtt_dom_tag_t *p_tag = (const webvtt_dom_tag_t *)p_node; - *pp_append = ConvertNodesToSegments( p_dec, p_vars, p_cue, - p_tag->p_child ); + if( strcmp(p_tag->psz_tag, "ruby") ) + *pp_append = ConvertNodesToSegments( p_dec, p_vars, p_cue, + p_tag->p_child ); + else + *pp_append = ConvertRubyNodeToSegment( p_tag->p_child ); } } return p_head; _______________________________________________ vlc-commits mailing list vlc-commits@videolan.org https://mailman.videolan.org/listinfo/vlc-commits