pod: make format like other PODs

This commit is contained in:
Wim Taymans 2017-02-27 17:07:48 +01:00
parent e2d930e394
commit f02f93cda9
13 changed files with 125 additions and 87 deletions

View file

@ -35,13 +35,10 @@ spa_pod_builder_push_format (SpaPODBuilder *builder,
uint32_t media_type,
uint32_t media_subtype)
{
SpaFormat f = { media_type, media_subtype, { { 0, 0 }, { 0, 0 } } };
off_t offset;
offset = spa_pod_builder_raw (builder, &f, sizeof(f) - sizeof(SpaPODObject), false);
if (spa_pod_builder_push_object (builder, frame, 0, 0) == -1)
offset = -1;
return offset;
const SpaFormat p = { { sizeof (SpaFormatBody), SPA_POD_TYPE_FORMAT },
{ media_type, media_subtype } };
return spa_pod_builder_push (builder, frame, &p.pod,
spa_pod_builder_raw (builder, &p, sizeof(p), false));
}
static inline off_t

View file

@ -89,6 +89,12 @@ typedef enum {
SPA_PROP_ID_MEDIA_CUSTOM_START = 200,
} SpaFormatProps;
typedef struct {
uint32_t media_type;
uint32_t media_subtype;
/* contents follow, series of SpaPODProp */
} SpaFormatBody;
/**
* SpaFormat:
* @media_type: media type
@ -96,12 +102,25 @@ typedef enum {
* @pod: POD object with properties
*/
struct _SpaFormat {
uint32_t media_type;
uint32_t media_subtype;
SpaPODObject obj;
SpaPOD pod;
SpaFormatBody body;
};
#define SPA_FORMAT_SIZE(f) (sizeof(SpaFormat) + (f)->obj.pod.size)
#define SPA_FORMAT_BODY_FOREACH(body, size, iter) \
for ((iter) = SPA_MEMBER ((body), sizeof (SpaFormatBody), SpaPODProp); \
(iter) < SPA_MEMBER ((body), (size), SpaPODProp); \
(iter) = SPA_MEMBER ((iter), SPA_ROUND_UP_N (SPA_POD_SIZE (iter), 8), SpaPODProp))
static inline SpaPODProp *
spa_format_find_prop (const SpaFormat *format, uint32_t key)
{
SpaPODProp *res;
SPA_POD_FOREACH (format, res) {
if (res->pod.type == SPA_POD_TYPE_PROP && res->body.key == key)
return res;
}
return NULL;
}
static inline SpaResult
spa_format_fixate (SpaFormat *format)

View file

@ -47,7 +47,8 @@ typedef enum {
SPA_POD_TYPE_STRUCT,
SPA_POD_TYPE_OBJECT,
SPA_POD_TYPE_PROP,
SPA_POD_TYPE_BYTES
SPA_POD_TYPE_BYTES,
SPA_POD_TYPE_FORMAT
} SpaPODType;
typedef struct {
@ -55,7 +56,7 @@ typedef struct {
uint32_t type;
} SpaPOD;
#define SPA_POD_BODY_SIZE(pod) ((pod)->size)
#define SPA_POD_BODY_SIZE(pod) (((SpaPOD*)(pod))->size)
#define SPA_POD_SIZE(pod) (sizeof(SpaPOD) + SPA_POD_BODY_SIZE(pod))
#define SPA_POD_CONTENTS(type,pod) SPA_MEMBER((pod),sizeof(type),void)
@ -169,10 +170,15 @@ typedef struct {
(iter) < SPA_MEMBER ((body), (size), SpaPOD); \
(iter) = SPA_MEMBER ((iter), SPA_ROUND_UP_N (SPA_POD_SIZE (iter), 8), SpaPOD))
#define SPA_POD_FOREACH(pod, iter) \
for ((iter) = SPA_POD_CONTENTS(__typeof__(*pod), pod); \
(iter) < SPA_MEMBER ((pod), SPA_POD_SIZE (pod), __typeof__(*iter)); \
(iter) = SPA_MEMBER ((iter), SPA_ROUND_UP_N (SPA_POD_SIZE (iter), 8), __typeof__(*iter)))
#define SPA_POD_OBJECT_BODY_FOREACH(body, size, iter) \
for ((iter) = SPA_MEMBER ((body), sizeof (SpaPODObjectBody), SpaPODProp); \
(iter) < SPA_MEMBER ((body), (size), SpaPODProp); \
(iter) = SPA_MEMBER ((iter), SPA_ROUND_UP_N (SPA_POD_SIZE (&(iter)->pod), 8), SpaPODProp))
(iter) = SPA_MEMBER ((iter), SPA_ROUND_UP_N (SPA_POD_SIZE (iter), 8), SpaPODProp))
#define SPA_POD_PROP_ALTERNATIVE_FOREACH(body, _size, iter) \
for ((iter) = SPA_MEMBER ((body), (body)->value.size + sizeof (SpaPODPropBody), __typeof__(*iter)); \
@ -180,17 +186,16 @@ typedef struct {
(iter) = SPA_MEMBER ((iter), (body)->value.size, __typeof__(*iter)))
static inline SpaPODProp *
spa_pod_object_body_find_prop (const SpaPODObjectBody *body, uint32_t size, uint32_t key)
spa_pod_object_find_prop (const SpaPODObject *obj, uint32_t key)
{
SpaPODProp *res;
SPA_POD_OBJECT_BODY_FOREACH (body, size, res) {
if (res->body.key == key)
SPA_POD_FOREACH (obj, res) {
if (res->pod.type == SPA_POD_TYPE_PROP && res->body.key == key)
return res;
}
return NULL;
}
#ifdef __cplusplus
} /* extern "C" */
#endif