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);
size = buf->size;
data = buf->datas[0].data;
data = buf->datas[0].ptr;
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);
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);

View file

@ -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;

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->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);

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->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;

View file

@ -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++)

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.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;

View file

@ -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);

View file

@ -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;