summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@qt.io>2021-11-03 11:41:17 +0100
committerQt Cherry-pick Bot <cherrypick_bot@qt-project.org>2021-11-03 12:32:24 +0000
commitb4b6942a5a7dc4313dafd6a0d1f70d70ce8dfb16 (patch)
tree417fea6bf1ee0a9fc5ddbe667e5220d8e6daa232
parentd8c680bdbebd532a8ccd91d7ffb9b524c8fbd0e0 (diff)
downloadqtmultimedia-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>
-rw-r--r--src/multimedia/platform/gstreamer/common/qgstpipeline.cpp3
-rw-r--r--src/multimedia/platform/gstreamer/common/qgstvideorenderersink.cpp21
-rw-r--r--src/multimedia/platform/gstreamer/mediacapture/qgstreamermediacapture.cpp1
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");
}