5#ifndef SPA_POD_PARSER_H
6#define SPA_POD_PARSER_H
18#ifndef SPA_API_POD_PARSER
20 #define SPA_API_POD_PARSER SPA_API_IMPL
22 #define SPA_API_POD_PARSER static inline
44#define SPA_POD_PARSER_INIT(buffer,size) ((struct spa_pod_parser){ (buffer), (size), 0, {0,0,NULL}})
47 const void *data, uint32_t size)
59 const struct spa_pod *pod,
const void *body)
66 const void *data, uint32_t maxsize, uint32_t
offset, uint32_t size)
70 sz =
SPA_MIN(maxsize - offs, size);
77 *state = parser->
state;
88 void *header, uint32_t header_size, uint32_t pod_offset,
const void **body)
91 const uint64_t long_offset = (uint64_t)
offset + header_size;
92 if (long_offset <= size && (
offset & 7) == 0) {
135 void *header, uint32_t header_size, uint32_t pod_offset,
const void **body)
140 header, header_size, pod_offset, body);
164 struct spa_pod *pod,
const void **body)
348 struct spa_pod *value,
const void **body)
433 const void *obj_body;
436 if (type != obj.body.type) {
484 uint32_t start_offset;
492 if (prop->
key == key)
499 if (prop->
key == key)
516 if (type ==
'V' || type ==
'W')
522 pod = &choice.body.child;
576#define SPA_POD_PARSER_COLLECT_BODY(_pod,_body,_type,args) \
579 struct spa_pod_choice choice; \
580 const struct spa_pod *_p = _pod; \
581 const void *_b = _body; \
582 if (_p->type == SPA_TYPE_Choice && _type != 'V' && _type != 'W') { \
583 if (spa_pod_body_get_choice(_p, _b, &choice, &_b) >= 0 && \
584 choice.body.type == SPA_CHOICE_None) \
585 _p = &choice.body.child; \
590 bool *val = va_arg(args, bool*); \
591 res = spa_pod_body_get_bool(_p, _b, val); \
596 uint32_t *val = va_arg(args, uint32_t*); \
597 res = spa_pod_body_get_id(_p, _b, val); \
602 int32_t *val = va_arg(args, int32_t*); \
603 res = spa_pod_body_get_int(_p, _b, val); \
608 int64_t *val = va_arg(args, int64_t*); \
609 res = spa_pod_body_get_long(_p, _b, val); \
614 float *val = va_arg(args, float*); \
615 res = spa_pod_body_get_float(_p, _b, val); \
620 double *val = va_arg(args, double*); \
621 res = spa_pod_body_get_double(_p, _b, val); \
626 const char **dest = va_arg(args, const char**); \
627 if (_p->type == SPA_TYPE_None) \
630 res = spa_pod_body_get_string(_p, _b, dest); \
635 char *dest = va_arg(args, char*); \
636 uint32_t maxlen = va_arg(args, uint32_t); \
637 res = spa_pod_body_copy_string(_p, _b, dest, maxlen); \
642 const void **value = va_arg(args, const void**); \
643 uint32_t *len = va_arg(args, uint32_t*); \
644 res = spa_pod_body_get_bytes(_p, _b, value, len); \
649 struct spa_rectangle *val = va_arg(args, struct spa_rectangle*); \
650 res = spa_pod_body_get_rectangle(_p, _b, val); \
655 struct spa_fraction *val = va_arg(args, struct spa_fraction*); \
656 res = spa_pod_body_get_fraction(_p, _b, val); \
661 const uint8_t **val = va_arg(args, const uint8_t**); \
662 res = spa_pod_body_get_bitmap(_p, _b, val); \
667 uint32_t *val_size = va_arg(args, uint32_t*); \
668 uint32_t *val_type = va_arg(args, uint32_t*); \
669 uint32_t *n_values = va_arg(args, uint32_t*); \
670 const void **arr_body = va_arg(args, const void**); \
671 *arr_body = spa_pod_body_get_array_values(_p, _b, \
672 n_values, val_size, val_type); \
673 if (*arr_body == NULL) \
679 uint32_t *type = va_arg(args, uint32_t*); \
680 const void **value = va_arg(args, const void**); \
681 res = spa_pod_body_get_pointer(_p, _b, type, value); \
686 int64_t *val = va_arg(args, int64_t*); \
687 res = spa_pod_body_get_fd(_p, _b, val); \
692 bool valid = false, do_body = false; \
704 valid = spa_pod_is_struct(_p) || spa_pod_is_none(_p); \
710 valid = spa_pod_is_object(_p) || spa_pod_is_none(_p); \
716 valid = spa_pod_is_choice(_p) || spa_pod_is_none(_p); \
722 if (res >= 0 && do_body) { \
723 struct spa_pod *p = va_arg(args, struct spa_pod*); \
724 const void **v = va_arg(args, const void **); \
725 if (valid && p && v) { \
729 } else if (res >= 0) { \
730 const struct spa_pod **d = va_arg(args, const struct spa_pod**);\
732 *d = (_p->type == SPA_TYPE_None) ? \
734 SPA_PTROFF((_b), -sizeof(struct spa_pod), \
735 const struct spa_pod); \
745#define SPA_POD_PARSER_COLLECT(pod,_type,args) \
746 SPA_POD_PARSER_COLLECT_BODY(pod, SPA_POD_BODY_CONST(pod),_type,args)
748#define SPA_POD_PARSER_SKIP(_type,args) \
752 va_arg(args, char*); \
753 va_arg(args, uint32_t); \
756 va_arg(args, void*); \
757 va_arg(args, void*); \
761 va_arg(args, void*); \
782 va_arg(args, void*); \
798 const void *body = NULL;
818 if ((format = va_arg(
args,
char *)) == NULL)
824 if ((optional = (*format ==
'?')))
829 }
else if (!optional) {
852#define SPA_POD_OPT_Bool(val) "?" SPA_POD_Bool(val)
853#define SPA_POD_OPT_Id(val) "?" SPA_POD_Id(val)
854#define SPA_POD_OPT_Int(val) "?" SPA_POD_Int(val)
855#define SPA_POD_OPT_Long(val) "?" SPA_POD_Long(val)
856#define SPA_POD_OPT_Float(val) "?" SPA_POD_Float(val)
857#define SPA_POD_OPT_Double(val) "?" SPA_POD_Double(val)
858#define SPA_POD_OPT_String(val) "?" SPA_POD_String(val)
859#define SPA_POD_OPT_Stringn(val,len) "?" SPA_POD_Stringn(val,len)
860#define SPA_POD_OPT_Bytes(val,len) "?" SPA_POD_Bytes(val,len)
861#define SPA_POD_OPT_Rectangle(val) "?" SPA_POD_Rectangle(val)
862#define SPA_POD_OPT_Fraction(val) "?" SPA_POD_Fraction(val)
863#define SPA_POD_OPT_Array(csize,ctype,n_vals,vals) "?" SPA_POD_Array(csize,ctype,n_vals,vals)
864#define SPA_POD_OPT_Pointer(type,val) "?" SPA_POD_Pointer(type,val)
865#define SPA_POD_OPT_Fd(val) "?" SPA_POD_Fd(val)
866#define SPA_POD_OPT_Pod(val) "?" SPA_POD_Pod(val)
867#define SPA_POD_OPT_PodObject(val) "?" SPA_POD_PodObject(val)
868#define SPA_POD_OPT_PodStruct(val) "?" SPA_POD_PodStruct(val)
869#define SPA_POD_OPT_PodChoice(val) "?" SPA_POD_PodChoice(val)
870#define SPA_POD_OPT_PodBody(val,body) "?" SPA_POD_PodBody(val,body)
871#define SPA_POD_OPT_PodBodyObject(val,body) "?" SPA_POD_PodBodyObject(val,body)
872#define SPA_POD_OPT_PodBodyStruct(val,body) "?" SPA_POD_PodBodyStruct(val,body)
873#define SPA_POD_OPT_PodBodyChoice(val,body) "?" SPA_POD_PodBodyChoice(val,body)
875#define spa_pod_parser_get_object(p,type,id,...) \
877 struct spa_pod_frame _f; \
879 if ((_res = spa_pod_parser_push_object(p, &_f, type, id)) == 0) { \
880 _res = spa_pod_parser_get(p,##__VA_ARGS__, 0); \
881 spa_pod_parser_pop(p, &_f); \
886#define spa_pod_parser_get_struct(p,...) \
888 struct spa_pod_frame _f; \
890 if ((_res = spa_pod_parser_push_struct(p, &_f)) == 0) { \
891 _res = spa_pod_parser_get(p,##__VA_ARGS__, NULL); \
892 spa_pod_parser_pop(p, &_f); \
897#define spa_pod_body_parse_object(pod,body,type,id,...) \
899 struct spa_pod_parser _p; \
900 spa_pod_parser_init_pod_body(&_p, pod, body); \
901 spa_pod_parser_get_object(&_p,type,id,##__VA_ARGS__); \
904#define spa_pod_parse_object(pod,type,id,...) \
905 spa_pod_body_parse_object(pod,SPA_POD_BODY_CONST(pod),type,id,##__VA_ARGS__)
907#define spa_pod_body_parse_struct(pod,body,...) \
909 struct spa_pod_parser _p; \
910 spa_pod_parser_init_pod_body(&_p, pod, body); \
911 spa_pod_parser_get_struct(&_p,##__VA_ARGS__); \
914#define spa_pod_parse_struct(pod,...) \
915 spa_pod_body_parse_struct(pod,SPA_POD_BODY_CONST(pod),##__VA_ARGS__)
uint32_t int int const char va_list args
Definition core.h:434
uint32_t int seq
Definition core.h:432
uint32_t int int res
Definition core.h:433
SPA_API_POD_PARSER void spa_pod_parser_push(struct spa_pod_parser *parser, struct spa_pod_frame *frame, const struct spa_pod *pod, uint32_t offset)
Definition parser.h:132
SPA_API_POD_PARSER int spa_pod_parser_get_long(struct spa_pod_parser *parser, int64_t *value)
Definition parser.h:247
#define SPA_POD_PARSER_COLLECT_BODY(_pod, _body, _type, args)
Definition parser.h:584
SPA_API_POD_PARSER void spa_pod_parser_init_from_data(struct spa_pod_parser *parser, const void *data, uint32_t maxsize, uint32_t offset, uint32_t size)
Definition parser.h:73
SPA_API_POD_PARSER int spa_pod_parser_init_struct_body(struct spa_pod_parser *parser, struct spa_pod_frame *frame, const struct spa_pod *pod, const void *body)
Definition parser.h:376
SPA_API_POD_BODY int spa_pod_is_pointer(const struct spa_pod *pod)
Definition body.h:247
SPA_API_POD_PARSER int spa_pod_parser_get_int(struct spa_pod_parser *parser, int32_t *value)
Definition parser.h:235
SPA_API_POD_BODY int spa_pod_is_bitmap(const struct spa_pod *pod)
Definition body.h:310
SPA_API_POD_PARSER int spa_pod_parser_pop(struct spa_pod_parser *parser, struct spa_pod_frame *frame)
Definition parser.h:203
SPA_API_POD_PARSER struct spa_pod * spa_pod_parser_deref(struct spa_pod_parser *parser, uint32_t offset, uint32_t size)
Definition parser.h:118
SPA_API_POD_BODY int spa_pod_is_fraction(const struct spa_pod *pod)
Definition body.h:296
SPA_API_POD_PARSER void spa_pod_parser_pod(struct spa_pod_parser *parser, const struct spa_pod *pod)
Definition parser.h:60
SPA_API_POD_PARSER struct spa_pod * spa_pod_parser_next(struct spa_pod_parser *parser)
Definition parser.h:180
SPA_API_POD_BODY int spa_pod_body_get_pointer(const struct spa_pod *pod, const void *body, uint32_t *type, const void **value)
Definition body.h:252
SPA_API_POD_PARSER struct spa_pod * spa_pod_parser_current(struct spa_pod_parser *parser)
Definition parser.h:157
SPA_API_POD_PARSER int spa_pod_parser_push_sequence_body(struct spa_pod_parser *parser, struct spa_pod_frame *frame, struct spa_pod_sequence *seq, const void **seq_body)
Definition parser.h:463
#define SPA_POD_BODY_CONST(pod)
Definition pod.h:46
SPA_API_POD_PARSER bool spa_pod_parser_body_can_collect(const struct spa_pod *pod, const void *body, char type)
Definition parser.h:514
SPA_API_POD_BODY int spa_pod_is_double(const struct spa_pod *pod)
Definition body.h:186
SPA_API_POD_PARSER int spa_pod_parser_get_pointer(struct spa_pod_parser *parser, uint32_t *type, const void **value)
Definition parser.h:307
SPA_API_POD_BODY int spa_pod_body_get_sequence(const struct spa_pod *pod, const void *body, struct spa_pod_sequence *seq, const void **seq_body)
Definition body.h:413
SPA_API_POD_BODY int spa_pod_body_get_string(const struct spa_pod *pod, const void *body, const char **value)
Definition body.h:206
SPA_API_POD_PARSER int spa_pod_parser_get_control_body(struct spa_pod_parser *parser, struct spa_pod_control *control, const void **body)
Definition parser.h:478
SPA_API_POD_BODY int spa_pod_is_array(const struct spa_pod *pod)
Definition body.h:323
SPA_API_POD_BODY int spa_pod_is_rectangle(const struct spa_pod *pod)
Definition body.h:281
SPA_API_POD_PARSER int spa_pod_parser_get_fraction(struct spa_pod_parser *parser, struct spa_fraction *value)
Definition parser.h:343
SPA_API_POD_BODY int spa_pod_is_struct(const struct spa_pod *pod)
Definition body.h:388
SPA_API_POD_PARSER void spa_pod_parser_init_pod_body(struct spa_pod_parser *parser, const struct spa_pod *pod, const void *body)
Definition parser.h:66
SPA_API_POD_BODY int spa_pod_is_int(const struct spa_pod *pod)
Definition body.h:142
SPA_API_POD_PARSER void spa_pod_parser_advance(struct spa_pod_parser *parser, const struct spa_pod *pod)
Definition parser.h:166
SPA_API_POD_BODY int spa_pod_is_fd(const struct spa_pod *pod)
Definition body.h:265
SPA_API_POD_BODY int spa_pod_body_get_fraction(const struct spa_pod *pod, const void *body, struct spa_fraction *value)
Definition body.h:300
SPA_API_POD_PARSER int spa_pod_parser_next_body(struct spa_pod_parser *parser, struct spa_pod *pod, const void **body)
Definition parser.h:171
SPA_API_POD_BODY int spa_pod_is_none(const struct spa_pod *pod)
Definition body.h:106
SPA_API_POD_PARSER int spa_pod_parser_init_object_body(struct spa_pod_parser *parser, struct spa_pod_frame *frame, const struct spa_pod *pod, const void *body, struct spa_pod_object *object, const void **object_body)
Definition parser.h:407
SPA_API_POD_PARSER int spa_pod_parser_get_bytes(struct spa_pod_parser *parser, const void **value, uint32_t *len)
Definition parser.h:295
SPA_API_POD_PARSER void spa_pod_parser_reset(struct spa_pod_parser *parser, struct spa_pod_parser_state *state)
Definition parser.h:89
SPA_API_POD_PARSER int spa_pod_parser_get_prop_body(struct spa_pod_parser *parser, struct spa_pod_prop *prop, const void **body)
Definition parser.h:452
SPA_API_POD_BODY int spa_pod_is_object(const struct spa_pod *pod)
Definition body.h:393
SPA_API_POD_PARSER int spa_pod_parser_getv(struct spa_pod_parser *parser, va_list args)
Definition parser.h:795
SPA_API_POD_PARSER int spa_pod_parser_read_header(struct spa_pod_parser *parser, uint32_t offset, uint32_t size, void *header, uint32_t header_size, uint32_t pod_offset, const void **body)
Definition parser.h:95
SPA_API_POD_PARSER int spa_pod_parser_push_object(struct spa_pod_parser *parser, struct spa_pod_frame *frame, uint32_t type, uint32_t *id)
Definition parser.h:436
SPA_API_POD_PARSER int spa_pod_parser_get_double(struct spa_pod_parser *parser, double *value)
Definition parser.h:271
SPA_API_POD_BODY int spa_pod_is_bool(const struct spa_pod *pod)
Definition body.h:111
SPA_API_POD_PARSER int spa_pod_parser_object_find_prop(struct spa_pod_parser *parser, uint32_t key, struct spa_pod_prop *prop, const void **body)
Definition parser.h:489
SPA_API_POD_BODY int spa_pod_is_id(const struct spa_pod *pod)
Definition body.h:129
SPA_API_POD_PARSER bool spa_pod_parser_can_collect(const struct spa_pod *pod, char type)
Definition parser.h:579
SPA_API_POD_PARSER int spa_pod_parser_get_fd(struct spa_pod_parser *parser, int64_t *value)
Definition parser.h:319
SPA_API_POD_PARSER void spa_pod_parser_unpush(struct spa_pod_parser *parser, struct spa_pod_frame *frame)
Definition parser.h:196
SPA_API_POD_PARSER int spa_pod_parser_push_object_body(struct spa_pod_parser *parser, struct spa_pod_frame *frame, struct spa_pod_object *object, const void **object_body)
Definition parser.h:422
SPA_API_POD_PARSER int spa_pod_parser_get_bool(struct spa_pod_parser *parser, bool *value)
Definition parser.h:211
SPA_API_POD_PARSER int spa_pod_parser_get_pod(struct spa_pod_parser *parser, struct spa_pod **value)
Definition parser.h:365
SPA_API_POD_PARSER int spa_pod_parser_push_struct(struct spa_pod_parser *parser, struct spa_pod_frame *frame)
Definition parser.h:399
SPA_API_POD_BODY int spa_pod_body_get_double(const struct spa_pod *pod, const void *body, double *value)
Definition body.h:191
#define SPA_POD_CONTROL_SIZE(ev)
Definition pod.h:254
SPA_API_POD_PARSER int spa_pod_parser_get_float(struct spa_pod_parser *parser, float *value)
Definition parser.h:259
SPA_API_POD_PARSER struct spa_pod * spa_pod_parser_frame(struct spa_pod_parser *parser, struct spa_pod_frame *frame)
Definition parser.h:127
#define SPA_POD_PROP_SIZE(prop)
Definition pod.h:224
SPA_API_POD_BODY int spa_pod_body_get_long(const struct spa_pod *pod, const void *body, int64_t *value)
Definition body.h:160
SPA_API_POD_BODY int spa_pod_body_get_object(const struct spa_pod *pod, const void *body, struct spa_pod_object *object, const void **object_body)
Definition body.h:397
SPA_API_POD_PARSER void spa_pod_parser_get_state(struct spa_pod_parser *parser, struct spa_pod_parser_state *state)
Definition parser.h:83
SPA_API_POD_BODY int spa_pod_is_bytes(const struct spa_pod *pod)
Definition body.h:232
SPA_API_POD_BODY int spa_pod_body_get_int(const struct spa_pod *pod, const void *body, int32_t *value)
Definition body.h:147
SPA_API_POD_PARSER int spa_pod_parser_get_string(struct spa_pod_parser *parser, const char **value)
Definition parser.h:283
SPA_API_POD_BODY int spa_pod_is_string(const struct spa_pod *pod)
Definition body.h:201
#define SPA_POD_PARSER_INIT(buffer, size)
Definition parser.h:52
SPA_API_POD_PARSER int spa_pod_parser_current_body(struct spa_pod_parser *parser, struct spa_pod *pod, const void **body)
Definition parser.h:151
SPA_API_POD_PARSER int spa_pod_parser_get_header(struct spa_pod_parser *parser, void *header, uint32_t header_size, uint32_t pod_offset, const void **body)
Definition parser.h:142
SPA_API_POD_PARSER int spa_pod_parser_get(struct spa_pod_parser *parser,...)
Definition parser.h:848
SPA_API_POD_BODY int spa_pod_body_get_float(const struct spa_pod *pod, const void *body, float *value)
Definition body.h:176
SPA_API_POD_BODY int spa_pod_body_get_rectangle(const struct spa_pod *pod, const void *body, struct spa_rectangle *value)
Definition body.h:286
SPA_API_POD_BODY int spa_pod_body_get_bool(const struct spa_pod *pod, const void *body, bool *value)
Definition body.h:121
SPA_API_POD_PARSER void spa_pod_parser_init(struct spa_pod_parser *parser, const void *data, uint32_t size)
Definition parser.h:54
SPA_API_POD_PARSER int spa_pod_parser_get_pod_body(struct spa_pod_parser *parser, struct spa_pod *value, const void **body)
Definition parser.h:355
SPA_API_POD_PARSER int spa_pod_parser_get_rectangle(struct spa_pod_parser *parser, struct spa_rectangle *value)
Definition parser.h:331
SPA_API_POD_PARSER int spa_pod_parser_push_struct_body(struct spa_pod_parser *parser, struct spa_pod_frame *frame, struct spa_pod *str, const void **str_body)
Definition parser.h:387
#define SPA_POD_SIZE(pod)
Definition pod.h:35
#define SPA_POD_ALIGN
Definition pod.h:26
SPA_API_POD_BODY int spa_pod_body_get_choice(const struct spa_pod *pod, const void *body, struct spa_pod_choice *choice, const void **choice_body)
Definition body.h:361
SPA_API_POD_PARSER int spa_pod_parser_get_id(struct spa_pod_parser *parser, uint32_t *value)
Definition parser.h:223
SPA_API_POD_BODY int spa_pod_body_get_fd(const struct spa_pod *pod, const void *body, int64_t *value)
Definition body.h:270
SPA_API_POD_BODY int spa_pod_is_choice(const struct spa_pod *pod)
Definition body.h:357
SPA_API_POD_BODY int spa_pod_body_get_id(const struct spa_pod *pod, const void *body, uint32_t *value)
Definition body.h:134
SPA_API_POD_BODY int spa_pod_is_float(const struct spa_pod *pod)
Definition body.h:171
SPA_API_POD_PARSER void spa_pod_parser_restart(struct spa_pod_parser *parser, struct spa_pod_frame *frame)
Definition parser.h:190
SPA_API_POD_BODY int spa_pod_body_get_bytes(const struct spa_pod *pod, const void *body, const void **value, uint32_t *len)
Definition body.h:237
SPA_API_POD_BODY int spa_pod_is_long(const struct spa_pod *pod)
Definition body.h:155
@ SPA_CHOICE_None
no choice, first value is current
Definition pod.h:161
@ SPA_TYPE_Object
Definition type.h:56
@ SPA_TYPE_None
Definition type.h:42
@ SPA_TYPE_Choice
Definition type.h:60
@ SPA_TYPE_Struct
Definition type.h:55
#define SPA_MIN(a, b)
Definition defs.h:165
#define SPA_ROUND_UP_N(num, align)
Definition defs.h:364
#define SPA_ID_INVALID
Definition defs.h:250
#define SPA_BARRIER
Definition defs.h:315
#define SPA_PTROFF(ptr_, offset_, type_)
Return the address (buffer + offset) as pointer of type.
Definition defs.h:222
#define SPA_API_POD_PARSER
Definition parser.h:29
struct spa_pod_choice_body body
Definition pod.h:178
struct spa_pod pod
Definition pod.h:177
struct spa_pod pod
Definition body.h:39
uint32_t offset
Definition body.h:41
struct spa_pod_frame * parent
Definition body.h:40
uint32_t flags
Definition body.h:42
uint32_t id
id of the object, depends on the object type
Definition pod.h:198
struct spa_pod pod
Definition pod.h:203
struct spa_pod_object_body body
Definition pod.h:204
uint32_t offset
Definition parser.h:39
uint32_t flags
Definition parser.h:40
struct spa_pod_frame * frame
Definition parser.h:41
uint32_t size
Definition parser.h:46
struct spa_pod_parser_state state
Definition parser.h:48
const void * data
Definition parser.h:45
uint32_t _padding
Definition parser.h:47
uint32_t key
key of property, list of valid keys depends on the object type
Definition pod.h:228
uint32_t flags
flags for property
Definition pod.h:248
struct spa_pod value
Definition pod.h:249
a sequence of timed controls
Definition pod.h:271
struct spa_pod_sequence_body body
Definition pod.h:273
uint32_t type
Definition pod.h:59
uint32_t size
Definition pod.h:58