mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-11-02 09:01:50 -05:00
pod: handle NULL
This commit is contained in:
parent
e28b5f91b8
commit
3dba9f0fd4
10 changed files with 121 additions and 111 deletions
|
|
@ -104,6 +104,7 @@ typedef void (*SpaNotify) (void *data);
|
|||
#define SPA_N_ELEMENTS(arr) (sizeof (arr) / sizeof ((arr)[0]))
|
||||
#define SPA_MIN(a,b) ((a)<(b) ? (a) : (b))
|
||||
#define SPA_MAX(a,b) ((a)>(b) ? (a) : (b))
|
||||
#define SPA_ABS(a) ((a)>0 ? (a) : -(a))
|
||||
#define SPA_CLAMP(v,a,b) ((v)>(b) ? (b) : ((v) < (a) ? (a) : (v)))
|
||||
|
||||
#define SPA_MEMBER(b,o,t) ((t*)((uint8_t*)(b) + (o)))
|
||||
|
|
|
|||
|
|
@ -495,7 +495,11 @@ spa_pod_builder_addv (SpaPODBuilder *builder,
|
|||
spa_pod_builder_pop (builder, f);
|
||||
break;
|
||||
case SPA_POD_TYPE_POD:
|
||||
body = va_arg (args, void *);
|
||||
if ((body = va_arg (args, void *)) == NULL) {
|
||||
head.pod.type = SPA_POD_TYPE_NONE;
|
||||
head.pod.size = 0;
|
||||
body = &head;
|
||||
}
|
||||
body_size = SPA_POD_SIZE (body);
|
||||
goto extra;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -121,14 +121,13 @@ spa_pod_iter_getv (SpaPODIter *iter,
|
|||
while (type && (res = spa_pod_iter_has_next (iter))) {
|
||||
SpaPOD *pod = spa_pod_iter_next (iter);
|
||||
|
||||
if (type != SPA_POD_TYPE_POD && pod->type != type)
|
||||
return false;
|
||||
|
||||
SPA_POD_COLLECT (pod, type, args);
|
||||
SPA_POD_COLLECT (pod, type, args, error);
|
||||
|
||||
type = va_arg (args, uint32_t);
|
||||
}
|
||||
return res;
|
||||
error:
|
||||
return false;
|
||||
}
|
||||
|
||||
static inline bool
|
||||
|
|
|
|||
|
|
@ -24,6 +24,7 @@
|
|||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdarg.h>
|
||||
#include <spa/pod.h>
|
||||
|
||||
|
|
@ -90,61 +91,78 @@ spa_pod_object_find_prop (const SpaPODObject *obj, uint32_t key)
|
|||
return spa_pod_contents_find_prop (&obj->pod, sizeof (SpaPODObject), key);
|
||||
}
|
||||
|
||||
#define SPA_POD_COLLECT(pod,type,args) \
|
||||
switch (type) { \
|
||||
case SPA_POD_TYPE_BOOL: \
|
||||
case SPA_POD_TYPE_URI: \
|
||||
case SPA_POD_TYPE_INT: \
|
||||
*(va_arg (args, int32_t*)) = SPA_POD_VALUE(SpaPODInt, pod); \
|
||||
break; \
|
||||
case SPA_POD_TYPE_LONG: \
|
||||
*(va_arg (args, int64_t*)) = SPA_POD_VALUE (SpaPODLong, pod); \
|
||||
break; \
|
||||
case SPA_POD_TYPE_FLOAT: \
|
||||
*(va_arg (args, float*)) = SPA_POD_VALUE (SpaPODFloat, pod); \
|
||||
break; \
|
||||
case SPA_POD_TYPE_DOUBLE: \
|
||||
*(va_arg (args, double*)) = SPA_POD_VALUE (SpaPODDouble, pod); \
|
||||
break; \
|
||||
case SPA_POD_TYPE_STRING: \
|
||||
*(va_arg (args, char **)) = SPA_POD_CONTENTS (SpaPODString, pod); \
|
||||
break; \
|
||||
case -SPA_POD_TYPE_STRING: \
|
||||
{ \
|
||||
char *dest = va_arg (args, char *); \
|
||||
uint32_t maxlen = va_arg (args, uint32_t); \
|
||||
strncpy (dest, SPA_POD_CONTENTS (SpaPODString, pod), maxlen-1); \
|
||||
break; \
|
||||
#define SPA_POD_COLLECT(pod,type,args,error) \
|
||||
do { \
|
||||
if (type == SPA_POD_TYPE_POD) { \
|
||||
*(va_arg (args, SpaPOD **)) = pod; \
|
||||
} else if ((pod)->type == SPA_POD_TYPE_NONE) { \
|
||||
switch (type) { \
|
||||
case SPA_POD_TYPE_ARRAY: \
|
||||
case SPA_POD_TYPE_STRUCT: \
|
||||
case SPA_POD_TYPE_OBJECT: \
|
||||
case SPA_POD_TYPE_PROP: \
|
||||
*(va_arg (args, SpaPOD **)) = NULL; \
|
||||
break; \
|
||||
default: \
|
||||
goto error; \
|
||||
} \
|
||||
case SPA_POD_TYPE_BYTES: \
|
||||
*(va_arg (args, void **)) = SPA_POD_CONTENTS (SpaPODBytes, pod); \
|
||||
*(va_arg (args, uint32_t *)) = SPA_POD_BODY_SIZE (pod); \
|
||||
break; \
|
||||
case SPA_POD_TYPE_POINTER: \
|
||||
{ \
|
||||
SpaPODPointerBody *b = SPA_POD_BODY (pod); \
|
||||
*(va_arg (args, void **)) = b->value; \
|
||||
break; \
|
||||
} else if ((pod)->type == type) { \
|
||||
switch (type) { \
|
||||
case SPA_POD_TYPE_BOOL: \
|
||||
case SPA_POD_TYPE_URI: \
|
||||
case SPA_POD_TYPE_INT: \
|
||||
*(va_arg (args, int32_t*)) = SPA_POD_VALUE(SpaPODInt, pod); \
|
||||
break; \
|
||||
case SPA_POD_TYPE_LONG: \
|
||||
*(va_arg (args, int64_t*)) = SPA_POD_VALUE (SpaPODLong, pod); \
|
||||
break; \
|
||||
case SPA_POD_TYPE_FLOAT: \
|
||||
*(va_arg (args, float*)) = SPA_POD_VALUE (SpaPODFloat, pod); \
|
||||
break; \
|
||||
case SPA_POD_TYPE_DOUBLE: \
|
||||
*(va_arg (args, double*)) = SPA_POD_VALUE (SpaPODDouble, pod); \
|
||||
break; \
|
||||
case SPA_POD_TYPE_STRING: \
|
||||
*(va_arg (args, char **)) = SPA_POD_CONTENTS (SpaPODString, pod); \
|
||||
break; \
|
||||
case -SPA_POD_TYPE_STRING: \
|
||||
{ \
|
||||
char *dest = va_arg (args, char *); \
|
||||
uint32_t maxlen = va_arg (args, uint32_t); \
|
||||
strncpy (dest, SPA_POD_CONTENTS (SpaPODString, pod), maxlen-1); \
|
||||
break; \
|
||||
} \
|
||||
case SPA_POD_TYPE_BYTES: \
|
||||
*(va_arg (args, void **)) = SPA_POD_CONTENTS (SpaPODBytes, pod); \
|
||||
*(va_arg (args, uint32_t *)) = SPA_POD_BODY_SIZE (pod); \
|
||||
break; \
|
||||
case SPA_POD_TYPE_POINTER: \
|
||||
{ \
|
||||
SpaPODPointerBody *b = SPA_POD_BODY (pod); \
|
||||
*(va_arg (args, void **)) = b->value; \
|
||||
break; \
|
||||
} \
|
||||
case SPA_POD_TYPE_RECTANGLE: \
|
||||
*(va_arg (args, SpaRectangle *)) = SPA_POD_VALUE (SpaPODRectangle, pod); \
|
||||
break; \
|
||||
case SPA_POD_TYPE_FRACTION: \
|
||||
*(va_arg (args, SpaFraction *)) = SPA_POD_VALUE (SpaPODFraction, pod); \
|
||||
break; \
|
||||
case SPA_POD_TYPE_BITMASK: \
|
||||
*(va_arg (args, uint32_t **)) = SPA_POD_CONTENTS (SpaPOD, pod); \
|
||||
break; \
|
||||
case SPA_POD_TYPE_ARRAY: \
|
||||
case SPA_POD_TYPE_STRUCT: \
|
||||
case SPA_POD_TYPE_OBJECT: \
|
||||
case SPA_POD_TYPE_PROP: \
|
||||
*(va_arg (args, SpaPOD **)) = pod; \
|
||||
break; \
|
||||
default: \
|
||||
goto error; \
|
||||
} \
|
||||
case SPA_POD_TYPE_RECTANGLE: \
|
||||
*(va_arg (args, SpaRectangle *)) = SPA_POD_VALUE (SpaPODRectangle, pod); \
|
||||
break; \
|
||||
case SPA_POD_TYPE_FRACTION: \
|
||||
*(va_arg (args, SpaFraction *)) = SPA_POD_VALUE (SpaPODFraction, pod); \
|
||||
break; \
|
||||
case SPA_POD_TYPE_BITMASK: \
|
||||
*(va_arg (args, uint32_t **)) = SPA_POD_CONTENTS (SpaPOD, pod); \
|
||||
break; \
|
||||
case SPA_POD_TYPE_ARRAY: \
|
||||
case SPA_POD_TYPE_STRUCT: \
|
||||
case SPA_POD_TYPE_OBJECT: \
|
||||
case SPA_POD_TYPE_PROP: \
|
||||
case SPA_POD_TYPE_POD: \
|
||||
*(va_arg (args, SpaPOD **)) = pod; \
|
||||
break; \
|
||||
default: \
|
||||
break; \
|
||||
} \
|
||||
} else \
|
||||
goto error; \
|
||||
} while (false); \
|
||||
|
||||
#define SPA_POD_COLLECT_SKIP(type,args) \
|
||||
switch (type) { \
|
||||
|
|
@ -184,13 +202,13 @@ spa_pod_contents_queryv (const SpaPOD *pod, uint32_t offset, uint32_t key, va_li
|
|||
type = va_arg (args, uint32_t);
|
||||
|
||||
if (prop && prop->body.key == key &&
|
||||
(type == SPA_POD_TYPE_POD || prop->body.value.type == type) &&
|
||||
!(prop->body.flags & SPA_POD_PROP_FLAG_UNSET)) {
|
||||
SPA_POD_COLLECT (&prop->body.value, type, args);
|
||||
SPA_POD_COLLECT (&prop->body.value, type, args, next);
|
||||
count++;
|
||||
} else {
|
||||
SPA_POD_COLLECT_SKIP (type, args);
|
||||
}
|
||||
next:
|
||||
key = va_arg (args, uint32_t);
|
||||
}
|
||||
return count;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue