mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-12-22 08:56:59 -05:00
Add new pod parser and builder
Add a new pod builder and parser that is less verbose and a little more powerful.
This commit is contained in:
parent
3e49aec61b
commit
24d80e5c00
54 changed files with 3616 additions and 2817 deletions
|
|
@ -177,12 +177,6 @@ static Uint32 id_to_sdl_format(struct data *data, uint32_t id)
|
|||
return SDL_PIXELFORMAT_UNKNOWN;
|
||||
}
|
||||
|
||||
#define PROP(f,key,type,...) \
|
||||
SPA_POD_PROP (f,key,0,type,1,__VA_ARGS__)
|
||||
#define PROP_U_MM(f,key,type,...) \
|
||||
SPA_POD_PROP (f,key,SPA_POD_PROP_FLAG_UNSET | \
|
||||
SPA_POD_PROP_RANGE_MIN_MAX,type,3,__VA_ARGS__)
|
||||
|
||||
static int impl_send_command(struct spa_node *node, const struct spa_command *command)
|
||||
{
|
||||
return SPA_RESULT_OK;
|
||||
|
|
@ -233,7 +227,6 @@ static int impl_port_enum_formats(struct spa_node *node, enum spa_direction dire
|
|||
uint32_t index)
|
||||
{
|
||||
struct data *d = SPA_CONTAINER_OF(node, struct data, impl_node);
|
||||
const struct spa_format *formats[1];
|
||||
struct spa_pod_builder b = SPA_POD_BUILDER_INIT(d->buffer, sizeof(d->buffer));
|
||||
struct spa_pod_frame f[2];
|
||||
SDL_RendererInfo info;
|
||||
|
|
@ -268,19 +261,18 @@ static int impl_port_enum_formats(struct spa_node *node, enum spa_direction dire
|
|||
}
|
||||
spa_pod_builder_pop(&b, &f[1]);
|
||||
spa_pod_builder_add(&b,
|
||||
PROP_U_MM(&f[1], d->type.format_video.size, SPA_POD_TYPE_RECTANGLE,
|
||||
WIDTH, HEIGHT,
|
||||
1, 1, info.max_texture_width, info.max_texture_height),
|
||||
PROP_U_MM(&f[1], d->type.format_video.framerate, SPA_POD_TYPE_FRACTION,
|
||||
25, 1,
|
||||
0, 1, 30, 1),
|
||||
0);
|
||||
":", d->type.format_video.size, "Rru", &SPA_RECTANGLE(WIDTH, HEIGHT),
|
||||
2, &SPA_RECTANGLE(1,1),
|
||||
&SPA_RECTANGLE(info.max_texture_width,
|
||||
info.max_texture_height),
|
||||
":", d->type.format_video.framerate, "Fru", &SPA_FRACTION(25,1),
|
||||
2, &SPA_FRACTION(0,1),
|
||||
&SPA_FRACTION(30,1),
|
||||
NULL);
|
||||
spa_pod_builder_pop(&b, &f[0]);
|
||||
formats[0] = SPA_POD_BUILDER_DEREF(&b, f[0].ref, struct spa_format);
|
||||
*format = SPA_POD_BUILDER_DEREF(&b, f[0].ref, struct spa_format);
|
||||
|
||||
spa_debug_format(formats[0]);
|
||||
|
||||
*format = (struct spa_format *)formats[0];
|
||||
spa_debug_format(*format);
|
||||
|
||||
return SPA_RESULT_OK;
|
||||
}
|
||||
|
|
@ -291,7 +283,6 @@ static int impl_port_set_format(struct spa_node *node, enum spa_direction direct
|
|||
struct data *d = SPA_CONTAINER_OF(node, struct data, impl_node);
|
||||
struct pw_type *t = d->t;
|
||||
struct spa_pod_builder b = { NULL };
|
||||
struct spa_pod_frame f[2];
|
||||
Uint32 sdl_format;
|
||||
void *dest;
|
||||
|
||||
|
|
@ -315,24 +306,18 @@ static int impl_port_set_format(struct spa_node *node, enum spa_direction direct
|
|||
SDL_UnlockTexture(d->texture);
|
||||
|
||||
spa_pod_builder_init(&b, d->params_buffer, sizeof(d->params_buffer));
|
||||
spa_pod_builder_object(&b, &f[0], 0, t->param_alloc_buffers.Buffers,
|
||||
PROP(&f[1], t->param_alloc_buffers.size, SPA_POD_TYPE_INT,
|
||||
d->stride * d->format.size.height),
|
||||
PROP(&f[1], t->param_alloc_buffers.stride, SPA_POD_TYPE_INT,
|
||||
d->stride),
|
||||
PROP_U_MM(&f[1], t->param_alloc_buffers.buffers, SPA_POD_TYPE_INT,
|
||||
32,
|
||||
2, 32),
|
||||
PROP(&f[1], t->param_alloc_buffers.align, SPA_POD_TYPE_INT,
|
||||
16));
|
||||
d->params[0] = SPA_POD_BUILDER_DEREF(&b, f[0].ref, struct spa_param);
|
||||
d->params[0] = spa_pod_builder_param(&b,
|
||||
t->param_alloc_buffers.Buffers,
|
||||
":", t->param_alloc_buffers.size, "i", d->stride * d->format.size.height,
|
||||
":", t->param_alloc_buffers.stride, "i", d->stride,
|
||||
":", t->param_alloc_buffers.buffers, "iru", 32,
|
||||
2, 2, 32,
|
||||
":", t->param_alloc_buffers.align, "i", 16);
|
||||
|
||||
spa_pod_builder_object(&b, &f[0], 0, t->param_alloc_meta_enable.MetaEnable,
|
||||
PROP(&f[1], t->param_alloc_meta_enable.type, SPA_POD_TYPE_ID,
|
||||
t->meta.Header),
|
||||
PROP(&f[1], t->param_alloc_meta_enable.size, SPA_POD_TYPE_INT,
|
||||
sizeof(struct spa_meta_header)));
|
||||
d->params[1] = SPA_POD_BUILDER_DEREF(&b, f[0].ref, struct spa_param);
|
||||
d->params[1] = spa_pod_builder_param(&b,
|
||||
t->param_alloc_meta_enable.MetaEnable,
|
||||
":", t->param_alloc_meta_enable.type, "I", t->meta.Header,
|
||||
":", t->param_alloc_meta_enable.size, "i", sizeof(struct spa_meta_header));
|
||||
|
||||
return SPA_RESULT_OK;
|
||||
}
|
||||
|
|
@ -342,18 +327,13 @@ static int impl_port_get_format(struct spa_node *node, enum spa_direction direct
|
|||
{
|
||||
struct data *d = SPA_CONTAINER_OF(node, struct data, impl_node);
|
||||
struct spa_pod_builder b = SPA_POD_BUILDER_INIT(d->buffer, sizeof(d->buffer));
|
||||
struct spa_pod_frame f[2];
|
||||
|
||||
spa_pod_builder_push_format(&b, &f[0], d->type.format,
|
||||
d->type.media_type.video,
|
||||
d->type.media_subtype.raw);
|
||||
spa_pod_builder_add(&b,
|
||||
PROP(&f[1], d->type.format_video.format, SPA_POD_TYPE_ID, d->format.format),
|
||||
PROP(&f[1], d->type.format_video.size, SPA_POD_TYPE_RECTANGLE, &d->format.size),
|
||||
PROP(&f[1], d->type.format_video.framerate, SPA_POD_TYPE_FRACTION, &d->format.framerate),
|
||||
0);
|
||||
spa_pod_builder_pop(&b, &f[0]);
|
||||
*format = SPA_POD_BUILDER_DEREF(&b, f[0].ref, struct spa_format);
|
||||
*format = spa_pod_builder_format(&b, d->type.format,
|
||||
d->type.media_type.video,
|
||||
d->type.media_subtype.raw,
|
||||
":", d->type.format_video.format, "I", d->format.format,
|
||||
":", d->type.format_video.size, "R", &d->format.size,
|
||||
":", d->type.format_video.framerate, "F", &d->format.framerate);
|
||||
|
||||
return SPA_RESULT_OK;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -98,12 +98,6 @@ struct data {
|
|||
double accumulator;
|
||||
};
|
||||
|
||||
#define PROP(f,key,type,...) \
|
||||
SPA_POD_PROP (f,key,0,type,1,__VA_ARGS__)
|
||||
#define PROP_U_MM(f,key,type,...) \
|
||||
SPA_POD_PROP (f,key,SPA_POD_PROP_FLAG_UNSET | \
|
||||
SPA_POD_PROP_RANGE_MIN_MAX,type,3,__VA_ARGS__)
|
||||
|
||||
static int impl_send_command(struct spa_node *node, const struct spa_command *command)
|
||||
{
|
||||
return SPA_RESULT_OK;
|
||||
|
|
@ -155,21 +149,15 @@ static int impl_port_enum_formats(struct spa_node *node, enum spa_direction dire
|
|||
{
|
||||
struct data *d = SPA_CONTAINER_OF(node, struct data, impl_node);
|
||||
struct spa_pod_builder b = SPA_POD_BUILDER_INIT(d->buffer, sizeof(d->buffer));
|
||||
struct spa_pod_frame f[2];
|
||||
|
||||
if (index != 0)
|
||||
return SPA_RESULT_ENUM_END;
|
||||
|
||||
spa_pod_builder_push_format(&b, &f[0], d->type.format,
|
||||
d->type.media_type.audio,
|
||||
d->type.media_subtype.raw);
|
||||
spa_pod_builder_add(&b,
|
||||
PROP(&f[1], d->type.format_audio.format, SPA_POD_TYPE_ID, d->type.audio_format.S16),
|
||||
PROP(&f[1], d->type.format_audio.channels, SPA_POD_TYPE_INT, 2),
|
||||
PROP(&f[1], d->type.format_audio.rate, SPA_POD_TYPE_INT, 44100),
|
||||
0);
|
||||
spa_pod_builder_pop(&b, &f[0]);
|
||||
*format = SPA_POD_BUILDER_DEREF(&b, f[0].ref, struct spa_format);
|
||||
*format = spa_pod_builder_format(&b, d->type.format,
|
||||
d->type.media_type.audio, d->type.media_subtype.raw,
|
||||
":", d->type.format_audio.format, "I", d->type.audio_format.S16,
|
||||
":", d->type.format_audio.channels, "i", 2,
|
||||
":", d->type.format_audio.rate, "i", 44100);
|
||||
|
||||
spa_debug_format(*format);
|
||||
|
||||
|
|
@ -182,31 +170,32 @@ static int impl_port_set_format(struct spa_node *node, enum spa_direction direct
|
|||
struct data *d = SPA_CONTAINER_OF(node, struct data, impl_node);
|
||||
struct pw_type *t = d->t;
|
||||
struct spa_pod_builder b = { NULL };
|
||||
struct spa_pod_frame f[2];
|
||||
|
||||
if (format == NULL)
|
||||
return SPA_RESULT_OK;
|
||||
|
||||
spa_debug_format(format);
|
||||
|
||||
spa_format_audio_raw_parse(format, &d->format, &d->type.format_audio);
|
||||
if (spa_format_audio_raw_parse(format, &d->format, &d->type.format_audio) < 0)
|
||||
return SPA_RESULT_INVALID_MEDIA_TYPE;
|
||||
|
||||
if (d->format.format != d->type.audio_format.S16)
|
||||
return SPA_RESULT_ERROR;
|
||||
|
||||
spa_pod_builder_init(&b, d->params_buffer, sizeof(d->params_buffer));
|
||||
spa_pod_builder_object(&b, &f[0], 0, t->param_alloc_buffers.Buffers,
|
||||
PROP_U_MM(&f[1], t->param_alloc_buffers.size, SPA_POD_TYPE_INT, 1024, 32, 4096),
|
||||
PROP (&f[1], t->param_alloc_buffers.stride, SPA_POD_TYPE_INT, 0),
|
||||
PROP_U_MM(&f[1], t->param_alloc_buffers.buffers, SPA_POD_TYPE_INT, 2, 2, 32),
|
||||
PROP (&f[1], t->param_alloc_buffers.align, SPA_POD_TYPE_INT, 16));
|
||||
d->params[0] = SPA_POD_BUILDER_DEREF(&b, f[0].ref, struct spa_param);
|
||||
d->params[0] = spa_pod_builder_param(&b,
|
||||
t->param_alloc_buffers.Buffers,
|
||||
":", t->param_alloc_buffers.size, "iru", 1024,
|
||||
2, 32, 4096,
|
||||
":", t->param_alloc_buffers.stride, "i", 0,
|
||||
":", t->param_alloc_buffers.buffers, "iru", 2,
|
||||
2, 2, 32,
|
||||
":", t->param_alloc_buffers.align, "i", 16);
|
||||
|
||||
spa_pod_builder_object(&b, &f[0], 0, t->param_alloc_meta_enable.MetaEnable,
|
||||
PROP(&f[1], t->param_alloc_meta_enable.type, SPA_POD_TYPE_ID, t->meta.Header),
|
||||
PROP(&f[1], t->param_alloc_meta_enable.size, SPA_POD_TYPE_INT,
|
||||
sizeof(struct spa_meta_header)));
|
||||
d->params[1] = SPA_POD_BUILDER_DEREF(&b, f[0].ref, struct spa_param);
|
||||
d->params[1] = spa_pod_builder_param(&b,
|
||||
t->param_alloc_meta_enable.MetaEnable,
|
||||
":", t->param_alloc_meta_enable.type, "I", t->meta.Header,
|
||||
":", t->param_alloc_meta_enable.size, "i", sizeof(struct spa_meta_header));
|
||||
|
||||
return SPA_RESULT_OK;
|
||||
}
|
||||
|
|
@ -216,18 +205,12 @@ static int impl_port_get_format(struct spa_node *node, enum spa_direction direct
|
|||
{
|
||||
struct data *d = SPA_CONTAINER_OF(node, struct data, impl_node);
|
||||
struct spa_pod_builder b = SPA_POD_BUILDER_INIT(d->buffer, sizeof(d->buffer));
|
||||
struct spa_pod_frame f[2];
|
||||
|
||||
spa_pod_builder_push_format(&b, &f[0], d->type.format,
|
||||
d->type.media_type.audio,
|
||||
d->type.media_subtype.raw);
|
||||
spa_pod_builder_add(&b,
|
||||
PROP(&f[1], d->type.format_audio.format, SPA_POD_TYPE_ID, d->format.format),
|
||||
PROP(&f[1], d->type.format_audio.channels, SPA_POD_TYPE_INT, d->format.channels),
|
||||
PROP(&f[1], d->type.format_audio.rate, SPA_POD_TYPE_INT, d->format.rate),
|
||||
0);
|
||||
spa_pod_builder_pop(&b, &f[0]);
|
||||
*format = SPA_POD_BUILDER_DEREF(&b, f[0].ref, struct spa_format);
|
||||
*format = spa_pod_builder_format(&b, d->type.format,
|
||||
d->type.media_type.audio, d->type.media_subtype.raw,
|
||||
":", d->type.format_audio.format, "I", d->format.format,
|
||||
":", d->type.format_audio.channels, "i", d->format.channels,
|
||||
":", d->type.format_audio.rate, "i", d->format.rate);
|
||||
|
||||
return SPA_RESULT_OK;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -177,12 +177,6 @@ static Uint32 id_to_sdl_format(struct data *data, uint32_t id)
|
|||
return SDL_PIXELFORMAT_UNKNOWN;
|
||||
}
|
||||
|
||||
#define PROP(f,key,type,...) \
|
||||
SPA_POD_PROP (f,key,0,type,1,__VA_ARGS__)
|
||||
#define PROP_U_MM(f,key,type,...) \
|
||||
SPA_POD_PROP (f,key,SPA_POD_PROP_FLAG_UNSET | \
|
||||
SPA_POD_PROP_RANGE_MIN_MAX,type,3,__VA_ARGS__)
|
||||
|
||||
static int impl_send_command(struct spa_node *node, const struct spa_command *command)
|
||||
{
|
||||
return SPA_RESULT_OK;
|
||||
|
|
@ -233,7 +227,6 @@ static int impl_port_enum_formats(struct spa_node *node, enum spa_direction dire
|
|||
uint32_t index)
|
||||
{
|
||||
struct data *d = SPA_CONTAINER_OF(node, struct data, impl_node);
|
||||
const struct spa_format *formats[1];
|
||||
struct spa_pod_builder b = SPA_POD_BUILDER_INIT(d->buffer, sizeof(d->buffer));
|
||||
struct spa_pod_frame f[2];
|
||||
SDL_RendererInfo info;
|
||||
|
|
@ -267,20 +260,20 @@ static int impl_port_enum_formats(struct spa_node *node, enum spa_direction dire
|
|||
spa_pod_builder_id(&b, id);
|
||||
}
|
||||
spa_pod_builder_pop(&b, &f[1]);
|
||||
|
||||
spa_pod_builder_add(&b,
|
||||
PROP_U_MM(&f[1], d->type.format_video.size, SPA_POD_TYPE_RECTANGLE,
|
||||
WIDTH, HEIGHT,
|
||||
1, 1, info.max_texture_width, info.max_texture_height),
|
||||
PROP_U_MM(&f[1], d->type.format_video.framerate, SPA_POD_TYPE_FRACTION,
|
||||
25, 1,
|
||||
0, 1, 30, 1),
|
||||
0);
|
||||
":", d->type.format_video.size, "Rru", &SPA_RECTANGLE(WIDTH, HEIGHT),
|
||||
2, &SPA_RECTANGLE(1,1),
|
||||
&SPA_RECTANGLE(info.max_texture_width,
|
||||
info.max_texture_height),
|
||||
":", d->type.format_video.framerate, "Fru", &SPA_FRACTION(25,1),
|
||||
2, &SPA_FRACTION(0,1),
|
||||
&SPA_FRACTION(30,1),
|
||||
NULL);
|
||||
spa_pod_builder_pop(&b, &f[0]);
|
||||
formats[0] = SPA_POD_BUILDER_DEREF(&b, f[0].ref, struct spa_format);
|
||||
*format = SPA_POD_BUILDER_DEREF(&b, f[0].ref, struct spa_format);
|
||||
|
||||
spa_debug_format(formats[0]);
|
||||
|
||||
*format = (struct spa_format *)formats[0];
|
||||
spa_debug_format(*format);
|
||||
|
||||
return SPA_RESULT_OK;
|
||||
}
|
||||
|
|
@ -291,7 +284,6 @@ static int impl_port_set_format(struct spa_node *node, enum spa_direction direct
|
|||
struct data *d = SPA_CONTAINER_OF(node, struct data, impl_node);
|
||||
struct pw_type *t = d->t;
|
||||
struct spa_pod_builder b = { NULL };
|
||||
struct spa_pod_frame f[2];
|
||||
Uint32 sdl_format;
|
||||
void *dest;
|
||||
|
||||
|
|
@ -316,24 +308,18 @@ static int impl_port_set_format(struct spa_node *node, enum spa_direction direct
|
|||
SDL_UnlockTexture(d->texture);
|
||||
|
||||
spa_pod_builder_init(&b, d->params_buffer, sizeof(d->params_buffer));
|
||||
spa_pod_builder_object(&b, &f[0], 0, t->param_alloc_buffers.Buffers,
|
||||
PROP(&f[1], t->param_alloc_buffers.size, SPA_POD_TYPE_INT,
|
||||
d->stride * d->format.size.height),
|
||||
PROP(&f[1], t->param_alloc_buffers.stride, SPA_POD_TYPE_INT,
|
||||
d->stride),
|
||||
PROP_U_MM(&f[1], t->param_alloc_buffers.buffers, SPA_POD_TYPE_INT,
|
||||
32,
|
||||
2, 32),
|
||||
PROP(&f[1], t->param_alloc_buffers.align, SPA_POD_TYPE_INT,
|
||||
16));
|
||||
d->params[0] = SPA_POD_BUILDER_DEREF(&b, f[0].ref, struct spa_param);
|
||||
d->params[0] = spa_pod_builder_param(&b,
|
||||
t->param_alloc_buffers.Buffers,
|
||||
":", t->param_alloc_buffers.size, "i", d->stride * d->format.size.height,
|
||||
":", t->param_alloc_buffers.stride, "i", d->stride,
|
||||
":", t->param_alloc_buffers.buffers, "iru", 2,
|
||||
2, 1, 32,
|
||||
":", t->param_alloc_buffers.align, "i", 16);
|
||||
|
||||
spa_pod_builder_object(&b, &f[0], 0, t->param_alloc_meta_enable.MetaEnable,
|
||||
PROP(&f[1], t->param_alloc_meta_enable.type, SPA_POD_TYPE_ID,
|
||||
t->meta.Header),
|
||||
PROP(&f[1], t->param_alloc_meta_enable.size, SPA_POD_TYPE_INT,
|
||||
sizeof(struct spa_meta_header)));
|
||||
d->params[1] = SPA_POD_BUILDER_DEREF(&b, f[0].ref, struct spa_param);
|
||||
d->params[1] = spa_pod_builder_param(&b,
|
||||
t->param_alloc_meta_enable.MetaEnable,
|
||||
":", t->param_alloc_meta_enable.type, "I", t->meta.Header,
|
||||
":", t->param_alloc_meta_enable.size, "i", sizeof(struct spa_meta_header));
|
||||
|
||||
return SPA_RESULT_OK;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -223,12 +223,6 @@ static Uint32 id_to_sdl_format(struct data *data, uint32_t id)
|
|||
return SDL_PIXELFORMAT_UNKNOWN;
|
||||
}
|
||||
|
||||
#define PROP(f,key,type,...) \
|
||||
SPA_POD_PROP (f,key,0,type,1,__VA_ARGS__)
|
||||
#define PROP_U_MM(f,key,type,...) \
|
||||
SPA_POD_PROP (f,key,SPA_POD_PROP_FLAG_UNSET | \
|
||||
SPA_POD_PROP_RANGE_MIN_MAX,type,3,__VA_ARGS__)
|
||||
|
||||
static void
|
||||
on_stream_format_changed(void *_data, struct spa_format *format)
|
||||
{
|
||||
|
|
@ -236,7 +230,6 @@ on_stream_format_changed(void *_data, struct spa_format *format)
|
|||
struct pw_stream *stream = data->stream;
|
||||
struct pw_type *t = data->t;
|
||||
struct spa_pod_builder b = { NULL };
|
||||
struct spa_pod_frame f[2];
|
||||
struct spa_param *params[2];
|
||||
Uint32 sdl_format;
|
||||
void *d;
|
||||
|
|
@ -265,24 +258,18 @@ on_stream_format_changed(void *_data, struct spa_format *format)
|
|||
SDL_UnlockTexture(data->texture);
|
||||
|
||||
spa_pod_builder_init(&b, data->params_buffer, sizeof(data->params_buffer));
|
||||
spa_pod_builder_object(&b, &f[0], 0, t->param_alloc_buffers.Buffers,
|
||||
PROP(&f[1], t->param_alloc_buffers.size, SPA_POD_TYPE_INT,
|
||||
data->stride * data->format.size.height),
|
||||
PROP(&f[1], t->param_alloc_buffers.stride, SPA_POD_TYPE_INT,
|
||||
data->stride),
|
||||
PROP_U_MM(&f[1], t->param_alloc_buffers.buffers, SPA_POD_TYPE_INT,
|
||||
32,
|
||||
2, 32),
|
||||
PROP(&f[1], t->param_alloc_buffers.align, SPA_POD_TYPE_INT,
|
||||
16));
|
||||
params[0] = SPA_POD_BUILDER_DEREF(&b, f[0].ref, struct spa_param);
|
||||
params[0] = spa_pod_builder_param(&b,
|
||||
t->param_alloc_buffers.Buffers,
|
||||
":", t->param_alloc_buffers.size, "i", data->stride * data->format.size.height,
|
||||
":", t->param_alloc_buffers.stride, "i", data->stride,
|
||||
":", t->param_alloc_buffers.buffers, "iru", 32,
|
||||
2, 2, 32,
|
||||
":", t->param_alloc_buffers.align, "i", 16);
|
||||
|
||||
spa_pod_builder_object(&b, &f[0], 0, t->param_alloc_meta_enable.MetaEnable,
|
||||
PROP(&f[1], t->param_alloc_meta_enable.type, SPA_POD_TYPE_ID,
|
||||
t->meta.Header),
|
||||
PROP(&f[1], t->param_alloc_meta_enable.size, SPA_POD_TYPE_INT,
|
||||
sizeof(struct spa_meta_header)));
|
||||
params[1] = SPA_POD_BUILDER_DEREF(&b, f[0].ref, struct spa_param);
|
||||
params[1] = spa_pod_builder_param(&b,
|
||||
t->param_alloc_meta_enable.MetaEnable,
|
||||
":", t->param_alloc_meta_enable.type, "I", t->meta.Header,
|
||||
":", t->param_alloc_meta_enable.size, "i", sizeof(struct spa_meta_header));
|
||||
|
||||
pw_stream_finish_format(stream, SPA_RESULT_OK, params, 2);
|
||||
}
|
||||
|
|
@ -344,13 +331,14 @@ static void on_state_changed(void *_data, enum pw_remote_state old, enum pw_remo
|
|||
}
|
||||
spa_pod_builder_pop(&b, &f[1]);
|
||||
spa_pod_builder_add(&b,
|
||||
PROP_U_MM(&f[1], data->type.format_video.size, SPA_POD_TYPE_RECTANGLE,
|
||||
WIDTH, HEIGHT,
|
||||
1, 1, info.max_texture_width, info.max_texture_height),
|
||||
PROP_U_MM(&f[1], data->type.format_video.framerate, SPA_POD_TYPE_FRACTION,
|
||||
25, 1,
|
||||
0, 1, 30, 1),
|
||||
0);
|
||||
":", data->type.format_video.size, "Rru", &SPA_RECTANGLE(WIDTH, HEIGHT),
|
||||
2, &SPA_RECTANGLE(1,1),
|
||||
&SPA_RECTANGLE(info.max_texture_width,
|
||||
info.max_texture_height),
|
||||
":", data->type.format_video.framerate, "Fru", &SPA_FRACTION(25,1),
|
||||
2, &SPA_RECTANGLE(0,1),
|
||||
&SPA_RECTANGLE(30,1),
|
||||
NULL);
|
||||
spa_pod_builder_pop(&b, &f[0]);
|
||||
formats[0] = SPA_POD_BUILDER_DEREF(&b, f[0].ref, struct spa_format);
|
||||
|
||||
|
|
|
|||
|
|
@ -165,12 +165,6 @@ static void on_stream_state_changed(void *_data, enum pw_stream_state old, enum
|
|||
}
|
||||
}
|
||||
|
||||
#define PROP(f,key,type,...) \
|
||||
SPA_POD_PROP (f,key,0,type,1,__VA_ARGS__)
|
||||
#define PROP_U_MM(f,key,type,...) \
|
||||
SPA_POD_PROP (f,key,SPA_POD_PROP_FLAG_UNSET | \
|
||||
SPA_POD_PROP_RANGE_MIN_MAX,type,3,__VA_ARGS__)
|
||||
|
||||
static void
|
||||
on_stream_format_changed(void *_data, struct spa_format *format)
|
||||
{
|
||||
|
|
@ -178,7 +172,6 @@ on_stream_format_changed(void *_data, struct spa_format *format)
|
|||
struct pw_stream *stream = data->stream;
|
||||
struct pw_type *t = data->t;
|
||||
struct spa_pod_builder b = { NULL };
|
||||
struct spa_pod_frame f[2];
|
||||
struct spa_param *params[2];
|
||||
|
||||
if (format == NULL) {
|
||||
|
|
@ -190,24 +183,18 @@ on_stream_format_changed(void *_data, struct spa_format *format)
|
|||
data->stride = SPA_ROUND_UP_N(data->format.size.width * BPP, 4);
|
||||
|
||||
spa_pod_builder_init(&b, data->params_buffer, sizeof(data->params_buffer));
|
||||
spa_pod_builder_object(&b, &f[0], 0, t->param_alloc_buffers.Buffers,
|
||||
PROP(&f[1], t->param_alloc_buffers.size, SPA_POD_TYPE_INT,
|
||||
data->stride * data->format.size.height),
|
||||
PROP(&f[1], t->param_alloc_buffers.stride, SPA_POD_TYPE_INT,
|
||||
data->stride),
|
||||
PROP_U_MM(&f[1], t->param_alloc_buffers.buffers, SPA_POD_TYPE_INT,
|
||||
32,
|
||||
2, 32),
|
||||
PROP(&f[1], t->param_alloc_buffers.align, SPA_POD_TYPE_INT,
|
||||
16));
|
||||
params[0] = SPA_POD_BUILDER_DEREF(&b, f[0].ref, struct spa_param);
|
||||
params[0] = spa_pod_builder_param(&b,
|
||||
t->param_alloc_buffers.Buffers,
|
||||
":", t->param_alloc_buffers.size, "i", data->stride * data->format.size.height,
|
||||
":", t->param_alloc_buffers.stride, "i", data->stride,
|
||||
":", t->param_alloc_buffers.buffers, "iru", 2,
|
||||
2, 1, 32,
|
||||
":", t->param_alloc_buffers.align, "i", 16);
|
||||
|
||||
spa_pod_builder_object(&b, &f[0], 0, t->param_alloc_meta_enable.MetaEnable,
|
||||
PROP(&f[1], t->param_alloc_meta_enable.type, SPA_POD_TYPE_ID,
|
||||
t->meta.Header),
|
||||
PROP(&f[1], t->param_alloc_meta_enable.size, SPA_POD_TYPE_INT,
|
||||
sizeof(struct spa_meta_header)));
|
||||
params[1] = SPA_POD_BUILDER_DEREF(&b, f[0].ref, struct spa_param);
|
||||
params[1] = spa_pod_builder_param(&b,
|
||||
t->param_alloc_meta_enable.MetaEnable,
|
||||
":", t->param_alloc_meta_enable.type, "I", t->meta.Header,
|
||||
":", t->param_alloc_meta_enable.size, "i", sizeof(struct spa_meta_header));
|
||||
|
||||
pw_stream_finish_format(stream, SPA_RESULT_OK, params, 2);
|
||||
}
|
||||
|
|
@ -234,24 +221,19 @@ static void on_state_changed(void *_data, enum pw_remote_state old, enum pw_remo
|
|||
const struct spa_format *formats[1];
|
||||
uint8_t buffer[1024];
|
||||
struct spa_pod_builder b = SPA_POD_BUILDER_INIT(buffer, sizeof(buffer));
|
||||
struct spa_pod_frame f[2];
|
||||
|
||||
printf("remote state: \"%s\"\n",
|
||||
pw_remote_state_as_string(state));
|
||||
|
||||
data->stream = pw_stream_new(remote, "video-src", NULL);
|
||||
|
||||
spa_pod_builder_format(&b, &f[0], data->type.format,
|
||||
data->type.media_type.video,
|
||||
data->type.media_subtype.raw,
|
||||
PROP(&f[1], data->type.format_video.format, SPA_POD_TYPE_ID,
|
||||
data->type.video_format.RGB),
|
||||
PROP_U_MM(&f[1], data->type.format_video.size, SPA_POD_TYPE_RECTANGLE,
|
||||
320, 240,
|
||||
1, 1, 4096, 4096),
|
||||
PROP(&f[1], data->type.format_video.framerate, SPA_POD_TYPE_FRACTION,
|
||||
25, 1));
|
||||
formats[0] = SPA_POD_BUILDER_DEREF(&b, f[0].ref, struct spa_format);
|
||||
formats[0] = spa_pod_builder_format(&b, data->type.format,
|
||||
data->type.media_type.video, data->type.media_subtype.raw,
|
||||
":", data->type.format_video.format, "I", data->type.video_format.RGB,
|
||||
":", data->type.format_video.size, "Rru", &SPA_RECTANGLE(320, 240),
|
||||
2, &SPA_RECTANGLE(1, 1),
|
||||
&SPA_RECTANGLE(4096, 4096),
|
||||
":", data->type.format_video.framerate, "F", &SPA_FRACTION(25, 1));
|
||||
|
||||
pw_stream_add_listener(data->stream,
|
||||
&data->stream_listener,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue