Re: [FFmpeg-devel] [PATCH] fftools/ffplay: use SDL_WaitEvent instead of SDL_PeepEvents while paused

2023-11-10 Thread Marton Balint




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

2023-11-10 Thread Bolshoy Toster
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

2023-11-08 Thread Michael Niedermayer
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

2023-11-07 Thread Bolshoy Toster
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".