diff --git a/pinos/gst/gstpinosformat.c b/pinos/gst/gstpinosformat.c index e6f38e083..cbe3d587b 100644 --- a/pinos/gst/gstpinosformat.c +++ b/pinos/gst/gstpinosformat.c @@ -277,7 +277,7 @@ static gboolean handle_audio_fields (ConvertData *d) { SpaPODFrame f; - const GValue *value, value2; + const GValue *value; int i = 0; value = gst_structure_get_value (d->cs, "format"); diff --git a/spa/include/spa/format-builder.h b/spa/include/spa/format-builder.h index e42fdd53f..76be8afe9 100644 --- a/spa/include/spa/format-builder.h +++ b/spa/include/spa/format-builder.h @@ -44,108 +44,6 @@ spa_pod_builder_push_format (SpaPODBuilder *builder, return offset; } -static inline void -spa_pod_builder_format_propv (SpaPODBuilder *builder, - uint32_t propid, - va_list args) -{ - while (propid != 0) { - int type, n_alternatives = -1; - SpaPODProp *prop = NULL; - SpaPODFrame f; - off_t off; - - if ((off = spa_pod_builder_push_prop (builder, &f, propid, SPA_POD_PROP_FLAG_READWRITE)) != -1) - prop = SPA_MEMBER (builder->data, off, SpaPODProp); - - type = va_arg (args, uint32_t); - - while (n_alternatives != 0) { - switch (type) { - case SPA_POD_TYPE_INVALID: - break; - case SPA_POD_TYPE_BOOL: - spa_pod_builder_bool (builder, va_arg (args, int)); - break; - case SPA_POD_TYPE_INT: - spa_pod_builder_int (builder, va_arg (args, int32_t)); - break; - case SPA_POD_TYPE_LONG: - spa_pod_builder_long (builder, va_arg (args, int64_t)); - break; - case SPA_POD_TYPE_FLOAT: - spa_pod_builder_float (builder, va_arg (args, double)); - break; - case SPA_POD_TYPE_DOUBLE: - spa_pod_builder_double (builder, va_arg (args, double)); - break; - case SPA_POD_TYPE_STRING: - { - const char *str = va_arg (args, char *); - uint32_t len = va_arg (args, uint32_t); - spa_pod_builder_string (builder, str, len); - break; - } - case SPA_POD_TYPE_RECTANGLE: - { - uint32_t width = va_arg (args, uint32_t), height = va_arg (args, uint32_t); - spa_pod_builder_rectangle (builder, width, height); - break; - } - case SPA_POD_TYPE_FRACTION: - { - uint32_t num = va_arg (args, uint32_t), denom = va_arg (args, uint32_t); - spa_pod_builder_fraction (builder, num, denom); - break; - } - case SPA_POD_TYPE_BITMASK: - break; - case SPA_POD_TYPE_ARRAY: - case SPA_POD_TYPE_STRUCT: - case SPA_POD_TYPE_OBJECT: - case SPA_POD_TYPE_PROP: - break; - } - if (n_alternatives == -1) { - uint32_t flags = va_arg (args, uint32_t); - if (prop) - prop->body.flags = flags; - - switch (flags & SPA_POD_PROP_RANGE_MASK) { - case SPA_POD_PROP_RANGE_NONE: - n_alternatives = 0; - break; - case SPA_POD_PROP_RANGE_MIN_MAX: - n_alternatives = 2; - break; - case SPA_POD_PROP_RANGE_STEP: - n_alternatives = 3; - break; - case SPA_POD_PROP_RANGE_ENUM: - case SPA_POD_PROP_RANGE_MASK: - n_alternatives = va_arg (args, int); - break; - } - } else - n_alternatives--; - } - spa_pod_builder_pop (builder, &f); - - propid = va_arg (args, uint32_t); - } -} - -static inline void -spa_pod_builder_format_prop (SpaPODBuilder *builder, - uint32_t propid, ...) -{ - va_list args; - - va_start (args, propid); - spa_pod_builder_format_propv (builder, propid, args); - va_end (args); -} - static inline off_t spa_pod_builder_format (SpaPODBuilder *builder, uint32_t media_type, @@ -159,7 +57,7 @@ spa_pod_builder_format (SpaPODBuilder *builder, off = spa_pod_builder_push_format (builder, &f, media_type, media_subtype); va_start (args, propid); - spa_pod_builder_format_propv (builder, propid, args); + spa_pod_builder_propv (builder, propid, args); va_end (args); spa_pod_builder_pop (builder, &f); diff --git a/spa/include/spa/format.h b/spa/include/spa/format.h index df1552112..5ec119f49 100644 --- a/spa/include/spa/format.h +++ b/spa/include/spa/format.h @@ -24,6 +24,9 @@ extern "C" { #endif +#define SPA_FORMAT_URI "http://spaplug.in/ns/format" +#define SPA_FORMAT_PREFIX SPA_FORMAT_URI "#" + typedef struct _SpaFormat SpaFormat; #include diff --git a/spa/include/spa/pod-builder.h b/spa/include/spa/pod-builder.h index fac46e96b..a5bfc8b99 100644 --- a/spa/include/spa/pod-builder.h +++ b/spa/include/spa/pod-builder.h @@ -24,6 +24,7 @@ extern "C" { #endif +#include #include typedef struct _SpaPODFrame { @@ -270,6 +271,108 @@ spa_pod_builder_push_prop (SpaPODBuilder *builder, spa_pod_builder_raw (builder, &p, sizeof(p) - sizeof(SpaPOD), false)); } +static inline void +spa_pod_builder_propv (SpaPODBuilder *builder, + uint32_t propid, + va_list args) +{ + while (propid != 0) { + int type, n_alternatives = -1; + SpaPODProp *prop = NULL; + SpaPODFrame f; + off_t off; + + if ((off = spa_pod_builder_push_prop (builder, &f, propid, SPA_POD_PROP_FLAG_READWRITE)) != -1) + prop = SPA_MEMBER (builder->data, off, SpaPODProp); + + type = va_arg (args, uint32_t); + + while (n_alternatives != 0) { + switch (type) { + case SPA_POD_TYPE_INVALID: + break; + case SPA_POD_TYPE_BOOL: + spa_pod_builder_bool (builder, va_arg (args, int)); + break; + case SPA_POD_TYPE_INT: + spa_pod_builder_int (builder, va_arg (args, int32_t)); + break; + case SPA_POD_TYPE_LONG: + spa_pod_builder_long (builder, va_arg (args, int64_t)); + break; + case SPA_POD_TYPE_FLOAT: + spa_pod_builder_float (builder, va_arg (args, double)); + break; + case SPA_POD_TYPE_DOUBLE: + spa_pod_builder_double (builder, va_arg (args, double)); + break; + case SPA_POD_TYPE_STRING: + { + const char *str = va_arg (args, char *); + uint32_t len = va_arg (args, uint32_t); + spa_pod_builder_string (builder, str, len); + break; + } + case SPA_POD_TYPE_RECTANGLE: + { + uint32_t width = va_arg (args, uint32_t), height = va_arg (args, uint32_t); + spa_pod_builder_rectangle (builder, width, height); + break; + } + case SPA_POD_TYPE_FRACTION: + { + uint32_t num = va_arg (args, uint32_t), denom = va_arg (args, uint32_t); + spa_pod_builder_fraction (builder, num, denom); + break; + } + case SPA_POD_TYPE_BITMASK: + break; + case SPA_POD_TYPE_ARRAY: + case SPA_POD_TYPE_STRUCT: + case SPA_POD_TYPE_OBJECT: + case SPA_POD_TYPE_PROP: + break; + } + if (n_alternatives == -1) { + uint32_t flags = va_arg (args, uint32_t); + if (prop) + prop->body.flags = flags; + + switch (flags & SPA_POD_PROP_RANGE_MASK) { + case SPA_POD_PROP_RANGE_NONE: + n_alternatives = 0; + break; + case SPA_POD_PROP_RANGE_MIN_MAX: + n_alternatives = 2; + break; + case SPA_POD_PROP_RANGE_STEP: + n_alternatives = 3; + break; + case SPA_POD_PROP_RANGE_ENUM: + case SPA_POD_PROP_RANGE_MASK: + n_alternatives = va_arg (args, int); + break; + } + } else + n_alternatives--; + } + spa_pod_builder_pop (builder, &f); + + propid = va_arg (args, uint32_t); + } +} + +static inline void +spa_pod_builder_prop (SpaPODBuilder *builder, + uint32_t propid, ...) +{ + va_list args; + + va_start (args, propid); + spa_pod_builder_propv (builder, propid, args); + va_end (args); +} + #ifdef __cplusplus } /* extern "C" */ #endif diff --git a/spa/plugins/v4l2/v4l2-utils.c b/spa/plugins/v4l2/v4l2-utils.c index 1442b29e2..378b58bd5 100644 --- a/spa/plugins/v4l2/v4l2-utils.c +++ b/spa/plugins/v4l2/v4l2-utils.c @@ -609,14 +609,14 @@ have_size: SpaFormat); if (info->media_subtype == SPA_MEDIA_SUBTYPE_RAW) { - spa_pod_builder_format_prop (&b, + spa_pod_builder_prop (&b, SPA_PROP_ID_VIDEO_FORMAT, SPA_POD_TYPE_INT, info->format, SPA_POD_PROP_RANGE_NONE | SPA_POD_PROP_FLAG_READWRITE, 0); } - spa_pod_builder_format_prop (&b, + spa_pod_builder_prop (&b, SPA_PROP_ID_VIDEO_SIZE, SPA_POD_TYPE_RECTANGLE, state->frmsize.discrete.width, state->frmsize.discrete.height,