diff options
Diffstat (limited to 'src/plugins')
6 files changed, 73 insertions, 17 deletions
diff --git a/src/plugins/common/evr/evrd3dpresentengine.cpp b/src/plugins/common/evr/evrd3dpresentengine.cpp index 9718c78b5..ae3d69fc2 100644 --- a/src/plugins/common/evr/evrd3dpresentengine.cpp +++ b/src/plugins/common/evr/evrd3dpresentengine.cpp @@ -255,7 +255,7 @@ QVariant IMFSampleVideoBuffer::handle() const if (handleType() != GLTextureHandle) return handle; - if (m_textureUpdated || m_engine->updateTexture(m_surface)) { + if (m_engine->m_glResources && (m_textureUpdated || m_engine->updateTexture(m_surface))) { m_textureUpdated = true; handle = QVariant::fromValue<unsigned int>(m_engine->m_glResources->glTexture); } diff --git a/src/plugins/gstreamer/mediaplayer/qgstreamermetadataprovider.cpp b/src/plugins/gstreamer/mediaplayer/qgstreamermetadataprovider.cpp index 01103d659..b9e29245f 100644 --- a/src/plugins/gstreamer/mediaplayer/qgstreamermetadataprovider.cpp +++ b/src/plugins/gstreamer/mediaplayer/qgstreamermetadataprovider.cpp @@ -93,7 +93,8 @@ static const QGstreamerMetaDataKeyLookup *qt_gstreamerMetaDataKeys() //metadataKeys->insert(0, QMediaMetaData::CoverArtUrlSmall); //metadataKeys->insert(0, QMediaMetaData::CoverArtUrlLarge); - metadataKeys->insert(GST_TAG_PREVIEW_IMAGE, QMediaMetaData::CoverArtImage); + metadataKeys->insert(GST_TAG_PREVIEW_IMAGE, QMediaMetaData::ThumbnailImage); + metadataKeys->insert(GST_TAG_IMAGE, QMediaMetaData::CoverArtImage); // Image/Video metadataKeys->insert("resolution", QMediaMetaData::Resolution); diff --git a/src/plugins/gstreamer/mediaplayer/qgstreamerplayersession.cpp b/src/plugins/gstreamer/mediaplayer/qgstreamerplayersession.cpp index 09b74148e..76a56aca7 100644 --- a/src/plugins/gstreamer/mediaplayer/qgstreamerplayersession.cpp +++ b/src/plugins/gstreamer/mediaplayer/qgstreamerplayersession.cpp @@ -61,12 +61,59 @@ #include <QtCore/qdebug.h> #include <QtCore/qdir.h> #include <QtCore/qstandardpaths.h> +#include <QtCore/qvector.h> +#include <QtCore/qmutex.h> //#define DEBUG_PLAYBIN //#define DEBUG_VO_BIN_DUMP QT_BEGIN_NAMESPACE +class TypefindDelegator +{ +public: + TypefindDelegator() + { + Q_ASSERT(gst_type_find_register(0, "playlist", GST_RANK_MARGINAL, notifySessions, 0, 0, 0, 0) == TRUE); + } + + void add(QGstreamerPlayerSession *session) + { + QMutexLocker locker(&m_mtx); + m_sessions.append(session); + } + + void remove(QGstreamerPlayerSession *session) + { + QMutexLocker locker(&m_mtx); + const int idx = m_sessions.indexOf(session); + if (idx != -1) + m_sessions.remove(idx); + } + +private: + static void notifySessions(GstTypeFind *find, gpointer /* unused */) + { + QMutexLocker locker(&m_mtx); + SessionList::const_iterator it = m_sessions.constBegin(); + SessionList::const_iterator end = m_sessions.constEnd(); + + while (it != end) { + (*it)->playlistTypeFindFunction(find); + ++it; + } + } + + typedef QVector<QGstreamerPlayerSession *> SessionList; + static SessionList m_sessions; + static QMutex m_mtx; +}; + +TypefindDelegator::SessionList TypefindDelegator::m_sessions; +QMutex TypefindDelegator::m_mtx; + +Q_GLOBAL_STATIC(TypefindDelegator, g_typeRegister); + static bool usePlaybinVolume() { static enum { Yes, No, Unknown } status = Unknown; @@ -147,10 +194,7 @@ QGstreamerPlayerSession::QGstreamerPlayerSession(QObject *parent) m_isLiveSource(false), m_isPlaylist(false) { - gboolean result = gst_type_find_register(0, "playlist", GST_RANK_MARGINAL, playlistTypeFindFunction, 0, 0, this, 0); - Q_ASSERT(result == TRUE); - Q_UNUSED(result); - + g_typeRegister->add(this); m_playbin = gst_element_factory_make(QT_GSTREAMER_PLAYBIN_ELEMENT_NAME, NULL); if (m_playbin) { //GST_PLAY_FLAG_NATIVE_VIDEO omits configuration of ffmpegcolorspace and videoscale, @@ -251,6 +295,8 @@ QGstreamerPlayerSession::QGstreamerPlayerSession(QObject *parent) QGstreamerPlayerSession::~QGstreamerPlayerSession() { + g_typeRegister->remove(this); + if (m_playbin) { stop(); @@ -1890,16 +1936,16 @@ void QGstreamerPlayerSession::resumeVideoProbes() m_videoProbe->stopFlushing(); } -void QGstreamerPlayerSession::playlistTypeFindFunction(GstTypeFind *find, gpointer userData) +void QGstreamerPlayerSession::playlistTypeFindFunction(GstTypeFind *find) { - QGstreamerPlayerSession* session = (QGstreamerPlayerSession*)userData; - - const gchar *uri = 0; + gchar *strval = 0; #if GST_CHECK_VERSION(1,0,0) - g_object_get(G_OBJECT(session->m_playbin), "current-uri", &uri, NULL); + g_object_get(G_OBJECT(m_playbin), "current-uri", &strval, NULL); #else - g_object_get(G_OBJECT(session->m_playbin), "uri", &uri, NULL); + g_object_get(G_OBJECT(m_playbin), "uri", &strval, NULL); #endif + const QString uri(QString::fromUtf8(strval)); + g_free(strval); guint64 length = gst_type_find_get_length(find); if (!length) @@ -1910,7 +1956,7 @@ void QGstreamerPlayerSession::playlistTypeFindFunction(GstTypeFind *find, gpoint while (length > 0) { const guint8 *data = gst_type_find_peek(find, 0, length); if (data) { - session->m_isPlaylist = (QPlaylistFileParser::findPlaylistType(QString::fromUtf8(uri), 0, data, length) != QPlaylistFileParser::UNKNOWN); + m_isPlaylist = (QPlaylistFileParser::findPlaylistType(uri, 0, data, length) != QPlaylistFileParser::UNKNOWN); return; } length >>= 1; // for HTTP files length is not available, diff --git a/src/plugins/gstreamer/mediaplayer/qgstreamerplayersession.h b/src/plugins/gstreamer/mediaplayer/qgstreamerplayersession.h index e5d5498c7..fdfb416bd 100644 --- a/src/plugins/gstreamer/mediaplayer/qgstreamerplayersession.h +++ b/src/plugins/gstreamer/mediaplayer/qgstreamerplayersession.h @@ -131,6 +131,8 @@ public: void endOfMediaReset(); + void playlistTypeFindFunction(GstTypeFind *find); + public slots: void loadFromUri(const QNetworkRequest &url); void loadFromStream(const QNetworkRequest &url, QIODevice *stream); @@ -192,8 +194,6 @@ private: void flushVideoProbes(); void resumeVideoProbes(); - static void playlistTypeFindFunction(GstTypeFind *find, gpointer userData); - QNetworkRequest m_request; QMediaPlayer::State m_state; QMediaPlayer::State m_pendingState; diff --git a/src/plugins/winrt/qwinrtabstractvideorenderercontrol.cpp b/src/plugins/winrt/qwinrtabstractvideorenderercontrol.cpp index 561d9e03c..b3fd11111 100644 --- a/src/plugins/winrt/qwinrtabstractvideorenderercontrol.cpp +++ b/src/plugins/winrt/qwinrtabstractvideorenderercontrol.cpp @@ -356,6 +356,13 @@ void QWinRTAbstractVideoRendererControl::setActive(bool active) if (!d->surface) return; + // This only happens for quick restart scenarios, for instance + // when switching cameras. + if (d->renderThread.isRunning() && d->renderThread.isInterruptionRequested()) { + CriticalSectionLocker lock(&d->mutex); + d->renderThread.wait(); + } + if (!d->surface->isActive()) d->surface->start(d->format); @@ -363,7 +370,8 @@ void QWinRTAbstractVideoRendererControl::setActive(bool active) return; } - shutdown(); + d->renderThread.requestInterruption(); + if (d->surface && d->surface->isActive()) d->surface->stop(); } diff --git a/src/plugins/winrt/qwinrtmediaplayercontrol.cpp b/src/plugins/winrt/qwinrtmediaplayercontrol.cpp index 5720488f2..a4df6306f 100644 --- a/src/plugins/winrt/qwinrtmediaplayercontrol.cpp +++ b/src/plugins/winrt/qwinrtmediaplayercontrol.cpp @@ -267,7 +267,8 @@ public: } if (d->videoRenderer) - d->videoRenderer->setActive(d->state == QMediaPlayer::PlayingState); + d->videoRenderer->setActive(d->state == QMediaPlayer::PlayingState && + d->videoRenderer->size().isValid()); const QMediaPlayer::MediaStatus oldMediaStatus = d->mediaStatus; const QMediaPlayer::State oldState = d->state; |