[vlc-commits] codec: ttml: allow merge with replace

Francois Cartegnie git at videolan.org
Wed Mar 7 14:28:06 CET 2018


vlc | branch: master | Francois Cartegnie <fcvlcdev at free.fr> | Wed Mar  7 14:19:47 2018 +0100| [4269635e2eab120d0ab6fd37b4ccfc52b701905e] | committer: Francois Cartegnie

codec: ttml: allow merge with replace

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

 modules/codec/ttml/substtml.c | 31 +++++++++++++++++++++----------
 1 file changed, 21 insertions(+), 10 deletions(-)

diff --git a/modules/codec/ttml/substtml.c b/modules/codec/ttml/substtml.c
index ffdbdbffc6..9361098b01 100644
--- a/modules/codec/ttml/substtml.c
+++ b/modules/codec/ttml/substtml.c
@@ -556,18 +556,29 @@ static void FillTTMLStyle( const char *psz_attr, const char *psz_val,
     else FillTextStyle( psz_attr, psz_val, p_ttml_style->font_style );
 }
 
-static void DictionaryMerge( const vlc_dictionary_t *p_src, vlc_dictionary_t *p_dst )
+static void DictionaryMerge( const vlc_dictionary_t *p_src, vlc_dictionary_t *p_dst,
+                             bool b_override )
 {
     for( int i = 0; i < p_src->i_size; ++i )
     {
         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 ) ||
-                  !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 );
+            if( !strncmp( "tts:", p_entry->psz_key, 4 ) ||
+                !strncmp( "ttp:", p_entry->psz_key, 4 ) ||
+                !strcmp( "xml:space", p_entry->psz_key ) )
+            {
+                if( vlc_dictionary_has_key( p_dst, p_entry->psz_key ) )
+                {
+                    if( b_override )
+                    {
+                        vlc_dictionary_remove_value_for_key( p_dst, p_entry->psz_key, NULL, NULL );
+                        vlc_dictionary_insert( p_dst, p_entry->psz_key, p_entry->p_value );
+                    }
+                }
+                else
+                    vlc_dictionary_insert( p_dst, p_entry->psz_key, p_entry->p_value );
+            }
         }
     }
 }
@@ -582,7 +593,7 @@ static void DictMergeWithStyleID( ttml_context_t *p_ctx, const char *psz_id,
         const tt_node_t *p_node = FindNode( p_ctx->p_rootnode,
                                             "style", -1, psz_id );
         if( p_node )
-            DictionaryMerge( &p_node->attr_dict, p_dst );
+            DictionaryMerge( &p_node->attr_dict, p_dst, false );
     }
 }
 
@@ -597,7 +608,7 @@ static void DictMergeWithRegionID( ttml_context_t *p_ctx, const char *psz_id,
         if( !p_regionnode )
             return;
 
-        DictionaryMerge( &p_regionnode->attr_dict, p_dst );
+        DictionaryMerge( &p_regionnode->attr_dict, p_dst, false );
 
         const char *psz_styleid = (const char *)
                 vlc_dictionary_value_for_key( &p_regionnode->attr_dict, "style" );
@@ -613,7 +624,7 @@ static void DictMergeWithRegionID( ttml_context_t *p_ctx, const char *psz_id,
             const tt_node_t *p_node = (const tt_node_t *) p_child;
             if( !tt_node_NameCompare( p_node->psz_node_name, "style" ) )
             {
-                DictionaryMerge( &p_node->attr_dict, p_dst );
+                DictionaryMerge( &p_node->attr_dict, p_dst, false );
             }
         }
     }
@@ -643,7 +654,7 @@ static ttml_style_t * InheritTTMLStyles( ttml_context_t *p_ctx, tt_node_t *p_nod
     /* Merge dics backwards without overwriting */
     for( ; p_node; p_node = p_node->p_parent )
     {
-        DictionaryMerge( &p_node->attr_dict, &merged );
+        DictionaryMerge( &p_node->attr_dict, &merged, false );
 
         const char *psz_styleid = (const char *)
                 vlc_dictionary_value_for_key( &p_node->attr_dict, "style" );



More information about the vlc-commits mailing list