mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-10-29 05:40:27 -04:00
buffer: add ptr_type to the data
We can give more info about the memory or fd that way and we can also pass other structures as data later if we need to.
This commit is contained in:
parent
16d2a3a69c
commit
61caf0e19c
9 changed files with 44 additions and 31 deletions
|
|
@ -121,7 +121,7 @@ on_sink_event (SpaHandle *handle, SpaEvent *event, void *user_data)
|
|||
g_debug ("pull ringbuffer %p", buf);
|
||||
|
||||
size = buf->size;
|
||||
data = buf->datas[0].data;
|
||||
data = buf->datas[0].ptr;
|
||||
|
||||
pinos_ringbuffer_get_read_areas (priv->ringbuffer, areas);
|
||||
|
||||
|
|
|
|||
|
|
@ -200,9 +200,9 @@ on_source_event (SpaHandle *handle, SpaEvent *event, void *user_data)
|
|||
pinos_buffer_builder_add_header (&builder, &hdr);
|
||||
|
||||
if (b->datas[0].type == SPA_DATA_TYPE_FD) {
|
||||
fd = *((int *)b->datas[0].data);
|
||||
fd = *((int *)b->datas[0].ptr);
|
||||
} else {
|
||||
fd = tmpfile_create (source, b->datas[0].data, b->size);
|
||||
fd = tmpfile_create (source, b->datas[0].ptr, b->size);
|
||||
}
|
||||
p.fd_index = pinos_buffer_builder_add_fd (&builder, fd);
|
||||
p.id = pinos_fd_manager_get_id (priv->fdmanager);
|
||||
|
|
@ -267,7 +267,7 @@ create_pipeline (PinosSpaV4l2Source *this)
|
|||
g_debug ("got get_props error %d", res);
|
||||
|
||||
value.type = SPA_PROP_TYPE_STRING;
|
||||
value.value = "/dev/video1";
|
||||
value.value = "/dev/video0";
|
||||
value.size = strlen (value.value)+1;
|
||||
props->set_prop (props, spa_props_index_for_name (props, "device"), &value);
|
||||
|
||||
|
|
|
|||
|
|
@ -70,7 +70,7 @@ typedef struct {
|
|||
} SpaMetaHeader;
|
||||
|
||||
typedef struct {
|
||||
const char *type;
|
||||
const char *ptr_type;
|
||||
void *ptr;
|
||||
} SpaMetaPointer;
|
||||
|
||||
|
|
@ -101,27 +101,34 @@ typedef struct {
|
|||
/**
|
||||
* SpaDataType:
|
||||
* @SPA_DATA_TYPE_INVALID: invalid data type, is ignored
|
||||
* @SPA_DATA_TYPE_MEMPTR: data and size point to memory
|
||||
* @SPA_DATA_TYPE_FD: data points to an int file descriptor
|
||||
* @SPA_DATA_TYPE_MEMPTR: data and size point to memory accassible by the
|
||||
* CPU.
|
||||
* @SPA_DATA_TYPE_FD: data points to an int file descriptor that can be
|
||||
* mmapped.
|
||||
* @SPA_DATA_TYPE_POINTER: data points to some other datastructure, the
|
||||
* type can be found in ptr_type
|
||||
*/
|
||||
typedef enum {
|
||||
SPA_DATA_TYPE_INVALID = 0,
|
||||
SPA_DATA_TYPE_MEMPTR,
|
||||
SPA_DATA_TYPE_FD,
|
||||
SPA_DATA_TYPE_POINTER,
|
||||
} SpaDataType;
|
||||
|
||||
/**
|
||||
* SpaData:
|
||||
* @id: user id
|
||||
* @type: the type of data
|
||||
* @data: pointer to data or fd
|
||||
* @ptr_type: more info abouut the type of @ptr
|
||||
* @ptr: pointer to data or fd
|
||||
* @offset: offset of data
|
||||
* @size: size of data
|
||||
* @stride: stride of data
|
||||
* @stride: stride of data if applicable
|
||||
*/
|
||||
typedef struct {
|
||||
SpaDataType type;
|
||||
void *data;
|
||||
const char *ptr_type;
|
||||
void *ptr;
|
||||
unsigned int offset;
|
||||
size_t size;
|
||||
size_t stride;
|
||||
|
|
|
|||
|
|
@ -232,7 +232,8 @@ pull_input (SpaALSASink *this, void *data, snd_pcm_uframes_t frames)
|
|||
buffer->meta[0].size = sizeof (buffer->header);
|
||||
|
||||
buffer->data[0].type = SPA_DATA_TYPE_MEMPTR;
|
||||
buffer->data[0].data = data;
|
||||
buffer->data[0].ptr = data;
|
||||
buffer->data[0].ptr_type = "sysmem";
|
||||
buffer->data[0].size = frames * sizeof (uint16_t) * 2;
|
||||
|
||||
this->event_cb (&this->handle, &event,this->user_data);
|
||||
|
|
|
|||
|
|
@ -548,7 +548,8 @@ pull_port (SpaAudioMixer *this, uint32_t port_id, SpaOutputInfo *info, size_t pu
|
|||
buffer->meta[0].size = sizeof (buffer->header);
|
||||
|
||||
buffer->data[0].type = SPA_DATA_TYPE_MEMPTR;
|
||||
buffer->data[0].data = buffer->samples;
|
||||
buffer->data[0].ptr = buffer->samples;
|
||||
buffer->data[0].ptr_type = "sysmem";
|
||||
buffer->data[0].size = pull_size;
|
||||
|
||||
this->event_cb (&this->handle, &event, this->user_data);
|
||||
|
|
@ -565,11 +566,11 @@ add_port_data (SpaAudioMixer *this, SpaBuffer *out, SpaAudioMixerPort *port)
|
|||
|
||||
while (true) {
|
||||
if (op == NULL) {
|
||||
op = out->datas[oi].data;
|
||||
op = out->datas[oi].ptr;
|
||||
os = out->datas[oi].size;
|
||||
}
|
||||
if (ip == NULL) {
|
||||
ip = port->buffer->datas[port->buffer_index].data;
|
||||
ip = port->buffer->datas[port->buffer_index].ptr;
|
||||
is = port->buffer->datas[port->buffer_index].size;
|
||||
ip += port->buffer_offset;
|
||||
is -= port->buffer_offset;
|
||||
|
|
|
|||
|
|
@ -467,7 +467,7 @@ spa_audiotestsrc_node_port_pull_output (SpaHandle *handle,
|
|||
continue;
|
||||
}
|
||||
|
||||
ptr = info[i].buffer->datas[0].data;
|
||||
ptr = info[i].buffer->datas[0].ptr;
|
||||
size = info[i].buffer->datas[0].size;
|
||||
|
||||
for (j = 0; j < size; j++)
|
||||
|
|
|
|||
|
|
@ -459,7 +459,7 @@ 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) b->buffer.datas[0].data;
|
||||
b->v4l2_buffer.m.userptr = (unsigned long) b->buffer.datas[0].ptr;
|
||||
b->v4l2_buffer.length = b->buffer.datas[0].size;
|
||||
|
||||
v4l2_buffer_free (b);
|
||||
|
|
@ -542,22 +542,24 @@ mmap_init (SpaV4l2Source *this)
|
|||
|
||||
b->dmafd = expbuf.fd;
|
||||
b->datas[0].type = SPA_DATA_TYPE_FD;
|
||||
b->datas[0].data = &b->dmafd;
|
||||
b->datas[0].ptr = &b->dmafd;
|
||||
b->datas[0].ptr_type = "dmabuf";
|
||||
b->datas[0].offset = 0;
|
||||
b->datas[0].size = buf.length;
|
||||
b->datas[0].stride = state->fmt.fmt.pix.bytesperline;
|
||||
} else {
|
||||
b->datas[0].type = SPA_DATA_TYPE_MEMPTR;
|
||||
b->datas[0].data = mmap (NULL,
|
||||
buf.length,
|
||||
PROT_READ | PROT_WRITE,
|
||||
MAP_SHARED,
|
||||
state->fd,
|
||||
buf.m.offset);
|
||||
b->datas[0].ptr_type = "sysmem";
|
||||
b->datas[0].ptr = mmap (NULL,
|
||||
buf.length,
|
||||
PROT_READ | PROT_WRITE,
|
||||
MAP_SHARED,
|
||||
state->fd,
|
||||
buf.m.offset);
|
||||
b->datas[0].offset = 0;
|
||||
b->datas[0].size = buf.length;
|
||||
b->datas[0].stride = state->fmt.fmt.pix.bytesperline;
|
||||
if (b->datas[0].data == MAP_FAILED) {
|
||||
if (b->datas[0].ptr == MAP_FAILED) {
|
||||
perror ("mmap");
|
||||
continue;
|
||||
}
|
||||
|
|
@ -662,7 +664,7 @@ spa_v4l2_stop (SpaV4l2Source *this)
|
|||
if (state->export_buf) {
|
||||
close (b->dmafd);
|
||||
} else {
|
||||
munmap (b->datas[0].data, b->datas[0].size);
|
||||
munmap (b->datas[0].ptr, b->datas[0].size);
|
||||
}
|
||||
}
|
||||
state->have_buffers = false;
|
||||
|
|
|
|||
|
|
@ -520,8 +520,8 @@ spa_volume_node_port_pull_output (SpaHandle *handle,
|
|||
di++;
|
||||
continue;
|
||||
}
|
||||
src = (uint16_t*) ((uint8_t*)sd->data + soff);
|
||||
dst = (uint16_t*) ((uint8_t*)dd->data + doff);
|
||||
src = (uint16_t*) ((uint8_t*)sd->ptr + soff);
|
||||
dst = (uint16_t*) ((uint8_t*)dd->ptr + doff);
|
||||
|
||||
n_bytes = MIN (sd->size - soff, dd->size - doff);
|
||||
n_samples = n_bytes / sizeof (uint16_t);
|
||||
|
|
|
|||
|
|
@ -126,7 +126,7 @@ on_source_event (SpaHandle *handle, SpaEvent *event, void *user_data)
|
|||
b = info[0].buffer;
|
||||
|
||||
if (b->metas[1].type == SPA_META_TYPE_POINTER &&
|
||||
strcmp (((SpaMetaPointer*)b->metas[1].data)->type, "SDL_Texture") == 0) {
|
||||
strcmp (((SpaMetaPointer*)b->metas[1].data)->ptr_type, "SDL_Texture") == 0) {
|
||||
SDL_Texture *texture;
|
||||
texture = ((SpaMetaPointer*)b->metas[1].data)->ptr;
|
||||
|
||||
|
|
@ -140,7 +140,8 @@ on_source_event (SpaHandle *handle, SpaEvent *event, void *user_data)
|
|||
fprintf (stderr, "Couldn't lock texture: %s\n", SDL_GetError());
|
||||
return;
|
||||
}
|
||||
b->datas[0].data = sdata;
|
||||
b->datas[0].ptr = sdata;
|
||||
b->datas[0].ptr_type = "sysmem";
|
||||
b->datas[0].size = sstride * 240;
|
||||
b->datas[0].stride = sstride;
|
||||
} else {
|
||||
|
|
@ -148,7 +149,7 @@ on_source_event (SpaHandle *handle, SpaEvent *event, void *user_data)
|
|||
fprintf (stderr, "Couldn't lock texture: %s\n", SDL_GetError());
|
||||
return;
|
||||
}
|
||||
sdata = b->datas[0].data;
|
||||
sdata = b->datas[0].ptr;
|
||||
sstride = b->datas[0].stride;
|
||||
|
||||
for (i = 0; i < 240; i++) {
|
||||
|
|
@ -257,7 +258,8 @@ alloc_buffers (AppData *data)
|
|||
b->metas[1].size = sizeof (b->ptr);
|
||||
|
||||
b->datas[0].type = SPA_DATA_TYPE_MEMPTR;
|
||||
b->datas[0].data = mem;
|
||||
b->datas[0].ptr = mem;
|
||||
b->datas[0].ptr_type = "sysmem";
|
||||
b->datas[0].offset = 0;
|
||||
b->datas[0].size = stride * 240;
|
||||
b->datas[0].stride = stride;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue