mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-11-02 09:01:50 -05:00
compare: add size to compare
This commit is contained in:
parent
982fa0c80b
commit
be1725c67b
2 changed files with 18 additions and 12 deletions
|
|
@ -40,7 +40,7 @@ extern "C" {
|
|||
#include <spa/pod/iter.h>
|
||||
#include <spa/pod/builder.h>
|
||||
|
||||
static inline int spa_pod_compare_value(uint32_t type, const void *r1, const void *r2)
|
||||
static inline int spa_pod_compare_value(uint32_t type, const void *r1, const void *r2, uint32_t size)
|
||||
{
|
||||
switch (type) {
|
||||
case SPA_TYPE_None:
|
||||
|
|
@ -58,6 +58,8 @@ static inline int spa_pod_compare_value(uint32_t type, const void *r1, const voi
|
|||
return *(double *) r1 - *(double *) r2;
|
||||
case SPA_TYPE_String:
|
||||
return strcmp((char *)r1, (char *)r2);
|
||||
case SPA_TYPE_Bytes:
|
||||
return memcmp((char *)r1, (char *)r2, size);
|
||||
case SPA_TYPE_Rectangle:
|
||||
{
|
||||
const struct spa_rectangle *rec1 = (struct spa_rectangle *) r1,
|
||||
|
|
@ -156,7 +158,11 @@ static inline int spa_pod_compare(const struct spa_pod *pod1,
|
|||
break;
|
||||
}
|
||||
default:
|
||||
res = spa_pod_compare_value(SPA_POD_TYPE(pod1), SPA_POD_BODY(pod1), SPA_POD_BODY(pod2));
|
||||
if (SPA_POD_BODY_SIZE(pod1) != SPA_POD_BODY_SIZE(pod2))
|
||||
return -EINVAL;
|
||||
res = spa_pod_compare_value(SPA_POD_TYPE(pod1),
|
||||
SPA_POD_BODY(pod1), SPA_POD_BODY(pod2),
|
||||
SPA_POD_BODY_SIZE(pod1));
|
||||
break;
|
||||
}
|
||||
return res;
|
||||
|
|
|
|||
|
|
@ -51,12 +51,12 @@ static inline int spa_pod_choice_fix_default(struct spa_pod_choice *choice)
|
|||
case SPA_CHOICE_Step:
|
||||
if (nvals > 1) {
|
||||
alt = SPA_MEMBER(alt, size, void);
|
||||
if (spa_pod_compare_value(type, val, alt) < 0)
|
||||
if (spa_pod_compare_value(type, val, alt, size) < 0)
|
||||
memcpy(val, alt, size);
|
||||
}
|
||||
if (nvals > 2) {
|
||||
alt = SPA_MEMBER(alt, size, void);
|
||||
if (spa_pod_compare_value(type, val, alt) > 0)
|
||||
if (spa_pod_compare_value(type, val, alt, size) > 0)
|
||||
memcpy(val, alt, size);
|
||||
}
|
||||
break;
|
||||
|
|
@ -66,7 +66,7 @@ static inline int spa_pod_choice_fix_default(struct spa_pod_choice *choice)
|
|||
|
||||
for (i = 1; i < nvals; i++) {
|
||||
alt = SPA_MEMBER(alt, size, void);
|
||||
if (spa_pod_compare_value(type, val, alt) == 0) {
|
||||
if (spa_pod_compare_value(type, val, alt, size) == 0) {
|
||||
best = alt;
|
||||
break;
|
||||
}
|
||||
|
|
@ -138,7 +138,7 @@ spa_pod_filter_prop(struct spa_pod_builder *b,
|
|||
/* copy all equal values but don't copy the default value again */
|
||||
for (j = 0, a1 = alt1; j < nalt1; j++, a1 = SPA_MEMBER(a1, size, void)) {
|
||||
for (k = 0, a2 = alt2; k < nalt2; k++, a2 = SPA_MEMBER(a2,size,void)) {
|
||||
if (spa_pod_compare_value(type, a1, a2) == 0) {
|
||||
if (spa_pod_compare_value(type, a1, a2, size) == 0) {
|
||||
if (p1c == SPA_CHOICE_Enum || j > 0)
|
||||
spa_pod_builder_raw(b, a1, size);
|
||||
n_copied++;
|
||||
|
|
@ -155,9 +155,9 @@ spa_pod_filter_prop(struct spa_pod_builder *b,
|
|||
int n_copied = 0;
|
||||
/* copy all values inside the range */
|
||||
for (j = 0, a1 = alt1, a2 = alt2; j < nalt1; j++, a1 = SPA_MEMBER(a1,size,void)) {
|
||||
if (spa_pod_compare_value(type, a1, a2) < 0)
|
||||
if (spa_pod_compare_value(type, a1, a2, size) < 0)
|
||||
continue;
|
||||
if (spa_pod_compare_value(type, a1, SPA_MEMBER(a2,size,void)) > 0)
|
||||
if (spa_pod_compare_value(type, a1, SPA_MEMBER(a2,size,void), size) > 0)
|
||||
continue;
|
||||
spa_pod_builder_raw(b, a1, size);
|
||||
n_copied++;
|
||||
|
|
@ -177,9 +177,9 @@ spa_pod_filter_prop(struct spa_pod_builder *b,
|
|||
int n_copied = 0;
|
||||
/* copy all values inside the range */
|
||||
for (k = 0, a1 = alt1, a2 = alt2; k < nalt2; k++, a2 = SPA_MEMBER(a2,size,void)) {
|
||||
if (spa_pod_compare_value(type, a2, a1) < 0)
|
||||
if (spa_pod_compare_value(type, a2, a1, size) < 0)
|
||||
continue;
|
||||
if (spa_pod_compare_value(type, a2, SPA_MEMBER(a1,size,void)) > 0)
|
||||
if (spa_pod_compare_value(type, a2, SPA_MEMBER(a1,size,void), size) > 0)
|
||||
continue;
|
||||
spa_pod_builder_raw(b, a2, size);
|
||||
n_copied++;
|
||||
|
|
@ -190,7 +190,7 @@ spa_pod_filter_prop(struct spa_pod_builder *b,
|
|||
}
|
||||
|
||||
if (p1c == SPA_CHOICE_Range && p2c == SPA_CHOICE_Range) {
|
||||
if (spa_pod_compare_value(type, alt1, alt2) < 0)
|
||||
if (spa_pod_compare_value(type, alt1, alt2, size) < 0)
|
||||
spa_pod_builder_raw(b, alt2, size);
|
||||
else
|
||||
spa_pod_builder_raw(b, alt1, size);
|
||||
|
|
@ -198,7 +198,7 @@ spa_pod_filter_prop(struct spa_pod_builder *b,
|
|||
alt1 = SPA_MEMBER(alt1,size,void);
|
||||
alt2 = SPA_MEMBER(alt2,size,void);
|
||||
|
||||
if (spa_pod_compare_value(type, alt1, alt2) < 0)
|
||||
if (spa_pod_compare_value(type, alt1, alt2, size) < 0)
|
||||
spa_pod_builder_raw(b, alt1, size);
|
||||
else
|
||||
spa_pod_builder_raw(b, alt2, size);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue