videoconvert: unmap buffer memory as well

Set a flag when we mmaped the buffer memory so that we can unmap it
again when clearing the buffers.
This commit is contained in:
Wim Taymans 2025-03-27 15:21:12 +01:00
parent abc03ec810
commit 9ceb4310f8

View file

@ -59,6 +59,7 @@ static void props_reset(struct props *props)
struct buffer { struct buffer {
uint32_t id; uint32_t id;
#define BUFFER_FLAG_QUEUED (1<<0) #define BUFFER_FLAG_QUEUED (1<<0)
#define BUFFER_FLAG_MAPPED (1<<1)
uint32_t flags; uint32_t flags;
struct spa_list link; struct spa_list link;
struct spa_buffer *buf; struct spa_buffer *buf;
@ -1329,11 +1330,26 @@ impl_node_port_enum_params(void *object, int seq,
static int clear_buffers(struct impl *this, struct port *port) static int clear_buffers(struct impl *this, struct port *port)
{ {
if (port->n_buffers > 0) { uint32_t i, j;
spa_log_debug(this->log, "%p: clear buffers %p", this, port);
port->n_buffers = 0; spa_log_debug(this->log, "%p: clear buffers %p %d", this, port, port->n_buffers);
spa_list_init(&port->queue); for (i = 0; i < port->n_buffers; i++) {
struct buffer *b = &port->buffers[i];
spa_log_debug(this->log, "%p: %d %p %d", this, i, b, b->flags);
if (SPA_FLAG_IS_SET(b->flags, BUFFER_FLAG_MAPPED)) {
for (j = 0; j < b->buf->n_datas; j++) {
if (b->datas[j]) {
spa_log_debug(this->log, "%p: unmap buffer %d data %d %p",
this, i, j, b->datas[j]);
munmap(b->datas[j], b->buf->datas[j].maxsize);
b->datas[j] = NULL;
}
}
SPA_FLAG_CLEAR(b->flags, BUFFER_FLAG_MAPPED);
}
} }
port->n_buffers = 0;
spa_list_init(&port->queue);
return 0; return 0;
} }
@ -1738,13 +1754,16 @@ impl_node_port_use_buffers(void *object,
this, j, i, d[j].type, data); this, j, i, d[j].type, data);
return -EINVAL; return -EINVAL;
} }
SPA_FLAG_SET(b->flags, BUFFER_FLAG_MAPPED);
spa_log_debug(this->log, "%p: mmap %d on buffer %d %d %p %p",
this, j, i, d[j].type, data, b);
} }
if (data != NULL && !SPA_IS_ALIGNED(data, this->max_align)) { if (data != NULL && !SPA_IS_ALIGNED(data, this->max_align)) {
spa_log_warn(this->log, "%p: memory %d on buffer %d not aligned", spa_log_warn(this->log, "%p: memory %d on buffer %d not aligned",
this, j, i); this, j, i);
} }
b->datas[j] = data; b->datas[j] = data;
spa_log_debug(this->log, "buffer %d: mem:%d mapped:%p maxsize:%d", spa_log_debug(this->log, "buffer %d: mem:%d data:%p maxsize:%d",
i, j, data, d[j].maxsize); i, j, data, d[j].maxsize);
maxsize = SPA_MAX(maxsize, d[j].maxsize); maxsize = SPA_MAX(maxsize, d[j].maxsize);
} }