diff --git a/src/gsttools/qgstreamerplayersession.cpp b/src/gsttools/qgstreamerplayersession.cpp
index bd402fb3c123bbce4a975c66ca56e66b6e9d716c..f21c94c5c4da1937f3cad30164711eed69f67e08 100644
--- a/src/gsttools/qgstreamerplayersession.cpp
+++ b/src/gsttools/qgstreamerplayersession.cpp
@@ -47,7 +47,7 @@
 #include <private/gstvideoconnector_p.h>
 #endif
 #include <private/qgstutils_p.h>
-#include <private/qgstutils_p.h>
+#include <private/qvideosurfacegstsink_p.h>
 
 #include <gst/gstvalue.h>
 #include <gst/base/gstbasesrc.h>
@@ -60,6 +60,7 @@
 #include <QtCore/qdebug.h>
 #include <QtCore/qdir.h>
 #include <QtCore/qstandardpaths.h>
+#include <qvideorenderercontrol.h>
 
 //#define DEBUG_PLAYBIN
 //#define DEBUG_VO_BIN_DUMP
@@ -338,6 +339,11 @@ void QGstreamerPlayerSession::loadFromUri(const QNetworkRequest &request)
 #endif
 
     if (m_request.url().scheme() == QLatin1String("gst-pipeline")) {
+        // Set current surface to video sink before creating a pipeline.
+        auto renderer = qobject_cast<QVideoRendererControl*>(m_videoOutput);
+        if (renderer)
+            QVideoSurfaceGstSink::setSurface(renderer->surface());
+
         QString url = m_request.url().toString(QUrl::RemoveScheme);
         QString pipeline = QUrl::fromPercentEncoding(url.toLatin1().constData());
         GError *err = nullptr;
diff --git a/src/gsttools/qgstreamervideorenderer.cpp b/src/gsttools/qgstreamervideorenderer.cpp
index 25fc33cb3c3e8cd305e481adf1ad678eba898dfb..c2226d658497ea0f43a82041a9007cd15f7bde3d 100644
--- a/src/gsttools/qgstreamervideorenderer.cpp
+++ b/src/gsttools/qgstreamervideorenderer.cpp
@@ -113,7 +113,6 @@ void QGstreamerVideoRenderer::setSurface(QAbstractVideoSurface *surface)
         if (m_surface) {
             connect(m_surface.data(), SIGNAL(supportedFormatsChanged()),
                     this, SLOT(handleFormatChange()));
-            QVideoSurfaceGstSink::setSurface(m_surface);
         }
 
         if (wasReady != isReady())