vlc | branch: master | Francois Cartegnie <[email protected]> | Tue May 23 11:07:16 2017 +0200| [8654ef67a995b21c689b603b0996ad08c4e718e5] | committer: Francois Cartegnie
codec: ttml: compute sizes from cells (fix #18347) > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=8654ef67a995b21c689b603b0996ad08c4e718e5 --- modules/codec/ttml/substtml.c | 38 +++++++++++++++++++++++++++++++------- 1 file changed, 31 insertions(+), 7 deletions(-) diff --git a/modules/codec/ttml/substtml.c b/modules/codec/ttml/substtml.c index e7be874639..ed7a79e36b 100644 --- a/modules/codec/ttml/substtml.c +++ b/modules/codec/ttml/substtml.c @@ -46,6 +46,7 @@ typedef struct { text_style_t* font_style; + unsigned i_cell_height; int i_text_align; int i_direction; bool b_direction_set; @@ -104,6 +105,7 @@ static ttml_style_t * ttml_style_New( ) if( unlikely( !p_ttml_style ) ) return NULL; + p_ttml_style->i_cell_height = 15; p_ttml_style->font_style = text_style_Create( STYLE_NO_DEFAULTS ); if( unlikely( !p_ttml_style->font_style ) ) { @@ -199,7 +201,7 @@ static tt_node_t * FindNode( tt_node_t *p_node, const char *psz_nodename, } static void FillTextStyle( const char *psz_attr, const char *psz_val, - text_style_t *p_text_style ) + const ttml_style_t *p_ttml_style, text_style_t *p_text_style ) { if( !strcasecmp ( "tts:fontFamily", psz_attr ) ) { @@ -216,10 +218,15 @@ static void FillTextStyle( const char *psz_attr, const char *psz_val, { char* psz_end = NULL; float size = us_strtof( psz_val, &psz_end ); - if( *psz_end == '%' ) - p_text_style->f_font_relsize = STYLE_DEFAULT_REL_FONT_SIZE * size / 100.0; - else - p_text_style->i_font_size = (int)( size + 0.5 ); + if( size > 0.0 ) + { + if( *psz_end == 'c' ) + p_text_style->f_font_relsize = 100.0 * size / p_ttml_style->i_cell_height; + else if( *psz_end == '%' ) + p_text_style->f_font_relsize = size / p_ttml_style->i_cell_height; + else + p_text_style->i_font_size = (int)( size + 0.5 ); + } } else if( !strcasecmp( "tts:color", psz_attr ) ) { @@ -334,6 +341,19 @@ static void FillRegionStyle( const char *psz_attr, const char *psz_val, } } +static void FillTTMLStylePrio( const vlc_dictionary_t *p_dict, + ttml_style_t *p_ttml_style ) +{ + void *value = vlc_dictionary_value_for_key( p_dict, "ttp:cellResolution" ); + if( value != kVLCDictionaryNotFound ) + { + const char *psz_val = value; + unsigned w, h; + if( sscanf( psz_val, "%u %u", &w, &h) == 2 && w && h ) + p_ttml_style->i_cell_height = h; + } +} + static void FillTTMLStyle( const char *psz_attr, const char *psz_val, ttml_style_t *p_ttml_style ) { @@ -396,7 +416,7 @@ static void FillTTMLStyle( const char *psz_attr, const char *psz_val, { p_ttml_style->b_preserve_space = !strcmp( "preserve", psz_val ); } - else FillTextStyle( psz_attr, psz_val, p_ttml_style->font_style ); + else FillTextStyle( psz_attr, psz_val, p_ttml_style, p_ttml_style->font_style ); } static void DictionaryMerge( const vlc_dictionary_t *p_src, vlc_dictionary_t *p_dst ) @@ -406,7 +426,9 @@ static void DictionaryMerge( const vlc_dictionary_t *p_src, vlc_dictionary_t *p_ for ( const vlc_dictionary_entry_t* p_entry = p_src->p_entries[i]; p_entry != NULL; p_entry = p_entry->p_next ) { - if( !strncmp( "tts:", p_entry->psz_key, 4 ) && + if( ( !strncmp( "tts:", p_entry->psz_key, 4 ) || + !strncmp( "ttp:", p_entry->psz_key, 4 ) || + !strcmp( "xml:space", p_entry->psz_key ) ) && !vlc_dictionary_has_key( p_dst, p_entry->psz_key ) ) vlc_dictionary_insert( p_dst, p_entry->psz_key, p_entry->p_value ); } @@ -459,6 +481,8 @@ static void DictMergeWithRegionID( ttml_context_t *p_ctx, const char *psz_id, static void DictToTTMLStyle( const vlc_dictionary_t *p_dict, ttml_style_t *p_ttml_style ) { + /* Units, defaults, that must be set first to compute styles */ + FillTTMLStylePrio( p_dict, p_ttml_style ); for( int i = 0; i < p_dict->i_size; ++i ) { for ( vlc_dictionary_entry_t* p_entry = p_dict->p_entries[i]; _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
