summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFrederik Gladhorn <frederik.gladhorn@theqtcompany.com>2015-02-24 17:38:46 +0100
committerFrederik Gladhorn <frederik.gladhorn@theqtcompany.com>2015-02-24 17:38:46 +0100
commit39bb642cb297dcd95273ba0dba417beec03e686c (patch)
treeae8a58b76224e1ba6a83c00cfdbbb095756213ad
parentf86a3b7bb3a601da9705ef178fda9658cdbfebb0 (diff)
parentfcf5d826a0e2d3ea6a01bf4c962e0d4fe096d321 (diff)
Merge remote-tracking branch 'origin/5.4' into 5.5
Conflicts: qtmultimedia.pro src/gsttools/qgstreamervideowidget.cpp src/plugins/gstreamer/camerabin/camerabinservice.cpp Change-Id: I883f20dc17924ab42514a1aa00d16675a0f13d99
-rw-r--r--qtmultimedia.pro4
-rw-r--r--src/gsttools/qgstreamervideowidget.cpp37
-rw-r--r--src/plugins/gstreamer/camerabin/camerabinservice.cpp14
-rw-r--r--src/plugins/gstreamer/camerabin/camerabinservice.h3
-rw-r--r--src/plugins/gstreamer/mediacapture/qgstreamercaptureservice.cpp15
-rw-r--r--src/plugins/gstreamer/mediacapture/qgstreamercaptureservice.h5
-rw-r--r--src/plugins/gstreamer/mediaplayer/qgstreamerplayerservice.cpp14
-rw-r--r--src/plugins/gstreamer/mediaplayer/qgstreamerplayerservice.h5
8 files changed, 70 insertions, 27 deletions
diff --git a/qtmultimedia.pro b/qtmultimedia.pro
index 489589df7..21d72d096 100644
--- a/qtmultimedia.pro
+++ b/qtmultimedia.pro
@@ -15,8 +15,8 @@ win32 {
} else:qnx {
qtCompileTest(mmrenderer)
} else {
- qtCompileTest(alsa)
- qtCompileTest(pulseaudio)
+ contains(QT_CONFIG, alsa):qtCompileTest(alsa)
+ contains(QT_CONFIG, pulseaudio):qtCompileTest(pulseaudio)
isEmpty(GST_VERSION) {
contains(QT_CONFIG, gstreamer-0.10) {
diff --git a/src/gsttools/qgstreamervideowidget.cpp b/src/gsttools/qgstreamervideowidget.cpp
index 1c1d9245f..5261ccb86 100644
--- a/src/gsttools/qgstreamervideowidget.cpp
+++ b/src/gsttools/qgstreamervideowidget.cpp
@@ -98,6 +98,22 @@ QGstreamerVideoWidgetControl::QGstreamerVideoWidgetControl(QObject *parent)
, m_widget(0)
, m_fullScreen(false)
{
+ m_videoSink = gst_element_factory_make ("xvimagesink", NULL);
+
+ if (!m_videoSink)
+ m_videoSink = gst_element_factory_make ("ximagesink", NULL);
+
+ if (m_videoSink) {
+ // Check if the xv sink is usable
+ if (gst_element_set_state(m_videoSink, GST_STATE_READY) != GST_STATE_CHANGE_SUCCESS) {
+ gst_object_unref(GST_OBJECT(m_videoSink));
+ m_videoSink = 0;
+ } else {
+ gst_element_set_state(m_videoSink, GST_STATE_NULL);
+ g_object_set(G_OBJECT(m_videoSink), "force-aspect-ratio", 1, (const char*)NULL);
+ qt_gst_object_ref_sink(GST_OBJECT (m_videoSink)); //Take ownership
+ }
+ }
}
QGstreamerVideoWidgetControl::~QGstreamerVideoWidgetControl()
@@ -110,36 +126,17 @@ QGstreamerVideoWidgetControl::~QGstreamerVideoWidgetControl()
void QGstreamerVideoWidgetControl::createVideoWidget()
{
- if (m_widget)
+ if (!m_videoSink || m_widget)
return;
m_widget = new QGstreamerVideoWidget;
m_widget->installEventFilter(this);
m_windowId = m_widget->winId();
-
- m_videoSink = gst_element_factory_make ("xvimagesink", NULL);
- if (m_videoSink) {
- // Check if the xv sink is usable
- if (gst_element_set_state(m_videoSink, GST_STATE_READY) != GST_STATE_CHANGE_SUCCESS) {
- gst_object_unref(GST_OBJECT(m_videoSink));
- m_videoSink = 0;
- } else {
- gst_element_set_state(m_videoSink, GST_STATE_NULL);
-
- g_object_set(G_OBJECT(m_videoSink), "force-aspect-ratio", 1, (const char*)NULL);
- }
- }
-
- if (!m_videoSink)
- m_videoSink = gst_element_factory_make ("ximagesink", NULL);
-
- qt_gst_object_ref_sink(GST_OBJECT (m_videoSink)); //Take ownership
}
GstElement *QGstreamerVideoWidgetControl::videoSink()
{
- createVideoWidget();
return m_videoSink;
}
diff --git a/src/plugins/gstreamer/camerabin/camerabinservice.cpp b/src/plugins/gstreamer/camerabin/camerabinservice.cpp
index 706907ec7..25fd44817 100644
--- a/src/plugins/gstreamer/camerabin/camerabinservice.cpp
+++ b/src/plugins/gstreamer/camerabin/camerabinservice.cpp
@@ -124,8 +124,22 @@ CameraBinService::CameraBinService(GstElementFactory *sourceFactory, QObject *pa
#else
m_videoWindow = new QGstreamerVideoWindow(this);
#endif
+ // If the GStreamer sink element is not available (xvimagesink), don't provide
+ // the video window control since it won't work anyway.
+ if (!m_videoWindow->videoSink()) {
+ delete m_videoWindow;
+ m_videoWindow = 0;
+ }
#if defined(HAVE_WIDGETS)
m_videoWidgetControl = new QGstreamerVideoWidgetControl(this);
+
+ // If the GStreamer sink element is not available (xvimagesink or ximagesink), don't provide
+ // the video widget control since it won't work anyway.
+ // QVideoWidget will fall back to QVideoRendererControl in that case.
+ if (!m_videoWidgetControl->videoSink()) {
+ delete m_videoWidgetControl;
+ m_videoWidgetControl = 0;
+ }
#endif
m_audioInputSelector = new QGstreamerAudioInputSelector(this);
diff --git a/src/plugins/gstreamer/camerabin/camerabinservice.h b/src/plugins/gstreamer/camerabin/camerabinservice.h
index ed181eef9..814df7e51 100644
--- a/src/plugins/gstreamer/camerabin/camerabinservice.h
+++ b/src/plugins/gstreamer/camerabin/camerabinservice.h
@@ -48,6 +48,7 @@ class CameraBinControl;
class QGstreamerMessage;
class QGstreamerBusHelper;
class QGstreamerVideoRenderer;
+class QGstreamerVideoWindow;
class QGstreamerVideoWidgetControl;
class QGstreamerElementFactory;
class CameraBinMetaData;
@@ -81,7 +82,7 @@ private:
QMediaControl *m_videoOutput;
QMediaControl *m_videoRenderer;
- QMediaControl *m_videoWindow;
+ QGstreamerVideoWindow *m_videoWindow;
#if defined(HAVE_WIDGETS)
QGstreamerVideoWidgetControl *m_videoWidgetControl;
#endif
diff --git a/src/plugins/gstreamer/mediacapture/qgstreamercaptureservice.cpp b/src/plugins/gstreamer/mediacapture/qgstreamercaptureservice.cpp
index 96c0e841c..bf9b474d6 100644
--- a/src/plugins/gstreamer/mediacapture/qgstreamercaptureservice.cpp
+++ b/src/plugins/gstreamer/mediacapture/qgstreamercaptureservice.cpp
@@ -100,10 +100,25 @@ QGstreamerCaptureService::QGstreamerCaptureService(const QString &service, QObje
m_videoInput->setDevice(m_videoInputDevice->deviceName(m_videoInputDevice->selectedDevice()));
m_videoRenderer = new QGstreamerVideoRenderer(this);
+
m_videoWindow = new QGstreamerVideoWindow(this);
+ // If the GStreamer sink element is not available (xvimagesink), don't provide
+ // the video window control since it won't work anyway.
+ if (!m_videoWindow->videoSink()) {
+ delete m_videoWindow;
+ m_videoWindow = 0;
+ }
#if defined(HAVE_WIDGETS)
m_videoWidgetControl = new QGstreamerVideoWidgetControl(this);
+
+ // If the GStreamer sink element is not available (xvimagesink or ximagesink), don't provide
+ // the video widget control since it won't work anyway.
+ // QVideoWidget will fall back to QVideoRendererControl in that case.
+ if (!m_videoWidgetControl->videoSink()) {
+ delete m_videoWidgetControl;
+ m_videoWidgetControl = 0;
+ }
#endif
m_imageCaptureControl = new QGstreamerImageCaptureControl(m_captureSession);
}
diff --git a/src/plugins/gstreamer/mediacapture/qgstreamercaptureservice.h b/src/plugins/gstreamer/mediacapture/qgstreamercaptureservice.h
index 2cd3d3d4d..23978eee7 100644
--- a/src/plugins/gstreamer/mediacapture/qgstreamercaptureservice.h
+++ b/src/plugins/gstreamer/mediacapture/qgstreamercaptureservice.h
@@ -49,6 +49,7 @@ class QGstreamerCameraControl;
class QGstreamerMessage;
class QGstreamerBusHelper;
class QGstreamerVideoRenderer;
+class QGstreamerVideoWindow;
class QGstreamerVideoWidgetControl;
class QGstreamerElementFactory;
class QGstreamerCaptureMetaDataControl;
@@ -82,9 +83,9 @@ private:
QMediaControl *m_videoOutput;
QGstreamerVideoRenderer *m_videoRenderer;
- QMediaControl *m_videoWindow;
+ QGstreamerVideoWindow *m_videoWindow;
#if defined(HAVE_WIDGETS)
- QMediaControl *m_videoWidgetControl;
+ QGstreamerVideoWidgetControl *m_videoWidgetControl;
#endif
QGstreamerImageCaptureControl *m_imageCaptureControl;
diff --git a/src/plugins/gstreamer/mediaplayer/qgstreamerplayerservice.cpp b/src/plugins/gstreamer/mediaplayer/qgstreamerplayerservice.cpp
index f2658c4b6..48cbd937a 100644
--- a/src/plugins/gstreamer/mediaplayer/qgstreamerplayerservice.cpp
+++ b/src/plugins/gstreamer/mediaplayer/qgstreamerplayerservice.cpp
@@ -99,9 +99,23 @@ QGstreamerPlayerService::QGstreamerPlayerService(QObject *parent):
#else
m_videoWindow = new QGstreamerVideoWindow(this);
#endif
+ // If the GStreamer sink element is not available (xvimagesink), don't provide
+ // the video window control since it won't work anyway.
+ if (!m_videoWindow->videoSink()) {
+ delete m_videoWindow;
+ m_videoWindow = 0;
+ }
#if defined(HAVE_WIDGETS)
m_videoWidget = new QGstreamerVideoWidgetControl(this);
+
+ // If the GStreamer sink element is not available (xvimagesink or ximagesink), don't provide
+ // the video widget control since it won't work anyway.
+ // QVideoWidget will fall back to QVideoRendererControl in that case.
+ if (!m_videoWidget->videoSink()) {
+ delete m_videoWidget;
+ m_videoWidget = 0;
+ }
#endif
}
diff --git a/src/plugins/gstreamer/mediaplayer/qgstreamerplayerservice.h b/src/plugins/gstreamer/mediaplayer/qgstreamerplayerservice.h
index 15ea6c231..943107e23 100644
--- a/src/plugins/gstreamer/mediaplayer/qgstreamerplayerservice.h
+++ b/src/plugins/gstreamer/mediaplayer/qgstreamerplayerservice.h
@@ -50,6 +50,7 @@ class QGstreamerPlayerSession;
class QGstreamerMetaDataProvider;
class QGstreamerStreamsControl;
class QGstreamerVideoRenderer;
+class QGstreamerVideoWindow;
class QGstreamerVideoWidgetControl;
class QGStreamerAvailabilityControl;
class QGstreamerAudioProbeControl;
@@ -77,9 +78,9 @@ private:
QMediaControl *m_videoOutput;
QMediaControl *m_videoRenderer;
- QMediaControl *m_videoWindow;
+ QGstreamerVideoWindow *m_videoWindow;
#if defined(HAVE_WIDGETS)
- QMediaControl *m_videoWidget;
+ QGstreamerVideoWidgetControl *m_videoWidget;
#endif
void increaseVideoRef();