mirror of
https://repo.dec05eba.com/gpu-screen-recorder
synced 2026-03-31 09:07:13 +09:00
Set update fps to video fps, on x11 sync video to damage tracking
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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 */
|
||||
|
||||
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user