pod: fix padding

This commit is contained in:
Wim Taymans 2017-03-01 20:00:11 +01:00
parent c063e206f4
commit 9b7debbfd3
2 changed files with 19 additions and 13 deletions

View file

@ -55,14 +55,18 @@ spa_pod_builder_init (SpaPODBuilder *builder,
} }
static inline bool static inline bool
spa_pod_builder_in_array (SpaPODBuilder *builder) spa_pod_builder_in_array (SpaPODBuilder *builder, bool *first)
{ {
SpaPODFrame *f; SpaPODFrame *f;
if ((f = builder->stack)) { if ((f = builder->stack)) {
if (f->pod.type == SPA_POD_TYPE_ARRAY && f->pod.size > 0) if (f->pod.type == SPA_POD_TYPE_ARRAY) {
*first = f->pod.size == 0;
return true; return true;
if (f->pod.type == SPA_POD_TYPE_PROP && f->pod.size > (sizeof (SpaPODPropBody) - sizeof(SpaPOD))) }
if (f->pod.type == SPA_POD_TYPE_PROP) {
*first = f->pod.size == (sizeof (SpaPODPropBody) - sizeof(SpaPOD));
return true; return true;
}
} }
return false; return false;
} }
@ -83,12 +87,12 @@ spa_pod_builder_push (SpaPODBuilder *builder,
static inline void static inline void
spa_pod_builder_advance (SpaPODBuilder *builder, uint32_t size, bool pad) spa_pod_builder_advance (SpaPODBuilder *builder, uint32_t size, bool pad)
{ {
SpaPODFrame *f;
if (pad) if (pad)
size += SPA_ROUND_UP_N (builder->offset, 8) - builder->offset; size = SPA_ROUND_UP_N (size, 8);
if (size > 0) { if (size > 0) {
SpaPODFrame *f;
builder->offset += size; builder->offset += size;
for (f = builder->stack; f; f = f->parent) for (f = builder->stack; f; f = f->parent)
f->pod.size += size; f->pod.size += size;
@ -106,7 +110,7 @@ spa_pod_builder_pop (SpaPODBuilder *builder,
memcpy (builder->data + frame->ref, &frame->pod, sizeof(SpaPOD)); memcpy (builder->data + frame->ref, &frame->pod, sizeof(SpaPOD));
} }
builder->stack = frame->parent; builder->stack = frame->parent;
spa_pod_builder_advance (builder, 0, true); spa_pod_builder_advance (builder, SPA_ROUND_UP_N(builder->offset, 8) - builder->offset, false);
} }
static inline off_t static inline off_t
@ -151,18 +155,17 @@ spa_pod_builder_primitive (SpaPODBuilder *builder, const SpaPOD *p)
{ {
const void *data; const void *data;
size_t size; size_t size;
bool pad; bool in_array, first = false;
if (spa_pod_builder_in_array (builder)) { in_array = spa_pod_builder_in_array (builder, &first);
if (in_array && !first) {
data = SPA_POD_BODY_CONST (p); data = SPA_POD_BODY_CONST (p);
size = SPA_POD_BODY_SIZE (p); size = SPA_POD_BODY_SIZE (p);
pad = false;
} else { } else {
data = p; data = p;
size = SPA_POD_SIZE (p); size = SPA_POD_SIZE (p);
pad = true;
} }
return spa_pod_builder_raw (builder, data, size, pad); return spa_pod_builder_raw (builder, data, size, !in_array);
} }
static inline off_t static inline off_t
@ -182,7 +185,7 @@ spa_pod_builder_uri (SpaPODBuilder *builder, uint32_t val)
static inline off_t static inline off_t
spa_pod_builder_int (SpaPODBuilder *builder, int32_t val) spa_pod_builder_int (SpaPODBuilder *builder, int32_t val)
{ {
const SpaPODInt p = { { sizeof (val), SPA_POD_TYPE_INT }, val }; const SpaPODInt p = { { sizeof (uint32_t), SPA_POD_TYPE_INT }, val };
return spa_pod_builder_primitive (builder, &p.pod); return spa_pod_builder_primitive (builder, &p.pod);
} }

View file

@ -424,6 +424,9 @@ print_pod_value (uint32_t size, uint32_t type, void *body, int prefix)
} }
break; break;
} }
default:
printf ("unhandled prop type %d\n", type);
break;
} }
} }