mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-11-01 22:58:50 -04:00
clean up pod_builder
Remove the frame argument from the builder, we can use the builder allocated frames. Add deref function to builder to make it more flexible later. Add some more recursion depth checks in the parser. Improve props filter, also filter other types.
This commit is contained in:
parent
30a4651c51
commit
cc47fb7e3a
31 changed files with 246 additions and 218 deletions
|
|
@ -386,20 +386,25 @@ static int negotiate_formats(struct data *data)
|
|||
|
||||
ref = b.offset;
|
||||
|
||||
spa_debug_pod(&filter->pod, 0);
|
||||
|
||||
spa_log_debug(&default_log.log, "enum_params");
|
||||
if ((res = spa_node_port_enum_params(data->sink,
|
||||
SPA_DIRECTION_INPUT, 0,
|
||||
data->type.param.idEnumFormat, &state,
|
||||
filter, &b)) < 0)
|
||||
return res;
|
||||
|
||||
format = SPA_POD_BUILDER_DEREF(&b, ref, struct spa_pod_object);
|
||||
|
||||
format = spa_pod_builder_deref(&b, ref);
|
||||
spa_debug_pod(&format->pod, 0);
|
||||
|
||||
spa_log_debug(&default_log.log, "sink set_param");
|
||||
if ((res = spa_node_port_set_param(data->sink,
|
||||
SPA_DIRECTION_INPUT, 0,
|
||||
data->type.param.idFormat, 0, format)) < 0)
|
||||
return res;
|
||||
|
||||
spa_log_debug(&default_log.log, "volume set_param");
|
||||
if ((res = spa_node_port_set_param(data->volume,
|
||||
SPA_DIRECTION_OUTPUT, 0,
|
||||
data->type.param.idFormat, 0, format)) < 0)
|
||||
|
|
|
|||
|
|
@ -475,7 +475,7 @@ static int negotiate_formats(struct data *data)
|
|||
filter, &b)) < 0)
|
||||
return res;
|
||||
|
||||
format = SPA_POD_BUILDER_DEREF(&b, ref, struct spa_pod_object);
|
||||
format = spa_pod_builder_deref(&b, ref);
|
||||
|
||||
if ((res = spa_node_port_set_param(data->sink,
|
||||
SPA_DIRECTION_INPUT, 0,
|
||||
|
|
|
|||
|
|
@ -278,7 +278,6 @@ static void do_static_struct(struct spa_type_map *map)
|
|||
int main(int argc, char *argv[])
|
||||
{
|
||||
struct spa_pod_builder b = { NULL, };
|
||||
struct spa_pod_frame f[2];
|
||||
uint8_t buffer[1024];
|
||||
struct spa_pod_object *fmt;
|
||||
struct spa_type_map *map = &default_map.map;
|
||||
|
|
@ -288,36 +287,35 @@ int main(int argc, char *argv[])
|
|||
|
||||
spa_pod_builder_init(&b, buffer, sizeof(buffer));
|
||||
|
||||
fmt = SPA_MEMBER(buffer, spa_pod_builder_push_object(&b, &f[0], 0, type.format),
|
||||
struct spa_pod_object);
|
||||
spa_pod_builder_push_object(&b, 0, type.format);
|
||||
|
||||
spa_pod_builder_id(&b, type.media_type.video);
|
||||
spa_pod_builder_id(&b, type.media_subtype.raw);
|
||||
|
||||
spa_pod_builder_push_prop(&b, &f[1], type.format_video.format,
|
||||
spa_pod_builder_push_prop(&b, type.format_video.format,
|
||||
SPA_POD_PROP_RANGE_ENUM | SPA_POD_PROP_FLAG_UNSET);
|
||||
spa_pod_builder_id(&b, type.video_format.I420);
|
||||
spa_pod_builder_id(&b, type.video_format.I420);
|
||||
spa_pod_builder_id(&b, type.video_format.YUY2);
|
||||
spa_pod_builder_pop(&b, &f[1]);
|
||||
spa_pod_builder_pop(&b);
|
||||
|
||||
struct spa_rectangle size_min_max[] = { {1, 1}, {INT32_MAX, INT32_MAX} };
|
||||
spa_pod_builder_push_prop(&b, &f[1],
|
||||
spa_pod_builder_push_prop(&b,
|
||||
type.format_video.size,
|
||||
SPA_POD_PROP_RANGE_MIN_MAX | SPA_POD_PROP_FLAG_UNSET);
|
||||
spa_pod_builder_rectangle(&b, 320, 240);
|
||||
spa_pod_builder_raw(&b, size_min_max, sizeof(size_min_max));
|
||||
spa_pod_builder_pop(&b, &f[1]);
|
||||
spa_pod_builder_pop(&b);
|
||||
|
||||
struct spa_fraction rate_min_max[] = { {0, 1}, {INT32_MAX, 1} };
|
||||
spa_pod_builder_push_prop(&b, &f[1],
|
||||
spa_pod_builder_push_prop(&b,
|
||||
type.format_video.framerate,
|
||||
SPA_POD_PROP_RANGE_MIN_MAX | SPA_POD_PROP_FLAG_UNSET);
|
||||
spa_pod_builder_fraction(&b, 25, 1);
|
||||
spa_pod_builder_raw(&b, rate_min_max, sizeof(rate_min_max));
|
||||
spa_pod_builder_pop(&b, &f[1]);
|
||||
spa_pod_builder_pop(&b);
|
||||
|
||||
spa_pod_builder_pop(&b, &f[0]);
|
||||
fmt = spa_pod_builder_pop_deref(&b);
|
||||
|
||||
spa_debug_pod(&fmt->pod, 0);
|
||||
|
||||
|
|
|
|||
|
|
@ -39,8 +39,8 @@ static SPA_TYPE_MAP_IMPL(default_map, 4096);
|
|||
int main(int argc, char *argv[])
|
||||
{
|
||||
struct spa_pod_builder b = { NULL, };
|
||||
struct spa_pod_frame frame[4];
|
||||
uint8_t buffer[1024];
|
||||
uint32_t ref;
|
||||
struct spa_pod *obj;
|
||||
struct spa_pod_parser prs;
|
||||
struct spa_type_map *map = &default_map.map;
|
||||
|
|
@ -50,28 +50,28 @@ int main(int argc, char *argv[])
|
|||
b.data = buffer;
|
||||
b.size = 1024;
|
||||
|
||||
spa_pod_builder_push_object(&b, &frame[0], 0, 0);
|
||||
spa_pod_builder_push_object(&b, 0, 0);
|
||||
|
||||
uint32_t formats[] = { 1, 2 };
|
||||
spa_pod_builder_push_prop(&b, &frame[1], 1, SPA_POD_PROP_RANGE_ENUM);
|
||||
spa_pod_builder_push_prop(&b, 1, SPA_POD_PROP_RANGE_ENUM);
|
||||
spa_pod_builder_int(&b, 1);
|
||||
spa_pod_builder_int(&b, formats[0]);
|
||||
spa_pod_builder_int(&b, formats[1]);
|
||||
spa_pod_builder_pop(&b, &frame[1]);
|
||||
spa_pod_builder_pop(&b);
|
||||
|
||||
spa_pod_builder_push_prop(&b, &frame[1], 2, 0);
|
||||
spa_pod_builder_push_prop(&b, 2, 0);
|
||||
spa_pod_builder_int(&b, 42);
|
||||
spa_pod_builder_pop(&b, &frame[1]);
|
||||
spa_pod_builder_pop(&b);
|
||||
|
||||
struct spa_rectangle sizes[] = { {0, 0}, {1024, 1024} };
|
||||
spa_pod_builder_push_prop(&b, &frame[1],
|
||||
spa_pod_builder_push_prop(&b,
|
||||
3, SPA_POD_PROP_RANGE_MIN_MAX | SPA_POD_PROP_FLAG_UNSET);
|
||||
spa_pod_builder_rectangle(&b, 320, 240);
|
||||
spa_pod_builder_raw(&b, sizes, sizeof(sizes));
|
||||
spa_pod_builder_pop(&b, &frame[1]);
|
||||
spa_pod_builder_pop(&b);
|
||||
|
||||
spa_pod_builder_push_prop(&b, &frame[1], 4, SPA_POD_PROP_FLAG_READONLY);
|
||||
spa_pod_builder_push_struct(&b, &frame[2]);
|
||||
spa_pod_builder_push_prop(&b, 4, SPA_POD_PROP_FLAG_READONLY);
|
||||
ref = spa_pod_builder_push_struct(&b);
|
||||
spa_pod_builder_int(&b, 4);
|
||||
spa_pod_builder_long(&b, 6000);
|
||||
spa_pod_builder_float(&b, 4.0);
|
||||
|
|
@ -79,23 +79,22 @@ int main(int argc, char *argv[])
|
|||
spa_pod_builder_string(&b, "test123");
|
||||
spa_pod_builder_rectangle(&b, 320, 240);
|
||||
spa_pod_builder_fraction(&b, 25, 1);
|
||||
spa_pod_builder_push_array(&b, &frame[3]);
|
||||
spa_pod_builder_push_array(&b);
|
||||
spa_pod_builder_int(&b, 4);
|
||||
spa_pod_builder_int(&b, 5);
|
||||
spa_pod_builder_int(&b, 6);
|
||||
spa_pod_builder_pop(&b, &frame[3]);
|
||||
spa_pod_builder_pop(&b, &frame[2]);
|
||||
spa_pod_builder_pop(&b, &frame[1]);
|
||||
spa_pod_builder_pop(&b, &frame[0]);
|
||||
spa_pod_builder_pop(&b);
|
||||
spa_pod_builder_pop(&b);
|
||||
spa_pod_builder_pop(&b);
|
||||
obj = spa_pod_builder_pop_deref(&b);
|
||||
|
||||
obj = SPA_POD_BUILDER_DEREF(&b, frame[0].ref, struct spa_pod);
|
||||
spa_debug_pod(obj, 0);
|
||||
|
||||
struct spa_pod_prop *p = spa_pod_object_find_prop((struct spa_pod_object *) obj, 4);
|
||||
printf("%d %d\n", p->body.key, p->body.flags);
|
||||
spa_debug_pod(&p->body.value, 0);
|
||||
|
||||
obj = SPA_POD_BUILDER_DEREF(&b, frame[2].ref, struct spa_pod);
|
||||
obj = spa_pod_builder_deref(&b, ref);
|
||||
|
||||
int32_t vi, *pi;
|
||||
int64_t vl;
|
||||
|
|
|
|||
|
|
@ -64,11 +64,11 @@
|
|||
*/
|
||||
#endif
|
||||
|
||||
#define SPA_POD_MAX_LEVEL 16
|
||||
#define SPA_POD_MAX_DEPTH 16
|
||||
|
||||
struct spa_pod_maker {
|
||||
struct spa_pod_builder b;
|
||||
struct spa_pod_frame frame[SPA_POD_MAX_LEVEL];
|
||||
struct spa_pod_frame frame[SPA_POD_MAX_DEPTH];
|
||||
int depth;
|
||||
};
|
||||
|
||||
|
|
@ -392,7 +392,7 @@ static inline int
|
|||
spa_pod_match(struct spa_pod *pod,
|
||||
const char *templ, ...)
|
||||
{
|
||||
struct spa_pod_iter it[SPA_POD_MAX_LEVEL];
|
||||
struct spa_pod_iter it[SPA_POD_MAX_DEPTH];
|
||||
int depth = 0, collected = 0;
|
||||
va_list args;
|
||||
const char *start;
|
||||
|
|
|
|||
|
|
@ -340,7 +340,7 @@ static int negotiate_formats(struct data *data)
|
|||
filter, &b)) < 0)
|
||||
return res;
|
||||
|
||||
format = SPA_POD_BUILDER_DEREF(&b, ref, struct spa_pod_object);
|
||||
format = spa_pod_builder_deref(&b, ref);
|
||||
|
||||
if ((res = spa_node_port_set_param(data->sink,
|
||||
SPA_DIRECTION_INPUT, 0,
|
||||
|
|
|
|||
|
|
@ -417,7 +417,7 @@ static int negotiate_formats(struct data *data)
|
|||
if ((res = spa_node_port_set_param(data->source,
|
||||
SPA_DIRECTION_OUTPUT, 0,
|
||||
data->type.param.idFormat, 0,
|
||||
(struct spa_pod_object*)format)) < 0)
|
||||
format)) < 0)
|
||||
return res;
|
||||
|
||||
if ((res = spa_node_port_get_info(data->source, SPA_DIRECTION_OUTPUT, 0, &info)) < 0)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue