mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-11-01 22:58:50 -04:00
work on memory references
Add a memory reference helper struct that we can use to track the memory in buffers and formats. Remove custom property get and set, the default ones will work fine. Custom ones are problematic when we want to serialize properties in formats etc. Deserialized Formats are now tracked in the memory pool and can be freed if needed.
This commit is contained in:
parent
8f9222bf9e
commit
dd1fbef28f
23 changed files with 166 additions and 138 deletions
|
|
@ -209,8 +209,6 @@ spa_audio_raw_format_init (SpaAudioRawFormat *format)
|
|||
format->format.media_subtype = SPA_MEDIA_SUBTYPE_RAW;
|
||||
format->format.props.n_prop_info = SPA_N_ELEMENTS (raw_format_prop_info);
|
||||
format->format.props.prop_info = raw_format_prop_info;
|
||||
format->format.props.set_prop = spa_props_generic_set_prop;
|
||||
format->format.props.get_prop = spa_props_generic_get_prop;
|
||||
format->unset_mask = (1 << 0) | (1 << 2) | (1 << 3) | (1 << 4);
|
||||
format->info = default_info;
|
||||
|
||||
|
|
@ -235,7 +233,7 @@ spa_audio_raw_format_parse (const SpaFormat *format,
|
|||
spa_audio_raw_format_init (rawformat);
|
||||
|
||||
props = &format->props;
|
||||
if ((res = props->get_prop (props, spa_props_index_for_id (props, SPA_PROP_ID_AUDIO_RAW_INFO), &value)) < 0)
|
||||
if ((res = spa_props_get_prop (props, spa_props_index_for_id (props, SPA_PROP_ID_AUDIO_RAW_INFO), &value)) < 0)
|
||||
goto fallback;
|
||||
|
||||
if (value.type != SPA_PROP_TYPE_POINTER || value.size != sizeof (SpaAudioRawInfo))
|
||||
|
|
|
|||
|
|
@ -348,16 +348,15 @@ iter_parse_set_format (struct stack_iter *si, SpaControlCmdSetFormat *cmd)
|
|||
unsigned int i, j;
|
||||
SpaPropInfo *pi;
|
||||
SpaPropRangeInfo *ri;
|
||||
SpaMemory *mem;
|
||||
|
||||
cmd->port_id = *p++;
|
||||
cmd->format = malloc (si->size - 4);
|
||||
memcpy (cmd->format, p, si->size - 4);
|
||||
mem = spa_memory_alloc_size (SPA_MEMORY_POOL_LOCAL, p, si->size - 4);
|
||||
cmd->format = spa_memory_ensure_ptr (mem);
|
||||
cmd->format->mem = mem->mem;
|
||||
|
||||
tp = (SpaProps *) &cmd->format->props;
|
||||
tp->prop_info = SPA_MEMBER (tp, SPA_PTR_TO_INT (tp->prop_info), SpaPropInfo);
|
||||
tp->set_prop = spa_props_generic_set_prop;
|
||||
tp->get_prop = spa_props_generic_get_prop;
|
||||
tp->priv = NULL;
|
||||
|
||||
/* now fix all the pointers */
|
||||
for (i = 0; i < tp->n_prop_info; i++) {
|
||||
|
|
@ -764,13 +763,10 @@ builder_add_set_format (struct stack_builder *sb, SpaControlCmdSetFormat *sf)
|
|||
|
||||
tp = SPA_MEMBER (tf, offsetof (SpaFormat, props), SpaProps);
|
||||
tp->n_prop_info = sp->n_prop_info;
|
||||
tp->prop_info = SPA_INT_TO_PTR (sizeof (SpaFormat) + sizeof (uint32_t));
|
||||
tp->set_prop = NULL;
|
||||
tp->get_prop = NULL;
|
||||
tp->priv = NULL;
|
||||
tp->prop_info = SPA_INT_TO_PTR (sizeof (SpaProps) + sizeof (uint32_t));
|
||||
|
||||
/* write propinfo array, adjust offset of mask */
|
||||
bpi = pi = (SpaPropInfo *) ((uint8_t *)tp + sizeof (SpaFormat) + sizeof (uint32_t));
|
||||
bpi = pi = (SpaPropInfo *) ((uint8_t *)tp + sizeof (SpaProps) + sizeof (uint32_t));
|
||||
for (i = 0; i < tp->n_prop_info; i++) {
|
||||
memcpy (pi, &sp->prop_info[i], sizeof (SpaPropInfo));
|
||||
pi->mask_offset = sizeof (SpaFormat);
|
||||
|
|
@ -781,7 +777,7 @@ builder_add_set_format (struct stack_builder *sb, SpaControlCmdSetFormat *sf)
|
|||
pi = bpi;
|
||||
/* write range info arrays, adjust offset to it */
|
||||
for (i = 0; i < tp->n_prop_info; i++) {
|
||||
pi->range_values = SPA_INT_TO_PTR (SPA_PTRDIFF (ri, tf));
|
||||
pi->range_values = SPA_INT_TO_PTR (SPA_PTRDIFF (ri, tp));
|
||||
for (j = 0; j < pi->n_range_values; j++) {
|
||||
memcpy (ri, &sp->prop_info[i].range_values[j], sizeof (SpaPropRangeInfo));
|
||||
ri++;
|
||||
|
|
@ -796,7 +792,7 @@ builder_add_set_format (struct stack_builder *sb, SpaControlCmdSetFormat *sf)
|
|||
if (pi->name) {
|
||||
slen = strlen (pi->name) + 1;
|
||||
memcpy (p, pi->name, slen);
|
||||
pi->name = SPA_INT_TO_PTR (SPA_PTRDIFF (p, tf));
|
||||
pi->name = SPA_INT_TO_PTR (SPA_PTRDIFF (p, tp));
|
||||
p += slen;
|
||||
} else {
|
||||
pi->name = 0;
|
||||
|
|
@ -804,14 +800,14 @@ builder_add_set_format (struct stack_builder *sb, SpaControlCmdSetFormat *sf)
|
|||
if (pi->description) {
|
||||
slen = strlen (pi->description) + 1;
|
||||
memcpy (p, pi->description, slen);
|
||||
pi->description = SPA_INT_TO_PTR (SPA_PTRDIFF (p, tf));
|
||||
pi->description = SPA_INT_TO_PTR (SPA_PTRDIFF (p, tp));
|
||||
p += slen;
|
||||
} else {
|
||||
pi->description = 0;
|
||||
}
|
||||
if (pi->default_value) {
|
||||
memcpy (p, pi->default_value, pi->default_size);
|
||||
pi->default_value = SPA_INT_TO_PTR (SPA_PTRDIFF (p, tf));
|
||||
pi->default_value = SPA_INT_TO_PTR (SPA_PTRDIFF (p, tp));
|
||||
p += pi->default_size;
|
||||
} else {
|
||||
pi->default_value = 0;
|
||||
|
|
@ -820,7 +816,7 @@ builder_add_set_format (struct stack_builder *sb, SpaControlCmdSetFormat *sf)
|
|||
if (ri->name) {
|
||||
slen = strlen (ri->name) + 1;
|
||||
memcpy (p, ri->name, slen);
|
||||
ri->name = SPA_INT_TO_PTR (SPA_PTRDIFF (p, tf));
|
||||
ri->name = SPA_INT_TO_PTR (SPA_PTRDIFF (p, tp));
|
||||
p += slen;
|
||||
} else {
|
||||
ri->name = 0;
|
||||
|
|
@ -828,14 +824,14 @@ builder_add_set_format (struct stack_builder *sb, SpaControlCmdSetFormat *sf)
|
|||
if (ri->description) {
|
||||
slen = strlen (ri->description) + 1;
|
||||
memcpy (p, ri->description, slen);
|
||||
ri->description = SPA_INT_TO_PTR (SPA_PTRDIFF (p, tf));
|
||||
ri->description = SPA_INT_TO_PTR (SPA_PTRDIFF (p, tp));
|
||||
p += slen;
|
||||
} else {
|
||||
ri->description = 0;
|
||||
}
|
||||
if (ri->size) {
|
||||
memcpy (p, ri->value, ri->size);
|
||||
ri->value = SPA_INT_TO_PTR (SPA_PTRDIFF (p, tf));
|
||||
ri->value = SPA_INT_TO_PTR (SPA_PTRDIFF (p, tp));
|
||||
p += ri->size;
|
||||
} else {
|
||||
ri->value = 0;
|
||||
|
|
@ -849,7 +845,7 @@ builder_add_set_format (struct stack_builder *sb, SpaControlCmdSetFormat *sf)
|
|||
for (i = 0; i < tp->n_prop_info; i++) {
|
||||
if (pi->offset) {
|
||||
memcpy (p, SPA_MEMBER (sp, pi->offset, void), pi->maxsize);
|
||||
pi->offset = SPA_PTRDIFF (p, tf);
|
||||
pi->offset = SPA_PTRDIFF (p, tp);
|
||||
p += pi->maxsize;
|
||||
} else {
|
||||
pi->offset = 0;
|
||||
|
|
|
|||
|
|
@ -335,7 +335,7 @@ spa_debug_props (const SpaProps *props, bool print_ranges)
|
|||
else
|
||||
fprintf (stderr, "None");
|
||||
|
||||
res = props->get_prop (props, i, &value);
|
||||
res = spa_props_get_prop (props, i, &value);
|
||||
|
||||
fprintf (stderr, ". Current: ");
|
||||
if (res == SPA_RESULT_OK)
|
||||
|
|
@ -407,7 +407,7 @@ spa_debug_format (const SpaFormat *format)
|
|||
SpaPropValue value;
|
||||
SpaResult res;
|
||||
|
||||
res = props->get_prop (props, i, &value);
|
||||
res = spa_props_get_prop (props, i, &value);
|
||||
|
||||
if (res == SPA_RESULT_PROPERTY_UNSET && info->flags & SPA_PROP_FLAG_OPTIONAL)
|
||||
continue;
|
||||
|
|
|
|||
|
|
@ -62,7 +62,8 @@ spa_memory_init (void)
|
|||
static bool initialized = false;
|
||||
|
||||
if (!initialized) {
|
||||
spa_memory_pool_init (&pools[0], 0);
|
||||
spa_memory_pool_init (&pools[0], SPA_MEMORY_POOL_SHARED);
|
||||
spa_memory_pool_init (&pools[1], SPA_MEMORY_POOL_LOCAL);
|
||||
initialized = true;
|
||||
}
|
||||
}
|
||||
|
|
@ -114,12 +115,31 @@ spa_memory_alloc (uint32_t pool_id)
|
|||
mem = &pool->memories[id];
|
||||
mem->refcount = 1;
|
||||
mem->notify = NULL;
|
||||
mem->fd = -1;
|
||||
mem->ptr = NULL;
|
||||
mem->mem.pool_id = pool_id;
|
||||
mem->mem.id = id;
|
||||
|
||||
return mem;
|
||||
}
|
||||
|
||||
SpaMemory *
|
||||
spa_memory_alloc_size (uint32_t pool_id, void *data, size_t size)
|
||||
{
|
||||
SpaMemory *mem;
|
||||
|
||||
if (!(mem = spa_memory_alloc (pool_id)))
|
||||
return NULL;
|
||||
|
||||
mem->flags = SPA_MEMORY_FLAG_READWRITE;
|
||||
mem->ptr = malloc (size);
|
||||
mem->size = size;
|
||||
if (data)
|
||||
memcpy (mem->ptr, data, size);
|
||||
|
||||
return mem;
|
||||
}
|
||||
|
||||
SpaMemory *
|
||||
spa_memory_alloc_with_fd (uint32_t pool_id, void *data, size_t size)
|
||||
{
|
||||
|
|
@ -151,13 +171,11 @@ spa_memory_alloc_with_fd (uint32_t pool_id, void *data, size_t size)
|
|||
}
|
||||
|
||||
mem->flags = SPA_MEMORY_FLAG_READWRITE;
|
||||
mem->ptr = NULL;
|
||||
mem->size = size;
|
||||
|
||||
return mem;
|
||||
}
|
||||
|
||||
|
||||
SpaMemory *
|
||||
spa_memory_import (SpaMemoryRef *ref)
|
||||
{
|
||||
|
|
@ -189,22 +207,56 @@ spa_memory_import (SpaMemoryRef *ref)
|
|||
mem->refcount = 1;
|
||||
mem->notify = NULL;
|
||||
mem->mem = *ref;
|
||||
mem->ptr = NULL;
|
||||
mem->fd = -1;
|
||||
}
|
||||
|
||||
return mem;
|
||||
}
|
||||
|
||||
SpaResult
|
||||
spa_memory_free (SpaMemoryRef *ref)
|
||||
spa_memory_ref (SpaMemoryRef *ref)
|
||||
{
|
||||
SpaMemory *mem;
|
||||
|
||||
if (!(mem = spa_memory_find (ref)))
|
||||
return SPA_RESULT_ERROR;
|
||||
|
||||
mem->refcount++;
|
||||
|
||||
return SPA_RESULT_OK;
|
||||
}
|
||||
|
||||
static void
|
||||
spa_memory_free (SpaMemory *mem)
|
||||
{
|
||||
SpaMemoryPool *pool;
|
||||
|
||||
if (ref == NULL || ref->pool_id >= MAX_POOLS || !pools[ref->pool_id].valid)
|
||||
return SPA_RESULT_INVALID_ARGUMENTS;
|
||||
|
||||
pool = &pools[ref->pool_id];
|
||||
pool->free_mem[pool->n_free] = ref->id;
|
||||
if (mem->fd != -1) {
|
||||
if (mem->ptr)
|
||||
munmap (mem->ptr, mem->size);
|
||||
close (mem->fd);
|
||||
}
|
||||
pool = &pools[mem->mem.pool_id];
|
||||
pool->free_mem[pool->n_free] = mem->mem.id;
|
||||
pool->n_free++;
|
||||
}
|
||||
|
||||
SpaResult
|
||||
spa_memory_unref (SpaMemoryRef *ref)
|
||||
{
|
||||
SpaMemory *mem;
|
||||
|
||||
if (!(mem = spa_memory_find (ref)))
|
||||
return SPA_RESULT_ERROR;
|
||||
|
||||
if (--mem->refcount == 0) {
|
||||
if (mem->notify)
|
||||
mem->notify (mem);
|
||||
|
||||
if (mem->refcount == 0)
|
||||
spa_memory_free (mem);
|
||||
}
|
||||
|
||||
return SPA_RESULT_OK;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -25,9 +25,9 @@
|
|||
#include <spa/props.h>
|
||||
|
||||
SpaResult
|
||||
spa_props_generic_set_prop (SpaProps *props,
|
||||
unsigned int index,
|
||||
const SpaPropValue *value)
|
||||
spa_props_set_prop (SpaProps *props,
|
||||
unsigned int index,
|
||||
const SpaPropValue *value)
|
||||
{
|
||||
const SpaPropInfo *info;
|
||||
|
||||
|
|
@ -56,9 +56,9 @@ spa_props_generic_set_prop (SpaProps *props,
|
|||
|
||||
|
||||
SpaResult
|
||||
spa_props_generic_get_prop (const SpaProps *props,
|
||||
unsigned int index,
|
||||
SpaPropValue *value)
|
||||
spa_props_get_prop (const SpaProps *props,
|
||||
unsigned int index,
|
||||
SpaPropValue *value)
|
||||
{
|
||||
const SpaPropInfo *info;
|
||||
|
||||
|
|
@ -100,7 +100,7 @@ spa_props_copy (const SpaProps *src,
|
|||
|
||||
if (!(info->flags & SPA_PROP_FLAG_WRITABLE))
|
||||
continue;
|
||||
if ((res = src->get_prop (src, spa_props_index_for_id (src, info->id), &value)) < 0)
|
||||
if ((res = spa_props_get_prop (src, spa_props_index_for_id (src, info->id), &value)) < 0)
|
||||
continue;
|
||||
if (value.type != info->type)
|
||||
return SPA_RESULT_WRONG_PROPERTY_TYPE;
|
||||
|
|
|
|||
|
|
@ -483,8 +483,6 @@ spa_video_raw_format_init (SpaVideoRawFormat *format)
|
|||
format->format.media_subtype = SPA_MEDIA_SUBTYPE_RAW;
|
||||
format->format.props.n_prop_info = SPA_N_ELEMENTS (raw_format_prop_info);
|
||||
format->format.props.prop_info = raw_format_prop_info;
|
||||
format->format.props.set_prop = spa_props_generic_set_prop;
|
||||
format->format.props.get_prop = spa_props_generic_get_prop;
|
||||
format->unset_mask = (1 << 14)-1;
|
||||
format->info = default_info;
|
||||
|
||||
|
|
@ -509,7 +507,7 @@ spa_video_raw_format_parse (const SpaFormat *format,
|
|||
spa_video_raw_format_init (rawformat);
|
||||
|
||||
props = &format->props;
|
||||
if ((res = props->get_prop (props, spa_props_index_for_id (props, SPA_PROP_ID_VIDEO_RAW_INFO), &value)) < 0)
|
||||
if ((res = spa_props_get_prop (props, spa_props_index_for_id (props, SPA_PROP_ID_VIDEO_RAW_INFO), &value)) < 0)
|
||||
goto fallback;
|
||||
|
||||
if (value.type != SPA_PROP_TYPE_POINTER || value.size != sizeof (SpaVideoRawInfo))
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue