PipeWire 1.7.0
Loading...
Searching...
No Matches
buffer.h
Go to the documentation of this file.
1/* Simple Plugin API */
2/* SPDX-FileCopyrightText: Copyright © 2018 Wim Taymans */
3/* SPDX-License-Identifier: MIT */
4
5#ifndef SPA_DEBUG_BUFFER_H
6#define SPA_DEBUG_BUFFER_H
7
8#include <inttypes.h>
9
10#include <spa/debug/context.h>
11#include <spa/debug/mem.h>
12#include <spa/debug/pod.h>
13#include <spa/debug/types.h>
15#include <spa/param/video/type-info.h>
16
17#ifdef __cplusplus
18extern "C" {
19#endif
20
24
29
30#ifndef SPA_API_DEBUG_BUFFER
31 #ifdef SPA_API_IMPL
32 #define SPA_API_DEBUG_BUFFER SPA_API_IMPL
33 #else
34 #define SPA_API_DEBUG_BUFFER static inline
35 #endif
36#endif
37
38SPA_API_DEBUG_BUFFER int spa_debugc_buffer(struct spa_debug_context *ctx, int indent, const struct spa_buffer *buffer)
39{
40 uint32_t i;
42 spa_debugc(ctx, "%*s" "struct spa_buffer %p:", indent, "", buffer);
43 spa_debugc(ctx, "%*s" " n_metas: %u (at %p)", indent, "", buffer->n_metas, buffer->metas);
44 for (i = 0; i < buffer->n_metas; i++) {
45 struct spa_meta *m = &buffer->metas[i];
46 const char *type_name;
47
49 spa_debugc(ctx, "%*s" " meta %d: type %d (%s), data %p, size %d:", indent, "", i, m->type,
50 type_name, m->data, m->size);
51
52 switch (m->type) {
53 case SPA_META_Header:
54 {
55 struct spa_meta_header *h = (struct spa_meta_header*)m->data;
56 if (m->size < sizeof(*h))
57 break;
58
59 spa_debugc(ctx, "%*s" " struct spa_meta_header:", indent, "");
60 spa_debugc(ctx, "%*s" " flags: %08x", indent, "", h->flags);
61 spa_debugc(ctx, "%*s" " offset: %u", indent, "", h->offset);
62 spa_debugc(ctx, "%*s" " seq: %" PRIu64, indent, "", h->seq);
63 spa_debugc(ctx, "%*s" " pts: %" PRIi64, indent, "", h->pts);
64 spa_debugc(ctx, "%*s" " dts_offset: %" PRIi64, indent, "", h->dts_offset);
65 break;
66 }
68 {
69 struct spa_meta_region *h = (struct spa_meta_region*)m->data;
70 if (m->size < sizeof(*h))
71 break;
72
73 spa_debugc(ctx, "%*s" " struct spa_meta_region:", indent, "");
74 spa_debugc(ctx, "%*s" " x: %d", indent, "", h->region.position.x);
75 spa_debugc(ctx, "%*s" " y: %d", indent, "", h->region.position.y);
76 spa_debugc(ctx, "%*s" " width: %d", indent, "", h->region.size.width);
77 spa_debugc(ctx, "%*s" " height: %d", indent, "", h->region.size.height);
78 break;
79 }
81 {
82 struct spa_meta_region *h;
83 spa_meta_for_each(h, m) {
84 spa_debugc(ctx, "%*s" " struct spa_meta_region:", indent, "");
85 spa_debugc(ctx, "%*s" " x: %d", indent, "", h->region.position.x);
86 spa_debugc(ctx, "%*s" " y: %d", indent, "", h->region.position.y);
87 spa_debugc(ctx, "%*s" " width: %d", indent, "", h->region.size.width);
88 spa_debugc(ctx, "%*s" " height: %d", indent, "", h->region.size.height);
89 }
90 break;
91 }
92 case SPA_META_Bitmap:
93 {
94 const struct spa_meta_bitmap *h = (const struct spa_meta_bitmap *) m->data;
95 if (m->size < sizeof(*h))
96 break;
97
98 spa_debugc(ctx, "%*s" " struct spa_meta_bitmap:", indent, "");
99 spa_debugc(ctx, "%*s" " format: %" PRIu32 " (%s)", indent, "",
100 h->format, spa_debug_type_find_name(spa_type_video_format, h->format));
101 spa_debugc(ctx, "%*s" " size:", indent, "");
102 spa_debugc(ctx, "%*s" " width: %" PRIu32, indent, "", h->size.width);
103 spa_debugc(ctx, "%*s" " height: %" PRIu32, indent, "", h->size.height);
104 spa_debugc(ctx, "%*s" " stride: %" PRId32, indent, "", h->stride);
105 spa_debugc(ctx, "%*s" " offset: %" PRIu32, indent, "", h->offset);
106 break;
107 }
108 case SPA_META_Cursor:
109 {
110 const struct spa_meta_cursor *h = (const struct spa_meta_cursor *) m->data;
111 if (m->size < sizeof(*h))
112 break;
113
114 spa_debugc(ctx, "%*s" " struct spa_meta_cursor:", indent, "");
115 spa_debugc(ctx, "%*s" " id: %" PRIu32, indent, "", h->id);
116 spa_debugc(ctx, "%*s" " flags: %08" PRIx32, indent, "", h->flags);
117 spa_debugc(ctx, "%*s" " position:", indent, "");
118 spa_debugc(ctx, "%*s" " x: %" PRId32, indent, "", h->position.x);
119 spa_debugc(ctx, "%*s" " y: %" PRId32, indent, "", h->position.y);
120 spa_debugc(ctx, "%*s" " hotspot:", indent, "");
121 spa_debugc(ctx, "%*s" " x: %" PRId32, indent, "", h->hotspot.x);
122 spa_debugc(ctx, "%*s" " y: %" PRId32, indent, "", h->hotspot.y);
123 spa_debugc(ctx, "%*s" " bitmap_offset: %" PRIu32, indent, "", h->bitmap_offset);
124 break;
125 }
126 case SPA_META_Control:
127 {
128 const struct spa_meta_control *h = (const struct spa_meta_control *) m->data;
129 if (m->size < sizeof(*h))
130 break;
131
132 spa_debugc(ctx, "%*s" " struct spa_meta_control:", indent, "");
133 spa_debugc(ctx, "%*s" " sequence:", indent, "");
134 spa_debugc_pod(ctx, indent + 8, NULL, &h->sequence.pod);
135 break;
136 }
137 case SPA_META_Busy:
138 {
139 const struct spa_meta_busy *h = (const struct spa_meta_busy *) m->data;
140 if (m->size < sizeof(*h))
141 break;
142
143 spa_debugc(ctx, "%*s" " struct spa_meta_busy:", indent, "");
144 spa_debugc(ctx, "%*s" " flags: %08" PRIx32, indent, "", h->flags);
145 spa_debugc(ctx, "%*s" " count: %" PRIu32, indent, "", SPA_ATOMIC_LOAD(h->count));
146 break;
147 }
149 {
150 const struct spa_meta_videotransform *h = (const struct spa_meta_videotransform *) m->data;
151 if (m->size < sizeof(*h))
152 break;
153
154 spa_debugc(ctx, "%*s" " struct spa_meta_videotransform:", indent, "");
155 spa_debugc(ctx, "%*s" " transform: %" PRIu32 " (%s)", indent, "",
157 break;
158 }
160 {
161 const struct spa_meta_sync_timeline *h = (const struct spa_meta_sync_timeline *) m->data;
162 if (m->size < sizeof(*h))
163 break;
164
165 spa_debugc(ctx, "%*s" " struct spa_meta_sync_timeline:", indent, "");
166 spa_debugc(ctx, "%*s" " flags: %08" PRIx32, indent, "", h->flags);
167 spa_debugc(ctx, "%*s" " acquire_point: %" PRIu64, indent, "", h->acquire_point);
168 spa_debugc(ctx, "%*s" " release_point: %" PRIu64, indent, "", h->release_point);
169 break;
170 }
171 default:
172 spa_debugc(ctx, "%*s" " Unknown:", indent, "");
173 spa_debugc_mem(ctx, 5, m->data, m->size);
174 }
175 }
176 spa_debugc(ctx, "%*s" " n_datas: %u (at %p)", indent, "", buffer->n_datas, buffer->datas);
177 for (i = 0; i < buffer->n_datas; i++) {
178 struct spa_data *d = &buffer->datas[i];
179 spa_debugc(ctx, "%*s" " type: %d (%s)", indent, "", d->type,
181 spa_debugc(ctx, "%*s" " flags: %d", indent, "", d->flags);
182 spa_debugc(ctx, "%*s" " data: %p", indent, "", d->data);
183 spa_debugc(ctx, "%*s" " fd: %" PRIi64, indent, "", d->fd);
184 spa_debugc(ctx, "%*s" " offset: %d", indent, "", d->mapoffset);
185 spa_debugc(ctx, "%*s" " maxsize: %u", indent, "", d->maxsize);
186 spa_debugc(ctx, "%*s" " chunk: %p", indent, "", d->chunk);
187 spa_debugc(ctx, "%*s" " offset: %d", indent, "", d->chunk->offset);
188 spa_debugc(ctx, "%*s" " size: %u", indent, "", d->chunk->size);
189 spa_debugc(ctx, "%*s" " stride: %d", indent, "", d->chunk->stride);
190 }
191 return 0;
192}
193
194SPA_API_DEBUG_BUFFER int spa_debug_buffer(int indent, const struct spa_buffer *buffer)
195{
196 return spa_debugc_buffer(NULL, indent, buffer);
197}
200
202#ifdef __cplusplus
203} /* extern "C" */
204#endif
205
206#endif /* SPA_DEBUG_BUFFER_H */
spa/buffer/type-info.h
spa/debug/pod.h
#define SPA_ATOMIC_LOAD(s)
Atomically loads the value of the given variable and then returns the value.
Definition atomic.h:124
static const struct spa_type_info spa_type_meta_videotransform_type[]
Definition type-info.h:79
static const struct spa_type_info spa_type_data_type[]
Definition type-info.h:43
#define spa_meta_for_each(pos, meta)
iterate all the items in a metadata
Definition meta.h:116
static const struct spa_type_info spa_type_meta_type[]
Definition type-info.h:91
@ SPA_META_VideoDamage
array of struct spa_meta_region with damage, where an invalid entry or end-of-array marks the end.
Definition meta.h:39
@ SPA_META_Bitmap
struct spa_meta_bitmap
Definition meta.h:40
@ SPA_META_VideoTransform
struct spa_meta_transform
Definition meta.h:45
@ SPA_META_Cursor
struct spa_meta_cursor
Definition meta.h:41
@ SPA_META_Busy
don't write to buffer when count > 0
Definition meta.h:44
@ SPA_META_VideoCrop
struct spa_meta_region with cropping data
Definition meta.h:38
@ SPA_META_SyncTimeline
struct spa_meta_sync_timeline
Definition meta.h:46
@ SPA_META_Header
struct spa_meta_header
Definition meta.h:37
@ SPA_META_Control
metadata contains a spa_meta_control associated with the data
Definition meta.h:42
SPA_API_DEBUG_MEM int spa_debugc_mem(struct spa_debug_context *ctx, int indent, const void *data, size_t size)
Definition mem.h:37
#define spa_debugc(_c, _fmt,...)
Definition context.h:50
SPA_API_DEBUG_BUFFER int spa_debugc_buffer(struct spa_debug_context *ctx, int indent, const struct spa_buffer *buffer)
Definition buffer.h:45
#define SPA_API_DEBUG_BUFFER
Definition buffer.h:41
SPA_API_DEBUG_POD int spa_debugc_pod(struct spa_debug_context *ctx, int indent, const struct spa_type_info *info, const struct spa_pod *pod)
Definition pod.h:232
SPA_API_DEBUG_TYPES const char * spa_debug_type_find_name(const struct spa_type_info *info, uint32_t type)
Definition types.h:61
SPA_API_DEBUG_BUFFER int spa_debug_buffer(int indent, const struct spa_buffer *buffer)
Definition buffer.h:201
static const struct spa_type_info spa_type_video_format[]
Definition raw-types.h:40
spa/debug/context.h
spa/debug/mem.h
A Buffer.
Definition buffer.h:112
int32_t stride
stride of valid data
Definition buffer.h:65
uint32_t size
size of valid data.
Definition buffer.h:63
uint32_t offset
offset of valid data.
Definition buffer.h:60
Data for a buffer this stays constant for a buffer.
Definition buffer.h:80
struct spa_chunk * chunk
valid chunk of memory
Definition buffer.h:108
int64_t fd
optional fd for data
Definition buffer.h:104
uint32_t mapoffset
offset to map fd at, this is page aligned
Definition buffer.h:105
uint32_t flags
data flags
Definition buffer.h:103
void * data
optional data pointer
Definition buffer.h:107
uint32_t maxsize
max size of data
Definition buffer.h:106
uint32_t type
memory type, one of enum spa_data_type, when allocating memory, the type contains a bitmask of allowe...
Definition buffer.h:81
Definition context.h:46
Bitmap information.
Definition meta.h:128
a busy counter for the buffer
Definition meta.h:172
a timed set of events associated with the buffer
Definition meta.h:167
Cursor information.
Definition meta.h:149
Describes essential buffer header metadata such as flags and timestamps.
Definition meta.h:85
metadata structure for Region or an array of these for RegionArray
Definition meta.h:107
struct spa_region region
Definition meta.h:108
Definition meta.h:210
a transformation of the buffer
Definition meta.h:191
A metadata element.
Definition meta.h:66
uint32_t size
size of metadata
Definition meta.h:68
uint32_t type
metadata type, one of enum spa_meta_type
Definition meta.h:67
void * data
pointer to metadata
Definition meta.h:69
int32_t y
Definition defs.h:126
int32_t x
Definition defs.h:125
uint32_t width
Definition defs.h:118
uint32_t height
Definition defs.h:119
struct spa_point position
Definition defs.h:132
struct spa_rectangle size
Definition defs.h:133
spa/debug/types.h