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".