diff options
author | Tim Blechmann <tim@klingt.org> | 2024-04-26 12:01:00 +0800 |
---|---|---|
committer | Qt Cherry-pick Bot <cherrypick_bot@qt-project.org> | 2024-04-26 15:10:17 +0000 |
commit | 7a79dc396c6dd1abdde4d794564fd89034935317 (patch) | |
tree | d1d74a507e1606bf04393619dbcbc2f5e61848d7 | |
parent | 51c382141319eda138ee84fe0bc463c3608b38d4 (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>
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; } |