Commit 6d5667ead8 for ffmpeg
commit 6d5667ead85f7e8d9bd748f5e769bd64478a6284
Author: Michael Niedermayer <michael@niedermayer.cc>
Date: Tue Oct 13 06:02:51 2026 +0200
ffplay: wake up for input events instead of sleeping until the next refresh
The event loop slept up to REFRESH_RATE between refreshes while input
waited in the queue; waiting for an event with the same timeout handles
input as soon as it arrives.
Assisted-by: Claude
diff --git a/fftools/ffplay.c b/fftools/ffplay.c
index 9a4fb98a94..867fb532f7 100644
--- a/fftools/ffplay.c
+++ b/fftools/ffplay.c
@@ -452,6 +452,7 @@ static int exit_status = 0;
static SDL_Window *window;
static SDL_Renderer *renderer;
+static int wait_for_events;
static SDL_RendererInfo renderer_info = {0};
static SDL_AudioDeviceID audio_dev;
@@ -4407,8 +4408,12 @@ static void refresh_loop_wait_event(VideoState *is, SDL_Event *event) {
SDL_ShowCursor(0);
cursor_hidden = 1;
}
- if (remaining_time > 0.0)
- av_usleep((int64_t)(remaining_time * 1000000.0));
+ if (remaining_time > 0.0) {
+ if (!wait_for_events)
+ av_usleep((int64_t)(remaining_time * 1000000.0));
+ else if (SDL_WaitEventTimeout(NULL, ceil(remaining_time * 1000)))
+ continue;
+ }
remaining_time = REFRESH_RATE;
if (is->chapter_render_pending || (chapter_list_visible(is) && current_chapter(is) != is->chapter_playing))
chapter_list_render(is);
@@ -4979,6 +4984,10 @@ int main(int argc, char **argv)
av_log(NULL, AV_LOG_FATAL, "Failed to create window: %s", SDL_GetError());
do_exit(NULL);
}
+ SDL_version version;
+ SDL_GetVersion(&version);
+ /* SDL before 2.0.16 waits for events by polling */
+ wait_for_events = SDL_VERSIONNUM(version.major, version.minor, version.patch) >= SDL_VERSIONNUM(2, 0, 16);
if (vk_renderer) {
AVDictionary *dict = NULL;