Qt
Internal/Contributor docs for the Qt SDK. <b>Note:</b> These are NOT official API docs; those are found <a href='https://doc.qt.io/'>here</a>.
Loading...
Searching...
No Matches
qgst_debug.cpp
Go to the documentation of this file.
1// Copyright (C) 2024 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
4#include "qgst_debug_p.h"
6
7#include <gst/gstclock.h>
8
10
11// NOLINTBEGIN(performance-unnecessary-value-param)
12
14{
15 return dbg << str.get();
16}
17
19{
20 return dbg << caps.caps();
21}
22
23QDebug operator<<(QDebug dbg, const QGstStructure &structure)
24{
25 return dbg << structure.structure;
26}
27
29{
30 return dbg << value.value;
31}
32
34{
35 return dbg << msg.message();
36}
37
39{
40 return dbg << handle.get();
41}
42
44{
45 return dbg << handle.get();
46}
47
48QDebug operator<<(QDebug dbg, const QGstElement &element)
49{
50 return dbg << element.element();
51}
52
54{
55 return dbg << pad.pad();
56}
57
58QDebug operator<<(QDebug dbg, const GstCaps *caps)
59{
60 if (caps)
61 return dbg << QGString(gst_caps_to_string(caps));
62 else
63 return dbg << "null";
64}
65
66QDebug operator<<(QDebug dbg, const GstVideoInfo *info)
67{
68#if GST_CHECK_VERSION(1, 20, 0)
69 return dbg << QGstCaps{
70 gst_video_info_to_caps(info),
72 };
73#else
74 return dbg << QGstCaps{
75 gst_video_info_to_caps(const_cast<GstVideoInfo *>(info)),
77 };
78#endif
79}
80
81QDebug operator<<(QDebug dbg, const GstStructure *structure)
82{
83 if (structure)
84 return dbg << QGString(gst_structure_to_string(structure));
85 else
86 return dbg << "null";
87}
88
89QDebug operator<<(QDebug dbg, const GstObject *object)
90{
91 dbg << QGString{gst_object_get_name(const_cast<GstObject*>(object))};
92
93 {
94 QDebugStateSaver saver(dbg);
95 dbg.nospace();
96
97 dbg << "{";
98
99 guint numProperties;
100 GParamSpec **properties = g_object_class_list_properties(G_OBJECT_GET_CLASS(object), &numProperties);
101
102 for (guint i = 0; i < numProperties; i++) {
103 GParamSpec *param = properties[i];
104
105 const gchar *name = g_param_spec_get_name(param);
106 constexpr bool trace_blurb = false;
107 if constexpr (trace_blurb) {
108 const gchar *blurb = g_param_spec_get_blurb(param);
109 dbg << name << " (" << blurb << "): ";
110 } else
111 dbg << name << ": ";
112
113 bool readable = bool(param->flags & G_PARAM_READABLE);
114 if (!readable) {
115 dbg << "(not readable)";
116 } else if (QLatin1StringView(name) == QLatin1StringView("parent")) {
117 if (object->parent)
118 dbg << QGString{ gst_object_get_name(object->parent) };
119 else
120 dbg << "(none)";
121 } else {
122 GValue value = {};
123 g_object_get_property(&const_cast<GstObject *>(object)->object, param->name,
124 &value);
125 dbg << &value;
126 }
127 if (i != numProperties - 1)
128 dbg << ", ";
129 }
130
131 dbg << "}";
132
133 g_free(properties);
134 }
135 return dbg;
136}
137
138QDebug operator<<(QDebug dbg, const GstElement *element)
139{
140 return dbg << GST_OBJECT_CAST(element); // LATER: output other members?
141}
142
143QDebug operator<<(QDebug dbg, const GstPad *pad)
144{
145 return dbg << GST_OBJECT_CAST(pad); // LATER: output other members?
146}
147
148QDebug operator<<(QDebug dbg, const GstDevice *device)
149{
150 GstDevice *d = const_cast<GstDevice *>(device);
151 QDebugStateSaver saver(dbg);
152 dbg.nospace();
153
154 dbg << gst_device_get_display_name(d) << "(" << gst_device_get_device_class(d) << ") ";
155 dbg << "Caps: " << QGstCaps{ gst_device_get_caps(d), QGstCaps::NeedsRef, } << ", ";
156 dbg << "Properties: " << QUniqueGstStructureHandle{ gst_device_get_properties(d) }.get();
157 return dbg;
158}
159
160namespace {
161
162struct Timepoint
163{
164 explicit Timepoint(guint64 us) : ts{ us } { }
165 guint64 ts;
166};
167
168QDebug operator<<(QDebug dbg, Timepoint ts)
169{
170 char buffer[128];
171 snprintf(buffer, sizeof(buffer), "%" GST_TIME_FORMAT, GST_TIME_ARGS(ts.ts));
172 dbg << buffer;
173 return dbg;
174}
175
176} // namespace
177
178QDebug operator<<(QDebug dbg, const GstMessage *msg)
179{
180 QDebugStateSaver saver(dbg);
181 dbg.nospace();
182
183 dbg << GST_MESSAGE_TYPE_NAME(msg) << ", Source: " << GST_MESSAGE_SRC_NAME(msg);
184 if (GST_MESSAGE_TIMESTAMP(msg) != 0xFFFFFFFFFFFFFFFF)
185 dbg << ", Timestamp: " << GST_MESSAGE_TIMESTAMP(msg);
186
187 switch (msg->type) {
188 case GST_MESSAGE_ERROR: {
191 gst_message_parse_error(const_cast<GstMessage *>(msg), &err, &debug);
192
193 dbg << ", Error: " << err << " (" << debug << ")";
194 break;
195 }
196
197 case GST_MESSAGE_WARNING: {
200 gst_message_parse_warning(const_cast<GstMessage *>(msg), &err, &debug);
201
202 dbg << ", Warning: " << err << " (" << debug << ")";
203 break;
204 }
205
206 case GST_MESSAGE_INFO: {
209 gst_message_parse_info(const_cast<GstMessage *>(msg), &err, &debug);
210
211 dbg << ", Info: " << err << " (" << debug << ")";
212 break;
213 }
214
215 case GST_MESSAGE_QOS: {
216 gboolean live;
217 guint64 running_time;
218 guint64 stream_time;
219 guint64 timestamp;
220 guint64 duration;
221
222 gst_message_parse_qos(const_cast<GstMessage *>(msg), &live, &running_time, &stream_time,
223 &timestamp, &duration);
224
225 dbg << ", Live: " << bool(live) << ", Running time: " << Timepoint{ running_time }
226 << ", Stream time: " << Timepoint{ stream_time }
227 << ", Timestamp: " << Timepoint{ timestamp } << ", Duration: " << Timepoint{ duration };
228 break;
229 }
230
231 case GST_MESSAGE_STATE_CHANGED: {
232 GstState oldState;
233 GstState newState;
234 GstState pending;
235
236 gst_message_parse_state_changed(const_cast<GstMessage *>(msg), &oldState, &newState,
237 &pending);
238
239 dbg << ", Transition: " << oldState << "->" << newState;
240
241 if (pending != GST_STATE_VOID_PENDING)
242 dbg << ", Pending State: " << pending;
243 break;
244 }
245
246 default:
247 break;
248 }
249 return dbg;
250}
251
252QDebug operator<<(QDebug dbg, const GstTagList *tagList)
253{
254 dbg << QGString{ gst_tag_list_to_string(tagList) };
255 return dbg;
256}
257
258QDebug operator<<(QDebug dbg, const GstQuery *query)
259{
260 dbg << GST_QUERY_TYPE_NAME(query);
261 return dbg;
262}
263
264QDebug operator<<(QDebug dbg, const GstEvent *event)
265{
266 dbg << GST_EVENT_TYPE_NAME(event);
267 return dbg;
268}
269
270QDebug operator<<(QDebug dbg, const GstPadTemplate *padTemplate)
271{
272 QGstCaps caps = padTemplate
273 ? QGstCaps{ gst_pad_template_get_caps(const_cast<GstPadTemplate *>(padTemplate)), QGstCaps::HasRef, }
274 : QGstCaps{};
275
276 dbg << caps;
277 return dbg;
278}
279
281{
282 return dbg << gst_element_state_get_name(state);
283}
284
285QDebug operator<<(QDebug dbg, GstStateChange transition)
286{
287 return dbg << gst_state_change_get_name(transition);
288}
289
290QDebug operator<<(QDebug dbg, GstStateChangeReturn stateChangeReturn)
291{
292 return dbg << gst_element_state_change_return_get_name(stateChangeReturn);
293}
294
295QDebug operator<<(QDebug dbg, GstMessageType type)
296{
297 return dbg << gst_message_type_get_name(type);
298}
299
300QDebug operator<<(QDebug dbg, GstPadDirection direction)
301{
302 switch (direction) {
303 case GST_PAD_UNKNOWN:
304 return dbg << "GST_PAD_UNKNOWN";
305 case GST_PAD_SRC:
306 return dbg << "GST_PAD_SRC";
307 case GST_PAD_SINK:
308 return dbg << "GST_PAD_SINK";
309 }
310 return dbg;
311}
312
313QDebug operator<<(QDebug dbg, const GValue *value)
314{
315 switch (G_VALUE_TYPE(value)) {
316 case G_TYPE_STRING:
317 return dbg << g_value_get_string(value);
318 case G_TYPE_BOOLEAN:
319 return dbg << g_value_get_boolean(value);
320 case G_TYPE_ULONG:
321 return dbg << g_value_get_ulong(value);
322 case G_TYPE_LONG:
323 return dbg << g_value_get_long(value);
324 case G_TYPE_UINT:
325 return dbg << g_value_get_uint(value);
326 case G_TYPE_INT:
327 return dbg << g_value_get_int(value);
328 case G_TYPE_UINT64:
329 return dbg << g_value_get_uint64(value);
330 case G_TYPE_INT64:
331 return dbg << g_value_get_int64(value);
332 case G_TYPE_FLOAT:
333 return dbg << g_value_get_float(value);
334 case G_TYPE_DOUBLE:
335 return dbg << g_value_get_double(value);
336 default:
337 break;
338 }
339
340 if (GST_VALUE_HOLDS_BITMASK(value)) {
341 QDebugStateSaver saver(dbg);
342 return dbg << Qt::hex << gst_value_get_bitmask(value);
343 }
344
345 if (GST_VALUE_HOLDS_FRACTION(value))
346 return dbg << gst_value_get_fraction_numerator(value) << "/"
347 << gst_value_get_fraction_denominator(value);
348
349 if (GST_VALUE_HOLDS_CAPS(value))
350 return dbg << gst_value_get_caps(value);
351
352 if (GST_VALUE_HOLDS_STRUCTURE(value))
353 return dbg << gst_value_get_structure(value);
354
355 if (GST_VALUE_HOLDS_ARRAY(value)) {
356 const guint size = gst_value_array_get_size(value);
357 const guint last = size - 1;
358 dbg << "[";
359 for (guint index = 0; index != size; ++index) {
360 dbg << gst_value_array_get_value(value, index);
361 if (index != last)
362 dbg << ", ";
363 }
364 dbg << "}";
365 return dbg;
366 }
367
368 if (G_VALUE_TYPE(value) == GST_TYPE_PAD_DIRECTION) {
369 GstPadDirection direction = static_cast<GstPadDirection>(g_value_get_enum(value));
370 return dbg << direction;
371 }
372
373 if (G_VALUE_TYPE(value) == GST_TYPE_PAD_TEMPLATE) {
374 GstPadTemplate *padTemplate = static_cast<GstPadTemplate *>(g_value_get_object(value));
375 return dbg << padTemplate;
376 }
377
378 dbg << "(not implemented: " << G_VALUE_TYPE_NAME(value) << ")";
379
380 return dbg;
381}
382
383QDebug operator<<(QDebug dbg, const GError *error)
384{
385 return dbg << error->message;
386}
387
394
396 : msg{
397 m,
398 }
399{
400}
401
403{
404 std::optional<QDebugStateSaver> saver(dbg);
405 dbg.nospace();
406
407 switch (GST_MESSAGE_TYPE(m.msg)) {
408 case GST_MESSAGE_ERROR: {
411 gst_message_parse_error(m.msg, &err, &debug);
412 dbg << err << " (" << debug << ")";
413 return dbg;
414 }
415
416 case GST_MESSAGE_WARNING: {
419 gst_message_parse_warning(m.msg, &err, &debug);
420 dbg << err << " (" << debug << ")";
421 return dbg;
422 }
423
424 case GST_MESSAGE_INFO: {
427 gst_message_parse_info(m.msg, &err, &debug);
428
429 dbg << err << " (" << debug << ")";
430 return dbg;
431 }
432
433 case GST_MESSAGE_STATE_CHANGED: {
434 GstState oldState;
435 GstState newState;
436 GstState pending;
437
438 gst_message_parse_state_changed(m.msg, &oldState, &newState, &pending);
439
440 dbg << oldState << " -> " << newState;
441 if (pending != GST_STATE_VOID_PENDING)
442 dbg << " (pending: " << pending << ")";
443 return dbg;
444 }
445
446 default: {
447 saver.reset();
448 return dbg << m.msg;
449 }
450 }
451}
452
IOBluetoothDevice * device
\inmodule QtCore
\inmodule QtCore
GstCaps * caps() const
Definition qgst.cpp:526
GstElement * element() const
Definition qgst.cpp:1026
GstPad * pad() const
Definition qgst.cpp:782
const GstStructure * structure
Definition qgst_p.h:315
GstMessage * message() const
QString str
[2]
direction
else opt state
[0]
void newState(QList< State > &states, const char *token, const char *lexem, bool pre)
Combined button and popup list for selecting options.
QTextStream & hex(QTextStream &stream)
Calls QTextStream::setIntegerBase(16) on stream and returns stream.
static const QCssKnownValue properties[NumProperties - 1]
DBusConnection const char DBusError * error
DBusConnection const char DBusError DBusBusType DBusError return DBusConnection DBusHandleMessageFunction void DBusFreeFunction return DBusConnection return DBusConnection return const char DBusError return DBusConnection DBusMessage dbus_uint32_t return DBusConnection dbus_bool_t DBusConnection DBusAddWatchFunction DBusRemoveWatchFunction DBusWatchToggledFunction void DBusFreeFunction return DBusConnection DBusDispatchStatusFunction void DBusFreeFunction DBusTimeout return DBusTimeout return DBusWatch return DBusWatch unsigned int return DBusError const DBusError return const DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessageIter int const void return DBusMessageIter DBusMessageIter return DBusMessageIter void DBusMessageIter void int return DBusMessage DBusMessageIter return DBusMessageIter return DBusMessageIter DBusMessageIter const char const char const char const char return DBusMessage return DBusMessage const char return DBusMessage dbus_bool_t return DBusMessage dbus_uint32_t return DBusMessage return DBusPendingCall * pending
EGLOutputLayerEXT EGLint EGLAttrib value
[5]
QT_BEGIN_NAMESPACE QDebug operator<<(QDebug dbg, const QGString &str)
QUniqueHandle< QGstImpl::QUniqueGstStructureHandleTraits > QUniqueGstStructureHandle
GLuint64 GLenum void * handle
const GLfloat * m
GLenum GLuint GLintptr GLsizeiptr size
[1]
GLuint index
[2]
GLuint object
[3]
GLenum GLuint buffer
GLenum type
GLuint GLsizei const GLchar * message
GLenum const GLint * param
GLuint name
struct _cl_event * event
GLenum query
QHostInfo info
[0]
QCompactGstMessageAdaptor(const QGstreamerMessage &m)