diff options
author | Frederik Gladhorn <frederik.gladhorn@theqtcompany.com> | 2015-02-24 17:38:46 +0100 |
---|---|---|
committer | Frederik Gladhorn <frederik.gladhorn@theqtcompany.com> | 2015-02-24 17:38:46 +0100 |
commit | 39bb642cb297dcd95273ba0dba417beec03e686c (patch) | |
tree | ae8a58b76224e1ba6a83c00cfdbbb095756213ad | |
parent | f86a3b7bb3a601da9705ef178fda9658cdbfebb0 (diff) | |
parent | fcf5d826a0e2d3ea6a01bf4c962e0d4fe096d321 (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
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(); |