screenshooter: Record one extra frame when recording stops
If the compositor hasn't been rendering for a while when the recording
stops, the time difference between the last rendered frame and that
moment won't be in the encoded video. Fix that by forcing one extra
frame to be recorded when the user presses the recorder key binding.
https://bugs.freedesktop.org/show_bug.cgi?id=71142
diff --git a/src/screenshooter.c b/src/screenshooter.c
index 0c657bc..2d05ad6 100644
--- a/src/screenshooter.c
+++ b/src/screenshooter.c
@@ -267,7 +267,7 @@
uint32_t total;
int fd;
struct wl_listener frame_listener;
- int count;
+ int count, destroying;
};
static uint32_t *
@@ -356,6 +356,9 @@
}
static void
+weston_recorder_destroy(struct weston_recorder *recorder);
+
+static void
weston_recorder_frame_notify(struct wl_listener *listener, void *data)
{
struct weston_recorder *recorder =
@@ -456,6 +459,9 @@
pixman_region32_fini(&damage);
recorder->count++;
+
+ if (recorder->destroying)
+ weston_recorder_destroy(recorder);
}
static void
@@ -477,6 +483,7 @@
recorder->rect = malloc(size);
recorder->total = 0;
recorder->count = 0;
+ recorder->destroying = 0;
recorder->output = output;
if (do_yflip)
@@ -553,7 +560,8 @@
"stopping recorder, total file size %dM, %d frames\n",
recorder->total / (1024 * 1024), recorder->count);
- weston_recorder_destroy(recorder);
+ recorder->destroying = 1;
+ weston_output_schedule_repaint(recorder->output);
} else {
weston_log("starting recorder, file %s\n", filename);
weston_recorder_create(output, filename);