mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-11-03 09:01:54 -05:00
pod: make format like other PODs
This commit is contained in:
parent
e2d930e394
commit
f02f93cda9
13 changed files with 125 additions and 87 deletions
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue