diff options
author | Lars Knoll <lars.knoll@qt.io> | 2021-11-03 11:41:17 +0100 |
---|---|---|
committer | Qt Cherry-pick Bot <cherrypick_bot@qt-project.org> | 2021-11-03 12:32:24 +0000 |
commit | b4b6942a5a7dc4313dafd6a0d1f70d70ce8dfb16 (patch) | |
tree | 417fea6bf1ee0a9fc5ddbe667e5220d8e6daa232 | |
parent | d8c680bdbebd532a8ccd91d7ffb9b524c8fbd0e0 (diff) | |
download | qtmultimedia-b4b6942a5a7dc4313dafd6a0d1f70d70ce8dfb16.tar.gz |
GStreamer: Fix black preview window on capturesessions
Properly render the video frames we receive in capture sessions. The
pipeline for capturing should never be in a stopped state and not
deliver any video frames.
As a drive-by, convert some commented out debug output to use proper
logging.
Fixes: QTBUG-97911
Change-Id: Ie318925fa6bb9ef705b3d996f878da0bda8bf315
Reviewed-by: Piotr Srebrny <piotr.srebrny@qt.io>
Reviewed-by: Lars Knoll <lars.knoll@qt.io>
(cherry picked from commit ed857e84f3c0ab90ac6dfff1aecce460f56e1a9a)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
3 files changed, 14 insertions, 11 deletions
diff --git a/src/multimedia/platform/gstreamer/common/qgstpipeline.cpp b/src/multimedia/platform/gstreamer/common/qgstpipeline.cpp index 7a605b709..29fb0a552 100644 --- a/src/multimedia/platform/gstreamer/common/qgstpipeline.cpp +++ b/src/multimedia/platform/gstreamer/common/qgstpipeline.cpp @@ -138,8 +138,7 @@ private: QGstPipelinePrivate::QGstPipelinePrivate(GstBus* bus, QObject* parent) : QObject(parent), - m_bus(bus), - inStoppedState(true) + m_bus(bus) { gst_object_ref(GST_OBJECT(bus)); diff --git a/src/multimedia/platform/gstreamer/common/qgstvideorenderersink.cpp b/src/multimedia/platform/gstreamer/common/qgstvideorenderersink.cpp index e9a9cf678..cbb40c13e 100644 --- a/src/multimedia/platform/gstreamer/common/qgstvideorenderersink.cpp +++ b/src/multimedia/platform/gstreamer/common/qgstvideorenderersink.cpp @@ -53,6 +53,8 @@ #include <gst/video/video.h> #include <gst/video/gstvideometa.h> +#include <qloggingcategory.h> +#include <qdebug.h> #include "qgstutils_p.h" @@ -68,6 +70,8 @@ //#define DEBUG_VIDEO_SURFACE_SINK +Q_LOGGING_CATEGORY(qLcGstVideoRenderer, "qt.multimedia.gstvideorenderer") + QT_BEGIN_NAMESPACE QGstVideoRenderer::QGstVideoRenderer(QGstreamerVideoSink *sink) @@ -151,7 +155,7 @@ QGstMutableCaps QGstVideoRenderer::caps() bool QGstVideoRenderer::start(GstCaps *caps) { -// qDebug() << "QGstVideoRenderer::start" << QGstCaps(caps).toString(); + qCDebug(qLcGstVideoRenderer) << "QGstVideoRenderer::start" << QGstCaps(caps).toString(); QMutexLocker locker(&m_mutex); if (m_active) { @@ -224,6 +228,7 @@ void QGstVideoRenderer::flush() GstFlowReturn QGstVideoRenderer::render(GstBuffer *buffer) { QMutexLocker locker(&m_mutex); + qCDebug(qLcGstVideoRenderer) << "QGstVideoRenderer::render"; m_renderReturn = GST_FLOW_OK; m_renderBuffer = buffer; @@ -317,6 +322,7 @@ bool QGstVideoRenderer::handleEvent(QMutexLocker<QMutex> *locker) m_renderBuffer = nullptr; m_renderReturn = GST_FLOW_ERROR; + qCDebug(qLcGstVideoRenderer) << "QGstVideoRenderer::handleEvent(renderBuffer)" << m_active << m_sink; if (m_active && m_sink) { gst_buffer_ref(buffer); @@ -328,21 +334,21 @@ bool QGstVideoRenderer::handleEvent(QMutexLocker<QMutex> *locker) if (meta) { QRect vp(meta->x, meta->y, meta->width, meta->height); if (m_format.viewport() != vp) { -#ifdef DEBUG_VIDEO_SURFACE_SINK - qDebug() << Q_FUNC_INFO << " Update viewport on Metadata: [" << meta->height << "x" << meta->width << " | " << meta->x << "x" << meta->y << "]"; -#endif \ - //Update viewport if data is not the same + qCDebug(qLcGstVideoRenderer) << Q_FUNC_INFO << " Update viewport on Metadata: [" << meta->height << "x" << meta->width << " | " << meta->x << "x" << meta->y << "]"; + // Update viewport if data is not the same m_format.setViewport(vp); } } if (m_sink->inStoppedState()) { + qCDebug(qLcGstVideoRenderer) << " sending empty video frame"; m_sink->setVideoFrame(QVideoFrame()); } else { QGstVideoBuffer *videoBuffer = new QGstVideoBuffer(buffer, m_videoInfo, m_sink, m_format, memoryFormat); QVideoFrame frame(videoBuffer, m_format); QGstUtils::setFrameTimeStamps(&frame, buffer); + qCDebug(qLcGstVideoRenderer) << " sending video frame"; m_sink->setVideoFrame(frame); } @@ -555,10 +561,7 @@ gboolean QGstVideoRendererSink::set_caps(GstBaseSink *base, GstCaps *caps) { VO_SINK(base); -#ifdef DEBUG_VIDEO_SURFACE_SINK - qDebug() << "set_caps:"; - qDebug() << caps; -#endif + qCDebug(qLcGstVideoRenderer) << "set_caps:" << QGstCaps(caps).toString(); if (!caps) { sink->renderer->stop(); diff --git a/src/multimedia/platform/gstreamer/mediacapture/qgstreamermediacapture.cpp b/src/multimedia/platform/gstreamer/mediacapture/qgstreamermediacapture.cpp index 3c1793b15..b43a4fb30 100644 --- a/src/multimedia/platform/gstreamer/mediacapture/qgstreamermediacapture.cpp +++ b/src/multimedia/platform/gstreamer/mediacapture/qgstreamermediacapture.cpp @@ -91,6 +91,7 @@ QGstreamerMediaCapture::QGstreamerMediaCapture() // This is the recording pipeline with only live sources, thus the pipeline // will be always in the playing state. gstPipeline.setState(GST_STATE_PLAYING); + gstPipeline.setInStoppedState(false); gstPipeline.dumpGraph("initial"); } |