[vlc-devel] [PATCH 1/5] sout: remove unnecessary array

RĂ©mi Denis-Courmont remi at remlab.net
Sun Oct 11 15:22:55 CEST 2020


---
 src/stream_output/stream_output.c | 39 +++++++++++++++++--------------
 1 file changed, 22 insertions(+), 17 deletions(-)

diff --git a/src/stream_output/stream_output.c b/src/stream_output/stream_output.c
index 70b286910d..76c479efa7 100644
--- a/src/stream_output/stream_output.c
+++ b/src/stream_output/stream_output.c
@@ -821,12 +821,13 @@ static sout_stream_t *sout_StreamNew( vlc_object_t *parent, char *psz_name,
  *  Returns a pointer to the first module.
  */
 sout_stream_t *sout_StreamChainNew(vlc_object_t *parent, const char *psz_chain,
-                                sout_stream_t *p_next, sout_stream_t **pp_last)
+                                   sout_stream_t *sink,
+                                   sout_stream_t **restrict pp_last)
 {
     if(!psz_chain || !*psz_chain)
     {
         if(pp_last) *pp_last = NULL;
-        return p_next;
+        return sink;
     }
 
     char *psz_parser = strdup(psz_chain);
@@ -850,38 +851,42 @@ sout_stream_t *sout_StreamChainNew(vlc_object_t *parent, const char *psz_chain,
         vlc_array_append_or_abort(&name, psz_name);
     }
 
+    /* Instantiate modules from back to front of chain */
+    sout_stream_t *front = sink;
     size_t i = vlc_array_count(&name);
-    vlc_array_t module;
-    vlc_array_init(&module);
+
     while(i--)
     {
-        p_next = sout_StreamNew( parent, vlc_array_item_at_index(&name, i),
-            vlc_array_item_at_index(&cfg, i), p_next);
+        sout_stream_t *prev;
 
-        if(!p_next)
+        prev = sout_StreamNew(parent, vlc_array_item_at_index(&name, i),
+                              vlc_array_item_at_index(&cfg, i), front);
+        if (prev == NULL)
             goto error;
 
-        if(i == vlc_array_count(&name) - 1 && pp_last)
-            *pp_last = p_next;   /* last module created in the chain */
+        if (front == sink && pp_last != NULL)
+            *pp_last = prev; /* last module created in the chain */
 
-        vlc_array_append_or_abort(&module, p_next);
+        front = prev;
     }
 
     vlc_array_clear(&name);
     vlc_array_clear(&cfg);
-    vlc_array_clear(&module);
 
-    return p_next;
+    return front;
 
 error:
 
     i++;    /* last module couldn't be created */
 
-    /* destroy all modules created, starting with the last one */
-    int modules = vlc_array_count(&module);
-    while(modules--)
-        sout_StreamDelete(vlc_array_item_at_index(&module, modules));
-    vlc_array_clear(&module);
+    /* Destroy module instances in LIFO order */
+    while (front != sink)
+    {
+        sout_stream_t *next = front->p_next;
+
+        sout_StreamDelete(front);
+        front = next;
+    }
 
     /* then destroy all names and config which weren't destroyed by
      * sout_StreamDelete */
-- 
2.28.0



More information about the vlc-devel mailing list