summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTim Blechmann <tim@klingt.org>2024-04-26 12:01:00 +0800
committerQt Cherry-pick Bot <cherrypick_bot@qt-project.org>2024-04-26 15:10:17 +0000
commit7a79dc396c6dd1abdde4d794564fd89034935317 (patch)
treed1d74a507e1606bf04393619dbcbc2f5e61848d7
parent51c382141319eda138ee84fe0bc463c3608b38d4 (diff)
GStreamer: improve tracing of GstMessages
warning/info/state_changed are often useful to see parsed properly. * print them in a parsed manner on the QDebug output * introduce a QCompactGstMessageAdaptor adaptor that can be used to parse these messages in a consistent manner in message handlers. this can be used to remove boilerplate code. Pick-to: 6.5 Change-Id: I0ca76bcfc69628b747fd5e095cc1c783287acb3c Reviewed-by: Jøger Hansegård <joger.hansegard@qt.io> (cherry picked from commit 43bb01c87898a11942920cc58475c3543b8dbc2e) Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
-rw-r--r--src/plugins/multimedia/gstreamer/audio/qgstreameraudiodecoder.cpp33
-rw-r--r--src/plugins/multimedia/gstreamer/audio/qgstreameraudiosink.cpp7
-rw-r--r--src/plugins/multimedia/gstreamer/audio/qgstreameraudiosource.cpp13
-rw-r--r--src/plugins/multimedia/gstreamer/common/qgst_debug.cpp99
-rw-r--r--src/plugins/multimedia/gstreamer/common/qgst_debug_p.h9
-rw-r--r--src/plugins/multimedia/gstreamer/common/qgstreamermediaplayer.cpp30
-rw-r--r--src/plugins/multimedia/gstreamer/mediacapture/qgstreamermediaencoder.cpp15
7 files changed, 147 insertions, 59 deletions
diff --git a/src/plugins/multimedia/gstreamer/audio/qgstreameraudiodecoder.cpp b/src/plugins/multimedia/gstreamer/audio/qgstreameraudiodecoder.cpp
index 5f51c92ca..310fdd994 100644
--- a/src/plugins/multimedia/gstreamer/audio/qgstreameraudiodecoder.cpp
+++ b/src/plugins/multimedia/gstreamer/audio/qgstreameraudiodecoder.cpp
@@ -134,8 +134,8 @@ bool QGstreamerAudioDecoder::processBusMessage(const QGstreamerMessage &message)
gst_message_parse_state_changed(gm, &oldState, &newState, &pending);
if constexpr (extendedMessageTracing)
- qCDebug(qLcGstreamerAudioDecoder) << " state changed message from" << oldState
- << "to" << newState << pending;
+ qCDebug(qLcGstreamerAudioDecoder)
+ << " state changed" << QCompactGstMessageAdaptor(message);
bool isDecoding = false;
switch (newState) {
@@ -177,33 +177,30 @@ bool QGstreamerAudioDecoder::processBusMessage(const QGstreamerMessage &message)
else
processInvalidMedia(QAudioDecoder::ResourceError,
QString::fromUtf8(err.get()->message));
- qCWarning(qLcGstreamerAudioDecoder) << "Error:" << err;
+
+ qCWarning(qLcGstreamerAudioDecoder) << "Error:" << QCompactGstMessageAdaptor(message);
break;
}
- case GST_MESSAGE_WARNING: {
- QUniqueGErrorHandle err;
- QGString debug;
- gst_message_parse_warning(gm, &err, &debug);
- qCWarning(qLcGstreamerAudioDecoder) << "Warning:" << err;
+
+ case GST_MESSAGE_WARNING:
+ qCWarning(qLcGstreamerAudioDecoder) << "Warning:" << QCompactGstMessageAdaptor(message);
break;
- }
- case GST_MESSAGE_INFO: {
- if (qLcGstreamerAudioDecoder().isDebugEnabled()) {
- QUniqueGErrorHandle err;
- QGString debug;
- gst_message_parse_info(gm, &err, &debug);
- qDebug() << "Info:" << err;
- }
+
+ case GST_MESSAGE_INFO:
+ if (qLcGstreamerAudioDecoder().isDebugEnabled())
+ qDebug() << "Info:" << QCompactGstMessageAdaptor(message);
+
break;
- }
+
default:
break;
}
} else if (GST_MESSAGE_TYPE(gm) == GST_MESSAGE_ERROR) {
+ qCDebug(qLcGstreamerAudioDecoder) << " error" << QCompactGstMessageAdaptor(message);
+
QUniqueGErrorHandle err;
QGString debug;
gst_message_parse_error(gm, &err, &debug);
- qCDebug(qLcGstreamerAudioDecoder) << " error" << err << debug;
QAudioDecoder::Error qerror = QAudioDecoder::ResourceError;
if (err.get()->domain == GST_STREAM_ERROR) {
diff --git a/src/plugins/multimedia/gstreamer/audio/qgstreameraudiosink.cpp b/src/plugins/multimedia/gstreamer/audio/qgstreameraudiosink.cpp
index 5399a3e64..6fd972524 100644
--- a/src/plugins/multimedia/gstreamer/audio/qgstreameraudiosink.cpp
+++ b/src/plugins/multimedia/gstreamer/audio/qgstreameraudiosink.cpp
@@ -181,12 +181,7 @@ bool QGStreamerAudioSink::processBusMessage(const QGstreamerMessage &message)
break;
case GST_MESSAGE_ERROR: {
setError(QAudio::IOError);
- QUniqueGErrorHandle error;
- QGString debug;
-
- gst_message_parse_error(msg, &error, &debug);
- qDebug() << "Error:" << error;
-
+ qDebug() << "Error:" << QCompactGstMessageAdaptor(message);
break;
}
default:
diff --git a/src/plugins/multimedia/gstreamer/audio/qgstreameraudiosource.cpp b/src/plugins/multimedia/gstreamer/audio/qgstreameraudiosource.cpp
index ba9823d98..829d116a2 100644
--- a/src/plugins/multimedia/gstreamer/audio/qgstreameraudiosource.cpp
+++ b/src/plugins/multimedia/gstreamer/audio/qgstreameraudiosource.cpp
@@ -4,14 +4,16 @@
#include <QtCore/qcoreapplication.h>
#include <QtCore/qdebug.h>
#include <QtCore/qmath.h>
-#include <private/qaudiohelpers_p.h>
+#include <QtMultimedia/private/qaudiohelpers_p.h>
#include "qgstreameraudiosource_p.h"
#include "qgstreameraudiodevice_p.h"
+#include "common/qgst_p.h"
+#include "common/qgst_debug_p.h"
+
#include <sys/types.h>
#include <unistd.h>
-#include <gst/gst.h>
Q_DECLARE_OPAQUE_POINTER(GstSample *);
Q_DECLARE_METATYPE(GstSample *);
@@ -204,12 +206,7 @@ gboolean QGStreamerAudioSource::busMessage(GstBus *, GstMessage *msg, gpointer u
break;
case GST_MESSAGE_ERROR: {
input->setError(QAudio::IOError);
- QUniqueGErrorHandle error;
- QGString debug;
-
- gst_message_parse_error (msg, &error, &debug);
- qDebug() << "Error:" << error.get();
-
+ qDebug() << "Error:" << QCompactGstMessageAdaptor(msg);
break;
}
default:
diff --git a/src/plugins/multimedia/gstreamer/common/qgst_debug.cpp b/src/plugins/multimedia/gstreamer/common/qgst_debug.cpp
index ee28a5c45..ea749c817 100644
--- a/src/plugins/multimedia/gstreamer/common/qgst_debug.cpp
+++ b/src/plugins/multimedia/gstreamer/common/qgst_debug.cpp
@@ -172,6 +172,42 @@ QDebug operator<<(QDebug dbg, const GstMessage *msg)
break;
}
+ case GST_MESSAGE_WARNING: {
+ QUniqueGErrorHandle err;
+ QGString debug;
+ gst_message_parse_warning(const_cast<GstMessage *>(msg), &err, &debug);
+
+ dbg << GST_MESSAGE_TYPE_NAME(msg) << ", Source: " << GST_MESSAGE_SRC_NAME(msg)
+ << ", Timestamp: " << GST_MESSAGE_TIMESTAMP(msg) << ", Warning: " << err << " ("
+ << debug << ")";
+ break;
+ }
+
+ case GST_MESSAGE_INFO: {
+ QUniqueGErrorHandle err;
+ QGString debug;
+ gst_message_parse_info(const_cast<GstMessage *>(msg), &err, &debug);
+
+ dbg << GST_MESSAGE_TYPE_NAME(msg) << ", Source: " << GST_MESSAGE_SRC_NAME(msg)
+ << ", Timestamp: " << GST_MESSAGE_TIMESTAMP(msg) << ", Info: " << err << " (" << debug
+ << ")";
+ break;
+ }
+
+ case GST_MESSAGE_STATE_CHANGED: {
+ GstState oldState;
+ GstState newState;
+ GstState pending;
+
+ gst_message_parse_state_changed(const_cast<GstMessage *>(msg), &oldState, &newState,
+ &pending);
+
+ dbg << GST_MESSAGE_TYPE_NAME(msg) << ", Source: " << GST_MESSAGE_SRC_NAME(msg)
+ << ", Timestamp: " << GST_MESSAGE_TIMESTAMP(msg) << ", OldState: " << oldState
+ << ", NewState: " << newState << "Pending State: " << pending;
+ break;
+ }
+
default: {
dbg << GST_MESSAGE_TYPE_NAME(msg) << ", Source: " << GST_MESSAGE_SRC_NAME(msg)
<< ", Timestamp: " << GST_MESSAGE_TIMESTAMP(msg);
@@ -316,4 +352,67 @@ QDebug operator<<(QDebug dbg, const GError *error)
return dbg << error->message;
}
+QCompactGstMessageAdaptor::QCompactGstMessageAdaptor(const QGstreamerMessage &m)
+ : QCompactGstMessageAdaptor{
+ m.message(),
+ }
+{
+}
+
+QCompactGstMessageAdaptor::QCompactGstMessageAdaptor(GstMessage *m)
+ : msg{
+ m,
+ }
+{
+}
+
+QDebug operator<<(QDebug dbg, const QCompactGstMessageAdaptor &m)
+{
+ std::optional<QDebugStateSaver> saver(dbg);
+ dbg.nospace();
+
+ switch (GST_MESSAGE_TYPE(m.msg)) {
+ case GST_MESSAGE_ERROR: {
+ QUniqueGErrorHandle err;
+ QGString debug;
+ gst_message_parse_error(m.msg, &err, &debug);
+ dbg << err << " (" << debug << ")";
+ return dbg;
+ }
+
+ case GST_MESSAGE_WARNING: {
+ QUniqueGErrorHandle err;
+ QGString debug;
+ gst_message_parse_warning(m.msg, &err, &debug);
+ dbg << err << " (" << debug << ")";
+ return dbg;
+ }
+
+ case GST_MESSAGE_INFO: {
+ QUniqueGErrorHandle err;
+ QGString debug;
+ gst_message_parse_info(m.msg, &err, &debug);
+
+ dbg << err << " (" << debug << ")";
+ return dbg;
+ }
+
+ case GST_MESSAGE_STATE_CHANGED: {
+ GstState oldState;
+ GstState newState;
+ GstState pending;
+
+ gst_message_parse_state_changed(m.msg, &oldState, &newState, &pending);
+
+ dbg << oldState << "->" << newState << "(pending: " << pending << ")";
+ return dbg;
+ }
+
+ default: {
+ saver.reset();
+ return dbg << m.msg;
+ }
+ }
+}
+
QT_END_NAMESPACE
diff --git a/src/plugins/multimedia/gstreamer/common/qgst_debug_p.h b/src/plugins/multimedia/gstreamer/common/qgst_debug_p.h
index d64c240c6..31c722a90 100644
--- a/src/plugins/multimedia/gstreamer/common/qgst_debug_p.h
+++ b/src/plugins/multimedia/gstreamer/common/qgst_debug_p.h
@@ -54,6 +54,15 @@ QDebug operator<<(QDebug, GstPadDirection);
QDebug operator<<(QDebug, const GValue *);
QDebug operator<<(QDebug, const GError *);
+struct QCompactGstMessageAdaptor
+{
+ explicit QCompactGstMessageAdaptor(const QGstreamerMessage &m);
+ explicit QCompactGstMessageAdaptor(GstMessage *m);
+ GstMessage *msg;
+};
+
+QDebug operator<<(QDebug, const QCompactGstMessageAdaptor &);
+
QT_END_NAMESPACE
#endif
diff --git a/src/plugins/multimedia/gstreamer/common/qgstreamermediaplayer.cpp b/src/plugins/multimedia/gstreamer/common/qgstreamermediaplayer.cpp
index 3e3df7057..4dd5695dc 100644
--- a/src/plugins/multimedia/gstreamer/common/qgstreamermediaplayer.cpp
+++ b/src/plugins/multimedia/gstreamer/common/qgstreamermediaplayer.cpp
@@ -362,8 +362,8 @@ bool QGstreamerMediaPlayer::processBusMessage(const QGstreamerMessage &message)
GstState pending;
gst_message_parse_state_changed(gm, &oldState, &newState, &pending);
- qCDebug(qLcMediaPlayer) << " state changed message from" << oldState << "to" << newState
- << pending;
+ qCDebug(qLcMediaPlayer) << " state changed message from"
+ << QCompactGstMessageAdaptor(message);
switch (newState) {
case GST_STATE_VOID_PENDING:
@@ -427,11 +427,11 @@ bool QGstreamerMediaPlayer::processBusMessage(const QGstreamerMessage &message)
break;
}
case GST_MESSAGE_ERROR: {
+ qCDebug(qLcMediaPlayer) << " error" << QCompactGstMessageAdaptor(message);
+
QUniqueGErrorHandle err;
QUniqueGStringHandle debug;
gst_message_parse_error(gm, &err, &debug);
- qCDebug(qLcMediaPlayer) << " error" << err << debug;
-
GQuark errorDomain = err.get()->domain;
gint errorCode = err.get()->code;
@@ -458,23 +458,17 @@ bool QGstreamerMediaPlayer::processBusMessage(const QGstreamerMessage &message)
mediaStatusChanged(QMediaPlayer::InvalidMedia);
break;
}
- case GST_MESSAGE_WARNING: {
- QUniqueGErrorHandle err;
- QUniqueGStringHandle debug;
- gst_message_parse_warning (gm, &err, &debug);
- qCWarning(qLcMediaPlayer) << "Warning:" << err;
+
+ case GST_MESSAGE_WARNING:
+ qCWarning(qLcMediaPlayer) << "Warning:" << QCompactGstMessageAdaptor(message);
playerPipeline.dumpGraph("warning");
break;
- }
- case GST_MESSAGE_INFO: {
- if (qLcMediaPlayer().isDebugEnabled()) {
- QUniqueGErrorHandle err;
- QUniqueGStringHandle debug;
- gst_message_parse_info (gm, &err, &debug);
- qCDebug(qLcMediaPlayer) << "Info:" << err;
- }
+
+ case GST_MESSAGE_INFO:
+ if (qLcMediaPlayer().isDebugEnabled())
+ qCDebug(qLcMediaPlayer) << "Info:" << QCompactGstMessageAdaptor(message);
break;
- }
+
case GST_MESSAGE_SEGMENT_START: {
qCDebug(qLcMediaPlayer) << " segment start message, updating position";
QGstStructure structure(gst_message_get_structure(gm));
diff --git a/src/plugins/multimedia/gstreamer/mediacapture/qgstreamermediaencoder.cpp b/src/plugins/multimedia/gstreamer/mediacapture/qgstreamermediaencoder.cpp
index 083186985..9c335a185 100644
--- a/src/plugins/multimedia/gstreamer/mediacapture/qgstreamermediaencoder.cpp
+++ b/src/plugins/multimedia/gstreamer/mediacapture/qgstreamermediaencoder.cpp
@@ -84,10 +84,12 @@ bool QGstreamerMediaEncoder::processBusMessage(const QGstreamerMessage &msg)
}
case GST_MESSAGE_ERROR: {
+ qCDebug(qLcMediaEncoderGst)
+ << "received error:" << msg.source().name() << QCompactGstMessageAdaptor(msg);
+
QUniqueGErrorHandle err;
QGString debug;
gst_message_parse_error(msg.message(), &err, &debug);
- qCDebug(qLcMediaEncoderGst) << "received error:" << msg.source().name() << err << debug;
error(QMediaRecorder::ResourceError, QString::fromUtf8(err.get()->message));
if (!m_finalizing)
stop();
@@ -96,14 +98,9 @@ bool QGstreamerMediaEncoder::processBusMessage(const QGstreamerMessage &msg)
}
case GST_MESSAGE_STATE_CHANGED: {
- if constexpr (traceStateChange) {
- GstState oldState;
- GstState newState;
- GstState pending;
- gst_message_parse_state_changed(msg.message(), &oldState, &newState, &pending);
- qCDebug(qLcMediaEncoderGst) << "received state change from" << msg.source().name()
- << oldState << newState << pending;
- }
+ if constexpr (traceStateChange)
+ qCDebug(qLcMediaEncoderGst)
+ << "received state change" << QCompactGstMessageAdaptor(msg);
return false;
}