PipeWire  0.3.64
parser.h
Go to the documentation of this file.
1 /* Spa
2  *
3  * Copyright © 2018 Wim Taymans
4  *
5  * Permission is hereby granted, free of charge, to any person obtaining a
6  * copy of this software and associated documentation files (the "Software"),
7  * to deal in the Software without restriction, including without limitation
8  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
9  * and/or sell copies of the Software, and to permit persons to whom the
10  * Software is furnished to do so, subject to the following conditions:
11  *
12  * The above copyright notice and this permission notice (including the next
13  * paragraph) shall be included in all copies or substantial portions of the
14  * Software.
15  *
16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
22  * DEALINGS IN THE SOFTWARE.
23  */
24 
25 #ifndef SPA_POD_PARSER_H
26 #define SPA_POD_PARSER_H
27 
28 #ifdef __cplusplus
29 extern "C" {
30 #endif
31 
32 #include <errno.h>
33 #include <stdarg.h>
34 
35 #include <spa/pod/iter.h>
36 #include <spa/pod/vararg.h>
37 
43 struct spa_pod_parser_state {
44  uint32_t offset;
45  uint32_t flags;
46  struct spa_pod_frame *frame;
47 };
48 
50  const void *data;
51  uint32_t size;
52  uint32_t _padding;
54 };
55 
56 #define SPA_POD_PARSER_INIT(buffer,size) ((struct spa_pod_parser){ (buffer), (size), 0, {} })
57 
58 static inline void spa_pod_parser_init(struct spa_pod_parser *parser,
59  const void *data, uint32_t size)
60 {
61  *parser = SPA_POD_PARSER_INIT(data, size);
62 }
63 
64 static inline void spa_pod_parser_pod(struct spa_pod_parser *parser,
65  const struct spa_pod *pod)
66 {
67  spa_pod_parser_init(parser, pod, SPA_POD_SIZE(pod));
68 }
69 
70 static inline void
72 {
73  spa_assert(parser);
74  *state = parser->state;
75 }
76 
77 static inline void
78 spa_pod_parser_reset(struct spa_pod_parser *parser, struct spa_pod_parser_state *state)
79 {
80  spa_assert(parser);
81  parser->state = *state;
82 }
83 
84 static inline struct spa_pod *
85 spa_pod_parser_deref(struct spa_pod_parser *parser, uint32_t offset, uint32_t size)
86 {
87  spa_assert(parser);
88  /* Cast to uint64_t to avoid wraparound. Add 8 for the pod itself. */
89  const uint64_t long_offset = (uint64_t)offset + 8;
90  if (long_offset <= size && (offset & 7) == 0) {
91  /* Use void* because creating a misaligned pointer is undefined. */
92  void *pod = SPA_PTROFF(parser->data, offset, void);
93  /*
94  * Check that the pointer is aligned and that the size (rounded
95  * to the next multiple of 8) is in bounds.
96  */
97  if (SPA_IS_ALIGNED(pod, __alignof__(struct spa_pod)) &&
98  long_offset + SPA_ROUND_UP_N((uint64_t)SPA_POD_BODY_SIZE(pod), 8) <= size)
99  return (struct spa_pod *)pod;
100  }
101  return NULL;
102 }
103 
104 static inline struct spa_pod *spa_pod_parser_frame(struct spa_pod_parser *parser, struct spa_pod_frame *frame)
105 {
106  spa_assert(parser);
107  spa_assert(frame);
108  return SPA_PTROFF(parser->data, frame->offset, struct spa_pod);
109 }
110 
111 static inline void spa_pod_parser_push(struct spa_pod_parser *parser,
112  struct spa_pod_frame *frame, const struct spa_pod *pod, uint32_t offset)
113 {
114  spa_assert(parser);
115  spa_assert(frame);
116  frame->pod = *pod;
117  frame->offset = offset;
118  frame->parent = parser->state.frame;
119  frame->flags = parser->state.flags;
120  parser->state.frame = frame;
121 }
122 
123 static inline struct spa_pod *spa_pod_parser_current(struct spa_pod_parser *parser)
124 {
125  spa_assert(parser);
126  struct spa_pod_frame *f = parser->state.frame;
127  uint32_t size = f ? f->offset + SPA_POD_SIZE(&f->pod) : parser->size;
128  return spa_pod_parser_deref(parser, parser->state.offset, size);
129 }
130 
131 static inline void spa_pod_parser_advance(struct spa_pod_parser *parser, const struct spa_pod *pod)
132 {
133  spa_assert(parser);
134  parser->state.offset += SPA_ROUND_UP_N(SPA_POD_SIZE(pod), 8);
135 }
136 
137 static inline struct spa_pod *spa_pod_parser_next(struct spa_pod_parser *parser)
138 {
139  struct spa_pod *pod = spa_pod_parser_current(parser);
140  if (pod)
141  spa_pod_parser_advance(parser, pod);
142  return pod;
143 }
144 
145 static inline int spa_pod_parser_pop(struct spa_pod_parser *parser,
146  struct spa_pod_frame *frame)
147 {
148  spa_assert(parser);
149  spa_assert(frame);
150  parser->state.frame = frame->parent;
151  parser->state.offset = frame->offset + SPA_ROUND_UP_N(SPA_POD_SIZE(&frame->pod), 8);
152  return 0;
153 }
154 
155 static inline int spa_pod_parser_get_bool(struct spa_pod_parser *parser, bool *value)
156 {
157  int res = -EPIPE;
158  const struct spa_pod *pod = spa_pod_parser_current(parser);
159  if (pod != NULL && (res = spa_pod_get_bool(pod, value)) >= 0)
160  spa_pod_parser_advance(parser, pod);
161  return res;
162 }
163 
164 static inline int spa_pod_parser_get_id(struct spa_pod_parser *parser, uint32_t *value)
165 {
166  int res = -EPIPE;
167  const struct spa_pod *pod = spa_pod_parser_current(parser);
168  if (pod != NULL && (res = spa_pod_get_id(pod, value)) >= 0)
169  spa_pod_parser_advance(parser, pod);
170  return res;
171 }
172 
173 static inline int spa_pod_parser_get_int(struct spa_pod_parser *parser, int32_t *value)
174 {
175  int res = -EPIPE;
176  const struct spa_pod *pod = spa_pod_parser_current(parser);
177  if (pod != NULL && (res = spa_pod_get_int(pod, value)) >= 0)
178  spa_pod_parser_advance(parser, pod);
179  return res;
180 }
181 
182 static inline int spa_pod_parser_get_long(struct spa_pod_parser *parser, int64_t *value)
183 {
184  int res = -EPIPE;
185  const struct spa_pod *pod = spa_pod_parser_current(parser);
186  if (pod != NULL && (res = spa_pod_get_long(pod, value)) >= 0)
187  spa_pod_parser_advance(parser, pod);
188  return res;
189 }
190 
191 static inline int spa_pod_parser_get_float(struct spa_pod_parser *parser, float *value)
192 {
193  int res = -EPIPE;
194  const struct spa_pod *pod = spa_pod_parser_current(parser);
195  if (pod != NULL && (res = spa_pod_get_float(pod, value)) >= 0)
196  spa_pod_parser_advance(parser, pod);
197  return res;
198 }
199 
200 static inline int spa_pod_parser_get_double(struct spa_pod_parser *parser, double *value)
201 {
202  int res = -EPIPE;
203  const struct spa_pod *pod = spa_pod_parser_current(parser);
204  if (pod != NULL && (res = spa_pod_get_double(pod, value)) >= 0)
205  spa_pod_parser_advance(parser, pod);
206  return res;
207 }
208 
209 static inline int spa_pod_parser_get_string(struct spa_pod_parser *parser, const char **value)
210 {
211  int res = -EPIPE;
212  const struct spa_pod *pod = spa_pod_parser_current(parser);
213  if (pod != NULL && (res = spa_pod_get_string(pod, value)) >= 0)
214  spa_pod_parser_advance(parser, pod);
215  return res;
216 }
217 
218 static inline int spa_pod_parser_get_bytes(struct spa_pod_parser *parser, const void **value, uint32_t *len)
219 {
220  int res = -EPIPE;
221  const struct spa_pod *pod = spa_pod_parser_current(parser);
222  if (pod != NULL && (res = spa_pod_get_bytes(pod, value, len)) >= 0)
223  spa_pod_parser_advance(parser, pod);
224  return res;
225 }
226 
227 static inline int spa_pod_parser_get_pointer(struct spa_pod_parser *parser, uint32_t *type, const void **value)
228 {
229  int res = -EPIPE;
230  const struct spa_pod *pod = spa_pod_parser_current(parser);
231  if (pod != NULL && (res = spa_pod_get_pointer(pod, type, value)) >= 0)
232  spa_pod_parser_advance(parser, pod);
233  return res;
234 }
235 
236 static inline int spa_pod_parser_get_fd(struct spa_pod_parser *parser, int64_t *value)
237 {
238  int res = -EPIPE;
239  const struct spa_pod *pod = spa_pod_parser_current(parser);
240  if (pod != NULL && (res = spa_pod_get_fd(pod, value)) >= 0)
241  spa_pod_parser_advance(parser, pod);
242  return res;
243 }
244 
245 static inline int spa_pod_parser_get_rectangle(struct spa_pod_parser *parser, struct spa_rectangle *value)
246 {
247  int res = -EPIPE;
248  const struct spa_pod *pod = spa_pod_parser_current(parser);
249  if (pod != NULL && (res = spa_pod_get_rectangle(pod, value)) >= 0)
250  spa_pod_parser_advance(parser, pod);
251  return res;
252 }
253 
254 static inline int spa_pod_parser_get_fraction(struct spa_pod_parser *parser, struct spa_fraction *value)
255 {
256  int res = -EPIPE;
257  const struct spa_pod *pod = spa_pod_parser_current(parser);
258  if (pod != NULL && (res = spa_pod_get_fraction(pod, value)) >= 0)
259  spa_pod_parser_advance(parser, pod);
260  return res;
261 }
262 
263 static inline int spa_pod_parser_get_pod(struct spa_pod_parser *parser, struct spa_pod **value)
264 {
265  struct spa_pod *pod = spa_pod_parser_current(parser);
266  if (pod == NULL)
267  return -EPIPE;
268  *value = pod;
270  return 0;
271 }
272 static inline int spa_pod_parser_push_struct(struct spa_pod_parser *parser,
273  struct spa_pod_frame *frame)
274 {
275  const struct spa_pod *pod = spa_pod_parser_current(parser);
276  if (pod == NULL)
277  return -EPIPE;
278  if (!spa_pod_is_struct(pod))
279  return -EINVAL;
280  spa_assert(parser);
281  spa_pod_parser_push(parser, frame, pod, parser->state.offset);
282  parser->state.offset += sizeof(struct spa_pod_struct);
283  return 0;
284 }
285 
286 static inline int spa_pod_parser_push_object(struct spa_pod_parser *parser,
287  struct spa_pod_frame *frame, uint32_t type, uint32_t *id)
288 {
289  const struct spa_pod *pod = spa_pod_parser_current(parser);
290  if (pod == NULL)
291  return -EPIPE;
292  if (!spa_pod_is_object(pod))
293  return -EINVAL;
294  if (type != SPA_POD_OBJECT_TYPE(pod))
295  return -EPROTO;
296  if (id != NULL)
297  *id = SPA_POD_OBJECT_ID(pod);
298  spa_assert(parser);
299  spa_pod_parser_push(parser, frame, pod, parser->state.offset);
300  parser->state.offset = parser->size;
301  return 0;
302 }
303 
304 static inline bool spa_pod_parser_can_collect(const struct spa_pod *pod, char type)
305 {
306  if (pod == NULL)
307  return false;
308 
309  if (SPA_POD_TYPE(pod) == SPA_TYPE_Choice) {
310  if (!spa_pod_is_choice(pod))
311  return false;
312  if (type == 'V')
313  return true;
315  return false;
316  pod = SPA_POD_CHOICE_CHILD(pod);
317  }
318 
319  switch (type) {
320  case 'P':
321  return true;
322  case 'b':
323  return spa_pod_is_bool(pod);
324  case 'I':
325  return spa_pod_is_id(pod);
326  case 'i':
327  return spa_pod_is_int(pod);
328  case 'l':
329  return spa_pod_is_long(pod);
330  case 'f':
331  return spa_pod_is_float(pod);
332  case 'd':
333  return spa_pod_is_double(pod);
334  case 's':
335  return spa_pod_is_string(pod) || spa_pod_is_none(pod);
336  case 'S':
337  return spa_pod_is_string(pod);
338  case 'y':
339  return spa_pod_is_bytes(pod);
340  case 'R':
341  return spa_pod_is_rectangle(pod);
342  case 'F':
343  return spa_pod_is_fraction(pod);
344  case 'B':
345  return spa_pod_is_bitmap(pod);
346  case 'a':
347  return spa_pod_is_array(pod);
348  case 'p':
349  return spa_pod_is_pointer(pod);
350  case 'h':
351  return spa_pod_is_fd(pod);
352  case 'T':
353  return spa_pod_is_struct(pod) || spa_pod_is_none(pod);
354  case 'O':
355  return spa_pod_is_object(pod) || spa_pod_is_none(pod);
356  case 'V':
357  default:
358  return false;
359  }
360 }
361 
362 #define SPA_POD_PARSER_COLLECT(pod,_type,args) \
363 do { \
364  switch (_type) { \
365  case 'b': \
366  *va_arg(args, bool*) = SPA_POD_VALUE(struct spa_pod_bool, pod); \
367  break; \
368  case 'I': \
369  case 'i': \
370  *va_arg(args, int32_t*) = SPA_POD_VALUE(struct spa_pod_int, pod); \
371  break; \
372  case 'l': \
373  *va_arg(args, int64_t*) = SPA_POD_VALUE(struct spa_pod_long, pod); \
374  break; \
375  case 'f': \
376  *va_arg(args, float*) = SPA_POD_VALUE(struct spa_pod_float, pod); \
377  break; \
378  case 'd': \
379  *va_arg(args, double*) = SPA_POD_VALUE(struct spa_pod_double, pod); \
380  break; \
381  case 's': \
382  *va_arg(args, char**) = \
383  ((pod) == NULL || (SPA_POD_TYPE(pod) == SPA_TYPE_None) \
384  ? NULL \
385  : (char *)SPA_POD_CONTENTS(struct spa_pod_string, pod)); \
386  break; \
387  case 'S': \
388  { \
389  char *dest = va_arg(args, char*); \
390  uint32_t maxlen = va_arg(args, uint32_t); \
391  strncpy(dest, (char *)SPA_POD_CONTENTS(struct spa_pod_string, pod), maxlen-1); \
392  dest[maxlen-1] = '\0'; \
393  break; \
394  } \
395  case 'y': \
396  *(va_arg(args, void **)) = SPA_POD_CONTENTS(struct spa_pod_bytes, pod); \
397  *(va_arg(args, uint32_t *)) = SPA_POD_BODY_SIZE(pod); \
398  break; \
399  case 'R': \
400  *va_arg(args, struct spa_rectangle*) = \
401  SPA_POD_VALUE(struct spa_pod_rectangle, pod); \
402  break; \
403  case 'F': \
404  *va_arg(args, struct spa_fraction*) = \
405  SPA_POD_VALUE(struct spa_pod_fraction, pod); \
406  break; \
407  case 'B': \
408  *va_arg(args, uint32_t **) = \
409  (uint32_t *) SPA_POD_CONTENTS(struct spa_pod_bitmap, pod); \
410  break; \
411  case 'a': \
412  *va_arg(args, uint32_t*) = SPA_POD_ARRAY_VALUE_SIZE(pod); \
413  *va_arg(args, uint32_t*) = SPA_POD_ARRAY_VALUE_TYPE(pod); \
414  *va_arg(args, uint32_t*) = SPA_POD_ARRAY_N_VALUES(pod); \
415  *va_arg(args, void**) = SPA_POD_ARRAY_VALUES(pod); \
416  break; \
417  case 'p': \
418  { \
419  struct spa_pod_pointer_body *b = \
420  (struct spa_pod_pointer_body *) SPA_POD_BODY(pod); \
421  *(va_arg(args, uint32_t *)) = b->type; \
422  *(va_arg(args, const void **)) = b->value; \
423  break; \
424  } \
425  case 'h': \
426  *va_arg(args, int64_t*) = SPA_POD_VALUE(struct spa_pod_fd, pod); \
427  break; \
428  case 'P': \
429  case 'T': \
430  case 'O': \
431  case 'V': \
432  { \
433  const struct spa_pod **d = va_arg(args, const struct spa_pod**); \
434  if (d) \
435  *d = ((pod) == NULL || (SPA_POD_TYPE(pod) == SPA_TYPE_None) \
436  ? NULL : (pod)); \
437  break; \
438  } \
439  default: \
440  break; \
441  } \
442 } while(false)
443 
444 #define SPA_POD_PARSER_SKIP(_type,args) \
445 do { \
446  switch (_type) { \
447  case 'S': \
448  va_arg(args, char*); \
449  va_arg(args, uint32_t); \
450  break; \
451  case 'a': \
452  va_arg(args, void*); \
453  va_arg(args, void*); \
454  SPA_FALLTHROUGH \
455  case 'p': \
456  case 'y': \
457  va_arg(args, void*); \
458  SPA_FALLTHROUGH \
459  case 'b': \
460  case 'I': \
461  case 'i': \
462  case 'l': \
463  case 'f': \
464  case 'd': \
465  case 's': \
466  case 'R': \
467  case 'F': \
468  case 'B': \
469  case 'h': \
470  case 'V': \
471  case 'P': \
472  case 'T': \
473  case 'O': \
474  va_arg(args, void*); \
475  break; \
476  } \
477 } while(false)
478 
479 static inline int spa_pod_parser_getv(struct spa_pod_parser *parser, va_list args)
480 {
481  spa_assert(parser);
482  struct spa_pod_frame *f = parser->state.frame;
483  uint32_t ftype = f ? f->pod.type : (uint32_t)SPA_TYPE_Struct;
484  const struct spa_pod_prop *prop = NULL;
485  int count = 0;
486 
487  do {
488  bool optional;
489  const struct spa_pod *pod = NULL;
490  const char *format;
491 
492  if (ftype == SPA_TYPE_Object) {
493  uint32_t key = va_arg(args, uint32_t);
494  const struct spa_pod_object *object;
495 
496  if (key == 0)
497  break;
498 
499  object = (const struct spa_pod_object *)spa_pod_parser_frame(parser, f);
500  prop = spa_pod_object_find_prop(object, prop, key);
501  pod = prop ? &prop->value : NULL;
502  }
503 
504  if ((format = va_arg(args, char *)) == NULL)
505  break;
506 
507  if (ftype == SPA_TYPE_Struct)
508  pod = spa_pod_parser_next(parser);
509 
510  if ((optional = (*format == '?')))
511  format++;
512 
513  if (!spa_pod_parser_can_collect(pod, *format)) {
514  if (!optional) {
515  if (pod == NULL)
516  return -ESRCH;
517  else
518  return -EPROTO;
519  }
520  SPA_POD_PARSER_SKIP(*format, args);
521  } else {
522  if (pod->type == SPA_TYPE_Choice && *format != 'V')
524 
525  SPA_POD_PARSER_COLLECT(pod, *format, args);
526  count++;
527  }
528  } while (true);
529 
530  return count;
531 }
532 
533 static inline int spa_pod_parser_get(struct spa_pod_parser *parser, ...)
534 {
535  int res;
536  va_list args;
537 
538  va_start(args, parser);
539  res = spa_pod_parser_getv(parser, args);
540  va_end(args);
541 
542  return res;
543 }
544 
545 #define SPA_POD_OPT_Bool(val) "?" SPA_POD_Bool(val)
546 #define SPA_POD_OPT_Id(val) "?" SPA_POD_Id(val)
547 #define SPA_POD_OPT_Int(val) "?" SPA_POD_Int(val)
548 #define SPA_POD_OPT_Long(val) "?" SPA_POD_Long(val)
549 #define SPA_POD_OPT_Float(val) "?" SPA_POD_Float(val)
550 #define SPA_POD_OPT_Double(val) "?" SPA_POD_Double(val)
551 #define SPA_POD_OPT_String(val) "?" SPA_POD_String(val)
552 #define SPA_POD_OPT_Stringn(val,len) "?" SPA_POD_Stringn(val,len)
553 #define SPA_POD_OPT_Bytes(val,len) "?" SPA_POD_Bytes(val,len)
554 #define SPA_POD_OPT_Rectangle(val) "?" SPA_POD_Rectangle(val)
555 #define SPA_POD_OPT_Fraction(val) "?" SPA_POD_Fraction(val)
556 #define SPA_POD_OPT_Array(csize,ctype,n_vals,vals) "?" SPA_POD_Array(csize,ctype,n_vals,vals)
557 #define SPA_POD_OPT_Pointer(type,val) "?" SPA_POD_Pointer(type,val)
558 #define SPA_POD_OPT_Fd(val) "?" SPA_POD_Fd(val)
559 #define SPA_POD_OPT_Pod(val) "?" SPA_POD_Pod(val)
560 #define SPA_POD_OPT_PodObject(val) "?" SPA_POD_PodObject(val)
561 #define SPA_POD_OPT_PodStruct(val) "?" SPA_POD_PodStruct(val)
562 #define SPA_POD_OPT_PodChoice(val) "?" SPA_POD_PodChoice(val)
563 
564 #define spa_pod_parser_get_object(p,type,id,...) \
565 ({ \
566  struct spa_pod_frame _f; \
567  int _res; \
568  if ((_res = spa_pod_parser_push_object(p, &_f, type, id)) == 0) { \
569  _res = spa_pod_parser_get(p,##__VA_ARGS__, 0); \
570  spa_pod_parser_pop(p, &_f); \
571  } \
572  _res; \
573 })
574 
575 #define spa_pod_parser_get_struct(p,...) \
576 ({ \
577  struct spa_pod_frame _f; \
578  int _res; \
579  if ((_res = spa_pod_parser_push_struct(p, &_f)) == 0) { \
580  _res = spa_pod_parser_get(p,##__VA_ARGS__, NULL); \
581  spa_pod_parser_pop(p, &_f); \
582  } \
583  _res; \
584 })
585 
586 #define spa_pod_parse_object(pod,type,id,...) \
587 ({ \
588  struct spa_pod_parser _p; \
589  spa_pod_parser_pod(&_p, pod); \
590  spa_pod_parser_get_object(&_p,type,id,##__VA_ARGS__); \
591 })
592 
593 #define spa_pod_parse_struct(pod,...) \
594 ({ \
595  struct spa_pod_parser _p; \
596  spa_pod_parser_pod(&_p, pod); \
597  spa_pod_parser_get_struct(&_p,##__VA_ARGS__); \
598 })
599 
604 #ifdef __cplusplus
605 } /* extern "C" */
606 #endif
607 
608 #endif /* SPA_POD_PARSER_H */
static int spa_pod_is_bitmap(const struct spa_pod *pod)
Definition: iter.h:330
static void spa_pod_parser_pod(struct spa_pod_parser *parser, const struct spa_pod *pod)
Definition: parser.h:70
static int spa_pod_get_int(const struct spa_pod *pod, int32_t *value)
Definition: iter.h:187
static int spa_pod_parser_get_double(struct spa_pod_parser *parser, double *value)
Definition: parser.h:206
static int spa_pod_is_long(const struct spa_pod *pod)
Definition: iter.h:195
static int spa_pod_is_bytes(const struct spa_pod *pod)
Definition: iter.h:260
static int spa_pod_parser_get_float(struct spa_pod_parser *parser, float *value)
Definition: parser.h:197
static const struct spa_pod_prop * spa_pod_object_find_prop(const struct spa_pod_object *pod, const struct spa_pod_prop *start, uint32_t key)
Definition: iter.h:408
static int spa_pod_get_pointer(const struct spa_pod *pod, uint32_t *type, const void **value)
Definition: iter.h:280
static int spa_pod_parser_get_bytes(struct spa_pod_parser *parser, const void **value, uint32_t *len)
Definition: parser.h:224
static int spa_pod_get_fraction(const struct spa_pod *pod, struct spa_fraction *value)
Definition: iter.h:323
static struct spa_pod * spa_pod_parser_deref(struct spa_pod_parser *parser, uint32_t offset, uint32_t size)
Definition: parser.h:91
static int spa_pod_parser_get(struct spa_pod_parser *parser,...)
Definition: parser.h:539
static int spa_pod_is_rectangle(const struct spa_pod *pod)
Definition: iter.h:303
static int spa_pod_is_fd(const struct spa_pod *pod)
Definition: iter.h:289
static int spa_pod_is_pointer(const struct spa_pod *pod)
Definition: iter.h:274
#define SPA_POD_TYPE(pod)
Definition: pod/pod.h:48
static int spa_pod_get_id(const struct spa_pod *pod, uint32_t *value)
Definition: iter.h:174
static int spa_pod_parser_get_long(struct spa_pod_parser *parser, int64_t *value)
Definition: parser.h:188
static struct spa_pod * spa_pod_parser_next(struct spa_pod_parser *parser)
Definition: parser.h:143
#define SPA_POD_BODY_SIZE(pod)
Definition: pod/pod.h:46
static int spa_pod_get_float(const struct spa_pod *pod, float *value)
Definition: iter.h:213
static int spa_pod_parser_get_int(struct spa_pod_parser *parser, int32_t *value)
Definition: parser.h:179
static int spa_pod_parser_get_pod(struct spa_pod_parser *parser, struct spa_pod **value)
Definition: parser.h:269
static int spa_pod_parser_push_struct(struct spa_pod_parser *parser, struct spa_pod_frame *frame)
Definition: parser.h:278
static void spa_pod_parser_get_state(struct spa_pod_parser *parser, struct spa_pod_parser_state *state)
Definition: parser.h:77
#define SPA_POD_PARSER_COLLECT(pod, _type, args)
Definition: parser.h:368
static int spa_pod_parser_get_string(struct spa_pod_parser *parser, const char **value)
Definition: parser.h:215
static int spa_pod_parser_get_rectangle(struct spa_pod_parser *parser, struct spa_rectangle *value)
Definition: parser.h:251
static 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:292
static int spa_pod_is_object(const struct spa_pod *pod)
Definition: iter.h:386
static int spa_pod_get_rectangle(const struct spa_pod *pod, struct spa_rectangle *value)
Definition: iter.h:309
static int spa_pod_get_fd(const struct spa_pod *pod, int64_t *value)
Definition: iter.h:295
static int spa_pod_is_struct(const struct spa_pod *pod)
Definition: iter.h:381
static struct spa_pod * spa_pod_parser_current(struct spa_pod_parser *parser)
Definition: parser.h:129
#define SPA_POD_PARSER_SKIP(_type, args)
Definition: parser.h:450
static int spa_pod_get_long(const struct spa_pod *pod, int64_t *value)
Definition: iter.h:200
static void spa_pod_parser_advance(struct spa_pod_parser *parser, const struct spa_pod *pod)
Definition: parser.h:137
static 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:117
static int spa_pod_is_string(const struct spa_pod *pod)
Definition: iter.h:234
static void spa_pod_parser_init(struct spa_pod_parser *parser, const void *data, uint32_t size)
Definition: parser.h:64
static int spa_pod_parser_get_bool(struct spa_pod_parser *parser, bool *value)
Definition: parser.h:161
static int spa_pod_is_choice(const struct spa_pod *pod)
Definition: iter.h:361
static int spa_pod_get_string(const struct spa_pod *pod, const char **value)
Definition: iter.h:242
static int spa_pod_get_double(const struct spa_pod *pod, double *value)
Definition: iter.h:226
static int spa_pod_parser_get_fd(struct spa_pod_parser *parser, int64_t *value)
Definition: parser.h:242
#define SPA_POD_PARSER_INIT(buffer, size)
Definition: parser.h:62
static int spa_pod_get_bool(const struct spa_pod *pod, bool *value)
Definition: iter.h:161
static int spa_pod_parser_get_pointer(struct spa_pod_parser *parser, uint32_t *type, const void **value)
Definition: parser.h:233
#define SPA_POD_OBJECT_TYPE(obj)
Definition: pod/pod.h:193
#define SPA_POD_OBJECT_ID(obj)
Definition: pod/pod.h:195
static int spa_pod_parser_getv(struct spa_pod_parser *parser, va_list args)
Definition: parser.h:485
static int spa_pod_is_array(const struct spa_pod *pod)
Definition: iter.h:336
static int spa_pod_parser_get_id(struct spa_pod_parser *parser, uint32_t *value)
Definition: parser.h:170
static int spa_pod_is_id(const struct spa_pod *pod)
Definition: iter.h:169
static int spa_pod_is_double(const struct spa_pod *pod)
Definition: iter.h:221
static int spa_pod_is_int(const struct spa_pod *pod)
Definition: iter.h:182
static struct spa_pod * spa_pod_parser_frame(struct spa_pod_parser *parser, struct spa_pod_frame *frame)
Definition: parser.h:110
static void spa_pod_parser_reset(struct spa_pod_parser *parser, struct spa_pod_parser_state *state)
Definition: parser.h:84
static bool spa_pod_parser_can_collect(const struct spa_pod *pod, char type)
Definition: parser.h:310
static int spa_pod_is_none(const struct spa_pod *pod)
Definition: iter.h:151
static int spa_pod_is_fraction(const struct spa_pod *pod)
Definition: iter.h:317
#define SPA_POD_SIZE(pod)
Definition: pod/pod.h:50
static int spa_pod_parser_get_fraction(struct spa_pod_parser *parser, struct spa_fraction *value)
Definition: parser.h:260
static int spa_pod_parser_pop(struct spa_pod_parser *parser, struct spa_pod_frame *frame)
Definition: parser.h:151
static int spa_pod_is_float(const struct spa_pod *pod)
Definition: iter.h:208
#define SPA_POD_CHOICE_CHILD(choice)
Definition: pod/pod.h:152
#define SPA_POD_CHOICE_TYPE(choice)
Definition: pod/pod.h:154
static int spa_pod_get_bytes(const struct spa_pod *pod, const void **value, uint32_t *len)
Definition: iter.h:265
static int spa_pod_is_bool(const struct spa_pod *pod)
Definition: iter.h:156
@ SPA_CHOICE_None
no choice, first value is current
Definition: pod/pod.h:167
@ SPA_TYPE_Object
Definition: spa/include/spa/utils/type.h:65
@ SPA_TYPE_Choice
Definition: spa/include/spa/utils/type.h:69
@ SPA_TYPE_Struct
Definition: spa/include/spa/utils/type.h:64
#define SPA_ROUND_UP_N(num, align)
Definition: defs.h:336
#define SPA_IS_ALIGNED(p, align)
Definition: defs.h:341
#define SPA_PTROFF(ptr_, offset_, type_)
Return the address (buffer + offset) as pointer of type.
Definition: defs.h:210
#define spa_assert(expr)
Definition: defs.h:410
spa/pod/iter.h
Definition: defs.h:139
Definition: iter.h:47
struct spa_pod pod
Definition: iter.h:48
uint32_t offset
Definition: iter.h:50
struct spa_pod_frame * parent
Definition: iter.h:49
uint32_t flags
Definition: iter.h:51
Definition: pod/pod.h:203
struct spa_pod pod
Definition: pod/pod.h:204
Definition: parser.h:48
uint32_t offset
Definition: parser.h:49
uint32_t flags
Definition: parser.h:50
struct spa_pod_frame * frame
Definition: parser.h:51
Definition: parser.h:54
uint32_t size
Definition: parser.h:56
struct spa_pod_parser_state state
Definition: parser.h:58
const void * data
Definition: parser.h:55
uint32_t _padding
Definition: parser.h:57
Definition: pod/pod.h:228
struct spa_pod value
Definition: pod/pod.h:246
Definition: pod/pod.h:187
Definition: pod/pod.h:63
uint32_t type
Definition: pod/pod.h:65
uint32_t size
Definition: pod/pod.h:64
Definition: defs.h:118
spa/pod/vararg.h