[vlc-commits] vout: spu: remove intermediate array

Thomas Guillem git at videolan.org
Tue Jun 11 07:58:59 CEST 2019


vlc | branch: master | Thomas Guillem <thomas at gllm.fr> | Thu Jun  6 14:50:51 2019 +0200| [003557bed76ec763c6a68503ee2b338ffa6b2ea3] | committer: Thomas Guillem

vout: spu: remove intermediate array

This will allow to remove one extra allocation.

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

 src/video_output/vout_subpictures.c | 52 ++++++++++++++++++++++++-------------
 1 file changed, 34 insertions(+), 18 deletions(-)

diff --git a/src/video_output/vout_subpictures.c b/src/video_output/vout_subpictures.c
index f6d2e4a586..0bef5fd48b 100644
--- a/src/video_output/vout_subpictures.c
+++ b/src/video_output/vout_subpictures.c
@@ -615,6 +615,28 @@ static size_t spu_channel_ConvertDates(struct spu_channel *channel,
     return entry_count;
 }
 
+static bool
+spu_render_entry_IsSelected(spu_render_entry_t *render_entry, size_t channel_id,
+                            vlc_tick_t system_now,
+                            vlc_tick_t render_subtitle_date, bool ignore_osd)
+{
+    subpicture_t *subpic = render_entry->subpic;
+
+    if (!subpic)
+        return false;
+
+    if ((subpic->i_channel >= 0 && (size_t) subpic->i_channel != channel_id) ||
+       (ignore_osd && !subpic->b_subtitle))
+        return false;
+
+    const vlc_tick_t render_date =
+        subpic->b_subtitle ? render_subtitle_date : system_now;
+
+    if (render_date && render_date < render_entry->start)
+        return false; /* Too early, come back next monday */
+    return true;
+}
+
 /*****************************************************************************
  * spu_SelectSubpictures: find the subpictures to display
  *****************************************************************************
@@ -647,8 +669,6 @@ spu_SelectSubpictures(spu_t *spu, vlc_tick_t system_now,
     {
         struct spu_channel *channel = &sys->channels.data[i];
         spu_render_entry_t *render_entries = channel->entries;
-        spu_render_entry_t available_entries[VOUT_MAX_SUBPICTURES];
-        size_t       available_count = 0;
 
         vlc_tick_t   start_date = render_subtitle_date;
         vlc_tick_t   ephemer_subtitle_date = 0;
@@ -662,23 +682,16 @@ spu_SelectSubpictures(spu_t *spu, vlc_tick_t system_now,
         /* Select available pictures */
         for (size_t index = 0; index < VOUT_MAX_SUBPICTURES; index++) {
             spu_render_entry_t *render_entry = &render_entries[index];
-            subpicture_t *current = channel->entries[index].subpic;
+            subpicture_t *current = render_entry->subpic;
             bool is_stop_valid;
             bool is_late;
 
-            if (!current)
-                continue;
-
-            if ((current->i_channel >= 0 && (size_t) current->i_channel != channel->id) ||
-               (ignore_osd && !current->b_subtitle))
+            if (!spu_render_entry_IsSelected(render_entry, channel->id,
+                                             system_now, render_subtitle_date,
+                                             ignore_osd))
                 continue;
 
             const vlc_tick_t render_date = current->b_subtitle ? render_subtitle_date : system_now;
-            if (render_date &&
-                render_date < render_entry->start) {
-                /* Too early, come back next monday */
-                continue;
-            }
 
             vlc_tick_t *ephemer_date_ptr  = current->b_subtitle ? &ephemer_subtitle_date  : &ephemer_osd_date;
             int64_t *ephemer_order_ptr = current->b_subtitle ? &ephemer_subtitle_order : &ephemer_system_order;
@@ -699,9 +712,7 @@ spu_SelectSubpictures(spu_t *spu, vlc_tick_t system_now,
                 start_date = render_entry->start;
 
             /* */
-            available_entries[available_count] = *render_entry;
-            available_entries[available_count].is_late = is_late;
-            available_count++;
+            render_entry->is_late = is_late;
         }
 
         /* Only forced old picture display at the transition */
@@ -711,11 +722,16 @@ spu_SelectSubpictures(spu_t *spu, vlc_tick_t system_now,
             start_date = INT64_MAX;
 
         /* Select pictures to be displayed */
-        for (size_t index = 0; index < available_count; index++) {
-            spu_render_entry_t *render_entry = &available_entries[index];
+        for (size_t index = 0; index < VOUT_MAX_SUBPICTURES; index++) {
+            spu_render_entry_t *render_entry = &render_entries[index];
             subpicture_t *current = render_entry->subpic;
             bool is_late = render_entry->is_late;
 
+            if (!spu_render_entry_IsSelected(render_entry, channel->id,
+                                             system_now, render_subtitle_date,
+                                             ignore_osd))
+                continue;
+
             const vlc_tick_t stop_date = current->b_subtitle ? __MAX(start_date, sys->last_sort_date) : system_now;
             const vlc_tick_t ephemer_date  = current->b_subtitle ? ephemer_subtitle_date  : ephemer_osd_date;
             const int64_t ephemer_order = current->b_subtitle ? ephemer_subtitle_order : ephemer_system_order;



More information about the vlc-commits mailing list