On Fri, 10 Nov 2023, Bolshoy Toster wrote:

Currently, when ffplay is paused, it still constantly polls for events at the
REFRESH_RATE (100 times per second). This leads to a high (5-10% on the latest
commit, using SDL2 2.28.5-1) CPU usage, when it should be idle.

This commit changes this behaviour to use SDL_WaitEvent while paused, allowing ffplay to use less (0-5% under X11) CPU time while paused on supported platforms
(windows, X11 and wayland) with SDL versions >=2.0.16.

This has the side effect of only running the refresh loop when there's an event,
preventing the cursor from being hidden while paused.

Was this always this way? Or upstream SDL changed something making the Pump/GetEvent more resource intensive? Polling like 100 times per second should not cause 10% cpu usage...

ALso, can this patch be made less intrusive? E.g. changing current code around av_usleep(remainig time) to:

if (*remainig_time > 0.0) {
  if (is->paused)
      SDL_WaitEventTimeout(NULL, 100);
  else
      av_usleep()
}

Regards,
Marton


Signed-off-by: bolshoytoster <toaster...@gmail.com>
---
 fftools/ffplay.c | 31 ++++++++++++++++++++-----------
 1 file changed, 20 insertions(+), 11 deletions(-)

diff --git a/fftools/ffplay.c b/fftools/ffplay.c
index d8c69e1..7814589 100644
--- a/fftools/ffplay.c
+++ b/fftools/ffplay.c
@@  -3221,20 +3221,29 @@ static void toggle_audio_display(VideoState *is)
     }
 }
 +static void refresh(VideoState *is, double *remaining_time) {
+ if (!cursor_hidden && av_gettime_relative() - cursor_last_shown > CURSOR_HIDE_DELAY) {
+        SDL_ShowCursor(0);
+        cursor_hidden = 1;
+    }
+    if (*remaining_time > 0.0)
+        av_usleep((int64_t)(*remaining_time * 1000000.0));
+    *remaining_time = REFRESH_RATE;
+ if (is->show_mode != SHOW_MODE_NONE && (!is->paused || is->force_refresh))
+        video_refresh(is, remaining_time);
+}
+
 static void refresh_loop_wait_event(VideoState *is, SDL_Event *event) {
    double remaining_time = 0.0;
-    SDL_PumpEvents();
- while (!SDL_PeepEvents(event, 1, SDL_GETEVENT, SDL_FIRSTEVENT, SDL_LASTEVENT)) {
-        if (!cursor_hidden && av_gettime_relative() - cursor_last_shown
 CURSOR_HIDE_DELAY) {
-            SDL_ShowCursor(0);
-            cursor_hidden = 1;
-        }
-        if (remaining_time > 0.0)
-            av_usleep((int64_t)(remaining_time * 1000000.0));
-        remaining_time = REFRESH_RATE;
- if (is->show_mode != SHOW_MODE_NONE && (!is->paused || is->force_refresh))
-            video_refresh(is, &remaining_time);
+    if (is->paused) {
+        refresh(is, &remaining_time);
+        SDL_WaitEvent(event);
+    } else {
        SDL_PumpEvents();
+ while (!SDL_PeepEvents(event, 1, SDL_GETEVENT, SDL_FIRSTEVENT, SDL_LASTEVENT)) {
+            refresh(is, &remaining_time);
+            SDL_PumpEvents();
+        }
     }
 }
 -- 2.42.1

_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".

_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".

Reply via email to