mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-11-02 09:01:50 -05:00
intersection improvements
Add uri type
This commit is contained in:
parent
7a7ede96e5
commit
282995d0d0
4 changed files with 55 additions and 12 deletions
|
|
@ -161,6 +161,13 @@ spa_pod_builder_bool (SpaPODBuilder *builder, bool val)
|
||||||
return spa_pod_builder_primitive (builder, &p.pod);
|
return spa_pod_builder_primitive (builder, &p.pod);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline off_t
|
||||||
|
spa_pod_builder_uri (SpaPODBuilder *builder, uint32_t val)
|
||||||
|
{
|
||||||
|
const SpaPODURI p = { { sizeof (uint32_t), SPA_POD_TYPE_URI }, val };
|
||||||
|
return spa_pod_builder_primitive (builder, &p.pod);
|
||||||
|
}
|
||||||
|
|
||||||
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)
|
||||||
{
|
{
|
||||||
|
|
@ -294,6 +301,9 @@ spa_pod_builder_propv (SpaPODBuilder *builder,
|
||||||
case SPA_POD_TYPE_BOOL:
|
case SPA_POD_TYPE_BOOL:
|
||||||
spa_pod_builder_bool (builder, va_arg (args, int));
|
spa_pod_builder_bool (builder, va_arg (args, int));
|
||||||
break;
|
break;
|
||||||
|
case SPA_POD_TYPE_URI:
|
||||||
|
spa_pod_builder_uri (builder, va_arg (args, int32_t));
|
||||||
|
break;
|
||||||
case SPA_POD_TYPE_INT:
|
case SPA_POD_TYPE_INT:
|
||||||
spa_pod_builder_int (builder, va_arg (args, int32_t));
|
spa_pod_builder_int (builder, va_arg (args, int32_t));
|
||||||
break;
|
break;
|
||||||
|
|
|
||||||
|
|
@ -35,6 +35,7 @@ extern "C" {
|
||||||
typedef enum {
|
typedef enum {
|
||||||
SPA_POD_TYPE_INVALID = 0,
|
SPA_POD_TYPE_INVALID = 0,
|
||||||
SPA_POD_TYPE_BOOL,
|
SPA_POD_TYPE_BOOL,
|
||||||
|
SPA_POD_TYPE_URI,
|
||||||
SPA_POD_TYPE_INT,
|
SPA_POD_TYPE_INT,
|
||||||
SPA_POD_TYPE_LONG,
|
SPA_POD_TYPE_LONG,
|
||||||
SPA_POD_TYPE_FLOAT,
|
SPA_POD_TYPE_FLOAT,
|
||||||
|
|
@ -64,13 +65,13 @@ typedef struct {
|
||||||
#define SPA_POD_BODY(pod) SPA_MEMBER((pod),sizeof(SpaPOD),void)
|
#define SPA_POD_BODY(pod) SPA_MEMBER((pod),sizeof(SpaPOD),void)
|
||||||
#define SPA_POD_BODY_CONST(pod) SPA_MEMBER((pod),sizeof(SpaPOD),const void)
|
#define SPA_POD_BODY_CONST(pod) SPA_MEMBER((pod),sizeof(SpaPOD),const void)
|
||||||
|
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
SpaPOD pod;
|
SpaPOD pod;
|
||||||
int32_t value;
|
int32_t value;
|
||||||
} SpaPODInt;
|
} SpaPODInt;
|
||||||
|
|
||||||
typedef SpaPODInt SpaPODBool;
|
typedef SpaPODInt SpaPODBool;
|
||||||
|
typedef SpaPODInt SpaPODURI;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
SpaPOD pod;
|
SpaPOD pod;
|
||||||
|
|
|
||||||
|
|
@ -319,6 +319,7 @@ struct pod_type_name {
|
||||||
{ "invalid", "*Invalid*" },
|
{ "invalid", "*Invalid*" },
|
||||||
{ "bool", "Bool" },
|
{ "bool", "Bool" },
|
||||||
{ "int", "Int" },
|
{ "int", "Int" },
|
||||||
|
{ "uri", "URI" },
|
||||||
{ "long", "Long" },
|
{ "long", "Long" },
|
||||||
{ "float", "Float" },
|
{ "float", "Float" },
|
||||||
{ "double", "Double" },
|
{ "double", "Double" },
|
||||||
|
|
@ -343,6 +344,9 @@ print_pod_value (uint32_t size, uint32_t type, void *body, int prefix)
|
||||||
case SPA_POD_TYPE_INT:
|
case SPA_POD_TYPE_INT:
|
||||||
printf ("%-*sInt %d\n", prefix, "", *(int32_t *) body);
|
printf ("%-*sInt %d\n", prefix, "", *(int32_t *) body);
|
||||||
break;
|
break;
|
||||||
|
case SPA_POD_TYPE_URI:
|
||||||
|
printf ("%-*sURI %d\n", prefix, "", *(int32_t *) body);
|
||||||
|
break;
|
||||||
case SPA_POD_TYPE_LONG:
|
case SPA_POD_TYPE_LONG:
|
||||||
printf ("%-*sLong %"PRIi64"\n", prefix, "", *(int64_t *) body);
|
printf ("%-*sLong %"PRIi64"\n", prefix, "", *(int64_t *) body);
|
||||||
break;
|
break;
|
||||||
|
|
@ -440,6 +444,9 @@ print_format_value (uint32_t size, uint32_t type, void *body)
|
||||||
case SPA_POD_TYPE_INT:
|
case SPA_POD_TYPE_INT:
|
||||||
fprintf (stderr, "%"PRIi32, *(int32_t *) body);
|
fprintf (stderr, "%"PRIi32, *(int32_t *) body);
|
||||||
break;
|
break;
|
||||||
|
case SPA_POD_TYPE_URI:
|
||||||
|
fprintf (stderr, "%"PRIi32, *(int32_t *) body);
|
||||||
|
break;
|
||||||
case SPA_POD_TYPE_LONG:
|
case SPA_POD_TYPE_LONG:
|
||||||
fprintf (stderr, "%"PRIi64, *(int64_t *) body);
|
fprintf (stderr, "%"PRIi64, *(int64_t *) body);
|
||||||
break;
|
break;
|
||||||
|
|
|
||||||
|
|
@ -116,7 +116,6 @@ compare_value (SpaPODType type, const void *r1, const void *r2)
|
||||||
case SPA_POD_TYPE_BOOL:
|
case SPA_POD_TYPE_BOOL:
|
||||||
return *(int32_t*)r1 == *(uint32_t*)r2;
|
return *(int32_t*)r1 == *(uint32_t*)r2;
|
||||||
case SPA_POD_TYPE_INT:
|
case SPA_POD_TYPE_INT:
|
||||||
printf ("%d <> %d\n", *(int32_t*)r1, *(int32_t*)r2);
|
|
||||||
return *(int32_t*)r1 - *(int32_t*)r2;
|
return *(int32_t*)r1 - *(int32_t*)r2;
|
||||||
case SPA_POD_TYPE_LONG:
|
case SPA_POD_TYPE_LONG:
|
||||||
return *(int64_t*)r1 - *(int64_t*)r2;
|
return *(int64_t*)r1 - *(int64_t*)r2;
|
||||||
|
|
@ -138,13 +137,36 @@ compare_value (SpaPODType type, const void *r1, const void *r2)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
case SPA_POD_TYPE_FRACTION:
|
case SPA_POD_TYPE_FRACTION:
|
||||||
break;
|
{
|
||||||
|
const SpaFraction *f1 = (SpaFraction*)r1,
|
||||||
|
*f2 = (SpaFraction*)r2;
|
||||||
|
uint64_t n1, n2;
|
||||||
|
n1 = ((int64_t) f1->num) * f2->denom;
|
||||||
|
n2 = ((int64_t) f2->num) * f1->denom;
|
||||||
|
if (n1 < n2)
|
||||||
|
return -1;
|
||||||
|
else if (n1 > n2)
|
||||||
|
return 1;
|
||||||
|
else
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline SpaPODProp *
|
||||||
|
find_prop (const SpaPOD *pod, uint32_t size, uint32_t key)
|
||||||
|
{
|
||||||
|
const SpaPOD *res;
|
||||||
|
SPA_POD_FOREACH (pod, size, res) {
|
||||||
|
if (res->type == SPA_POD_TYPE_PROP && ((SpaPODProp*)res)->body.key == key)
|
||||||
|
return (SpaPODProp *)res;
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
SpaResult
|
SpaResult
|
||||||
spa_props_filter (SpaPODBuilder *b,
|
spa_props_filter (SpaPODBuilder *b,
|
||||||
const SpaPOD *props,
|
const SpaPOD *props,
|
||||||
|
|
@ -167,7 +189,7 @@ spa_props_filter (SpaPODBuilder *b,
|
||||||
|
|
||||||
p1 = (SpaPODProp *) pr;
|
p1 = (SpaPODProp *) pr;
|
||||||
|
|
||||||
if (filter == NULL || (p2 = spa_pod_contents_find_prop (filter, 0, p1->body.key)) == NULL) {
|
if (filter == NULL || (p2 = find_prop (filter, filter_size, p1->body.key)) == NULL) {
|
||||||
/* no filter, copy the complete property */
|
/* no filter, copy the complete property */
|
||||||
spa_pod_builder_raw (b, p1, SPA_POD_SIZE (p1), true);
|
spa_pod_builder_raw (b, p1, SPA_POD_SIZE (p1), true);
|
||||||
continue;
|
continue;
|
||||||
|
|
@ -184,8 +206,8 @@ spa_props_filter (SpaPODBuilder *b,
|
||||||
np = SPA_POD_BUILDER_DEREF (b,
|
np = SPA_POD_BUILDER_DEREF (b,
|
||||||
spa_pod_builder_push_prop (b, &f, p1->body.key, SPA_POD_PROP_FLAG_READWRITE),
|
spa_pod_builder_push_prop (b, &f, p1->body.key, SPA_POD_PROP_FLAG_READWRITE),
|
||||||
SpaPODProp);
|
SpaPODProp);
|
||||||
/* size and type */
|
/* default value */
|
||||||
spa_pod_builder_raw (b, &p1->body.value, sizeof (p1->body.value), false);
|
spa_pod_builder_raw (b, &p1->body.value, sizeof (p1->body.value) + p1->body.value.size, false);
|
||||||
|
|
||||||
alt1 = SPA_MEMBER (p1, sizeof (SpaPODProp), void);
|
alt1 = SPA_MEMBER (p1, sizeof (SpaPODProp), void);
|
||||||
nalt1 = SPA_POD_PROP_N_VALUES (p1);
|
nalt1 = SPA_POD_PROP_N_VALUES (p1);
|
||||||
|
|
@ -248,11 +270,10 @@ spa_props_filter (SpaPODBuilder *b,
|
||||||
np->body.flags |= SPA_POD_PROP_RANGE_ENUM | SPA_POD_PROP_FLAG_UNSET;
|
np->body.flags |= SPA_POD_PROP_RANGE_ENUM | SPA_POD_PROP_FLAG_UNSET;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (rt1 == SPA_POD_PROP_RANGE_NONE && rt2 == SPA_POD_PROP_RANGE_STEP)
|
if ((rt1 == SPA_POD_PROP_RANGE_NONE && rt2 == SPA_POD_PROP_RANGE_STEP) ||
|
||||||
return SPA_RESULT_NOT_IMPLEMENTED;
|
(rt1 == SPA_POD_PROP_RANGE_ENUM && rt2 == SPA_POD_PROP_RANGE_STEP)) {
|
||||||
|
|
||||||
if (rt1 == SPA_POD_PROP_RANGE_NONE && rt2 == SPA_POD_PROP_RANGE_FLAGS)
|
|
||||||
return SPA_RESULT_NOT_IMPLEMENTED;
|
return SPA_RESULT_NOT_IMPLEMENTED;
|
||||||
|
}
|
||||||
|
|
||||||
if ((rt1 == SPA_POD_PROP_RANGE_MIN_MAX && rt2 == SPA_POD_PROP_RANGE_NONE) ||
|
if ((rt1 == SPA_POD_PROP_RANGE_MIN_MAX && rt2 == SPA_POD_PROP_RANGE_NONE) ||
|
||||||
(rt1 == SPA_POD_PROP_RANGE_MIN_MAX && rt2 == SPA_POD_PROP_RANGE_ENUM)) {
|
(rt1 == SPA_POD_PROP_RANGE_MIN_MAX && rt2 == SPA_POD_PROP_RANGE_ENUM)) {
|
||||||
|
|
@ -287,15 +308,19 @@ spa_props_filter (SpaPODBuilder *b,
|
||||||
spa_pod_builder_raw (b, alt1, p1->body.value.size, false);
|
spa_pod_builder_raw (b, alt1, p1->body.value.size, false);
|
||||||
else
|
else
|
||||||
spa_pod_builder_raw (b, alt2, p2->body.value.size, false);
|
spa_pod_builder_raw (b, alt2, p2->body.value.size, false);
|
||||||
|
|
||||||
|
np->body.flags |= SPA_POD_PROP_RANGE_MIN_MAX | SPA_POD_PROP_FLAG_UNSET;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (rt1 == SPA_POD_PROP_RANGE_NONE && rt2 == SPA_POD_PROP_RANGE_FLAGS)
|
||||||
|
return SPA_RESULT_NOT_IMPLEMENTED;
|
||||||
|
|
||||||
if (rt1 == SPA_POD_PROP_RANGE_MIN_MAX && rt2 == SPA_POD_PROP_RANGE_STEP)
|
if (rt1 == SPA_POD_PROP_RANGE_MIN_MAX && rt2 == SPA_POD_PROP_RANGE_STEP)
|
||||||
return SPA_RESULT_NOT_IMPLEMENTED;
|
return SPA_RESULT_NOT_IMPLEMENTED;
|
||||||
|
|
||||||
if (rt1 == SPA_POD_PROP_RANGE_MIN_MAX && rt2 == SPA_POD_PROP_RANGE_FLAGS)
|
if (rt1 == SPA_POD_PROP_RANGE_MIN_MAX && rt2 == SPA_POD_PROP_RANGE_FLAGS)
|
||||||
return SPA_RESULT_NOT_IMPLEMENTED;
|
return SPA_RESULT_NOT_IMPLEMENTED;
|
||||||
|
|
||||||
if (rt1 == SPA_POD_PROP_RANGE_ENUM && rt2 == SPA_POD_PROP_RANGE_STEP)
|
|
||||||
return SPA_RESULT_NOT_IMPLEMENTED;
|
|
||||||
if (rt1 == SPA_POD_PROP_RANGE_ENUM && rt2 == SPA_POD_PROP_RANGE_FLAGS)
|
if (rt1 == SPA_POD_PROP_RANGE_ENUM && rt2 == SPA_POD_PROP_RANGE_FLAGS)
|
||||||
return SPA_RESULT_NOT_IMPLEMENTED;
|
return SPA_RESULT_NOT_IMPLEMENTED;
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue