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:
Wim Taymans 2016-07-13 20:23:03 +02:00
parent 16d2a3a69c
commit 61caf0e19c
9 changed files with 44 additions and 31 deletions

View file

@ -121,7 +121,7 @@ on_sink_event (SpaHandle *handle, SpaEvent *event, void *user_data)
g_debug ("pull ringbuffer %p", buf); g_debug ("pull ringbuffer %p", buf);
size = buf->size; size = buf->size;
data = buf->datas[0].data; data = buf->datas[0].ptr;
pinos_ringbuffer_get_read_areas (priv->ringbuffer, areas); pinos_ringbuffer_get_read_areas (priv->ringbuffer, areas);

View file

@ -200,9 +200,9 @@ on_source_event (SpaHandle *handle, SpaEvent *event, void *user_data)
pinos_buffer_builder_add_header (&builder, &hdr); pinos_buffer_builder_add_header (&builder, &hdr);
if (b->datas[0].type == SPA_DATA_TYPE_FD) { if (b->datas[0].type == SPA_DATA_TYPE_FD) {
fd = *((int *)b->datas[0].data); fd = *((int *)b->datas[0].ptr);
} else { } 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.fd_index = pinos_buffer_builder_add_fd (&builder, fd);
p.id = pinos_fd_manager_get_id (priv->fdmanager); 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); g_debug ("got get_props error %d", res);
value.type = SPA_PROP_TYPE_STRING; value.type = SPA_PROP_TYPE_STRING;
value.value = "/dev/video1"; value.value = "/dev/video0";
value.size = strlen (value.value)+1; value.size = strlen (value.value)+1;
props->set_prop (props, spa_props_index_for_name (props, "device"), &value); props->set_prop (props, spa_props_index_for_name (props, "device"), &value);

View file

@ -70,7 +70,7 @@ typedef struct {
} SpaMetaHeader; } SpaMetaHeader;
typedef struct { typedef struct {
const char *type; const char *ptr_type;
void *ptr; void *ptr;
} SpaMetaPointer; } SpaMetaPointer;
@ -101,27 +101,34 @@ typedef struct {
/** /**
* SpaDataType: * SpaDataType:
* @SPA_DATA_TYPE_INVALID: invalid data type, is ignored * @SPA_DATA_TYPE_INVALID: invalid data type, is ignored
* @SPA_DATA_TYPE_MEMPTR: data and size point to memory * @SPA_DATA_TYPE_MEMPTR: data and size point to memory accassible by the
* @SPA_DATA_TYPE_FD: data points to an int file descriptor * 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 { typedef enum {
SPA_DATA_TYPE_INVALID = 0, SPA_DATA_TYPE_INVALID = 0,
SPA_DATA_TYPE_MEMPTR, SPA_DATA_TYPE_MEMPTR,
SPA_DATA_TYPE_FD, SPA_DATA_TYPE_FD,
SPA_DATA_TYPE_POINTER,
} SpaDataType; } SpaDataType;
/** /**
* SpaData: * SpaData:
* @id: user id * @id: user id
* @type: the type of data * @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 * @offset: offset of data
* @size: size of data * @size: size of data
* @stride: stride of data * @stride: stride of data if applicable
*/ */
typedef struct { typedef struct {
SpaDataType type; SpaDataType type;
void *data; const char *ptr_type;
void *ptr;
unsigned int offset; unsigned int offset;
size_t size; size_t size;
size_t stride; size_t stride;

View file

@ -232,7 +232,8 @@ pull_input (SpaALSASink *this, void *data, snd_pcm_uframes_t frames)
buffer->meta[0].size = sizeof (buffer->header); buffer->meta[0].size = sizeof (buffer->header);
buffer->data[0].type = SPA_DATA_TYPE_MEMPTR; 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; buffer->data[0].size = frames * sizeof (uint16_t) * 2;
this->event_cb (&this->handle, &event,this->user_data); this->event_cb (&this->handle, &event,this->user_data);

View file

@ -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->meta[0].size = sizeof (buffer->header);
buffer->data[0].type = SPA_DATA_TYPE_MEMPTR; 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; buffer->data[0].size = pull_size;
this->event_cb (&this->handle, &event, this->user_data); this->event_cb (&this->handle, &event, this->user_data);
@ -565,11 +566,11 @@ add_port_data (SpaAudioMixer *this, SpaBuffer *out, SpaAudioMixerPort *port)
while (true) { while (true) {
if (op == NULL) { if (op == NULL) {
op = out->datas[oi].data; op = out->datas[oi].ptr;
os = out->datas[oi].size; os = out->datas[oi].size;
} }
if (ip == NULL) { 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; is = port->buffer->datas[port->buffer_index].size;
ip += port->buffer_offset; ip += port->buffer_offset;
is -= port->buffer_offset; is -= port->buffer_offset;

View file

@ -467,7 +467,7 @@ spa_audiotestsrc_node_port_pull_output (SpaHandle *handle,
continue; continue;
} }
ptr = info[i].buffer->datas[0].data; ptr = info[i].buffer->datas[0].ptr;
size = info[i].buffer->datas[0].size; size = info[i].buffer->datas[0].size;
for (j = 0; j < size; j++) for (j = 0; j < size; j++)

View file

@ -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.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
b->v4l2_buffer.memory = state->memtype; b->v4l2_buffer.memory = state->memtype;
b->v4l2_buffer.index = i; 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; b->v4l2_buffer.length = b->buffer.datas[0].size;
v4l2_buffer_free (b); v4l2_buffer_free (b);
@ -542,22 +542,24 @@ mmap_init (SpaV4l2Source *this)
b->dmafd = expbuf.fd; b->dmafd = expbuf.fd;
b->datas[0].type = SPA_DATA_TYPE_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].offset = 0;
b->datas[0].size = buf.length; b->datas[0].size = buf.length;
b->datas[0].stride = state->fmt.fmt.pix.bytesperline; b->datas[0].stride = state->fmt.fmt.pix.bytesperline;
} else { } else {
b->datas[0].type = SPA_DATA_TYPE_MEMPTR; b->datas[0].type = SPA_DATA_TYPE_MEMPTR;
b->datas[0].data = mmap (NULL, b->datas[0].ptr_type = "sysmem";
buf.length, b->datas[0].ptr = mmap (NULL,
PROT_READ | PROT_WRITE, buf.length,
MAP_SHARED, PROT_READ | PROT_WRITE,
state->fd, MAP_SHARED,
buf.m.offset); state->fd,
buf.m.offset);
b->datas[0].offset = 0; b->datas[0].offset = 0;
b->datas[0].size = buf.length; b->datas[0].size = buf.length;
b->datas[0].stride = state->fmt.fmt.pix.bytesperline; 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"); perror ("mmap");
continue; continue;
} }
@ -662,7 +664,7 @@ spa_v4l2_stop (SpaV4l2Source *this)
if (state->export_buf) { if (state->export_buf) {
close (b->dmafd); close (b->dmafd);
} else { } else {
munmap (b->datas[0].data, b->datas[0].size); munmap (b->datas[0].ptr, b->datas[0].size);
} }
} }
state->have_buffers = false; state->have_buffers = false;

View file

@ -520,8 +520,8 @@ spa_volume_node_port_pull_output (SpaHandle *handle,
di++; di++;
continue; continue;
} }
src = (uint16_t*) ((uint8_t*)sd->data + soff); src = (uint16_t*) ((uint8_t*)sd->ptr + soff);
dst = (uint16_t*) ((uint8_t*)dd->data + doff); dst = (uint16_t*) ((uint8_t*)dd->ptr + doff);
n_bytes = MIN (sd->size - soff, dd->size - doff); n_bytes = MIN (sd->size - soff, dd->size - doff);
n_samples = n_bytes / sizeof (uint16_t); n_samples = n_bytes / sizeof (uint16_t);

View file

@ -126,7 +126,7 @@ on_source_event (SpaHandle *handle, SpaEvent *event, void *user_data)
b = info[0].buffer; b = info[0].buffer;
if (b->metas[1].type == SPA_META_TYPE_POINTER && 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; SDL_Texture *texture;
texture = ((SpaMetaPointer*)b->metas[1].data)->ptr; 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()); fprintf (stderr, "Couldn't lock texture: %s\n", SDL_GetError());
return; 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].size = sstride * 240;
b->datas[0].stride = sstride; b->datas[0].stride = sstride;
} else { } 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()); fprintf (stderr, "Couldn't lock texture: %s\n", SDL_GetError());
return; return;
} }
sdata = b->datas[0].data; sdata = b->datas[0].ptr;
sstride = b->datas[0].stride; sstride = b->datas[0].stride;
for (i = 0; i < 240; i++) { for (i = 0; i < 240; i++) {
@ -257,7 +258,8 @@ alloc_buffers (AppData *data)
b->metas[1].size = sizeof (b->ptr); b->metas[1].size = sizeof (b->ptr);
b->datas[0].type = SPA_DATA_TYPE_MEMPTR; 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].offset = 0;
b->datas[0].size = stride * 240; b->datas[0].size = stride * 240;
b->datas[0].stride = stride; b->datas[0].stride = stride;