Type changes

Only allow properties inside objects, this makes it easier to
iterate the object, which is needed for efficiently processing
control streams.
Add a choice type to mark variable properties.
SPA_TYPE_Enum -> SPA_TYPE_Id to avoid confusion with choice enum
Make it easier to allocate and initialize properties on the stack
Make more efficient methods to make objects.
This commit is contained in:
Wim Taymans 2018-09-05 16:41:07 +02:00
parent 03fdabd155
commit cc842cbdc8
63 changed files with 2253 additions and 1880 deletions

View file

@ -52,10 +52,10 @@ executable('test-props2', 'test-props2.c',
# include_directories : [spa_inc ],
# dependencies : [],
# install : false)
executable('test-props5', 'test-props5.c',
include_directories : [spa_inc ],
dependencies : [],
install : false)
#executable('test-props5', 'test-props5.c',
# include_directories : [spa_inc ],
# dependencies : [],
# install : false)
executable('test-control', 'test-control.c',
include_directories : [spa_inc ],
dependencies : [dl_lib, pthread_lib, mathlib],

View file

@ -199,13 +199,6 @@ static void update_props(struct data *data)
spa_pod_builder_init(&b, data->ctrl, sizeof(data->ctrl));
#if 1
pod = spa_pod_builder_sequence(&b, 0,
".", 0, SPA_CONTROL_Properties,
SPA_POD_OBJECT(SPA_TYPE_OBJECT_Props, 0,
":", SPA_PROP_frequency, "d", ((sin(data->freq_accum) + 1.0) * 200.0) + 440.0,
":", SPA_PROP_volume, "d", (sin(data->volume_accum) / 2.0) + 0.5));
#endif
#if 0
spa_pod_builder_push_sequence(&b, 0);
spa_pod_builder_control_header(&b, 0, SPA_CONTROL_Properties);
@ -218,14 +211,14 @@ static void update_props(struct data *data)
spa_pod_builder_pop(&b);
spa_pod_builder_pop(&b);
pod = spa_pod_builder_pop(&b);
#endif
#if 0
#else
spa_pod_builder_push_sequence(&b, 0);
spa_pod_builder_control_header(&b, 0, SPA_CONTROL_Properties);
spa_pod_builder_object(&b,
SPA_TYPE_OBJECT_Props, 0,
":", SPA_PROP_frequency, "d", ((sin(data->freq_accum) + 1.0) * 200.0) + 440.0,
":", SPA_PROP_volume, "d", (sin(data->volume_accum) / 2.0) + 0.5);
SPA_PROP_frequency, &SPA_POD_Float(((sin(data->freq_accum) + 1.0) * 200.0) + 440.0),
SPA_PROP_volume, &SPA_POD_Float((sin(data->volume_accum) / 2.0) + 0.5),
0);
pod = spa_pod_builder_pop(&b);
#endif
@ -311,8 +304,9 @@ static int make_nodes(struct data *data, const char *device)
spa_pod_builder_init(&b, buffer, sizeof(buffer));
props = spa_pod_builder_object(&b,
SPA_TYPE_OBJECT_Props, 0,
":", SPA_PROP_device, "s", device ? device : "hw:0",
":", SPA_PROP_minLatency, "i", MIN_LATENCY);
SPA_PROP_device, &SPA_POD_Stringv(device ? device : "hw:0"),
SPA_PROP_minLatency, &SPA_POD_Int(MIN_LATENCY),
0);
spa_debug_pod(0, NULL, props);
@ -329,9 +323,10 @@ static int make_nodes(struct data *data, const char *device)
spa_pod_builder_init(&b, buffer, sizeof(buffer));
props = spa_pod_builder_object(&b,
SPA_TYPE_OBJECT_Props, 0,
":", SPA_PROP_frequency, "d", 600.0,
":", SPA_PROP_volume, "d", 0.5,
":", SPA_PROP_live, "b", false);
SPA_PROP_frequency, &SPA_POD_Float(600.0),
SPA_PROP_volume, &SPA_POD_Float(0.5),
SPA_PROP_live, &SPA_POD_Bool(false),
0);
if ((res = spa_node_set_param(data->source, SPA_PARAM_Props, 0, props)) < 0)
printf("got set_props error %d\n", res);

View file

@ -258,8 +258,9 @@ static int make_nodes(struct data *data, const char *device)
spa_pod_builder_init(&b, buffer, sizeof(buffer));
props = spa_pod_builder_object(&b,
SPA_TYPE_OBJECT_Props, 0,
":", SPA_PROP_device, "s", device ? device : "hw:0",
":", SPA_PROP_minLatency, "i", MIN_LATENCY);
SPA_PROP_device, &SPA_POD_Stringv(device ? device : "hw:0"),
SPA_PROP_minLatency, &SPA_POD_Int(MIN_LATENCY),
0);
spa_debug_pod(0, NULL, props);
@ -282,9 +283,10 @@ static int make_nodes(struct data *data, const char *device)
spa_pod_builder_init(&b, buffer, sizeof(buffer));
props = spa_pod_builder_object(&b,
SPA_TYPE_OBJECT_Props, 0,
":", SPA_PROP_frequency, "d", 600.0,
":", SPA_PROP_volume, "d", 0.5,
":", SPA_PROP_live, "b", false);
SPA_PROP_frequency, &SPA_POD_Float(600.0),
SPA_PROP_volume, &SPA_POD_Float(0.5),
SPA_PROP_live, &SPA_POD_Bool(false),
0);
if ((res = spa_node_set_param(data->source, SPA_PARAM_Props, 0, props)) < 0)
printf("got set_props error %d\n", res);

View file

@ -320,8 +320,9 @@ static int make_nodes(struct data *data, const char *device)
spa_pod_builder_init(&b, buffer, sizeof(buffer));
props = spa_pod_builder_object(&b,
SPA_TYPE_OBJECT_Props, 0,
":", SPA_PROP_device, "s", device ? device : "hw:0",
":", SPA_PROP_minLatency, "i", MIN_LATENCY);
SPA_PROP_device, &SPA_POD_Stringv(device ? device : "hw:0"),
SPA_PROP_minLatency, &SPA_POD_Int(MIN_LATENCY),
0);
if ((res = spa_node_set_param(data->sink, SPA_PARAM_Props, 0, props)) < 0)
error(0, -res, "set_param props");
@ -343,9 +344,10 @@ static int make_nodes(struct data *data, const char *device)
spa_pod_builder_init(&b, buffer, sizeof(buffer));
props = spa_pod_builder_object(&b,
SPA_TYPE_OBJECT_Props, SPA_PARAM_Props,
":", SPA_PROP_frequency, "d", 600.0,
":", SPA_PROP_volume, "d", 1.0,
":", SPA_PROP_live, "b", false);
SPA_PROP_frequency, &SPA_POD_Float(600.0),
SPA_PROP_volume, &SPA_POD_Float(1.0),
SPA_PROP_live, &SPA_POD_Bool(false),
0);
if ((res = spa_node_set_param(data->source1, SPA_PARAM_Props, 0, props)) < 0)
printf("got set_props error %d\n", res);
@ -360,9 +362,10 @@ static int make_nodes(struct data *data, const char *device)
spa_pod_builder_init(&b, buffer, sizeof(buffer));
props = spa_pod_builder_object(&b,
SPA_TYPE_OBJECT_Props, SPA_PARAM_Props,
":", SPA_PROP_frequency, "d", 440.0,
":", SPA_PROP_volume, "d", 1.0,
":", SPA_PROP_live, "b", false);
SPA_PROP_frequency, &SPA_POD_Float(440.0),
SPA_PROP_volume, &SPA_POD_Float(1.0),
SPA_PROP_live, &SPA_POD_Bool(false),
0);
if ((res = spa_node_set_param(data->source2, SPA_PARAM_Props, 0, props)) < 0)
printf("got set_props error %d\n", res);
@ -404,8 +407,8 @@ static int make_nodes(struct data *data, const char *device)
SPA_IO_Buffers,
&data->mix_sink_io[0], sizeof(data->mix_sink_io[0]));
data->ctrl_volume[0] = SPA_POD_DOUBLE_INIT(0.5);
data->ctrl_volume[1] = SPA_POD_DOUBLE_INIT(0.5);
data->ctrl_volume[0] = SPA_POD_Double(0.5);
data->ctrl_volume[1] = SPA_POD_Double(0.5);
#if 0
if ((res = spa_node_port_set_io(data->mix,

View file

@ -360,8 +360,9 @@ static int negotiate_formats(struct data *data)
spa_pod_builder_init(&b, buffer, sizeof(buffer));
format = spa_pod_builder_object(&b,
SPA_TYPE_OBJECT_Format, 0,
":", SPA_FORMAT_mediaType, "I", SPA_MEDIA_TYPE_binary,
":", SPA_FORMAT_mediaSubtype, "I", SPA_MEDIA_SUBTYPE_raw);
SPA_FORMAT_mediaType, &SPA_POD_Id(SPA_MEDIA_TYPE_binary),
SPA_FORMAT_mediaSubtype, &SPA_POD_Id(SPA_MEDIA_SUBTYPE_raw),
0);
if ((res = spa_node_port_set_param(data->sink,
SPA_DIRECTION_INPUT, 0,

View file

@ -22,6 +22,7 @@
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <time.h>
#include <spa/support/log-impl.h>
#include <spa/pod/pod.h>
@ -147,21 +148,38 @@ key: "<name>"
}
]
( "Format",
("video", "raw" ),
{
"format": ( "seu", "I420", ( "I420","YUY2" ) ),
"size": ( "Rru", (320, 242), ( (1,1), (MAX, MAX)) ),
"framerate": ( "Fru", (25, 1), ( (0,1), (MAX, 1)) )
}
)
{ "Type" : "Format", "Id" : 0,
"mediaType": "video",
"mediaSubtype": "raw",
"videoFormat": [ "enum", "I420", "YUY2" ],
"videoSize": [ "range", [320,242], [1,1], [MAX,MAX] ],
"videoFramerate": [ "range", [25,1], [0,1], [MAX,1] ]
}
spa_build(SPA_MEDIA_TYPE_VIDEO, SPA_MEDIA_SUBTYPE_RAW,
SPA_FORMAT_VIDEO_format, SPA_PROP_TYPE_ID,
video_format.I420
SPA_POD_PROP_FLAG_UNSET |
SPA_PROP_RANGE_ENUM, 2,
SPA_CHOICE_ENUM, 2,
video_format.I420,
video_format.YUY2,
SPA_FORMAT_VIDEO_size, SPA_PROP_TYPE_RECTANGLE,
320, 240,
SPA_POD_PROP_FLAG_UNSET |
SPA_PROP_RANGE_MIN_MAX,
SPA_CHOICE_RANGE,
1, 1,
INT32_MAX, INT32_MAX,
SPA_FORMAT_VIDEO_framerate, SPA_PROP_TYPE_FRACTION, 25, 1,
SPA_POD_PROP_FLAG_UNSET | SPA_PROP_RANGE_MIN_MAX, 0, 1, INT32_MAX, 1, 0);
SPA_POD_PROP_FLAG_UNSET | SPA_CHOICE_RANGE, 0, 1, INT32_MAX, 1, 0);
#endif
static void do_static_struct(void)
@ -170,17 +188,22 @@ static void do_static_struct(void)
struct spa_pod_object fmt;
struct {
struct spa_pod_enum media_type SPA_ALIGNED(8);
struct spa_pod_enum media_subtype SPA_ALIGNED(8);
struct spa_pod_prop prop_media_type SPA_ALIGNED(8);
uint32_t media_type;
struct spa_pod_prop prop_media_subtype SPA_ALIGNED(8);
uint32_t media_subtype;
struct spa_pod_prop prop_format SPA_ALIGNED(8);
struct {
struct spa_pod_choice_body choice;
uint32_t def_format;
uint32_t enum_format[2];
} format_vals;
struct spa_pod_prop prop_size SPA_ALIGNED(8);
struct {
struct spa_pod_choice_body choice;
struct spa_rectangle def_size;
struct spa_rectangle min_size;
struct spa_rectangle max_size;
@ -188,43 +211,46 @@ static void do_static_struct(void)
struct spa_pod_prop prop_framerate SPA_ALIGNED(8);
struct {
struct spa_pod_choice_body array;
struct spa_fraction def_framerate;
struct spa_fraction min_framerate;
struct spa_fraction max_framerate;
} framerate_vals;
} props;
} test_format = {
SPA_POD_OBJECT_INIT(sizeof(test_format.props) + sizeof(struct spa_pod_object_body),
SPA_POD_Object(sizeof(test_format.props) + sizeof(struct spa_pod_object_body),
SPA_TYPE_OBJECT_Format, 0),
{
SPA_POD_ENUM_INIT(SPA_MEDIA_TYPE_video),
SPA_POD_ENUM_INIT(SPA_MEDIA_SUBTYPE_raw),
SPA_POD_Prop(SPA_FORMAT_mediaType, 0,
sizeof(test_format.props.media_type), SPA_TYPE_Id),
SPA_MEDIA_TYPE_video,
SPA_POD_PROP_INIT(sizeof(test_format.props.format_vals) +
sizeof(struct spa_pod_prop_body),
SPA_FORMAT_VIDEO_format,
SPA_POD_PROP_RANGE_ENUM | SPA_POD_PROP_FLAG_UNSET,
sizeof(uint32_t), SPA_TYPE_Enum),
SPA_POD_Prop(SPA_FORMAT_mediaSubtype, 0,
sizeof(test_format.props.media_subtype), SPA_TYPE_Id),
SPA_MEDIA_SUBTYPE_raw,
SPA_POD_Prop(SPA_FORMAT_VIDEO_format, 0,
sizeof(test_format.props.format_vals), SPA_TYPE_Choice),
{
SPA_POD_CHOICE_BODY_INIT(SPA_CHOICE_Enum, 0,
sizeof(uint32_t), SPA_TYPE_Id),
SPA_VIDEO_FORMAT_I420,
{ SPA_VIDEO_FORMAT_I420, SPA_VIDEO_FORMAT_YUY2 }
},
SPA_POD_PROP_INIT(sizeof(test_format.props.size_vals) +
sizeof(struct spa_pod_prop_body),
SPA_FORMAT_VIDEO_size,
SPA_POD_PROP_RANGE_MIN_MAX | SPA_POD_PROP_FLAG_UNSET,
sizeof(struct spa_rectangle), SPA_TYPE_Rectangle),
SPA_POD_Prop(SPA_FORMAT_VIDEO_size, 0,
sizeof(test_format.props.size_vals), SPA_TYPE_Choice),
{
SPA_POD_CHOICE_BODY_INIT(SPA_CHOICE_Range, 0,
sizeof(struct spa_rectangle), SPA_TYPE_Rectangle),
SPA_RECTANGLE(320,243),
SPA_RECTANGLE(1,1), SPA_RECTANGLE(INT32_MAX, INT32_MAX)
},
SPA_POD_PROP_INIT(sizeof(test_format.props.framerate_vals) +
sizeof(struct spa_pod_prop_body),
SPA_FORMAT_VIDEO_framerate,
SPA_POD_PROP_RANGE_MIN_MAX | SPA_POD_PROP_FLAG_UNSET,
sizeof(struct spa_fraction), SPA_TYPE_Fraction),
SPA_POD_Prop(SPA_FORMAT_VIDEO_framerate, 0,
sizeof(test_format.props.framerate_vals), SPA_TYPE_Choice),
{
SPA_POD_CHOICE_BODY_INIT(SPA_CHOICE_Range, 0,
sizeof(struct spa_fraction), SPA_TYPE_Fraction),
SPA_FRACTION(25,1),
SPA_FRACTION(0,1), SPA_FRACTION(INT32_MAX,1)
}
@ -256,106 +282,170 @@ static void do_static_struct(void)
}
#define ITER 10000000
int main(int argc, char *argv[])
{
struct spa_pod_builder b = { NULL, };
uint8_t buffer[1024];
struct spa_pod_object *fmt;
int i;
struct timespec ts1, ts2;
fprintf(stderr, "build 1: ");
clock_gettime(CLOCK_MONOTONIC, &ts1);
for (i = 0 ; i < ITER; i++) {
spa_pod_builder_init(&b, buffer, sizeof(buffer));
spa_pod_builder_push_object(&b, SPA_TYPE_OBJECT_Format, 0);
spa_pod_builder_enum(&b, SPA_MEDIA_TYPE_video);
spa_pod_builder_enum(&b, SPA_MEDIA_SUBTYPE_raw);
spa_pod_builder_prop(&b, SPA_FORMAT_mediaType, 0);
spa_pod_builder_id(&b, SPA_MEDIA_TYPE_video);
spa_pod_builder_prop(&b, SPA_FORMAT_mediaSubtype, 0);
spa_pod_builder_id(&b, SPA_MEDIA_SUBTYPE_raw);
spa_pod_builder_push_prop(&b, SPA_FORMAT_VIDEO_format,
SPA_POD_PROP_RANGE_ENUM | SPA_POD_PROP_FLAG_UNSET);
spa_pod_builder_enum(&b, SPA_VIDEO_FORMAT_I420);
spa_pod_builder_enum(&b, SPA_VIDEO_FORMAT_I420);
spa_pod_builder_enum(&b, SPA_VIDEO_FORMAT_YUY2);
spa_pod_builder_prop(&b, SPA_FORMAT_VIDEO_format, 0);
spa_pod_builder_push_choice(&b, SPA_CHOICE_Enum, 0);
spa_pod_builder_id(&b, SPA_VIDEO_FORMAT_I420);
spa_pod_builder_id(&b, SPA_VIDEO_FORMAT_I420);
spa_pod_builder_id(&b, SPA_VIDEO_FORMAT_YUY2);
spa_pod_builder_pop(&b);
struct spa_rectangle size_min_max[] = { {1, 1}, {INT32_MAX, INT32_MAX} };
spa_pod_builder_push_prop(&b,
SPA_FORMAT_VIDEO_size,
SPA_POD_PROP_RANGE_MIN_MAX | SPA_POD_PROP_FLAG_UNSET);
spa_pod_builder_prop(&b, SPA_FORMAT_VIDEO_size, 0);
spa_pod_builder_push_choice(&b, SPA_CHOICE_Range, 0);
spa_pod_builder_rectangle(&b, 320, 240);
spa_pod_builder_raw(&b, size_min_max, sizeof(size_min_max));
spa_pod_builder_pop(&b);
struct spa_fraction rate_min_max[] = { {0, 1}, {INT32_MAX, 1} };
spa_pod_builder_push_prop(&b,
SPA_FORMAT_VIDEO_framerate,
SPA_POD_PROP_RANGE_MIN_MAX | SPA_POD_PROP_FLAG_UNSET);
spa_pod_builder_prop(&b, SPA_FORMAT_VIDEO_framerate, 0);
spa_pod_builder_push_choice(&b, SPA_CHOICE_Range, 0);
spa_pod_builder_fraction(&b, 25, 1);
spa_pod_builder_raw(&b, rate_min_max, sizeof(rate_min_max));
spa_pod_builder_pop(&b);
fmt = spa_pod_builder_pop(&b);
}
clock_gettime(CLOCK_MONOTONIC, &ts2);
fprintf(stderr, "elapsed %lld\n", SPA_TIMESPEC_TO_TIME(&ts2) - SPA_TIMESPEC_TO_TIME(&ts1));
spa_debug_pod(0, NULL, &fmt->pod);
fprintf(stderr, "build 2: ");
clock_gettime(CLOCK_MONOTONIC, &ts1);
for (i = 0 ; i < ITER; i++) {
spa_pod_builder_init(&b, buffer, sizeof(buffer));
fmt = spa_pod_builder_object(&b,
fmt = spa_pod_builder_add_object(&b,
SPA_TYPE_OBJECT_Format, 0,
":", SPA_FORMAT_mediaType, "I", SPA_MEDIA_TYPE_video,
":", SPA_FORMAT_mediaSubtype, "I", SPA_MEDIA_SUBTYPE_raw,
":", SPA_FORMAT_VIDEO_format, "Ieu", SPA_VIDEO_FORMAT_I420,
2, SPA_VIDEO_FORMAT_I420,
SPA_VIDEO_FORMAT_YUY2,
":", SPA_FORMAT_VIDEO_size, "Rru", &SPA_RECTANGLE(320,241),
2, &SPA_RECTANGLE(1,1),
&SPA_RECTANGLE(INT32_MAX,INT32_MAX),
":", SPA_FORMAT_VIDEO_framerate, "Fru", &SPA_FRACTION(25,1),
2, &SPA_FRACTION(0,1),
&SPA_FRACTION(INT32_MAX,1));
":", SPA_FORMAT_VIDEO_format, "?eI", 3, SPA_VIDEO_FORMAT_I420,
SPA_VIDEO_FORMAT_I420,
SPA_VIDEO_FORMAT_YUY2,
":", SPA_FORMAT_VIDEO_size, "?rR", 3, &SPA_RECTANGLE(320,241),
&SPA_RECTANGLE(1,1),
&SPA_RECTANGLE(INT32_MAX,INT32_MAX),
":", SPA_FORMAT_VIDEO_framerate, "?rF", 3, &SPA_FRACTION(25,1),
&SPA_FRACTION(0,1),
&SPA_FRACTION(INT32_MAX,1));
}
clock_gettime(CLOCK_MONOTONIC, &ts2);
fprintf(stderr, "elapsed %lld\n", SPA_TIMESPEC_TO_TIME(&ts2) - SPA_TIMESPEC_TO_TIME(&ts1));
spa_debug_pod(0, NULL, &fmt->pod);
spa_debug_format(0, NULL, &fmt->pod);
fprintf(stderr, "build 3: ");
clock_gettime(CLOCK_MONOTONIC, &ts1);
for (i = 0 ; i < ITER; i++) {
spa_pod_builder_init(&b, buffer, sizeof(buffer));
/*
* ( "Format",
* ("video", "raw" ),
* {
* "format": ( "seu", "I420", ( "I420","YUY2" ) ),
* "size": ( "Rru", (320, 242), ( (1,1), (MAX, MAX)) ),
* "framerate": ( "Fru", (25, 1), ( (0,1), (MAX, 1)) )
* }
* )
*
* { "Type" : "Format", "Id" : 0,
* "mediaType": "video",
* "mediaSubtype": "raw",
* "videoFormat": [ "enum", "I420", "YUY2" ],
* "videoSize": [ "range", [320,242], [1,1], [MAX,MAX] ],
* "videoFramerate": [ "range", [25,1], [0,1], [MAX,1] ]
* }
*
*/
fmt = spa_pod_builder_add(&b,
"{", SPA_TYPE_OBJECT_Format, 0,
":", SPA_FORMAT_mediaType, "I", SPA_MEDIA_TYPE_video,
":", SPA_FORMAT_mediaSubtype, "I", SPA_MEDIA_SUBTYPE_raw,
":", SPA_FORMAT_VIDEO_format, "Ieu", SPA_VIDEO_FORMAT_I420,
2, SPA_VIDEO_FORMAT_I420,
SPA_VIDEO_FORMAT_YUY2,
":", SPA_FORMAT_VIDEO_size, "Rru", &SPA_RECTANGLE(320,242),
2, &SPA_RECTANGLE(1,1),
&SPA_RECTANGLE(INT32_MAX,INT32_MAX),
":", SPA_FORMAT_VIDEO_framerate, "Fru", &SPA_FRACTION(25,1),
2, &SPA_FRACTION(0,1),
&SPA_FRACTION(INT32_MAX,1),
":", SPA_FORMAT_VIDEO_format, "P", &SPA_POD_CHOICE_ENUM_Id(3,
SPA_VIDEO_FORMAT_I420,
SPA_VIDEO_FORMAT_I420,
SPA_VIDEO_FORMAT_YUY2),
":", SPA_FORMAT_VIDEO_size, "P", &SPA_POD_CHOICE_RANGE_Rectangle(
SPA_RECTANGLE(320,242),
SPA_RECTANGLE(1,1),
SPA_RECTANGLE(INT32_MAX,INT32_MAX)),
":", SPA_FORMAT_VIDEO_framerate, "P", &SPA_POD_CHOICE_RANGE_Fraction(
SPA_FRACTION(25,1),
SPA_FRACTION(0,1),
SPA_FRACTION(INT32_MAX,1)),
"}", NULL);
}
clock_gettime(CLOCK_MONOTONIC, &ts2);
fprintf(stderr, "elapsed %lld\n", SPA_TIMESPEC_TO_TIME(&ts2) - SPA_TIMESPEC_TO_TIME(&ts1));
spa_debug_pod(0, NULL, &fmt->pod);
spa_debug_format(0, NULL, &fmt->pod);
do_static_struct();
fprintf(stderr, "build 4: ");
clock_gettime(CLOCK_MONOTONIC, &ts1);
for (i = 0 ; i < ITER; i++) {
spa_pod_builder_init(&b, buffer, sizeof(buffer));
spa_pod_builder_push_object(&b, SPA_TYPE_OBJECT_Format, 0);
spa_pod_builder_prop(&b, SPA_FORMAT_mediaType, 0);
spa_pod_builder_id(&b, SPA_MEDIA_TYPE_video);
spa_pod_builder_prop(&b, SPA_FORMAT_mediaSubtype, 0);
spa_pod_builder_id(&b, SPA_MEDIA_SUBTYPE_raw);
spa_pod_builder_prop(&b, SPA_FORMAT_VIDEO_format, 0);
spa_pod_builder_primitive(&b, (struct spa_pod*)&SPA_POD_CHOICE_ENUM_Id(3,
SPA_VIDEO_FORMAT_I420, SPA_VIDEO_FORMAT_I420, SPA_VIDEO_FORMAT_YUY2));
spa_pod_builder_prop(&b, SPA_FORMAT_VIDEO_size, 0);
spa_pod_builder_primitive(&b, (struct spa_pod*)&SPA_POD_CHOICE_RANGE_Rectangle(
SPA_RECTANGLE(320,242),
SPA_RECTANGLE(1,1),
SPA_RECTANGLE(INT32_MAX,INT32_MAX)));
spa_pod_builder_prop(&b, SPA_FORMAT_VIDEO_framerate, 0);
spa_pod_builder_primitive(&b, (struct spa_pod *)&SPA_POD_CHOICE_RANGE_Fraction(
SPA_FRACTION(25,1),
SPA_FRACTION(0,1),
SPA_FRACTION(INT32_MAX,1)));
}
clock_gettime(CLOCK_MONOTONIC, &ts2);
fprintf(stderr, "elapsed %lld\n", SPA_TIMESPEC_TO_TIME(&ts2) - SPA_TIMESPEC_TO_TIME(&ts1));
fmt = spa_pod_builder_pop(&b);
spa_debug_pod(0, NULL, &fmt->pod);
spa_debug_format(0, NULL, &fmt->pod);
fprintf(stderr, "build 5: ");
clock_gettime(CLOCK_MONOTONIC, &ts1);
for (i = 0 ; i < ITER; i++) {
spa_pod_builder_init(&b, buffer, sizeof(buffer));
fmt = spa_pod_builder_object(&b,
SPA_TYPE_OBJECT_Format, 0,
SPA_FORMAT_mediaType, &SPA_POD_Id(SPA_MEDIA_TYPE_video),
SPA_FORMAT_mediaSubtype, &SPA_POD_Id(SPA_MEDIA_SUBTYPE_raw),
SPA_FORMAT_VIDEO_format, &SPA_POD_CHOICE_ENUM_Id(3,
SPA_VIDEO_FORMAT_I420,
SPA_VIDEO_FORMAT_I420,
SPA_VIDEO_FORMAT_YUY2),
SPA_FORMAT_VIDEO_size, &SPA_POD_CHOICE_RANGE_Rectangle(
SPA_RECTANGLE(320,242),
SPA_RECTANGLE(1,1),
SPA_RECTANGLE(INT32_MAX,INT32_MAX)),
SPA_FORMAT_VIDEO_framerate,&SPA_POD_CHOICE_RANGE_Fraction(
SPA_FRACTION(25,1),
SPA_FRACTION(0,1),
SPA_FRACTION(INT32_MAX,1)),
0);
}
clock_gettime(CLOCK_MONOTONIC, &ts2);
fprintf(stderr, "elapsed %lld\n", SPA_TIMESPEC_TO_TIME(&ts2) - SPA_TIMESPEC_TO_TIME(&ts1));
spa_debug_pod(0, NULL, &fmt->pod);
spa_debug_format(0, NULL, &fmt->pod);
#if 0
printf("media type is enum %d\n", spa_type_is_a(SPA_TYPE__mediaType, SPA_TYPE_ENUM_BASE));
printf("media sybtype is enum %d\n",

View file

@ -46,24 +46,24 @@ int main(int argc, char *argv[])
spa_pod_builder_push_object(&b, 0, 0);
uint32_t formats[] = { 1, 2 };
spa_pod_builder_push_prop(&b, 1, SPA_POD_PROP_RANGE_ENUM);
spa_pod_builder_prop(&b, 1, 0);
spa_pod_builder_push_array(&b);
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);
spa_pod_builder_push_prop(&b, 2, 0);
spa_pod_builder_prop(&b, 2, 0);
spa_pod_builder_int(&b, 42);
spa_pod_builder_pop(&b);
struct spa_rectangle sizes[] = { {0, 0}, {1024, 1024} };
spa_pod_builder_push_prop(&b,
3, SPA_POD_PROP_RANGE_MIN_MAX | SPA_POD_PROP_FLAG_UNSET);
spa_pod_builder_prop(&b, 3, 0);
spa_pod_builder_push_array(&b);
spa_pod_builder_rectangle(&b, 320, 240);
spa_pod_builder_raw(&b, sizes, sizeof(sizes));
spa_pod_builder_pop(&b);
spa_pod_builder_push_prop(&b, 4, SPA_POD_PROP_FLAG_READONLY);
spa_pod_builder_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);
@ -78,14 +78,12 @@ int main(int argc, char *argv[])
spa_pod_builder_int(&b, 6);
spa_pod_builder_pop(&b);
spa_pod_builder_pop(&b);
spa_pod_builder_pop(&b);
obj = spa_pod_builder_pop(&b);
spa_debug_pod(0, NULL, obj);
struct spa_pod_prop *p = spa_pod_find_prop(obj, 4);
printf("%d %d\n", p->body.key, p->body.flags);
spa_debug_pod(0, NULL, &p->body.value);
spa_debug_pod(0, NULL, &p->value);
obj = spa_pod_builder_deref(&b, ref);

View file

@ -237,8 +237,9 @@ static int make_nodes(struct data *data, const char *device)
spa_pod_builder_init(&b, buffer, sizeof(buffer));
props = spa_pod_builder_object(&b,
SPA_TYPE_OBJECT_Props, 0,
":", SPA_PROP_device, "s", device ? device : "hw:0",
":", SPA_PROP_minLatency, "i", 64);
SPA_PROP_device, &SPA_POD_Stringv(device ? device : "hw:0"),
SPA_PROP_minLatency, &SPA_POD_Int(64),
0);
if ((res = spa_node_set_param(data->sink, SPA_PARAM_Props, 0, props)) < 0)
printf("got set_props error %d\n", res);
@ -253,7 +254,8 @@ static int make_nodes(struct data *data, const char *device)
spa_pod_builder_init(&b, buffer, sizeof(buffer));
props = spa_pod_builder_object(&b,
SPA_TYPE_OBJECT_Props, 0,
":", SPA_PROP_live, "b", false);
SPA_PROP_live, &SPA_POD_Bool(false),
0);
if ((res = spa_node_set_param(data->source, SPA_PARAM_Props, 0, props)) < 0)
printf("got set_props error %d\n", res);

View file

@ -289,7 +289,8 @@ static int make_nodes(struct data *data, const char *device)
spa_pod_builder_init(&b, buffer, sizeof(buffer));
props = spa_pod_builder_object(&b,
SPA_TYPE_OBJECT_Props, 0,
":", SPA_PROP_device, "s", device ? device : "/dev/video0");
SPA_PROP_device, &SPA_POD_Stringv(device ? device : "/dev/video0"),
0);
if ((res = spa_node_set_param(data->source, SPA_PARAM_Props, 0, props)) < 0)
printf("got set_props error %d\n", res);