mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-10-31 22:25:38 -04:00
improve buffer import
Add generic pointer metadata type that is copied on import Pass array of pointers to SpaBuffers in use_buffers. Make sure we use the same data and metadata as the imported buffer.
This commit is contained in:
parent
c5a31acf8c
commit
4c7cee6b28
10 changed files with 120 additions and 110 deletions
|
|
@ -465,7 +465,7 @@ spa_alsa_sink_node_port_get_status (SpaHandle *handle,
|
|||
static SpaResult
|
||||
spa_alsa_sink_node_port_use_buffers (SpaHandle *handle,
|
||||
uint32_t port_id,
|
||||
SpaBuffer *buffers,
|
||||
SpaBuffer **buffers,
|
||||
uint32_t n_buffers)
|
||||
{
|
||||
return SPA_RESULT_NOT_IMPLEMENTED;
|
||||
|
|
|
|||
|
|
@ -431,7 +431,7 @@ spa_audiomixer_node_port_get_status (SpaHandle *handle,
|
|||
static SpaResult
|
||||
spa_audiomixer_node_port_use_buffers (SpaHandle *handle,
|
||||
uint32_t port_id,
|
||||
SpaBuffer *buffers,
|
||||
SpaBuffer **buffers,
|
||||
uint32_t n_buffers)
|
||||
{
|
||||
return SPA_RESULT_NOT_IMPLEMENTED;
|
||||
|
|
|
|||
|
|
@ -408,7 +408,7 @@ spa_audiotestsrc_node_port_get_status (SpaHandle *handle,
|
|||
static SpaResult
|
||||
spa_audiotestsrc_node_port_use_buffers (SpaHandle *handle,
|
||||
uint32_t port_id,
|
||||
SpaBuffer *buffers,
|
||||
SpaBuffer **buffers,
|
||||
uint32_t n_buffers)
|
||||
{
|
||||
return SPA_RESULT_NOT_IMPLEMENTED;
|
||||
|
|
|
|||
|
|
@ -54,8 +54,8 @@ struct _V4l2Buffer {
|
|||
SpaMetaHeader header;
|
||||
SpaData datas[1];
|
||||
SpaV4l2Source *source;
|
||||
bool outstanding;
|
||||
SpaBuffer *imported;
|
||||
bool outstanding;
|
||||
struct v4l2_buffer v4l2_buffer;
|
||||
V4l2Buffer *next;
|
||||
};
|
||||
|
|
@ -448,7 +448,7 @@ spa_v4l2_source_node_port_get_status (SpaHandle *handle,
|
|||
static SpaResult
|
||||
spa_v4l2_source_node_port_use_buffers (SpaHandle *handle,
|
||||
uint32_t port_id,
|
||||
SpaBuffer *buffers,
|
||||
SpaBuffer **buffers,
|
||||
uint32_t n_buffers)
|
||||
{
|
||||
SpaV4l2Source *this = (SpaV4l2Source *) handle;
|
||||
|
|
|
|||
|
|
@ -409,7 +409,7 @@ v4l2_buffer_free (void *data)
|
|||
}
|
||||
|
||||
static int
|
||||
spa_v4l2_import_buffers (SpaV4l2Source *this, SpaBuffer *buffers, uint32_t n_buffers)
|
||||
spa_v4l2_import_buffers (SpaV4l2Source *this, SpaBuffer **buffers, uint32_t n_buffers)
|
||||
{
|
||||
SpaV4l2State *state = &this->state[0];
|
||||
struct v4l2_requestbuffers reqbuf;
|
||||
|
|
@ -437,34 +437,24 @@ spa_v4l2_import_buffers (SpaV4l2Source *this, SpaBuffer *buffers, uint32_t n_buf
|
|||
V4l2Buffer *b;
|
||||
|
||||
b = &state->buffers[i];
|
||||
|
||||
b->source = this;
|
||||
b->buffer.refcount = 0;
|
||||
b->buffer.notify = v4l2_buffer_free;
|
||||
b->buffer.size = buffers[i].size;
|
||||
b->buffer.n_metas = 1;
|
||||
b->buffer.metas = b->metas;
|
||||
b->buffer.n_datas = 1;
|
||||
b->buffer.datas = b->datas;
|
||||
|
||||
b->header.flags = 0;
|
||||
b->header.seq = 0;
|
||||
b->header.pts = 0;
|
||||
b->header.dts_offset = 0;
|
||||
|
||||
b->metas[0].type = SPA_META_TYPE_HEADER;
|
||||
b->metas[0].data = &b->header;
|
||||
b->metas[0].size = sizeof (b->header);
|
||||
|
||||
b->datas[0] = buffers[i].datas[0];
|
||||
b->imported = &buffers[i];
|
||||
b->buffer.size = buffers[i]->size;
|
||||
b->buffer.n_metas = buffers[i]->n_metas;
|
||||
b->buffer.metas = buffers[i]->metas;
|
||||
b->buffer.n_datas = buffers[i]->n_datas;
|
||||
b->buffer.datas = buffers[i]->datas;
|
||||
b->imported = buffers[i];
|
||||
b->outstanding = true;
|
||||
|
||||
CLEAR (b->v4l2_buffer);
|
||||
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->datas[0].data;
|
||||
b->v4l2_buffer.length = b->datas[0].size;
|
||||
b->v4l2_buffer.m.userptr = (unsigned long) b->buffer.datas[0].data;
|
||||
b->v4l2_buffer.length = b->buffer.datas[0].size;
|
||||
|
||||
v4l2_buffer_free (b);
|
||||
}
|
||||
|
|
@ -543,7 +533,6 @@ mmap_init (SpaV4l2Source *this)
|
|||
b->datas[0].offset = 0;
|
||||
b->datas[0].size = buf.length;
|
||||
b->datas[0].stride = state->fmt.fmt.pix.bytesperline;
|
||||
b->imported = NULL;
|
||||
b->outstanding = true;
|
||||
|
||||
if (b->datas[0].data == MAP_FAILED) {
|
||||
|
|
|
|||
|
|
@ -389,7 +389,7 @@ spa_volume_node_port_get_status (SpaHandle *handle,
|
|||
static SpaResult
|
||||
spa_volume_node_port_use_buffers (SpaHandle *handle,
|
||||
uint32_t port_id,
|
||||
SpaBuffer *buffers,
|
||||
SpaBuffer **buffers,
|
||||
uint32_t n_buffers)
|
||||
{
|
||||
return SPA_RESULT_NOT_IMPLEMENTED;
|
||||
|
|
|
|||
|
|
@ -433,7 +433,7 @@ spa_xv_sink_node_port_get_status (SpaHandle *handle,
|
|||
static SpaResult
|
||||
spa_xv_sink_node_port_use_buffers (SpaHandle *handle,
|
||||
uint32_t port_id,
|
||||
SpaBuffer *buffers,
|
||||
SpaBuffer **buffers,
|
||||
uint32_t n_buffers)
|
||||
{
|
||||
return SPA_RESULT_NOT_IMPLEMENTED;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue