mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-11-01 22:58:50 -04:00
pod: fix padding
This commit is contained in:
parent
c063e206f4
commit
9b7debbfd3
2 changed files with 19 additions and 13 deletions
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue