mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-10-31 22:25:38 -04:00
Work on negotiation
Add helpers to convert between pinos and gstreamer formats. Use pinos formats in the API. Work on removing some hardcoded stuff and instead use the real format from the pinos server. Use memfd and sealing.
This commit is contained in:
parent
dd1fbef28f
commit
ac5d22ec79
26 changed files with 638 additions and 199 deletions
|
|
@ -550,7 +550,7 @@ spa_audiomixer_node_port_push_input (SpaNode *node,
|
|||
continue;
|
||||
}
|
||||
this->ports[idx].buffer = buffer;
|
||||
this->ports[idx].buffer_queued = buffer->size;
|
||||
this->ports[idx].buffer_queued = buffer->mem.size;
|
||||
this->ports[idx].buffer_index = 0;
|
||||
this->ports[idx].buffer_offset = 0;
|
||||
this->port_queued++;
|
||||
|
|
@ -597,14 +597,14 @@ add_port_data (SpaAudioMixer *this, SpaBuffer *out, SpaAudioMixerPort *port)
|
|||
|
||||
while (true) {
|
||||
if (op == NULL) {
|
||||
mem = spa_memory_find (&odatas[oi].mem);
|
||||
op = (uint8_t*)mem->ptr + odatas[oi].offset;
|
||||
os = odatas[oi].size;
|
||||
mem = spa_memory_find (&odatas[oi].mem.mem);
|
||||
op = (uint8_t*)mem->ptr + odatas[oi].mem.offset;
|
||||
os = odatas[oi].mem.size;
|
||||
}
|
||||
if (ip == NULL) {
|
||||
mem = spa_memory_find (&idatas[port->buffer_index].mem);
|
||||
ip = (uint8_t*)mem->ptr + odatas[oi].offset;
|
||||
is = idatas[port->buffer_index].size;
|
||||
mem = spa_memory_find (&idatas[port->buffer_index].mem.mem);
|
||||
ip = (uint8_t*)mem->ptr + odatas[oi].mem.offset;
|
||||
is = idatas[port->buffer_index].mem.size;
|
||||
ip += port->buffer_offset;
|
||||
is -= port->buffer_offset;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -28,9 +28,10 @@
|
|||
#include <fcntl.h>
|
||||
|
||||
|
||||
#include <spa/node.h>
|
||||
#include <spa/memory.h>
|
||||
#include <spa/control.h>
|
||||
#include <spa/debug.h>
|
||||
#include <spa/memory.h>
|
||||
#include <spa/node.h>
|
||||
|
||||
#define MAX_INPUTS 64
|
||||
#define MAX_OUTPUTS 64
|
||||
|
|
@ -443,6 +444,9 @@ spa_proxy_node_port_set_format (SpaNode *node,
|
|||
spa_control_builder_init_into (&builder, buf, sizeof (buf), NULL, 0);
|
||||
sf.port_id = port_id;
|
||||
sf.format = (SpaFormat *) format;
|
||||
|
||||
spa_debug_format (sf.format);
|
||||
|
||||
spa_control_builder_add_cmd (&builder, SPA_CONTROL_CMD_SET_FORMAT, &sf);
|
||||
spa_control_builder_end (&builder, &control);
|
||||
|
||||
|
|
@ -563,14 +567,14 @@ add_buffer (SpaProxy *this, uint32_t port_id, SpaBuffer *buffer)
|
|||
|
||||
spa_control_builder_init_into (&builder, buf, sizeof (buf), fds, sizeof (fds));
|
||||
|
||||
if (buffer->mem.id == SPA_ID_INVALID) {
|
||||
if (buffer->mem.mem.id == SPA_ID_INVALID) {
|
||||
fprintf (stderr, "proxy %p: alloc buffer space\n", this);
|
||||
bmem = spa_memory_alloc_with_fd (SPA_MEMORY_POOL_SHARED, buffer, buffer->size);
|
||||
bmem = spa_memory_alloc_with_fd (SPA_MEMORY_POOL_SHARED, buffer, buffer->mem.size);
|
||||
b = spa_memory_ensure_ptr (bmem);
|
||||
b->mem = bmem->mem;
|
||||
b->offset = 0;
|
||||
b->mem.mem = bmem->mem;
|
||||
b->mem.offset = 0;
|
||||
} else {
|
||||
bmem = spa_memory_find (&buffer->mem);
|
||||
bmem = spa_memory_find (&buffer->mem.mem);
|
||||
b = buffer;
|
||||
}
|
||||
|
||||
|
|
@ -586,7 +590,7 @@ add_buffer (SpaProxy *this, uint32_t port_id, SpaBuffer *buffer)
|
|||
SpaData *d = &SPA_BUFFER_DATAS (b)[i];
|
||||
SpaMemory *mem;
|
||||
|
||||
if (!(mem = spa_memory_find (&d->mem))) {
|
||||
if (!(mem = spa_memory_find (&d->mem.mem))) {
|
||||
fprintf (stderr, "proxy %p: error invalid memory\n", this);
|
||||
continue;
|
||||
}
|
||||
|
|
@ -601,9 +605,9 @@ add_buffer (SpaProxy *this, uint32_t port_id, SpaBuffer *buffer)
|
|||
}
|
||||
ab.port_id = port_id;
|
||||
ab.buffer_id = b->id;
|
||||
ab.mem = bmem->mem;
|
||||
ab.offset = b->offset;
|
||||
ab.size = b->size;
|
||||
ab.mem.mem = bmem->mem;
|
||||
ab.mem.offset = b->mem.offset;
|
||||
ab.mem.size = b->mem.size;
|
||||
spa_control_builder_add_cmd (&builder, SPA_CONTROL_CMD_ADD_BUFFER, &ab);
|
||||
|
||||
spa_control_builder_end (&builder, &control);
|
||||
|
|
@ -632,14 +636,14 @@ remove_buffer (SpaProxy *this, uint32_t port_id, SpaBuffer *buffer)
|
|||
rb.buffer_id = buffer->id;
|
||||
spa_control_builder_add_cmd (&builder, SPA_CONTROL_CMD_REMOVE_BUFFER, &rb);
|
||||
rm.port_id = port_id;
|
||||
rm.mem = buffer->mem;
|
||||
rm.mem = buffer->mem.mem;
|
||||
spa_control_builder_add_cmd (&builder, SPA_CONTROL_CMD_REMOVE_MEM, &rm);
|
||||
|
||||
for (i = 0; i < buffer->n_datas; i++) {
|
||||
SpaData *d = &SPA_BUFFER_DATAS (buffer)[i];
|
||||
|
||||
rm.port_id = port_id;
|
||||
rm.mem = d->mem;
|
||||
rm.mem = d->mem.mem;
|
||||
spa_control_builder_add_cmd (&builder, SPA_CONTROL_CMD_REMOVE_MEM, &rm);
|
||||
}
|
||||
spa_control_builder_end (&builder, &control);
|
||||
|
|
|
|||
|
|
@ -537,16 +537,16 @@ spa_v4l2_import_buffers (SpaV4l2Source *this, SpaBuffer **buffers, uint32_t n_bu
|
|||
SpaData *d = SPA_BUFFER_DATAS (buffers[i]);
|
||||
|
||||
b = &state->alloc_buffers[i];
|
||||
b->buffer.mem = state->alloc_mem->mem;
|
||||
b->buffer.offset = sizeof (V4l2Buffer) * i;
|
||||
b->buffer.size = sizeof (V4l2Buffer);
|
||||
b->buffer.mem.mem = state->alloc_mem->mem;
|
||||
b->buffer.mem.offset = sizeof (V4l2Buffer) * i;
|
||||
b->buffer.mem.size = sizeof (V4l2Buffer);
|
||||
b->buffer.id = SPA_ID_INVALID;
|
||||
b->outbuf = buffers[i];
|
||||
b->outstanding = true;
|
||||
|
||||
fprintf (stderr, "import buffer %p\n", buffers[i]);
|
||||
|
||||
mem_ref = &SPA_BUFFER_DATAS (buffers[i])[0].mem;
|
||||
mem_ref = &SPA_BUFFER_DATAS (buffers[i])[0].mem.mem;
|
||||
if (!(mem = spa_memory_find (mem_ref))) {
|
||||
fprintf (stderr, "invalid memory on buffer %p\n", buffers[i]);
|
||||
continue;
|
||||
|
|
@ -556,8 +556,8 @@ spa_v4l2_import_buffers (SpaV4l2Source *this, SpaBuffer **buffers, uint32_t n_bu
|
|||
b->v4l2_buffer.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
|
||||
b->v4l2_buffer.memory = state->memtype;
|
||||
b->v4l2_buffer.index = i;
|
||||
b->v4l2_buffer.m.userptr = (unsigned long) ((uint8_t*)mem->ptr + d[0].offset);
|
||||
b->v4l2_buffer.length = d[0].size;
|
||||
b->v4l2_buffer.m.userptr = (unsigned long) ((uint8_t*)mem->ptr + d[0].mem.offset);
|
||||
b->v4l2_buffer.length = d[0].mem.size;
|
||||
|
||||
spa_v4l2_buffer_recycle (this, buffers[i]->id);
|
||||
}
|
||||
|
|
@ -625,9 +625,9 @@ mmap_init (SpaV4l2Source *this,
|
|||
|
||||
b = &state->alloc_buffers[i];
|
||||
b->buffer.id = i;
|
||||
b->buffer.mem = state->alloc_mem->mem;
|
||||
b->buffer.offset = sizeof (V4l2Buffer) * i;
|
||||
b->buffer.size = sizeof (V4l2Buffer);
|
||||
b->buffer.mem.mem = state->alloc_mem->mem;
|
||||
b->buffer.mem.offset = sizeof (V4l2Buffer) * i;
|
||||
b->buffer.mem.size = sizeof (V4l2Buffer);
|
||||
|
||||
buffers[i] = &b->buffer;
|
||||
|
||||
|
|
@ -648,9 +648,9 @@ mmap_init (SpaV4l2Source *this,
|
|||
mem = spa_memory_alloc (SPA_MEMORY_POOL_SHARED);
|
||||
mem->flags = SPA_MEMORY_FLAG_READABLE;
|
||||
mem->size = buf.length;
|
||||
b->datas[0].mem = mem->mem;
|
||||
b->datas[0].offset = 0;
|
||||
b->datas[0].size = buf.length;
|
||||
b->datas[0].mem.mem = mem->mem;
|
||||
b->datas[0].mem.offset = 0;
|
||||
b->datas[0].mem.size = buf.length;
|
||||
b->datas[0].stride = state->fmt.fmt.pix.bytesperline;
|
||||
|
||||
if (state->export_buf) {
|
||||
|
|
@ -797,7 +797,7 @@ spa_v4l2_stop (SpaV4l2Source *this)
|
|||
fprintf (stderr, "queueing outstanding buffer %p\n", b);
|
||||
spa_v4l2_buffer_recycle (this, i);
|
||||
}
|
||||
mem = spa_memory_find (&b->datas[0].mem);
|
||||
mem = spa_memory_find (&b->datas[0].mem.mem);
|
||||
if (state->export_buf) {
|
||||
close (mem->fd);
|
||||
} else {
|
||||
|
|
|
|||
|
|
@ -583,13 +583,13 @@ spa_volume_node_port_pull_output (SpaNode *node,
|
|||
sd = &SPA_BUFFER_DATAS (sbuf)[si];
|
||||
dd = &SPA_BUFFER_DATAS (dbuf)[di];
|
||||
|
||||
sm = spa_memory_find (&sd->mem);
|
||||
dm = spa_memory_find (&dd->mem);
|
||||
sm = spa_memory_find (&sd->mem.mem);
|
||||
dm = spa_memory_find (&dd->mem.mem);
|
||||
|
||||
src = (uint16_t*) ((uint8_t*)sm->ptr + sd->offset + soff);
|
||||
dst = (uint16_t*) ((uint8_t*)dm->ptr + dd->offset + doff);
|
||||
src = (uint16_t*) ((uint8_t*)sm->ptr + sd->mem.offset + soff);
|
||||
dst = (uint16_t*) ((uint8_t*)dm->ptr + dd->mem.offset + doff);
|
||||
|
||||
n_bytes = SPA_MIN (sd->size - soff, dd->size - doff);
|
||||
n_bytes = SPA_MIN (sd->mem.size - soff, dd->mem.size - doff);
|
||||
n_samples = n_bytes / sizeof (uint16_t);
|
||||
|
||||
for (i = 0; i < n_samples; i++)
|
||||
|
|
@ -598,11 +598,11 @@ spa_volume_node_port_pull_output (SpaNode *node,
|
|||
soff += n_bytes;
|
||||
doff += n_bytes;
|
||||
|
||||
if (soff >= sd->size) {
|
||||
if (soff >= sd->mem.size) {
|
||||
si++;
|
||||
soff = 0;
|
||||
}
|
||||
if (doff >= dd->size) {
|
||||
if (doff >= dd->mem.size) {
|
||||
di++;
|
||||
doff = 0;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue