rework props with pod

This commit is contained in:
Wim Taymans 2017-02-27 21:25:33 +01:00
parent f02f93cda9
commit dbae2e3f96
25 changed files with 232 additions and 472 deletions

View file

@ -60,10 +60,13 @@ spa_format_audio_parse (const SpaFormat *format,
SpaPODProp *prop;
const ParseInfo *pinfo, *find;
if (format->body.media_type != SPA_MEDIA_TYPE_AUDIO)
if (format->body.media_type.value != SPA_MEDIA_TYPE_AUDIO)
return SPA_RESULT_INVALID_MEDIA_TYPE;
switch (format->body.media_subtype) {
info->media_type = format->body.media_type.value;
info->media_subtype = format->body.media_subtype.value;
switch (info->media_subtype) {
case SPA_MEDIA_SUBTYPE_RAW:
pinfo = raw_parse_info;
break;
@ -85,9 +88,6 @@ spa_format_audio_parse (const SpaFormat *format,
return SPA_RESULT_INVALID_ARGUMENTS;
}
info->media_type = format->body.media_type;
info->media_subtype = format->body.media_subtype;
SPA_POD_FOREACH (format, prop) {
if ((find = parse_info_find (pinfo, prop->body.key, prop->body.value.type))) {
memcpy (SPA_MEMBER (info, find->offset, void),

View file

@ -227,6 +227,7 @@ spa_debug_dump_mem (const void *mem, size_t size)
SpaResult
spa_debug_props (const SpaProps *props, bool print_ranges)
{
spa_debug_pod (&props->pod);
return SPA_RESULT_OK;
}
@ -352,7 +353,7 @@ print_pod_value (uint32_t size, uint32_t type, void *body, int prefix)
printf ("%-*sDouble %g\n", prefix, "", *(double *) body);
break;
case SPA_POD_TYPE_STRING:
printf ("%-*sString %s\n", prefix, "", (char *) body);
printf ("%-*sString \"%s\"\n", prefix, "", (char *) body);
break;
case SPA_POD_TYPE_RECTANGLE:
{
@ -419,17 +420,6 @@ print_pod_value (uint32_t size, uint32_t type, void *body, int prefix)
}
break;
}
case SPA_POD_TYPE_FORMAT:
{
SpaFormatBody *b = body;
SpaPODProp *p;
printf ("%-*sFormat: size %d\n", prefix, "", size);
printf ("%-*s Media Type: %d / %d\n", prefix, "", b->media_type, b->media_subtype);
SPA_FORMAT_BODY_FOREACH (b, size, p)
print_pod_value (p->pod.size, p->pod.type, SPA_POD_BODY (p), prefix + 6);
break;
}
}
}
@ -491,16 +481,20 @@ spa_debug_format (const SpaFormat *format)
const char *media_subtype;
const char **prop_names;
SpaPODProp *prop;
uint32_t mtype, mstype;
if (format == NULL)
return SPA_RESULT_INVALID_ARGUMENTS;
if (format->body.media_type > 0 && format->body.media_type < SPA_N_ELEMENTS (media_type_names)) {
media_type = media_type_names[format->body.media_type].name;
first = media_type_names[format->body.media_type].first;
last = media_type_names[format->body.media_type].last;
idx = media_type_names[format->body.media_type].idx;
prop_names = media_type_names[format->body.media_type].prop_names;
mtype = format->body.media_type.value;
mstype = format->body.media_subtype.value;
if (mtype > 0 && mtype < SPA_N_ELEMENTS (media_type_names)) {
media_type = media_type_names[mtype].name;
first = media_type_names[mtype].first;
last = media_type_names[mtype].last;
idx = media_type_names[mtype].idx;
prop_names = media_type_names[mtype].prop_names;
}
else {
media_type = "unknown";
@ -508,11 +502,11 @@ spa_debug_format (const SpaFormat *format)
prop_names = NULL;
}
if (format->body.media_subtype >= SPA_MEDIA_SUBTYPE_ANY_FIRST &&
format->body.media_subtype <= SPA_MEDIA_SUBTYPE_ANY_LAST) {
media_subtype = media_subtype_names[format->body.media_subtype].name;
} else if (format->body.media_subtype >= first && format->body.media_subtype <= last)
media_subtype = media_subtype_names[format->body.media_subtype - first + idx].name;
if (mstype >= SPA_MEDIA_SUBTYPE_ANY_FIRST &&
mstype <= SPA_MEDIA_SUBTYPE_ANY_LAST) {
media_subtype = media_subtype_names[mstype].name;
} else if (mstype >= first && mstype <= last)
media_subtype = media_subtype_names[mstype - first + idx].name;
else
media_subtype = "unknown";

View file

@ -1,7 +1,6 @@
spalib_sources = ['audio-raw.c',
'debug.c',
'mapper.c',
'props.c',
'video-raw.c']
spalib = shared_library('spa-lib',

View file

@ -26,42 +26,6 @@ extern "C" {
#include <spa/props.h>
/**
* spa_props_set_value:
* @props: a #SpaProps
* @index: the index of the property in the prop_info array
* @value: the value to set
*
* Sets @value in @prop. type should match the type specified
* in the #SpaPropInfo at @index or else #SPA_RESULT_WRONG_PROPERTY_TYPE
* is returned.
*
* Returns: #SPA_RESULT_OK on success.
* #SPA_RESULT_INVALID_PROPERTY_INDEX when @index is not valid
* #SPA_RESULT_WRONG_PROPERTY_TYPE when type is not correct
*/
SpaResult spa_props_set_value (SpaProps *props,
unsigned int index,
const SpaPropValue *value);
/**
* spa_props_get_value:
* @props: a #SpaProps
* @index: the property index in the prop_info array
* @value: a location for the type, size and value
*
* Get the size and value of the property at @index.
*
* Returns: #SPA_RESULT_OK on success.
* #SPA_RESULT_INVALID_PROPERTY_INDEX when @index is not valid
* #SPA_RESULT_PROPERTY_UNSET when no value has been set yet
*/
SpaResult spa_props_get_value (const SpaProps *props,
unsigned int index,
SpaPropValue *value);
SpaResult spa_props_copy_values (const SpaProps *src,
SpaProps *dest);
#ifdef __cplusplus
} /* extern "C" */
#endif

View file

@ -85,10 +85,13 @@ spa_format_video_parse (const SpaFormat *format,
SpaPODProp *prop;
const ParseInfo *pinfo, *find;
if (format->body.media_type != SPA_MEDIA_TYPE_VIDEO)
if (format->body.media_type.value != SPA_MEDIA_TYPE_VIDEO)
return SPA_RESULT_INVALID_MEDIA_TYPE;
switch (format->body.media_subtype) {
info->media_type = format->body.media_type.value;
info->media_subtype = format->body.media_subtype.value;
switch (info->media_subtype) {
case SPA_MEDIA_SUBTYPE_RAW:
pinfo = raw_parse_info;
break;
@ -116,9 +119,6 @@ spa_format_video_parse (const SpaFormat *format,
return SPA_RESULT_INVALID_ARGUMENTS;
}
info->media_type = format->body.media_type;
info->media_subtype = format->body.media_subtype;
SPA_POD_FOREACH (format, prop) {
if ((find = parse_info_find (pinfo, prop->body.key, prop->body.value.type))) {
memcpy (SPA_MEMBER (info, find->offset, void),
@ -142,8 +142,8 @@ spa_format_filter (const SpaFormat *format,
return SPA_RESULT_OK;
}
if (filter->body.media_type != format->body.media_type ||
filter->body.media_subtype != format->body.media_subtype)
if (filter->body.media_type.value != format->body.media_type.value ||
filter->body.media_subtype.value != format->body.media_subtype.value)
return SPA_RESULT_INVALID_MEDIA_TYPE;
spa_pod_builder_raw (result, format, SPA_POD_SIZE (format), true);