Skip to content

Commit

Permalink
screencast: renegotiate if buffersize changes
Browse files Browse the repository at this point in the history
  • Loading branch information
columbarius committed Jun 13, 2021
1 parent 8ffcef5 commit 3783a49
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 4 deletions.
26 changes: 24 additions & 2 deletions src/screencast/pipewire_screencast.c
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,16 @@ static inline struct spa_pod *build_format(struct spa_pod_builder *b, uint32_t f
return spa_pod_builder_pop(b, &f[0]);
}

void pwr_destroy_shm_buffer(struct xdpw_screencast_instance *cast, struct pw_buffer *buffer) {
struct spa_data *d;

logprint(TRACE, "pipewire: destroy buffer %p", buffer);
d = buffer->buffer->datas;
wl_buffer_destroy(d[0].data);
d[0].data = NULL;
close(d[0].fd);
}

static void pwr_handle_stream_state_changed(void *data,
enum pw_stream_state old, enum pw_stream_state state, const char *error) {
struct xdpw_screencast_instance *cast = data;
Expand Down Expand Up @@ -101,6 +111,7 @@ static void pwr_handle_stream_param_changed(void *data, uint32_t id,
SPA_PARAM_META_size, SPA_POD_Int(sizeof(struct spa_meta_header)));

pw_stream_update_params(stream, params, 2);
cast->changed = false;
}

static void pwr_handle_stream_add_buffer(void *data, struct pw_buffer *buffer) {
Expand Down Expand Up @@ -149,15 +160,23 @@ static void pwr_handle_stream_add_buffer(void *data, struct pw_buffer *buffer) {
}

static void pwr_handle_stream_remove_buffer(void *data, struct pw_buffer *buffer) {
struct xdpw_screencast_instance *cast = data;
struct spa_data *d;

logprint(TRACE, "pipewire: remove buffer event handle");

logprint(TRACE, "pipewire: buffer %p", buffer);
d = buffer->buffer->datas;
if (buffer == cast->current_pw_buffer) {
logprint(TRACE, "pipewire: can't remove buffer. still in use");
// TODO: We shouldn't trigger that currently, because we export the buffer before update_params which should
// flush the buffers at all clients, but what happens, if a client renegotiates parameters?
abort();
return;
}
switch (d[0].type) {
case SPA_DATA_MemFd:
wl_buffer_destroy(d[0].data);
close(d[0].fd);
pwr_destroy_shm_buffer(cast, buffer);
break;
default:
break;
Expand All @@ -179,6 +198,7 @@ void xdpw_pwr_import_buffer(struct xdpw_screencast_instance *cast) {

if ((pw_buf = pw_stream_dequeue_buffer(cast->stream)) == NULL) {
logprint(WARN, "pipewire: out of buffers");
cast->simple_frame.buffer = NULL;
return;
}

Expand Down Expand Up @@ -238,11 +258,13 @@ void pwr_update_stream_param(struct xdpw_screencast_instance *cast) {
SPA_POD_BUILDER_INIT(params_buffer, sizeof(params_buffer));
const struct spa_pod *params[1];


enum spa_video_format format = xdpw_format_pw_from_wl_shm(cast);

params[0] = build_format(&b, format,
cast->simple_frame.width, cast->simple_frame.height, cast->framerate);

logprint(TRACE, "pipewire: params updated");
pw_stream_update_params(stream, params, 1);
}

Expand Down
3 changes: 1 addition & 2 deletions src/screencast/wlr_screencast.c
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ void xdpw_wlr_frame_free(struct xdpw_screencast_instance *cast) {
return ;
}

if (cast->pwr_stream_state) {
if (cast->pwr_stream_state && !cast->changed) {
xdpw_wlr_frame_start(cast);
}
}
Expand Down Expand Up @@ -106,7 +106,6 @@ static void wlr_frame_buffer_done(void *data,
if (cast->pwr_stream_state) {
pwr_update_stream_param(cast);
}
cast->changed = false;
xdpw_wlr_frame_free(cast);
return;
}
Expand Down

0 comments on commit 3783a49

Please sign in to comment.