aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordec05eba <dec05eba@protonmail.com>2024-09-21 16:38:15 +0200
committerdec05eba <dec05eba@protonmail.com>2024-09-21 16:38:15 +0200
commit95e1971f8fc2b9f1814a80ffa19d17fc4eda9e47 (patch)
treeb2a288c1aa46be23aa91f304cc55f8fc5c5909f7
parentfb707aee6f61cef84cc15a3a00f46e7bf52f3ceb (diff)
Fix first frame is black
-rw-r--r--src/capture/kms.c3
-rw-r--r--src/capture/portal.c3
-rw-r--r--src/capture/xcomposite.c3
-rw-r--r--src/main.cpp6
4 files changed, 12 insertions, 3 deletions
diff --git a/src/capture/kms.c b/src/capture/kms.c
index 7a61962..ecc75a5 100644
--- a/src/capture/kms.c
+++ b/src/capture/kms.c
@@ -570,6 +570,9 @@ static int gsr_capture_kms_capture(gsr_capture *cap, AVFrame *frame, gsr_color_c
if(!capture_is_combined_plane)
capture_pos = (vec2i){drm_fd->x, drm_fd->y};
+ self->params.egl->glFlush();
+ self->params.egl->glFinish();
+
/* Fast opengl free path */
if(self->monitor_rotation == GSR_MONITOR_ROT_0 && video_codec_context_is_vaapi(self->video_codec_context) && self->params.egl->gpu_info.vendor == GSR_GPU_VENDOR_AMD) {
int fds[4];
diff --git a/src/capture/portal.c b/src/capture/portal.c
index 58d16d9..db5ba4e 100644
--- a/src/capture/portal.c
+++ b/src/capture/portal.c
@@ -336,6 +336,9 @@ static int gsr_capture_portal_capture(gsr_capture *cap, AVFrame *frame, gsr_colo
const vec2i target_pos = { max_int(0, frame->width / 2 - self->capture_size.x / 2), max_int(0, frame->height / 2 - self->capture_size.y / 2) };
+ self->params.egl->glFlush();
+ self->params.egl->glFinish();
+
// TODO: Handle region crop
/* Fast opengl free path */
diff --git a/src/capture/xcomposite.c b/src/capture/xcomposite.c
index 31d0b7e..9d053bb 100644
--- a/src/capture/xcomposite.c
+++ b/src/capture/xcomposite.c
@@ -258,6 +258,9 @@ static int gsr_capture_xcomposite_capture(gsr_capture *cap, AVFrame *frame, gsr_
const vec2i target_pos = { max_int(0, frame->width / 2 - self->texture_size.x / 2), max_int(0, frame->height / 2 - self->texture_size.y / 2) };
+ self->params.egl->glFlush();
+ self->params.egl->glFinish();
+
/* Fast opengl free path */
if(video_codec_context_is_vaapi(self->video_codec_context) && self->params.egl->gpu_info.vendor == GSR_GPU_VENDOR_AMD) {
vaapi_copy_egl_image_to_video_surface(self->params.egl, self->window_texture.image, (vec2i){0, 0}, self->texture_size, target_pos, self->texture_size, self->video_codec_context, frame);
diff --git a/src/main.cpp b/src/main.cpp
index ef53935..7c66bd1 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -3158,7 +3158,7 @@ int main(int argc, char **argv) {
}
double fps_start_time = clock_get_monotonic_seconds();
- double frame_timer_start = fps_start_time - target_fps; // We want to capture the first frame immediately
+ double frame_timer_start = fps_start_time;
int fps_counter = 0;
int damage_fps_counter = 0;
@@ -3446,11 +3446,11 @@ int main(int argc, char **argv) {
}
double frame_time_overflow = frame_timer_elapsed - target_fps;
- if (frame_time_overflow >= 0.0 && damaged) {
+ if ((frame_time_overflow >= 0.0 || video_pts_counter == 0) && damaged) {
gsr_damage_clear(&damage);
if(capture->clear_damage)
capture->clear_damage(capture);
- frame_time_overflow = std::min(frame_time_overflow, target_fps);
+ frame_time_overflow = std::min(std::max(0.0, frame_time_overflow), target_fps);
frame_timer_start = time_now - frame_time_overflow;
const double this_video_frame_time = clock_get_monotonic_seconds() - paused_time_offset;