aboutsummaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authordec05eba <dec05eba@protonmail.com>2024-09-14 01:15:01 +0200
committerdec05eba <dec05eba@protonmail.com>2024-09-14 01:15:01 +0200
commit8acb34638212ab8dba0d48a57dd40721203a7a44 (patch)
tree7f1942c56fa2700f2f5fe2d623e9e1c94fb23324 /include
parent992792fb1f35546b9d66c3f69aa3d0f5adb94ef6 (diff)
Set update fps to video fps, on x11 sync video to damage tracking
Diffstat (limited to 'include')
-rw-r--r--include/capture/capture.h8
-rw-r--r--include/capture/xcomposite.h1
-rw-r--r--include/damage.h23
-rw-r--r--include/egl.h8
-rw-r--r--include/utils.h2
5 files changed, 33 insertions, 9 deletions
diff --git a/include/capture/capture.h b/include/capture/capture.h
index 278c431..7a42909 100644
--- a/include/capture/capture.h
+++ b/include/capture/capture.h
@@ -4,6 +4,7 @@
#include "../color_conversion.h"
#include <stdbool.h>
#include <stddef.h>
+#include <stdint.h>
typedef struct AVCodecContext AVCodecContext;
typedef struct AVStream AVStream;
@@ -15,15 +16,15 @@ typedef struct AVContentLightMetadata AVContentLightMetadata;
struct gsr_capture {
/* These methods should not be called manually. Call gsr_capture_* instead */
int (*start)(gsr_capture *cap, AVCodecContext *video_codec_context, AVFrame *frame);
- void (*tick)(gsr_capture *cap, AVCodecContext *video_codec_context); /* can be NULL */
- bool (*is_damaged)(gsr_capture *cap); /* can be NULL */
- void (*clear_damage)(gsr_capture *cap); /* can be NULL */
+ void (*on_event)(gsr_capture *cap, gsr_egl *egl); /* can be NULL */
+ void (*tick)(gsr_capture *cap, AVCodecContext *video_codec_context); /* can be NULL. If there is an event then |on_event| is called before this */
bool (*should_stop)(gsr_capture *cap, bool *err); /* can be NULL. If NULL, return false */
int (*capture)(gsr_capture *cap, AVFrame *frame, gsr_color_conversion *color_conversion);
void (*capture_end)(gsr_capture *cap, AVFrame *frame); /* can be NULL */
gsr_source_color (*get_source_color)(gsr_capture *cap);
bool (*uses_external_image)(gsr_capture *cap); /* can be NULL. If NULL, return false */
bool (*set_hdr_metadata)(gsr_capture *cap, AVMasteringDisplayMetadata *mastering_display_metadata, AVContentLightMetadata *light_metadata); /* can be NULL. If NULL, return false */
+ uint64_t (*get_window_id)(gsr_capture *cap); /* can be NULL. Returns 0 if unknown */
void (*destroy)(gsr_capture *cap, AVCodecContext *video_codec_context);
void *priv; /* can be NULL */
@@ -31,6 +32,7 @@ struct gsr_capture {
};
int gsr_capture_start(gsr_capture *cap, AVCodecContext *video_codec_context, AVFrame *frame);
+void gsr_capture_on_event(gsr_capture *cap, gsr_egl *egl);
void gsr_capture_tick(gsr_capture *cap, AVCodecContext *video_codec_context);
bool gsr_capture_should_stop(gsr_capture *cap, bool *err);
int gsr_capture_capture(gsr_capture *cap, AVFrame *frame, gsr_color_conversion *color_conversion);
diff --git a/include/capture/xcomposite.h b/include/capture/xcomposite.h
index 98b8766..8c87404 100644
--- a/include/capture/xcomposite.h
+++ b/include/capture/xcomposite.h
@@ -11,7 +11,6 @@ typedef struct {
vec2i region_size; /* This is currently only used with |follow_focused| */
gsr_color_range color_range;
bool record_cursor;
- bool track_damage;
gsr_color_depth color_depth;
} gsr_capture_xcomposite_params;
diff --git a/include/damage.h b/include/damage.h
index 8f89e1d..68cd0d2 100644
--- a/include/damage.h
+++ b/include/damage.h
@@ -1,24 +1,43 @@
#ifndef GSR_DAMAGE_H
#define GSR_DAMAGE_H
+#include "utils.h"
#include <stdbool.h>
#include <stdint.h>
typedef struct _XDisplay Display;
typedef union _XEvent XEvent;
+typedef enum {
+ GSR_DAMAGE_TRACK_NONE,
+ GSR_DAMAGE_TRACK_WINDOW,
+ GSR_DAMAGE_TRACK_MONITOR
+} gsr_damage_track_type;
+
typedef struct {
- Display *display;
+ gsr_egl *egl;
+ bool track_cursor;
+ gsr_damage_track_type track_type;
+
int damage_event;
int damage_error;
+ uint64_t window;
uint64_t damage;
bool damaged;
+
+ int randr_event;
+ int randr_error;
+
+ vec2i cursor_position; /* Relative to |window| */
+ gsr_monitor monitor;
+ char monitor_name[32];
} gsr_damage;
-bool gsr_damage_init(gsr_damage *self, Display *display);
+bool gsr_damage_init(gsr_damage *self, gsr_egl *egl, bool track_cursor);
void gsr_damage_deinit(gsr_damage *self);
bool gsr_damage_set_target_window(gsr_damage *self, uint64_t window);
+bool gsr_damage_set_target_monitor(gsr_damage *self, const char *monitor_name);
void gsr_damage_update(gsr_damage *self, XEvent *xev);
/* Also returns true if damage tracking is not available */
bool gsr_damage_is_damaged(gsr_damage *self);
diff --git a/include/egl.h b/include/egl.h
index d9d555a..9e50ad0 100644
--- a/include/egl.h
+++ b/include/egl.h
@@ -156,6 +156,7 @@ typedef struct {
vec2i size;
uint32_t connector_id;
gsr_monitor_rotation rotation;
+ uint32_t monitor_identifier; /* crtc id */
} gsr_x11_output;
typedef struct {
@@ -163,6 +164,7 @@ typedef struct {
Window window;
gsr_x11_output outputs[GSR_MAX_OUTPUTS];
int num_outputs;
+ XEvent xev;
} gsr_x11;
typedef struct {
@@ -311,10 +313,12 @@ struct gsr_egl {
bool gsr_egl_load(gsr_egl *self, Display *dpy, bool wayland, bool is_monitor_capture);
void gsr_egl_unload(gsr_egl *self);
-void gsr_egl_update(gsr_egl *self);
+/* Returns true if an event is available */
+bool gsr_egl_update(gsr_egl *self);
/* Does opengl swap with egl or glx, depending on which one is active */
void gsr_egl_swap_buffers(gsr_egl *self);
-gsr_display_server gsr_egl_get_display_server(const gsr_egl *egl);
+gsr_display_server gsr_egl_get_display_server(const gsr_egl *self);
+XEvent* gsr_egl_get_event_data(gsr_egl *self);
#endif /* GSR_EGL_H */
diff --git a/include/utils.h b/include/utils.h
index cadde8f..99503e2 100644
--- a/include/utils.h
+++ b/include/utils.h
@@ -14,7 +14,7 @@ typedef struct {
vec2i size;
uint32_t connector_id; /* Only on x11 and drm */
gsr_monitor_rotation rotation; /* Only on x11 and wayland */
- uint32_t monitor_identifier; /* Only on drm and wayland */
+ uint32_t monitor_identifier; /* On x11 this is the crtc id */
} gsr_monitor;
typedef struct {