Re: [FFmpeg-devel] [PATCH] fftools/ffplay: use SDL_WaitEvent instead of SDL_PeepEvents while paused
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 --- 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 * 100.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 * 100.0)); -remaining_time = REFRESH_RATE; -if (is->show_mode != SHOW_MODE_NONE && (!is->paused || is->force_refresh)) -video_refresh(is, _time); +if (is->paused) { +refresh(is, _time); +SDL_WaitEvent(event); +} else { SDL_PumpEvents(); +while (!SDL_PeepEvents(event, 1, SDL_GETEVENT, SDL_FIRSTEVENT, SDL_LASTEVENT)) { +refresh(is, _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".
[FFmpeg-devel] [PATCH] fftools/ffplay: use SDL_WaitEvent instead of SDL_PeepEvents while paused
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. Signed-off-by: bolshoytoster --- 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 * 100.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 * 100.0)); -remaining_time = REFRESH_RATE; -if (is->show_mode != SHOW_MODE_NONE && (!is->paused || is->force_refresh)) -video_refresh(is, _time); +if (is->paused) { +refresh(is, _time); +SDL_WaitEvent(event); +} else { SDL_PumpEvents(); +while (!SDL_PeepEvents(event, 1, SDL_GETEVENT, SDL_FIRSTEVENT, SDL_LASTEVENT)) { +refresh(is, _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".
Re: [FFmpeg-devel] [PATCH] fftools/ffplay: use SDL_WaitEvent instead of SDL_PeepEvents while paused
On Tue, Nov 07, 2023 at 08:57:57PM +, 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 behavior 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. > > Signed-off-by: bolshoytoster > --- > 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); patch corupted by line breaks Applying: fftools/ffplay: use SDL_WaitEvent instead of SDL_PeepEvents while paused error: corrupt patch at line 50 [...] -- Michael GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB "I am not trying to be anyone's saviour, I'm trying to think about the future and not be sad" - Elon Musk signature.asc Description: PGP signature ___ 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] [PATCH] fftools/ffplay: use SDL_WaitEvent instead of SDL_PeepEvents while paused
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 behavior 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. Signed-off-by: bolshoytoster --- 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 * 100.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 * 100.0)); -remaining_time = REFRESH_RATE; -if (is->show_mode != SHOW_MODE_NONE && (!is->paused || is->force_refresh)) -video_refresh(is, _time); +if (is->paused) { +refresh(is, _time); +SDL_WaitEvent(event); +} else { SDL_PumpEvents(); +while (!SDL_PeepEvents(event, 1, SDL_GETEVENT, SDL_FIRSTEVENT, SDL_LASTEVENT)) { +refresh(is, _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".