mutter-pipewire-0_2-API.patch

This commit is contained in:
Ray Strode 2019-01-14 10:06:42 -05:00
parent 68570353fd
commit 6d7bbeddd7

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
@ -267,7 +266,7 @@ 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)
{ {