Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[WIP] ext-screencopy #218

Draft
wants to merge 6 commits into
base: master
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
1 change: 0 additions & 1 deletion include/pipewire_screencast.h
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@
#define XDPW_PWR_BUFFERS_MIN 2
#define XDPW_PWR_ALIGN 16

void xdpw_pwr_dequeue_buffer(struct xdpw_screencast_instance *cast);
void xdpw_pwr_enqueue_buffer(struct xdpw_screencast_instance *cast);
void pwr_update_stream_param(struct xdpw_screencast_instance *cast);
void xdpw_pwr_stream_create(struct xdpw_screencast_instance *cast);
Expand Down
41 changes: 38 additions & 3 deletions include/screencast_common.h
Original file line number Diff line number Diff line change
Expand Up @@ -44,12 +44,17 @@ enum xdpw_frame_state {
XDPW_FRAME_STATE_SUCCESS,
};

enum ext_screencopy_input_type {
EXT_SCREENCOPY_INPUT_TYPE_POINTER = 0,
EXT_SCREENCOPY_INPUT_TYPE_TABLET = 1,
};

struct xdpw_output_chooser {
enum xdpw_chooser_types type;
char *cmd;
};

struct xdpw_frame_damage {
struct xdpw_damage {
uint32_t x;
uint32_t y;
uint32_t width;
Expand All @@ -60,11 +65,25 @@ struct xdpw_frame {
bool y_invert;
uint64_t tv_sec;
uint32_t tv_nsec;
struct xdpw_frame_damage damage;
struct xdpw_damage damage;
struct xdpw_buffer *xdpw_buffer;
struct pw_buffer *pw_buffer;
};

struct xdpw_cursor {
char *seat_name;
enum ext_screencopy_input_type input_type;
bool present;
bool damaged;
int32_t width;
int32_t height;
int32_t position_x;
int32_t position_y;
int32_t hotspot_x;
int32_t hotspot_y;
struct xdpw_buffer *xdpw_buffer;
};

struct xdpw_screencopy_frame_info {
uint32_t width;
uint32_t height;
Expand All @@ -73,6 +92,13 @@ struct xdpw_screencopy_frame_info {
uint32_t format;
};

struct xdpw_screencopy_cursor_frame_info {
char *seat_name;
enum ext_screencopy_input_type input_type;

struct xdpw_screencopy_frame_info frame_info[2];
};

struct xdpw_buffer {
struct wl_list link;
enum buffer_type buffer_type;
Expand All @@ -90,6 +116,7 @@ struct xdpw_buffer {
struct gbm_bo *bo;

struct wl_buffer *buffer;
struct xdpw_damage damage;
};

struct xdpw_format_modifier_pair {
Expand All @@ -116,6 +143,7 @@ struct xdpw_screencast_context {
struct wl_list output_list;
struct wl_registry *registry;
struct zwlr_screencopy_manager_v1 *screencopy_manager;
struct ext_screencopy_manager_v1 *ext_screencopy_manager;
struct zxdg_output_manager_v1 *xdg_output_manager;
struct wl_shm *shm;
struct zwp_linux_dmabuf_v1 *linux_dmabuf;
Expand All @@ -141,6 +169,7 @@ struct xdpw_screencast_instance {
struct xdpw_frame current_frame;
enum xdpw_frame_state frame_state;
struct wl_list buffer_list;
struct wl_list cursor_buffer_list;
bool avoid_dmabufs;

// pipewire
Expand All @@ -158,12 +187,17 @@ struct xdpw_screencast_instance {
uint32_t max_framerate;
struct zwlr_screencopy_frame_v1 *wlr_frame;
struct xdpw_screencopy_frame_info screencopy_frame_info[2];
bool with_cursor;
enum cursor_modes cursor_mode;
int err;
bool quit;
bool teardown;
enum buffer_type buffer_type;

// ext_screencopy
struct ext_screencopy_surface_v1 *surface_capture;
struct wl_array screencopy_cursor_frame_infos;
struct xdpw_cursor xdpw_cursor;

// fps limit
struct fps_limit_state fps_limit;
};
Expand All @@ -183,6 +217,7 @@ struct xdpw_wlr_output {

void randname(char *buf);
struct gbm_device *xdpw_gbm_device_create(drmDevice *device);
void xdpw_buffer_apply_damage(struct xdpw_buffer *buffer, struct xdpw_damage *damage);
struct xdpw_buffer *xdpw_buffer_create(struct xdpw_screencast_instance *cast,
enum buffer_type buffer_type, struct xdpw_screencopy_frame_info *frame_info);
void xdpw_buffer_destroy(struct xdpw_buffer *buffer);
Expand Down
4 changes: 3 additions & 1 deletion include/wlr_screencast.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,9 @@ struct xdpw_wlr_output *xdpw_wlr_output_find(struct xdpw_screencast_context *ctx
struct xdpw_wlr_output *xdpw_wlr_output_chooser(struct xdpw_screencast_context *ctx);

void xdpw_wlr_frame_finish(struct xdpw_screencast_instance *cast);
void xdpw_wlr_frame_start(struct xdpw_screencast_instance *cast);
void xdpw_wlr_register_cb(struct xdpw_screencast_instance *cast);
void xdpw_wlr_ext_screencopy_surface_create(struct xdpw_screencast_instance *cast);
void xdpw_wlr_ext_screencopy_surface_destroy(struct xdpw_screencast_instance *cast);
void xdpw_wlr_handle_frame(struct xdpw_screencast_instance *cast);

#endif