mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-11-01 22:58:50 -04:00
PipeWire doesn't impose how the syncobj fds are negotiated but provides a way to add them to the buffer data when negotiating the Buffers.
193 lines
6.8 KiB
C
193 lines
6.8 KiB
C
/* Simple Plugin API */
|
|
/* SPDX-FileCopyrightText: Copyright © 2018 Wim Taymans */
|
|
/* SPDX-License-Identifier: MIT */
|
|
|
|
#ifndef SPA_META_H
|
|
#define SPA_META_H
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
#include <spa/utils/defs.h>
|
|
#include <spa/pod/pod.h>
|
|
|
|
/**
|
|
* \addtogroup spa_buffer
|
|
* \{
|
|
*/
|
|
|
|
enum spa_meta_type {
|
|
SPA_META_Invalid,
|
|
SPA_META_Header, /**< struct spa_meta_header */
|
|
SPA_META_VideoCrop, /**< struct spa_meta_region with cropping data */
|
|
SPA_META_VideoDamage, /**< array of struct spa_meta_region with damage, where an invalid entry or end-of-array marks the end. */
|
|
SPA_META_Bitmap, /**< struct spa_meta_bitmap */
|
|
SPA_META_Cursor, /**< struct spa_meta_cursor */
|
|
SPA_META_Control, /**< metadata contains a spa_meta_control
|
|
* associated with the data */
|
|
SPA_META_Busy, /**< don't write to buffer when count > 0 */
|
|
SPA_META_VideoTransform, /**< struct spa_meta_transform */
|
|
SPA_META_SyncTimeline, /**< struct spa_meta_sync_timeline */
|
|
|
|
_SPA_META_LAST, /**< not part of ABI/API */
|
|
};
|
|
|
|
/**
|
|
* A metadata element.
|
|
*
|
|
* This structure is available on the buffer structure and contains
|
|
* the type of the metadata and a pointer/size to the actual metadata
|
|
* itself.
|
|
*/
|
|
struct spa_meta {
|
|
uint32_t type; /**< metadata type, one of enum spa_meta_type */
|
|
uint32_t size; /**< size of metadata */
|
|
void *data; /**< pointer to metadata */
|
|
};
|
|
|
|
static inline void *spa_meta_first(const struct spa_meta *m) {
|
|
return m->data;
|
|
}
|
|
#define spa_meta_first spa_meta_first
|
|
static inline void *spa_meta_end(const struct spa_meta *m) {
|
|
return SPA_PTROFF(m->data,m->size,void);
|
|
}
|
|
#define spa_meta_end spa_meta_end
|
|
#define spa_meta_check(p,m) (SPA_PTROFF(p,sizeof(*(p)),void) <= spa_meta_end(m))
|
|
|
|
/**
|
|
* Describes essential buffer header metadata such as flags and
|
|
* timestamps.
|
|
*/
|
|
struct spa_meta_header {
|
|
#define SPA_META_HEADER_FLAG_DISCONT (1 << 0) /**< data is not continuous with previous buffer */
|
|
#define SPA_META_HEADER_FLAG_CORRUPTED (1 << 1) /**< data might be corrupted */
|
|
#define SPA_META_HEADER_FLAG_MARKER (1 << 2) /**< media specific marker */
|
|
#define SPA_META_HEADER_FLAG_HEADER (1 << 3) /**< data contains a codec specific header */
|
|
#define SPA_META_HEADER_FLAG_GAP (1 << 4) /**< data contains media neutral data */
|
|
#define SPA_META_HEADER_FLAG_DELTA_UNIT (1 << 5) /**< cannot be decoded independently */
|
|
uint32_t flags; /**< flags */
|
|
uint32_t offset; /**< offset in current cycle */
|
|
int64_t pts; /**< presentation timestamp in nanoseconds */
|
|
int64_t dts_offset; /**< decoding timestamp as a difference with pts */
|
|
uint64_t seq; /**< sequence number, increments with a
|
|
* media specific frequency */
|
|
};
|
|
|
|
/** metadata structure for Region or an array of these for RegionArray */
|
|
struct spa_meta_region {
|
|
struct spa_region region;
|
|
};
|
|
|
|
static inline bool spa_meta_region_is_valid(const struct spa_meta_region *m) {
|
|
return m->region.size.width != 0 && m->region.size.height != 0;
|
|
}
|
|
#define spa_meta_region_is_valid spa_meta_region_is_valid
|
|
|
|
/** iterate all the items in a metadata */
|
|
#define spa_meta_for_each(pos,meta) \
|
|
for ((pos) = (__typeof(pos))spa_meta_first(meta); \
|
|
spa_meta_check(pos, meta); \
|
|
(pos)++)
|
|
|
|
#define spa_meta_bitmap_is_valid(m) ((m)->format != 0)
|
|
|
|
/**
|
|
* Bitmap information
|
|
*
|
|
* This metadata contains a bitmap image in the given format and size.
|
|
* It is typically used for cursor images or other small images that are
|
|
* better transferred inline.
|
|
*/
|
|
struct spa_meta_bitmap {
|
|
uint32_t format; /**< bitmap video format, one of enum spa_video_format. 0 is
|
|
* and invalid format and should be handled as if there is
|
|
* no new bitmap information. */
|
|
struct spa_rectangle size; /**< width and height of bitmap */
|
|
int32_t stride; /**< stride of bitmap data */
|
|
uint32_t offset; /**< offset of bitmap data in this structure. An offset of
|
|
* 0 means no image data (invisible), an offset >=
|
|
* sizeof(struct spa_meta_bitmap) contains valid bitmap
|
|
* info. */
|
|
};
|
|
|
|
#define spa_meta_cursor_is_valid(m) ((m)->id != 0)
|
|
|
|
/**
|
|
* Cursor information
|
|
*
|
|
* Metadata to describe the position and appearance of a pointing device.
|
|
*/
|
|
struct spa_meta_cursor {
|
|
uint32_t id; /**< cursor id. an id of 0 is an invalid id and means that
|
|
* there is no new cursor data */
|
|
uint32_t flags; /**< extra flags */
|
|
struct spa_point position; /**< position on screen */
|
|
struct spa_point hotspot; /**< offsets for hotspot in bitmap, this field has no meaning
|
|
* when there is no valid bitmap (see below) */
|
|
uint32_t bitmap_offset; /**< offset of bitmap meta in this structure. When the offset
|
|
* is 0, there is no new bitmap information. When the offset is
|
|
* >= sizeof(struct spa_meta_cursor) there is a
|
|
* struct spa_meta_bitmap at the offset. */
|
|
};
|
|
|
|
/** a timed set of events associated with the buffer */
|
|
struct spa_meta_control {
|
|
struct spa_pod_sequence sequence;
|
|
};
|
|
|
|
/** a busy counter for the buffer */
|
|
struct spa_meta_busy {
|
|
uint32_t flags;
|
|
uint32_t count; /**< number of users busy with the buffer */
|
|
};
|
|
|
|
enum spa_meta_videotransform_value {
|
|
SPA_META_TRANSFORMATION_None = 0, /**< no transform */
|
|
SPA_META_TRANSFORMATION_90, /**< 90 degree counter-clockwise */
|
|
SPA_META_TRANSFORMATION_180, /**< 180 degree counter-clockwise */
|
|
SPA_META_TRANSFORMATION_270, /**< 270 degree counter-clockwise */
|
|
SPA_META_TRANSFORMATION_Flipped, /**< 180 degree flipped around the vertical axis. Equivalent
|
|
* to a reflexion through the vertical line splitting the
|
|
* buffer in two equal sized parts */
|
|
SPA_META_TRANSFORMATION_Flipped90, /**< flip then rotate around 90 degree counter-clockwise */
|
|
SPA_META_TRANSFORMATION_Flipped180, /**< flip then rotate around 180 degree counter-clockwise */
|
|
SPA_META_TRANSFORMATION_Flipped270, /**< flip then rotate around 270 degree counter-clockwise */
|
|
};
|
|
|
|
/** a transformation of the buffer */
|
|
struct spa_meta_videotransform {
|
|
uint32_t transform; /**< orientation transformation that was applied to the buffer,
|
|
* one of enum spa_meta_videotransform_value */
|
|
};
|
|
|
|
/**
|
|
* A timeline point for explicit sync
|
|
*
|
|
* Metadata to describe the time on the timeline when the buffer
|
|
* can be acquired and when it can be reused.
|
|
*
|
|
* This metadata will require negotiation of 2 extra fds for the acquire
|
|
* and release timelines respectively. One way to achieve this is to place
|
|
* this metadata as SPA_PARAM_BUFFERS_metaType when negotiating a buffer
|
|
* layout with 2 extra fds.
|
|
*/
|
|
struct spa_meta_sync_timeline {
|
|
uint32_t flags;
|
|
uint32_t padding;
|
|
uint64_t acquire_point; /**< the timeline acquire point, this is when the data
|
|
* can be accessed. */
|
|
uint64_t release_point; /**< the timeline release point, this timeline point should
|
|
* be signaled when the data is no longer accessed. */
|
|
};
|
|
|
|
/**
|
|
* \}
|
|
*/
|
|
|
|
#ifdef __cplusplus
|
|
} /* extern "C" */
|
|
#endif
|
|
|
|
#endif /* SPA_META_H */
|