1From 7a61361b5ff151ad36de04ca77a86944f14a2ab8 Mon Sep 17 00:00:00 2001 2From: Jeffy Chen <jeffy.chen@rock-chips.com> 3Date: Fri, 15 Jan 2021 16:27:59 +0800 4Subject: [PATCH 11/17] quicktools: Prefer VideoWindowBackend when using gst 5 sink 6 7Prefer VideoWindowBackend for video overlay. 8 9Signed-off-by: Jeffy Chen <jeffy.chen@rock-chips.com> 10--- 11 .../qdeclarativevideooutput.cpp | 15 +++++++++++---- 12 1 file changed, 11 insertions(+), 4 deletions(-) 13 14diff --git a/src/qtmultimediaquicktools/qdeclarativevideooutput.cpp b/src/qtmultimediaquicktools/qdeclarativevideooutput.cpp 15index ca3a4b2..d2f735b 100644 16--- a/src/qtmultimediaquicktools/qdeclarativevideooutput.cpp 17+++ b/src/qtmultimediaquicktools/qdeclarativevideooutput.cpp 18@@ -245,6 +245,7 @@ Q_GLOBAL_STATIC_WITH_ARGS(QMediaPluginLoader, videoBackendFactoryLoader, 19 bool QDeclarativeVideoOutput::createBackend(QMediaService *service) 20 { 21 bool backendAvailable = false; 22+ bool preferWindowBackend = !qgetenv( "QT_GSTREAMER_WINDOW_VIDEOSINK" ).isEmpty(); 23 24 const auto instances = videoBackendFactoryLoader()->instances(QLatin1String("declarativevideobackend")); 25 for (QObject *instance : instances) { 26@@ -257,10 +258,11 @@ bool QDeclarativeVideoOutput::createBackend(QMediaService *service) 27 } 28 } 29 } 30+ 31+retry: 32 #if QT_CONFIG(opengl) 33- if (!backendAvailable) { 34- if (!m_backend) 35- m_backend.reset(new QDeclarativeVideoRendererBackend(this)); 36+ if (!backendAvailable && !preferWindowBackend) { 37+ m_backend.reset(new QDeclarativeVideoRendererBackend(this)); 38 if (m_backend->init(service)) 39 backendAvailable = true; 40 } 41@@ -268,13 +270,18 @@ bool QDeclarativeVideoOutput::createBackend(QMediaService *service) 42 43 // QDeclarativeVideoWindowBackend only works when there is a service with a QVideoWindowControl. 44 // Without service, the QDeclarativeVideoRendererBackend should always work. 45- if (!backendAvailable) { 46+ if (!backendAvailable && service) { 47 Q_ASSERT(service); 48 m_backend.reset(new QDeclarativeVideoWindowBackend(this)); 49 if (m_backend->init(service)) 50 backendAvailable = true; 51 } 52 53+ if (!backendAvailable && preferWindowBackend) { 54+ preferWindowBackend = false; 55+ goto retry; 56+ } 57+ 58 if (backendAvailable) { 59 // Since new backend has been created needs to update its geometry. 60 m_geometryDirty = true; 61-- 622.20.1 63 64