mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-12-15 08:56:38 -05:00
meta: make safer find_meta_data function
This commit is contained in:
parent
33427b4cd3
commit
c98fbfe0a9
16 changed files with 59 additions and 32 deletions
|
|
@ -98,17 +98,25 @@ struct spa_buffer {
|
||||||
};
|
};
|
||||||
|
|
||||||
/** Find metadata in a buffer */
|
/** Find metadata in a buffer */
|
||||||
static inline void *spa_buffer_find_meta(struct spa_buffer *b, uint32_t type)
|
static inline struct spa_meta *spa_buffer_find_meta(const struct spa_buffer *b, uint32_t type)
|
||||||
{
|
{
|
||||||
uint32_t i;
|
uint32_t i;
|
||||||
|
|
||||||
for (i = 0; i < b->n_metas; i++)
|
for (i = 0; i < b->n_metas; i++)
|
||||||
if (b->metas[i].type == type)
|
if (b->metas[i].type == type)
|
||||||
return b->metas[i].data;
|
return &b->metas[i];
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline void *spa_buffer_find_meta_data(const struct spa_buffer *b, uint32_t type, size_t size)
|
||||||
|
{
|
||||||
|
struct spa_meta *m;
|
||||||
|
if ((m = spa_buffer_find_meta(b, type)) && m->size >= size)
|
||||||
|
return m->data;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
} /* extern "C" */
|
} /* extern "C" */
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
|
|
@ -50,6 +50,10 @@ struct spa_meta {
|
||||||
uint32_t size; /**< size of metadata */
|
uint32_t size; /**< size of metadata */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#define spa_meta_first(m) ((m)->data)
|
||||||
|
#define spa_meta_end(m) ((m)->data + (m)->size)
|
||||||
|
#define spa_meta_check(p,m) ((void*)(p) + sizeof(*p) <= spa_meta_end(m))
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Describes essential buffer header metadata such as flags and
|
* Describes essential buffer header metadata such as flags and
|
||||||
* timestamps.
|
* timestamps.
|
||||||
|
|
|
||||||
|
|
@ -494,7 +494,7 @@ impl_node_port_use_buffers(struct spa_node *node,
|
||||||
b->buf = buffers[i];
|
b->buf = buffers[i];
|
||||||
b->flags = BUFFER_FLAG_OUT;
|
b->flags = BUFFER_FLAG_OUT;
|
||||||
|
|
||||||
b->h = spa_buffer_find_meta(b->buf, this->type.meta.Header);
|
b->h = spa_buffer_find_meta_data(b->buf, this->type.meta.Header, sizeof(*b->h));
|
||||||
|
|
||||||
type = d[0].type;
|
type = d[0].type;
|
||||||
if ((type == this->type.data.MemFd ||
|
if ((type == this->type.data.MemFd ||
|
||||||
|
|
|
||||||
|
|
@ -515,7 +515,7 @@ impl_node_port_use_buffers(struct spa_node *node,
|
||||||
b->buf = buffers[i];
|
b->buf = buffers[i];
|
||||||
b->flags = 0;
|
b->flags = 0;
|
||||||
|
|
||||||
b->h = spa_buffer_find_meta(b->buf, this->type.meta.Header);
|
b->h = spa_buffer_find_meta_data(b->buf, this->type.meta.Header, sizeof(*b->h));
|
||||||
|
|
||||||
if (!((d[0].type == this->type.data.MemFd ||
|
if (!((d[0].type == this->type.data.MemFd ||
|
||||||
d[0].type == this->type.data.DmaBuf ||
|
d[0].type == this->type.data.DmaBuf ||
|
||||||
|
|
|
||||||
|
|
@ -651,7 +651,7 @@ impl_node_port_use_buffers(struct spa_node *node,
|
||||||
b = &port->buffers[i];
|
b = &port->buffers[i];
|
||||||
b->flags = 0;
|
b->flags = 0;
|
||||||
b->outbuf = buffers[i];
|
b->outbuf = buffers[i];
|
||||||
b->h = spa_buffer_find_meta(buffers[i], t->meta.Header);
|
b->h = spa_buffer_find_meta_data(buffers[i], t->meta.Header, sizeof(*b->h));
|
||||||
|
|
||||||
if (size == SPA_ID_INVALID)
|
if (size == SPA_ID_INVALID)
|
||||||
size = d[0].maxsize;
|
size = d[0].maxsize;
|
||||||
|
|
|
||||||
|
|
@ -807,7 +807,7 @@ impl_node_port_use_buffers(struct spa_node *node,
|
||||||
b = &port->buffers[i];
|
b = &port->buffers[i];
|
||||||
b->flags = 0;
|
b->flags = 0;
|
||||||
b->outbuf = buffers[i];
|
b->outbuf = buffers[i];
|
||||||
b->h = spa_buffer_find_meta(buffers[i], t->meta.Header);
|
b->h = spa_buffer_find_meta_data(buffers[i], t->meta.Header, sizeof(*b->h));
|
||||||
|
|
||||||
if (size == SPA_ID_INVALID)
|
if (size == SPA_ID_INVALID)
|
||||||
size = d[0].maxsize;
|
size = d[0].maxsize;
|
||||||
|
|
|
||||||
|
|
@ -617,7 +617,7 @@ impl_node_port_use_buffers(struct spa_node *node,
|
||||||
b = &port->buffers[i];
|
b = &port->buffers[i];
|
||||||
b->flags = 0;
|
b->flags = 0;
|
||||||
b->outbuf = buffers[i];
|
b->outbuf = buffers[i];
|
||||||
b->h = spa_buffer_find_meta(buffers[i], t->meta.Header);
|
b->h = spa_buffer_find_meta_data(buffers[i], t->meta.Header, sizeof(*b->h));
|
||||||
|
|
||||||
if (size == SPA_ID_INVALID)
|
if (size == SPA_ID_INVALID)
|
||||||
size = d[0].maxsize;
|
size = d[0].maxsize;
|
||||||
|
|
|
||||||
|
|
@ -709,7 +709,7 @@ impl_node_port_use_buffers(struct spa_node *node,
|
||||||
b = &port->buffers[i];
|
b = &port->buffers[i];
|
||||||
b->outbuf = buffers[i];
|
b->outbuf = buffers[i];
|
||||||
b->outstanding = (direction == SPA_DIRECTION_INPUT);
|
b->outstanding = (direction == SPA_DIRECTION_INPUT);
|
||||||
b->h = spa_buffer_find_meta(buffers[i], t->meta.Header);
|
b->h = spa_buffer_find_meta_data(buffers[i], t->meta.Header, sizeof(*b->h));
|
||||||
|
|
||||||
if (!((d[0].type == t->data.MemPtr ||
|
if (!((d[0].type == t->data.MemPtr ||
|
||||||
d[0].type == t->data.MemFd ||
|
d[0].type == t->data.MemFd ||
|
||||||
|
|
|
||||||
|
|
@ -870,6 +870,7 @@ impl_node_port_use_buffers(struct spa_node *node,
|
||||||
{
|
{
|
||||||
struct impl *this;
|
struct impl *this;
|
||||||
uint32_t i;
|
uint32_t i;
|
||||||
|
struct type *t;
|
||||||
|
|
||||||
spa_return_val_if_fail(node != NULL, -EINVAL);
|
spa_return_val_if_fail(node != NULL, -EINVAL);
|
||||||
|
|
||||||
|
|
@ -880,6 +881,8 @@ impl_node_port_use_buffers(struct spa_node *node,
|
||||||
if (!this->have_format)
|
if (!this->have_format)
|
||||||
return -EIO;
|
return -EIO;
|
||||||
|
|
||||||
|
t = &this->type;
|
||||||
|
|
||||||
clear_buffers(this);
|
clear_buffers(this);
|
||||||
|
|
||||||
for (i = 0; i < n_buffers; i++) {
|
for (i = 0; i < n_buffers; i++) {
|
||||||
|
|
@ -889,11 +892,11 @@ impl_node_port_use_buffers(struct spa_node *node,
|
||||||
b = &this->buffers[i];
|
b = &this->buffers[i];
|
||||||
b->outbuf = buffers[i];
|
b->outbuf = buffers[i];
|
||||||
b->outstanding = false;
|
b->outstanding = false;
|
||||||
b->h = spa_buffer_find_meta(buffers[i], this->type.meta.Header);
|
b->h = spa_buffer_find_meta_data(buffers[i], t->meta.Header, sizeof(*b->h));
|
||||||
|
|
||||||
if ((d[0].type == this->type.data.MemPtr ||
|
if ((d[0].type == t->data.MemPtr ||
|
||||||
d[0].type == this->type.data.MemFd ||
|
d[0].type == t->data.MemFd ||
|
||||||
d[0].type == this->type.data.DmaBuf) && d[0].data == NULL) {
|
d[0].type == t->data.DmaBuf) && d[0].data == NULL) {
|
||||||
spa_log_error(this->log, NAME " %p: invalid memory on buffer %p", this,
|
spa_log_error(this->log, NAME " %p: invalid memory on buffer %p", this,
|
||||||
buffers[i]);
|
buffers[i]);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
|
||||||
|
|
@ -1156,6 +1156,7 @@ impl_node_port_use_buffers(struct spa_node *node,
|
||||||
{
|
{
|
||||||
struct impl *this;
|
struct impl *this;
|
||||||
int i;
|
int i;
|
||||||
|
struct type *t;
|
||||||
|
|
||||||
spa_return_val_if_fail(node != NULL, -EINVAL);
|
spa_return_val_if_fail(node != NULL, -EINVAL);
|
||||||
|
|
||||||
|
|
@ -1168,6 +1169,8 @@ impl_node_port_use_buffers(struct spa_node *node,
|
||||||
if (!this->have_format)
|
if (!this->have_format)
|
||||||
return -EIO;
|
return -EIO;
|
||||||
|
|
||||||
|
t = &this->type;
|
||||||
|
|
||||||
clear_buffers(this);
|
clear_buffers(this);
|
||||||
|
|
||||||
for (i = 0; i < n_buffers; i++) {
|
for (i = 0; i < n_buffers; i++) {
|
||||||
|
|
@ -1177,12 +1180,12 @@ impl_node_port_use_buffers(struct spa_node *node,
|
||||||
b->buf = buffers[i];
|
b->buf = buffers[i];
|
||||||
b->outstanding = true;
|
b->outstanding = true;
|
||||||
|
|
||||||
b->h = spa_buffer_find_meta(b->buf, this->type.meta.Header);
|
b->h = spa_buffer_find_meta_data(buffers[i], t->meta.Header, sizeof(*b->h));
|
||||||
|
|
||||||
type = buffers[i]->datas[0].type;
|
type = buffers[i]->datas[0].type;
|
||||||
if ((type == this->type.data.MemFd ||
|
if ((type == t->data.MemFd ||
|
||||||
type == this->type.data.DmaBuf ||
|
type == t->data.DmaBuf ||
|
||||||
type == this->type.data.MemPtr) && buffers[i]->datas[0].data == NULL) {
|
type == t->data.MemPtr) && buffers[i]->datas[0].data == NULL) {
|
||||||
spa_log_error(this->log, NAME " %p: need mapped memory", this);
|
spa_log_error(this->log, NAME " %p: need mapped memory", this);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -608,6 +608,7 @@ impl_node_port_use_buffers(struct spa_node *node,
|
||||||
{
|
{
|
||||||
struct impl *this;
|
struct impl *this;
|
||||||
uint32_t i;
|
uint32_t i;
|
||||||
|
struct type *t;
|
||||||
|
|
||||||
spa_return_val_if_fail(node != NULL, -EINVAL);
|
spa_return_val_if_fail(node != NULL, -EINVAL);
|
||||||
|
|
||||||
|
|
@ -618,6 +619,8 @@ impl_node_port_use_buffers(struct spa_node *node,
|
||||||
if (!this->have_format)
|
if (!this->have_format)
|
||||||
return -EIO;
|
return -EIO;
|
||||||
|
|
||||||
|
t = &this->type;
|
||||||
|
|
||||||
clear_buffers(this);
|
clear_buffers(this);
|
||||||
|
|
||||||
for (i = 0; i < n_buffers; i++) {
|
for (i = 0; i < n_buffers; i++) {
|
||||||
|
|
@ -627,11 +630,11 @@ impl_node_port_use_buffers(struct spa_node *node,
|
||||||
b = &this->buffers[i];
|
b = &this->buffers[i];
|
||||||
b->outbuf = buffers[i];
|
b->outbuf = buffers[i];
|
||||||
b->outstanding = true;
|
b->outstanding = true;
|
||||||
b->h = spa_buffer_find_meta(buffers[i], this->type.meta.Header);
|
b->h = spa_buffer_find_meta_data(buffers[i], t->meta.Header, sizeof(*b->h));
|
||||||
|
|
||||||
if ((d[0].type == this->type.data.MemPtr ||
|
if ((d[0].type == t->data.MemPtr ||
|
||||||
d[0].type == this->type.data.MemFd ||
|
d[0].type == t->data.MemFd ||
|
||||||
d[0].type == this->type.data.DmaBuf) && d[0].data == NULL) {
|
d[0].type == t->data.DmaBuf) && d[0].data == NULL) {
|
||||||
spa_log_error(this->log, NAME " %p: invalid memory on buffer %p", this,
|
spa_log_error(this->log, NAME " %p: invalid memory on buffer %p", this,
|
||||||
buffers[i]);
|
buffers[i]);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -642,7 +642,7 @@ impl_node_port_use_buffers(struct spa_node *node,
|
||||||
b = &this->buffers[i];
|
b = &this->buffers[i];
|
||||||
b->outbuf = buffers[i];
|
b->outbuf = buffers[i];
|
||||||
b->outstanding = false;
|
b->outstanding = false;
|
||||||
b->h = spa_buffer_find_meta(buffers[i], this->type.meta.Header);
|
b->h = spa_buffer_find_meta_data(buffers[i], this->type.meta.Header, sizeof(*b->h));
|
||||||
|
|
||||||
if ((d[0].type == this->type.data.MemPtr ||
|
if ((d[0].type == this->type.data.MemPtr ||
|
||||||
d[0].type == this->type.data.MemFd ||
|
d[0].type == this->type.data.MemFd ||
|
||||||
|
|
|
||||||
|
|
@ -1252,7 +1252,7 @@ static int spa_v4l2_use_buffers(struct impl *this, struct spa_buffer **buffers,
|
||||||
b = &port->buffers[i];
|
b = &port->buffers[i];
|
||||||
b->outbuf = buffers[i];
|
b->outbuf = buffers[i];
|
||||||
b->flags = BUFFER_FLAG_OUTSTANDING;
|
b->flags = BUFFER_FLAG_OUTSTANDING;
|
||||||
b->h = spa_buffer_find_meta(b->outbuf, this->type.meta.Header);
|
b->h = spa_buffer_find_meta_data(buffers[i], this->type.meta.Header, sizeof(*b->h));
|
||||||
|
|
||||||
spa_log_info(port->log, "v4l2: import buffer %p", buffers[i]);
|
spa_log_info(port->log, "v4l2: import buffer %p", buffers[i]);
|
||||||
|
|
||||||
|
|
@ -1346,7 +1346,7 @@ mmap_init(struct impl *this,
|
||||||
b = &port->buffers[i];
|
b = &port->buffers[i];
|
||||||
b->outbuf = buffers[i];
|
b->outbuf = buffers[i];
|
||||||
b->flags = BUFFER_FLAG_OUTSTANDING;
|
b->flags = BUFFER_FLAG_OUTSTANDING;
|
||||||
b->h = spa_buffer_find_meta(b->outbuf, this->type.meta.Header);
|
b->h = spa_buffer_find_meta_data(buffers[i], this->type.meta.Header, sizeof(*b->h));
|
||||||
|
|
||||||
spa_zero(b->v4l2_buffer);
|
spa_zero(b->v4l2_buffer);
|
||||||
b->v4l2_buffer.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
|
b->v4l2_buffer.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
|
||||||
|
|
|
||||||
|
|
@ -727,6 +727,7 @@ impl_node_port_use_buffers(struct spa_node *node,
|
||||||
{
|
{
|
||||||
struct impl *this;
|
struct impl *this;
|
||||||
uint32_t i;
|
uint32_t i;
|
||||||
|
struct type *t;
|
||||||
|
|
||||||
spa_return_val_if_fail(node != NULL, -EINVAL);
|
spa_return_val_if_fail(node != NULL, -EINVAL);
|
||||||
|
|
||||||
|
|
@ -737,6 +738,8 @@ impl_node_port_use_buffers(struct spa_node *node,
|
||||||
if (!this->have_format)
|
if (!this->have_format)
|
||||||
return -EIO;
|
return -EIO;
|
||||||
|
|
||||||
|
t = &this->type;
|
||||||
|
|
||||||
clear_buffers(this);
|
clear_buffers(this);
|
||||||
|
|
||||||
for (i = 0; i < n_buffers; i++) {
|
for (i = 0; i < n_buffers; i++) {
|
||||||
|
|
@ -746,11 +749,11 @@ impl_node_port_use_buffers(struct spa_node *node,
|
||||||
b = &this->buffers[i];
|
b = &this->buffers[i];
|
||||||
b->outbuf = buffers[i];
|
b->outbuf = buffers[i];
|
||||||
b->outstanding = false;
|
b->outstanding = false;
|
||||||
b->h = spa_buffer_find_meta(buffers[i], this->type.meta.Header);
|
b->h = spa_buffer_find_meta_data(buffers[i], t->meta.Header, sizeof(*b->h));
|
||||||
|
|
||||||
if ((d[0].type == this->type.data.MemPtr ||
|
if ((d[0].type == t->data.MemPtr ||
|
||||||
d[0].type == this->type.data.MemFd ||
|
d[0].type == t->data.MemFd ||
|
||||||
d[0].type == this->type.data.DmaBuf) && d[0].data == NULL) {
|
d[0].type == t->data.DmaBuf) && d[0].data == NULL) {
|
||||||
spa_log_error(this->log, NAME " %p: invalid memory on buffer %p", this,
|
spa_log_error(this->log, NAME " %p: invalid memory on buffer %p", this,
|
||||||
buffers[i]);
|
buffers[i]);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
|
||||||
|
|
@ -610,6 +610,7 @@ impl_node_port_use_buffers(struct spa_node *node,
|
||||||
struct impl *this;
|
struct impl *this;
|
||||||
struct port *port;
|
struct port *port;
|
||||||
uint32_t i;
|
uint32_t i;
|
||||||
|
struct type *t;
|
||||||
|
|
||||||
spa_return_val_if_fail(node != NULL, -EINVAL);
|
spa_return_val_if_fail(node != NULL, -EINVAL);
|
||||||
|
|
||||||
|
|
@ -622,6 +623,8 @@ impl_node_port_use_buffers(struct spa_node *node,
|
||||||
if (!port->have_format)
|
if (!port->have_format)
|
||||||
return -EIO;
|
return -EIO;
|
||||||
|
|
||||||
|
t = &this->type;
|
||||||
|
|
||||||
clear_buffers(this, port);
|
clear_buffers(this, port);
|
||||||
|
|
||||||
for (i = 0; i < n_buffers; i++) {
|
for (i = 0; i < n_buffers; i++) {
|
||||||
|
|
@ -631,11 +634,11 @@ impl_node_port_use_buffers(struct spa_node *node,
|
||||||
b = &port->buffers[i];
|
b = &port->buffers[i];
|
||||||
b->outbuf = buffers[i];
|
b->outbuf = buffers[i];
|
||||||
b->outstanding = direction == SPA_DIRECTION_INPUT;
|
b->outstanding = direction == SPA_DIRECTION_INPUT;
|
||||||
b->h = spa_buffer_find_meta(buffers[i], this->type.meta.Header);
|
b->h = spa_buffer_find_meta_data(buffers[i], t->meta.Header, sizeof(*b->h));
|
||||||
|
|
||||||
if ((d[0].type == this->type.data.MemPtr ||
|
if ((d[0].type == t->data.MemPtr ||
|
||||||
d[0].type == this->type.data.MemFd ||
|
d[0].type == t->data.MemFd ||
|
||||||
d[0].type == this->type.data.DmaBuf) && d[0].data != NULL) {
|
d[0].type == t->data.DmaBuf) && d[0].data != NULL) {
|
||||||
b->ptr = d[0].data;
|
b->ptr = d[0].data;
|
||||||
b->size = d[0].maxsize;
|
b->size = d[0].maxsize;
|
||||||
} else {
|
} else {
|
||||||
|
|
|
||||||
|
|
@ -107,7 +107,7 @@ void gst_pipewire_pool_wrap_buffer (GstPipeWirePool *pool, struct pw_buffer *b)
|
||||||
|
|
||||||
data->pool = gst_object_ref (pool);
|
data->pool = gst_object_ref (pool);
|
||||||
data->owner = NULL;
|
data->owner = NULL;
|
||||||
data->header = spa_buffer_find_meta (b->buffer, t->meta.Header);
|
data->header = spa_buffer_find_meta_data (b->buffer, t->meta.Header, sizeof(*data->header));
|
||||||
data->flags = GST_BUFFER_FLAGS (buf);
|
data->flags = GST_BUFFER_FLAGS (buf);
|
||||||
data->b = b;
|
data->b = b;
|
||||||
data->buf = buf;
|
data->buf = buf;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue