mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-11-03 09:01:54 -05:00
buffer: make data and meta types dynamic
Use dynamic types for the data and meta types. Move the meta into a separate header. Remove port state, we can keep track of that ourselves. Add size to MetaDataEnable params
This commit is contained in:
parent
ed273ec465
commit
b51d3e4862
36 changed files with 543 additions and 553 deletions
|
|
@ -329,11 +329,13 @@ spa_alsa_sink_node_port_set_format (SpaNode *node,
|
|||
this->params[0] = SPA_POD_BUILDER_DEREF (&b, f[0].ref, SpaAllocParam);
|
||||
|
||||
spa_pod_builder_object (&b, &f[0], 0, this->type.alloc_param_meta_enable.MetaEnable,
|
||||
PROP (&f[1], this->type.alloc_param_meta_enable.type, SPA_POD_TYPE_INT, SPA_META_TYPE_HEADER));
|
||||
PROP (&f[1], this->type.alloc_param_meta_enable.type, SPA_POD_TYPE_ID, this->type.meta.Header),
|
||||
PROP (&f[1], this->type.alloc_param_meta_enable.size, SPA_POD_TYPE_INT, sizeof (SpaMetaHeader)));
|
||||
this->params[1] = SPA_POD_BUILDER_DEREF (&b, f[0].ref, SpaAllocParam);
|
||||
|
||||
spa_pod_builder_object (&b, &f[0], 0, this->type.alloc_param_meta_enable.MetaEnable,
|
||||
PROP (&f[1], this->type.alloc_param_meta_enable.type, SPA_POD_TYPE_INT, SPA_META_TYPE_RINGBUFFER),
|
||||
PROP (&f[1], this->type.alloc_param_meta_enable.type, SPA_POD_TYPE_ID, this->type.meta.Ringbuffer),
|
||||
PROP (&f[1], this->type.alloc_param_meta_enable.size, SPA_POD_TYPE_INT, sizeof (SpaMetaRingbuffer)),
|
||||
PROP (&f[1], this->type.alloc_param_meta_enable.ringbufferSize, SPA_POD_TYPE_INT, this->period_frames * this->frame_size * 32),
|
||||
PROP (&f[1], this->type.alloc_param_meta_enable.ringbufferStride, SPA_POD_TYPE_INT, 0),
|
||||
PROP (&f[1], this->type.alloc_param_meta_enable.ringbufferBlocks, SPA_POD_TYPE_INT, 1),
|
||||
|
|
@ -444,23 +446,20 @@ spa_alsa_sink_node_port_use_buffers (SpaNode *node,
|
|||
|
||||
for (i = 0; i < n_buffers; i++) {
|
||||
SpaALSABuffer *b = &this->buffers[i];
|
||||
uint32_t type = buffers[i]->datas[0].type;
|
||||
|
||||
b->outbuf = buffers[i];
|
||||
b->outstanding = true;
|
||||
|
||||
b->h = spa_buffer_find_meta (b->outbuf, SPA_META_TYPE_HEADER);
|
||||
b->rb = spa_buffer_find_meta (b->outbuf, SPA_META_TYPE_RINGBUFFER);
|
||||
b->h = spa_buffer_find_meta (b->outbuf, this->type.meta.Header);
|
||||
b->rb = spa_buffer_find_meta (b->outbuf, this->type.meta.Ringbuffer);
|
||||
|
||||
switch (buffers[i]->datas[0].type) {
|
||||
case SPA_DATA_TYPE_MEMFD:
|
||||
case SPA_DATA_TYPE_DMABUF:
|
||||
case SPA_DATA_TYPE_MEMPTR:
|
||||
if (buffers[i]->datas[0].data == NULL) {
|
||||
spa_log_error (this->log, "alsa-source: need mapped memory");
|
||||
continue;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
if ((type == this->type.data.MemFd ||
|
||||
type == this->type.data.DmaBuf ||
|
||||
type == this->type.data.MemPtr) &&
|
||||
buffers[i]->datas[0].data == NULL) {
|
||||
spa_log_error (this->log, "alsa-source: need mapped memory");
|
||||
return SPA_RESULT_ERROR;
|
||||
}
|
||||
}
|
||||
this->n_buffers = n_buffers;
|
||||
|
|
|
|||
|
|
@ -376,7 +376,8 @@ spa_alsa_source_node_port_set_format (SpaNode *node,
|
|||
this->params[0] = SPA_POD_BUILDER_DEREF (&b, f[0].ref, SpaAllocParam);
|
||||
|
||||
spa_pod_builder_object (&b, &f[0], 0, this->type.alloc_param_meta_enable.MetaEnable,
|
||||
PROP (&f[1], this->type.alloc_param_meta_enable.type, SPA_POD_TYPE_INT, SPA_META_TYPE_HEADER));
|
||||
PROP (&f[1], this->type.alloc_param_meta_enable.type, SPA_POD_TYPE_ID, this->type.meta.Header),
|
||||
PROP (&f[1], this->type.alloc_param_meta_enable.size, SPA_POD_TYPE_INT, sizeof (SpaMetaHeader)));
|
||||
this->params[1] = SPA_POD_BUILDER_DEREF (&b, f[0].ref, SpaAllocParam);
|
||||
|
||||
this->info.extra = NULL;
|
||||
|
|
@ -482,22 +483,19 @@ spa_alsa_source_node_port_use_buffers (SpaNode *node,
|
|||
}
|
||||
for (i = 0; i < n_buffers; i++) {
|
||||
SpaALSABuffer *b = &this->buffers[i];
|
||||
SpaData *d = buffers[i]->datas;
|
||||
|
||||
b->outbuf = buffers[i];
|
||||
b->outstanding = false;
|
||||
|
||||
b->h = spa_buffer_find_meta (b->outbuf, SPA_META_TYPE_HEADER);
|
||||
b->h = spa_buffer_find_meta (b->outbuf, this->type.meta.Header);
|
||||
|
||||
switch (buffers[i]->datas[0].type) {
|
||||
case SPA_DATA_TYPE_MEMFD:
|
||||
case SPA_DATA_TYPE_DMABUF:
|
||||
case SPA_DATA_TYPE_MEMPTR:
|
||||
if (buffers[i]->datas[0].data == NULL) {
|
||||
spa_log_error (this->log, "alsa-source: need mapped memory");
|
||||
continue;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
if (!((d[0].type == this->type.data.MemFd ||
|
||||
d[0].type == this->type.data.DmaBuf ||
|
||||
d[0].type == this->type.data.MemPtr) &&
|
||||
d[0].data != NULL)) {
|
||||
spa_log_error (this->log, "alsa-source: need mapped memory");
|
||||
return SPA_RESULT_ERROR;
|
||||
}
|
||||
spa_list_insert (this->free.prev, &b->link);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -67,6 +67,8 @@ typedef struct {
|
|||
uint32_t prop_device_name;
|
||||
uint32_t prop_card_name;
|
||||
uint32_t prop_min_latency;
|
||||
SpaTypeMeta meta;
|
||||
SpaTypeData data;
|
||||
SpaTypeMediaType media_type;
|
||||
SpaTypeMediaSubtype media_subtype;
|
||||
SpaTypeMediaSubtypeAudio media_subtype_audio;
|
||||
|
|
@ -90,6 +92,8 @@ init_type (Type *type, SpaTypeMap *map)
|
|||
type->prop_card_name = spa_type_map_get_id (map, SPA_TYPE_PROPS__cardName);
|
||||
type->prop_min_latency = spa_type_map_get_id (map, SPA_TYPE_PROPS__minLatency);
|
||||
|
||||
spa_type_meta_map (map, &type->meta);
|
||||
spa_type_data_map (map, &type->data);
|
||||
spa_type_media_type_map (map, &type->media_type);
|
||||
spa_type_media_subtype_map (map, &type->media_subtype);
|
||||
spa_type_media_subtype_audio_map (map, &type->media_subtype_audio);
|
||||
|
|
|
|||
|
|
@ -62,6 +62,8 @@ typedef struct {
|
|||
SpaTypeFormatAudio format_audio;
|
||||
SpaTypeAudioFormat audio_format;
|
||||
SpaTypeCommandNode command_node;
|
||||
SpaTypeMeta meta;
|
||||
SpaTypeData data;
|
||||
} Type;
|
||||
|
||||
static inline void
|
||||
|
|
@ -74,6 +76,8 @@ init_type (Type *type, SpaTypeMap *map)
|
|||
spa_type_format_audio_map (map, &type->format_audio);
|
||||
spa_type_audio_format_map (map, &type->audio_format);
|
||||
spa_type_command_node_map (map, &type->command_node);
|
||||
spa_type_meta_map (map, &type->meta);
|
||||
spa_type_data_map (map, &type->data);
|
||||
}
|
||||
|
||||
struct _SpaAudioMixer {
|
||||
|
|
@ -477,19 +481,14 @@ spa_audiomixer_node_port_use_buffers (SpaNode *node,
|
|||
b = &port->buffers[i];
|
||||
b->outbuf = buffers[i];
|
||||
b->outstanding = direction == SPA_DIRECTION_INPUT ? true : false;
|
||||
b->h = spa_buffer_find_meta (buffers[i], SPA_META_TYPE_HEADER);
|
||||
b->h = spa_buffer_find_meta (buffers[i], this->type.meta.Header);
|
||||
|
||||
switch (d[0].type) {
|
||||
case SPA_DATA_TYPE_MEMPTR:
|
||||
case SPA_DATA_TYPE_MEMFD:
|
||||
case SPA_DATA_TYPE_DMABUF:
|
||||
if (d[0].data == NULL) {
|
||||
spa_log_error (this->log, "volume %p: invalid memory on buffer %p", this, buffers[i]);
|
||||
continue;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
if (!((d[0].type == this->type.data.MemPtr ||
|
||||
d[0].type == this->type.data.MemFd ||
|
||||
d[0].type == this->type.data.DmaBuf) &&
|
||||
d[0].data != NULL)) {
|
||||
spa_log_error (this->log, "volume %p: invalid memory on buffer %p", this, buffers[i]);
|
||||
return SPA_RESULT_ERROR;
|
||||
}
|
||||
if (!b->outstanding)
|
||||
spa_list_insert (port->queue.prev, &b->link);
|
||||
|
|
|
|||
|
|
@ -48,6 +48,8 @@ typedef struct {
|
|||
uint32_t prop_volume;
|
||||
uint32_t wave_sine;
|
||||
uint32_t wave_square;
|
||||
SpaTypeMeta meta;
|
||||
SpaTypeData data;
|
||||
SpaTypeMediaType media_type;
|
||||
SpaTypeMediaSubtype media_subtype;
|
||||
SpaTypeFormatAudio format_audio;
|
||||
|
|
@ -71,6 +73,8 @@ init_type (Type *type, SpaTypeMap *map)
|
|||
type->prop_volume = spa_type_map_get_id (map, SPA_TYPE_PROPS__volume);
|
||||
type->wave_sine = spa_type_map_get_id (map, SPA_TYPE_PROPS__waveType ":sine");
|
||||
type->wave_square = spa_type_map_get_id (map, SPA_TYPE_PROPS__waveType ":square");
|
||||
spa_type_meta_map (map, &type->meta);
|
||||
spa_type_data_map (map, &type->data);
|
||||
spa_type_media_type_map (map, &type->media_type);
|
||||
spa_type_media_subtype_map (map, &type->media_subtype);
|
||||
spa_type_format_audio_map (map, &type->format_audio);
|
||||
|
|
@ -618,7 +622,8 @@ spa_audiotestsrc_node_port_set_format (SpaNode *node,
|
|||
this->params[0] = SPA_POD_BUILDER_DEREF (&b, f[0].ref, SpaAllocParam);
|
||||
|
||||
spa_pod_builder_object (&b, &f[0], 0, this->type.alloc_param_meta_enable.MetaEnable,
|
||||
PROP (&f[1], this->type.alloc_param_meta_enable.type, SPA_POD_TYPE_INT, SPA_META_TYPE_HEADER));
|
||||
PROP (&f[1], this->type.alloc_param_meta_enable.type, SPA_POD_TYPE_ID, this->type.meta.Header),
|
||||
PROP (&f[1], this->type.alloc_param_meta_enable.size, SPA_POD_TYPE_INT, sizeof (SpaMetaHeader)));
|
||||
this->params[1] = SPA_POD_BUILDER_DEREF (&b, f[0].ref, SpaAllocParam);
|
||||
|
||||
this->info.extra = NULL;
|
||||
|
|
@ -725,20 +730,14 @@ spa_audiotestsrc_node_port_use_buffers (SpaNode *node,
|
|||
b = &this->buffers[i];
|
||||
b->outbuf = buffers[i];
|
||||
b->outstanding = false;
|
||||
b->h = spa_buffer_find_meta (buffers[i], SPA_META_TYPE_HEADER);
|
||||
b->rb = spa_buffer_find_meta (buffers[i], SPA_META_TYPE_RINGBUFFER);
|
||||
b->h = spa_buffer_find_meta (buffers[i], this->type.meta.Header);
|
||||
b->rb = spa_buffer_find_meta (buffers[i], this->type.meta.Ringbuffer);
|
||||
|
||||
switch (d[0].type) {
|
||||
case SPA_DATA_TYPE_MEMPTR:
|
||||
case SPA_DATA_TYPE_MEMFD:
|
||||
case SPA_DATA_TYPE_DMABUF:
|
||||
if (d[0].data == NULL) {
|
||||
spa_log_error (this->log, "audiotestsrc %p: invalid memory on buffer %p", this, buffers[i]);
|
||||
continue;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
if ((d[0].type == this->type.data.MemPtr ||
|
||||
d[0].type == this->type.data.MemFd ||
|
||||
d[0].type == this->type.data.DmaBuf) &&
|
||||
d[0].data == NULL) {
|
||||
spa_log_error (this->log, "audiotestsrc %p: invalid memory on buffer %p", this, buffers[i]);
|
||||
}
|
||||
spa_list_insert (this->empty.prev, &b->link);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -80,6 +80,8 @@ typedef struct {
|
|||
SpaTypeCommandNode command_node;
|
||||
SpaTypeAllocParamBuffers alloc_param_buffers;
|
||||
SpaTypeAllocParamMetaEnable alloc_param_meta_enable;
|
||||
SpaTypeMeta meta;
|
||||
SpaTypeData data;
|
||||
} Type;
|
||||
|
||||
static inline void
|
||||
|
|
@ -101,6 +103,8 @@ init_type (Type *type, SpaTypeMap *map)
|
|||
spa_type_command_node_map (map, &type->command_node);
|
||||
spa_type_alloc_param_buffers_map (map, &type->alloc_param_buffers);
|
||||
spa_type_alloc_param_meta_enable_map (map, &type->alloc_param_meta_enable);
|
||||
spa_type_meta_map (map, &type->meta);
|
||||
spa_type_data_map (map, &type->data);
|
||||
}
|
||||
|
||||
typedef struct {
|
||||
|
|
|
|||
|
|
@ -121,7 +121,7 @@ spa_v4l2_clear_buffers (SpaV4l2Source *this)
|
|||
munmap (b->outbuf->datas[0].data, b->outbuf->datas[0].maxsize);
|
||||
if (b->outbuf->datas[0].fd != -1)
|
||||
close (b->outbuf->datas[0].fd);
|
||||
b->outbuf->datas[0].type = SPA_DATA_TYPE_INVALID;
|
||||
b->outbuf->datas[0].type = SPA_ID_INVALID;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -916,7 +916,8 @@ spa_v4l2_set_format (SpaV4l2Source *this, SpaVideoInfo *format, bool try_only)
|
|||
state->params[0] = SPA_POD_BUILDER_DEREF (&b, f[0].ref, SpaAllocParam);
|
||||
|
||||
spa_pod_builder_object (&b, &f[0], 0, this->type.alloc_param_meta_enable.MetaEnable,
|
||||
PROP (&f[1], this->type.alloc_param_meta_enable.type, SPA_POD_TYPE_INT, SPA_META_TYPE_HEADER));
|
||||
PROP (&f[1], this->type.alloc_param_meta_enable.type, SPA_POD_TYPE_ID, this->type.meta.Header),
|
||||
PROP (&f[1], this->type.alloc_param_meta_enable.size, SPA_POD_TYPE_INT, sizeof (SpaMetaHeader)));
|
||||
state->params[1] = SPA_POD_BUILDER_DEREF (&b, f[0].ref, SpaAllocParam);
|
||||
|
||||
state->info.extra = NULL;
|
||||
|
|
@ -959,9 +960,9 @@ mmap_read (SpaV4l2Source *this)
|
|||
|
||||
b = &state->buffers[buf.index];
|
||||
if (b->h) {
|
||||
b->h->flags = SPA_BUFFER_FLAG_NONE;
|
||||
b->h->flags = 0;
|
||||
if (buf.flags & V4L2_BUF_FLAG_ERROR)
|
||||
b->h->flags |= SPA_BUFFER_FLAG_CORRUPTED;
|
||||
b->h->flags |= SPA_META_HEADER_FLAG_CORRUPTED;
|
||||
b->h->seq = buf.sequence;
|
||||
b->h->pts = pts;
|
||||
}
|
||||
|
|
@ -1007,17 +1008,19 @@ spa_v4l2_use_buffers (SpaV4l2Source *this, SpaBuffer **buffers, uint32_t n_buffe
|
|||
SpaData *d;
|
||||
|
||||
if (n_buffers > 0) {
|
||||
switch (buffers[0]->datas[0].type) {
|
||||
case SPA_DATA_TYPE_MEMPTR:
|
||||
case SPA_DATA_TYPE_MEMFD:
|
||||
state->memtype = V4L2_MEMORY_USERPTR;
|
||||
break;
|
||||
case SPA_DATA_TYPE_DMABUF:
|
||||
state->memtype = V4L2_MEMORY_DMABUF;
|
||||
break;
|
||||
default:
|
||||
spa_log_error (state->log, "v4l2: can't use buffers");
|
||||
return SPA_RESULT_ERROR;
|
||||
SpaData *d = buffers[0]->datas;
|
||||
|
||||
if ((d[0].type == this->type.data.MemPtr ||
|
||||
d[0].type == this->type.data.MemFd) &&
|
||||
d[0].data != NULL) {
|
||||
state->memtype = V4L2_MEMORY_USERPTR;
|
||||
}
|
||||
else if (d[0].type == this->type.data.DmaBuf) {
|
||||
state->memtype = V4L2_MEMORY_DMABUF;
|
||||
}
|
||||
else {
|
||||
spa_log_error (state->log, "v4l2: can't use buffers of type %d", d[0].type);
|
||||
return SPA_RESULT_ERROR;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -1043,7 +1046,7 @@ spa_v4l2_use_buffers (SpaV4l2Source *this, SpaBuffer **buffers, uint32_t n_buffe
|
|||
b->outbuf = buffers[i];
|
||||
b->outstanding = true;
|
||||
b->allocated = false;
|
||||
b->h = spa_buffer_find_meta (b->outbuf, SPA_META_TYPE_HEADER);
|
||||
b->h = spa_buffer_find_meta (b->outbuf, this->type.meta.Header);
|
||||
|
||||
spa_log_info (state->log, "v4l2: import buffer %p", buffers[i]);
|
||||
|
||||
|
|
@ -1057,21 +1060,14 @@ spa_v4l2_use_buffers (SpaV4l2Source *this, SpaBuffer **buffers, uint32_t n_buffe
|
|||
b->v4l2_buffer.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
|
||||
b->v4l2_buffer.memory = state->memtype;
|
||||
b->v4l2_buffer.index = i;
|
||||
switch (d[0].type) {
|
||||
case SPA_DATA_TYPE_MEMPTR:
|
||||
case SPA_DATA_TYPE_MEMFD:
|
||||
if (d[0].data == NULL) {
|
||||
spa_log_error (state->log, "v4l2: need mmaped memory");
|
||||
continue;
|
||||
}
|
||||
b->v4l2_buffer.m.userptr = (unsigned long) d[0].data;
|
||||
b->v4l2_buffer.length = d[0].maxsize;
|
||||
break;
|
||||
case SPA_DATA_TYPE_DMABUF:
|
||||
b->v4l2_buffer.m.fd = d[0].fd;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
|
||||
if (d[0].type == this->type.data.MemPtr ||
|
||||
d[0].type == this->type.data.MemFd) {
|
||||
b->v4l2_buffer.m.userptr = (unsigned long) d[0].data;
|
||||
b->v4l2_buffer.length = d[0].maxsize;
|
||||
}
|
||||
else if (d[0].type == this->type.data.DmaBuf) {
|
||||
b->v4l2_buffer.m.fd = d[0].fd;
|
||||
}
|
||||
spa_v4l2_buffer_recycle (this, buffers[i]->id);
|
||||
}
|
||||
|
|
@ -1126,7 +1122,7 @@ mmap_init (SpaV4l2Source *this,
|
|||
b->outbuf = buffers[i];
|
||||
b->outstanding = true;
|
||||
b->allocated = true;
|
||||
b->h = spa_buffer_find_meta (b->outbuf, SPA_META_TYPE_HEADER);
|
||||
b->h = spa_buffer_find_meta (b->outbuf, this->type.meta.Header);
|
||||
|
||||
CLEAR (b->v4l2_buffer);
|
||||
b->v4l2_buffer.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
|
||||
|
|
@ -1156,11 +1152,11 @@ mmap_init (SpaV4l2Source *this,
|
|||
perror("VIDIOC_EXPBUF");
|
||||
continue;
|
||||
}
|
||||
d[0].type = SPA_DATA_TYPE_DMABUF;
|
||||
d[0].type = this->type.data.DmaBuf;
|
||||
d[0].fd = expbuf.fd;
|
||||
d[0].data = NULL;
|
||||
} else {
|
||||
d[0].type = SPA_DATA_TYPE_MEMPTR;
|
||||
d[0].type = this->type.data.MemPtr;
|
||||
d[0].fd = -1;
|
||||
d[0].data = mmap (NULL,
|
||||
b->v4l2_buffer.length,
|
||||
|
|
|
|||
|
|
@ -46,6 +46,8 @@ typedef struct {
|
|||
uint32_t prop_pattern;
|
||||
uint32_t pattern_smpte_snow;
|
||||
uint32_t pattern_snow;
|
||||
SpaTypeMeta meta;
|
||||
SpaTypeData data;
|
||||
SpaTypeMediaType media_type;
|
||||
SpaTypeMediaSubtype media_subtype;
|
||||
SpaTypeFormatVideo format_video;
|
||||
|
|
@ -67,6 +69,8 @@ init_type (Type *type, SpaTypeMap *map)
|
|||
type->prop_pattern = spa_type_map_get_id (map, SPA_TYPE_PROPS__patternType);
|
||||
type->pattern_smpte_snow = spa_type_map_get_id (map, SPA_TYPE_PROPS__patternType ":smpte-snow");
|
||||
type->pattern_snow = spa_type_map_get_id (map, SPA_TYPE_PROPS__patternType ":snow");
|
||||
spa_type_meta_map (map, &type->meta);
|
||||
spa_type_data_map (map, &type->data);
|
||||
spa_type_media_type_map (map, &type->media_type);
|
||||
spa_type_media_subtype_map (map, &type->media_subtype);
|
||||
spa_type_format_video_map (map, &type->format_video);
|
||||
|
|
@ -581,7 +585,8 @@ spa_videotestsrc_node_port_set_format (SpaNode *node,
|
|||
this->params[0] = SPA_POD_BUILDER_DEREF (&b, f[0].ref, SpaAllocParam);
|
||||
|
||||
spa_pod_builder_object (&b, &f[0], 0, this->type.alloc_param_meta_enable.MetaEnable,
|
||||
PROP (&f[1], this->type.alloc_param_meta_enable.type, SPA_POD_TYPE_INT, SPA_META_TYPE_HEADER));
|
||||
PROP (&f[1], this->type.alloc_param_meta_enable.type, SPA_POD_TYPE_ID, this->type.meta.Header),
|
||||
PROP (&f[1], this->type.alloc_param_meta_enable.size, SPA_POD_TYPE_INT, sizeof (SpaMetaHeader)));
|
||||
this->params[1] = SPA_POD_BUILDER_DEREF (&b, f[0].ref, SpaAllocParam);
|
||||
|
||||
this->info.extra = NULL;
|
||||
|
|
@ -687,19 +692,13 @@ spa_videotestsrc_node_port_use_buffers (SpaNode *node,
|
|||
b = &this->buffers[i];
|
||||
b->outbuf = buffers[i];
|
||||
b->outstanding = false;
|
||||
b->h = spa_buffer_find_meta (buffers[i], SPA_META_TYPE_HEADER);
|
||||
b->h = spa_buffer_find_meta (buffers[i], this->type.meta.Header);
|
||||
|
||||
switch (d[0].type) {
|
||||
case SPA_DATA_TYPE_MEMPTR:
|
||||
case SPA_DATA_TYPE_MEMFD:
|
||||
case SPA_DATA_TYPE_DMABUF:
|
||||
if (d[0].data == NULL) {
|
||||
spa_log_error (this->log, "videotestsrc %p: invalid memory on buffer %p", this, buffers[i]);
|
||||
continue;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
if ((d[0].type == this->type.data.MemPtr ||
|
||||
d[0].type == this->type.data.MemFd ||
|
||||
d[0].type == this->type.data.DmaBuf) &&
|
||||
d[0].data == NULL) {
|
||||
spa_log_error (this->log, "videotestsrc %p: invalid memory on buffer %p", this, buffers[i]);
|
||||
}
|
||||
spa_list_insert (this->empty.prev, &b->link);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -66,6 +66,8 @@ typedef struct {
|
|||
uint32_t props;
|
||||
uint32_t prop_volume;
|
||||
uint32_t prop_mute;
|
||||
SpaTypeMeta meta;
|
||||
SpaTypeData data;
|
||||
SpaTypeMediaType media_type;
|
||||
SpaTypeMediaSubtype media_subtype;
|
||||
SpaTypeFormatAudio format_audio;
|
||||
|
|
@ -84,6 +86,8 @@ init_type (Type *type, SpaTypeMap *map)
|
|||
type->props = spa_type_map_get_id (map, SPA_TYPE__Props);
|
||||
type->prop_volume = spa_type_map_get_id (map, SPA_TYPE_PROPS__volume);
|
||||
type->prop_mute = spa_type_map_get_id (map, SPA_TYPE_PROPS__mute);
|
||||
spa_type_meta_map (map, &type->meta);
|
||||
spa_type_data_map (map, &type->data);
|
||||
spa_type_media_type_map (map, &type->media_type);
|
||||
spa_type_media_subtype_map (map, &type->media_subtype);
|
||||
spa_type_format_audio_map (map, &type->format_audio);
|
||||
|
|
@ -402,7 +406,8 @@ spa_volume_node_port_set_format (SpaNode *node,
|
|||
port->params[0] = SPA_POD_BUILDER_DEREF (&b, f[0].ref, SpaAllocParam);
|
||||
|
||||
spa_pod_builder_object (&b, &f[0], 0, this->type.alloc_param_meta_enable.MetaEnable,
|
||||
PROP (&f[1], this->type.alloc_param_meta_enable.type, SPA_POD_TYPE_INT, SPA_META_TYPE_HEADER));
|
||||
PROP (&f[1], this->type.alloc_param_meta_enable.type, SPA_POD_TYPE_ID, this->type.meta.Header),
|
||||
PROP (&f[1], this->type.alloc_param_meta_enable.size, SPA_POD_TYPE_INT, sizeof (SpaMetaHeader)));
|
||||
port->params[1] = SPA_POD_BUILDER_DEREF (&b, f[0].ref, SpaAllocParam);
|
||||
|
||||
port->info.extra = NULL;
|
||||
|
|
@ -508,21 +513,18 @@ spa_volume_node_port_use_buffers (SpaNode *node,
|
|||
b = &port->buffers[i];
|
||||
b->outbuf = buffers[i];
|
||||
b->outstanding = true;
|
||||
b->h = spa_buffer_find_meta (buffers[i], SPA_META_TYPE_HEADER);
|
||||
b->h = spa_buffer_find_meta (buffers[i], this->type.meta.Header);
|
||||
|
||||
switch (d[0].type) {
|
||||
case SPA_DATA_TYPE_MEMPTR:
|
||||
case SPA_DATA_TYPE_MEMFD:
|
||||
case SPA_DATA_TYPE_DMABUF:
|
||||
if (d[0].data == NULL) {
|
||||
spa_log_error (this->log, "volume %p: invalid memory on buffer %p", this, buffers[i]);
|
||||
continue;
|
||||
}
|
||||
b->ptr = d[0].data;
|
||||
b->size = d[0].maxsize;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
if ((d[0].type == this->type.data.MemPtr ||
|
||||
d[0].type == this->type.data.MemFd ||
|
||||
d[0].type == this->type.data.DmaBuf) &&
|
||||
d[0].data != NULL) {
|
||||
b->ptr = d[0].data;
|
||||
b->size = d[0].maxsize;
|
||||
}
|
||||
else {
|
||||
spa_log_error (this->log, "volume %p: invalid memory on buffer %p", this, buffers[i]);
|
||||
return SPA_RESULT_ERROR;
|
||||
}
|
||||
spa_list_insert (port->empty.prev, &b->link);
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue