kms: allow capture higher than monitor framerate on wayland

This commit is contained in:
dec05eba
2024-09-16 23:30:13 +02:00
parent 69088303c0
commit 09fa00d4a7

View File

@@ -55,9 +55,9 @@ typedef struct {
AVCodecContext *video_codec_context; AVCodecContext *video_codec_context;
bool performance_error_shown; bool performance_error_shown;
int drm_fd; //int drm_fd;
uint64_t prev_sequence; //uint64_t prev_sequence;
bool damaged; //bool damaged;
vec2i prev_target_pos; vec2i prev_target_pos;
vec2i prev_plane_size; vec2i prev_plane_size;
@@ -93,10 +93,10 @@ static void gsr_capture_kms_stop(gsr_capture_kms *self) {
self->cursor_texture_id = 0; self->cursor_texture_id = 0;
} }
if(self->drm_fd > 0) { // if(self->drm_fd > 0) {
close(self->drm_fd); // close(self->drm_fd);
self->drm_fd = -1; // self->drm_fd = -1;
} // }
gsr_capture_kms_cleanup_kms_fds(self); gsr_capture_kms_cleanup_kms_fds(self);
gsr_kms_client_deinit(&self->kms_client); gsr_kms_client_deinit(&self->kms_client);
@@ -232,25 +232,26 @@ static void gsr_capture_kms_on_event(gsr_capture *cap, gsr_egl *egl) {
gsr_cursor_on_event(&self->x11_cursor, xev); gsr_cursor_on_event(&self->x11_cursor, xev);
} }
static void gsr_capture_kms_tick(gsr_capture *cap) { // TODO: This is disabled for now because we want to be able to record at a framerate highe than the monitor framerate
gsr_capture_kms *self = cap->priv; // static void gsr_capture_kms_tick(gsr_capture *cap) {
// gsr_capture_kms *self = cap->priv;
if(self->drm_fd <= 0) // if(self->drm_fd <= 0)
self->drm_fd = open(self->params.egl->card_path, O_RDONLY); // self->drm_fd = open(self->params.egl->card_path, O_RDONLY);
if(self->drm_fd <= 0) // if(self->drm_fd <= 0)
return; // return;
uint64_t sequence = 0; // uint64_t sequence = 0;
uint64_t ns = 0; // uint64_t ns = 0;
if(drmCrtcGetSequence(self->drm_fd, 79, &sequence, &ns) != 0) // if(drmCrtcGetSequence(self->drm_fd, 79, &sequence, &ns) != 0)
return; // return;
if(sequence != self->prev_sequence) { // if(sequence != self->prev_sequence) {
self->prev_sequence = sequence; // self->prev_sequence = sequence;
self->damaged = true; // self->damaged = true;
} // }
} // }
static float monitor_rotation_to_radians(gsr_monitor_rotation rot) { static float monitor_rotation_to_radians(gsr_monitor_rotation rot) {
switch(rot) { switch(rot) {
@@ -673,15 +674,15 @@ static bool gsr_capture_kms_set_hdr_metadata(gsr_capture *cap, AVMasteringDispla
return true; return true;
} }
static bool gsr_capture_kms_is_damaged(gsr_capture *cap) { // static bool gsr_capture_kms_is_damaged(gsr_capture *cap) {
gsr_capture_kms *self = cap->priv; // gsr_capture_kms *self = cap->priv;
return self->damaged; // return self->damaged;
} // }
static void gsr_capture_kms_clear_damage(gsr_capture *cap) { // static void gsr_capture_kms_clear_damage(gsr_capture *cap) {
gsr_capture_kms *self = cap->priv; // gsr_capture_kms *self = cap->priv;
self->damaged = false; // self->damaged = false;
} // }
static void gsr_capture_kms_destroy(gsr_capture *cap, AVCodecContext *video_codec_context) { static void gsr_capture_kms_destroy(gsr_capture *cap, AVCodecContext *video_codec_context) {
(void)video_codec_context; (void)video_codec_context;
@@ -725,14 +726,14 @@ gsr_capture* gsr_capture_kms_create(const gsr_capture_kms_params *params) {
*cap = (gsr_capture) { *cap = (gsr_capture) {
.start = gsr_capture_kms_start, .start = gsr_capture_kms_start,
.on_event = gsr_capture_kms_on_event, .on_event = gsr_capture_kms_on_event,
.tick = gsr_capture_kms_tick, //.tick = gsr_capture_kms_tick,
.should_stop = gsr_capture_kms_should_stop, .should_stop = gsr_capture_kms_should_stop,
.capture = gsr_capture_kms_capture, .capture = gsr_capture_kms_capture,
.get_source_color = gsr_capture_kms_get_source_color, .get_source_color = gsr_capture_kms_get_source_color,
.uses_external_image = gsr_capture_kms_uses_external_image, .uses_external_image = gsr_capture_kms_uses_external_image,
.set_hdr_metadata = gsr_capture_kms_set_hdr_metadata, .set_hdr_metadata = gsr_capture_kms_set_hdr_metadata,
.is_damaged = gsr_capture_kms_is_damaged, //.is_damaged = gsr_capture_kms_is_damaged,
.clear_damage = gsr_capture_kms_clear_damage, //.clear_damage = gsr_capture_kms_clear_damage,
.destroy = gsr_capture_kms_destroy, .destroy = gsr_capture_kms_destroy,
.priv = cap_kms .priv = cap_kms
}; };