screen-cast-src: Port to pipewire master

The PipeWire master branch saw some backports from the work branch,
including API changes making the 0.1 series more aligned with future
plans. Make mutter use the new API. This is needed to avoid dead locks
that existed in the older version.
This commit is contained in:
Jonas Ådahl 2018-07-09 17:27:47 +02:00 committed by Florian Müllner
parent 912a6f5e3f
commit 0407a8b33d

View File

@ -132,8 +132,8 @@ meta_screen_cast_stream_src_maybe_record_frame (MetaScreenCastStreamSrc *src)
{ {
MetaScreenCastStreamSrcPrivate *priv = MetaScreenCastStreamSrcPrivate *priv =
meta_screen_cast_stream_src_get_instance_private (src); meta_screen_cast_stream_src_get_instance_private (src);
uint32_t buffer_id; struct pw_buffer *buffer;
struct spa_buffer *buffer; struct spa_buffer *spa_buffer;
uint8_t *map = NULL; uint8_t *map = NULL;
uint8_t *data; uint8_t *data;
uint64_t now_us; uint64_t now_us;
@ -148,22 +148,24 @@ meta_screen_cast_stream_src_maybe_record_frame (MetaScreenCastStreamSrc *src)
if (!priv->pipewire_stream) if (!priv->pipewire_stream)
return; return;
buffer_id = pw_stream_get_empty_buffer (priv->pipewire_stream); buffer = pw_stream_dequeue_buffer (priv->pipewire_stream);
if (buffer_id == SPA_ID_INVALID)
return;
buffer = pw_stream_peek_buffer (priv->pipewire_stream, buffer_id);
if (!buffer) if (!buffer)
{ {
g_warning ("Failed to peek at PipeWire buffer"); g_warning ("Failed to dequeue at PipeWire buffer");
return; return;
} }
if (buffer->datas[0].type == priv->pipewire_type->data.MemFd) spa_buffer = buffer->buffer;
if (spa_buffer->datas[0].data)
{ {
map = mmap (NULL, buffer->datas[0].maxsize + buffer->datas[0].mapoffset, data = spa_buffer->datas[0].data;
}
else if (spa_buffer->datas[0].type == priv->pipewire_type->data.MemFd)
{
map = mmap (NULL, spa_buffer->datas[0].maxsize + spa_buffer->datas[0].mapoffset,
PROT_READ | PROT_WRITE, MAP_SHARED, PROT_READ | PROT_WRITE, MAP_SHARED,
buffer->datas[0].fd, 0); spa_buffer->datas[0].fd, 0);
if (map == MAP_FAILED) if (map == MAP_FAILED)
{ {
g_warning ("Failed to mmap pipewire stream buffer: %s\n", g_warning ("Failed to mmap pipewire stream buffer: %s\n",
@ -171,14 +173,11 @@ meta_screen_cast_stream_src_maybe_record_frame (MetaScreenCastStreamSrc *src)
return; return;
} }
data = SPA_MEMBER (map, buffer->datas[0].mapoffset, uint8_t); data = SPA_MEMBER (map, spa_buffer->datas[0].mapoffset, uint8_t);
}
else if (buffer->datas[0].type == priv->pipewire_type->data.MemPtr)
{
data = buffer->datas[0].data;
} }
else else
{ {
g_warning ("Unhandled spa buffer type: %d", spa_buffer->datas[0].type);
return; return;
} }
@ -186,11 +185,11 @@ meta_screen_cast_stream_src_maybe_record_frame (MetaScreenCastStreamSrc *src)
priv->last_frame_timestamp_us = now_us; priv->last_frame_timestamp_us = now_us;
if (map) if (map)
munmap (map, buffer->datas[0].maxsize + buffer->datas[0].mapoffset); munmap (map, spa_buffer->datas[0].maxsize + spa_buffer->datas[0].mapoffset);
buffer->datas[0].chunk->size = buffer->datas[0].maxsize; spa_buffer->datas[0].chunk->size = spa_buffer->datas[0].maxsize;
pw_stream_send_buffer (priv->pipewire_stream, buffer_id); pw_stream_queue_buffer (priv->pipewire_stream, buffer);
} }
static gboolean static gboolean
@ -266,8 +265,8 @@ on_stream_state_changed (void *data,
} }
static void static void
on_stream_format_changed (void *data, on_stream_format_changed (void *data,
struct spa_pod *format) const struct spa_pod *format)
{ {
MetaScreenCastStreamSrc *src = data; MetaScreenCastStreamSrc *src = data;
MetaScreenCastStreamSrcPrivate *priv = MetaScreenCastStreamSrcPrivate *priv =
@ -276,7 +275,7 @@ on_stream_format_changed (void *data,
uint8_t params_buffer[1024]; uint8_t params_buffer[1024];
int32_t width, height, stride, size; int32_t width, height, stride, size;
struct spa_pod_builder pod_builder; struct spa_pod_builder pod_builder;
struct spa_pod *params[1]; const struct spa_pod *params[1];
const int bpp = 4; const int bpp = 4;
if (!format) if (!format)
@ -372,7 +371,8 @@ create_pipewire_stream (MetaScreenCastStreamSrc *src,
result = pw_stream_connect (pipewire_stream, result = pw_stream_connect (pipewire_stream,
PW_DIRECTION_OUTPUT, PW_DIRECTION_OUTPUT,
NULL, NULL,
PW_STREAM_FLAG_NONE, (PW_STREAM_FLAG_DRIVER |
PW_STREAM_FLAG_MAP_BUFFERS),
params, G_N_ELEMENTS (params)); params, G_N_ELEMENTS (params));
if (result != 0) if (result != 0)
{ {