diff options
author | Qt Forward Merge Bot <qt_forward_merge_bot@qt-project.org> | 2019-09-11 18:48:35 +0200 |
---|---|---|
committer | Liang Qi <liang.qi@qt.io> | 2019-09-12 08:50:11 +0000 |
commit | 324471ef9054911422f8f2d40a243c67b501c8f0 (patch) | |
tree | b6fccceb55f338a8c53e31afb88a4fce965d305b /src/plugins | |
parent | c9058d90d0b08781f14a494780c3094594c81f22 (diff) | |
parent | a1bf811b1dd287fbb75b6d27dbc163f15001e28f (diff) |
Merge remote-tracking branch 'origin/5.13' into 5.14
Conflicts:
src/gsttools/qgstvideorenderersink.cpp
src/gsttools/qgstvideorenderersink_p.h
Change-Id: I7fe29161d568fa3f7688abfd2f993d1b16ac3fb9
Diffstat (limited to 'src/plugins')
15 files changed, 86 insertions, 52 deletions
diff --git a/src/plugins/common/evr/evrcustompresenter.cpp b/src/plugins/common/evr/evrcustompresenter.cpp index ef2e02220..b2dd0426c 100644 --- a/src/plugins/common/evr/evrcustompresenter.cpp +++ b/src/plugins/common/evr/evrcustompresenter.cpp @@ -559,6 +559,7 @@ EVRCustomPresenter::EVRCustomPresenter(QAbstractVideoSurface *surface) , m_mediaType(0) , m_surface(0) , m_canRenderToSurface(false) + , m_positionOffset(0) { // Initial source rectangle = (0,0,1,1) m_sourceRect.top = 0; @@ -1145,7 +1146,7 @@ HRESULT EVRCustomPresenter::flush() sample->Release(); m_frameStep.samples.clear(); - if (m_renderState == RenderStopped && m_surface->isActive()) { + if (m_renderState == RenderStopped && m_surface && m_surface->isActive()) { // Repaint with black. presentSample(NULL); } @@ -1934,6 +1935,15 @@ void EVRCustomPresenter::presentSample(IMFSample *sample) QVideoFrame frame = m_presentEngine->makeVideoFrame(sample); + // Since start/end times are related to a position when the clock is started, + // to have times from the beginning, need to adjust it by adding seeked position. + if (m_positionOffset) { + if (frame.startTime()) + frame.setStartTime(frame.startTime() + m_positionOffset); + if (frame.endTime()) + frame.setEndTime(frame.endTime() + m_positionOffset); + } + if (!m_surface->isActive() || m_surface->surfaceFormat() != m_presentEngine->videoSurfaceFormat()) { m_surface->stop(); if (!m_surface->start(m_presentEngine->videoSurfaceFormat())) @@ -1943,6 +1953,11 @@ void EVRCustomPresenter::presentSample(IMFSample *sample) m_surface->present(frame); } +void EVRCustomPresenter::positionChanged(qint64 position) +{ + m_positionOffset = position * 1000; +} + HRESULT setDesiredSampleTime(IMFSample *sample, const LONGLONG &sampleTime, const LONGLONG &duration) { if (!sample) diff --git a/src/plugins/common/evr/evrcustompresenter.h b/src/plugins/common/evr/evrcustompresenter.h index 5b7140b58..c1c21580e 100644 --- a/src/plugins/common/evr/evrcustompresenter.h +++ b/src/plugins/common/evr/evrcustompresenter.h @@ -264,6 +264,9 @@ public: bool event(QEvent *) override; +public Q_SLOTS: + void positionChanged(qint64 position); + private: HRESULT checkShutdown() const { @@ -364,6 +367,7 @@ private: QAbstractVideoSurface *m_surface; bool m_canRenderToSurface; + qint64 m_positionOffset; // Seek position in microseconds. }; bool qt_evr_setCustomPresenter(IUnknown *evr, EVRCustomPresenter *presenter); diff --git a/src/plugins/common/evr/evrd3dpresentengine.cpp b/src/plugins/common/evr/evrd3dpresentengine.cpp index 4ce5a99d7..d8e2da6d3 100644 --- a/src/plugins/common/evr/evrd3dpresentengine.cpp +++ b/src/plugins/common/evr/evrd3dpresentengine.cpp @@ -593,6 +593,17 @@ QVideoFrame D3DPresentEngine::makeVideoFrame(IMFSample *sample) m_surfaceFormat.frameSize(), m_surfaceFormat.pixelFormat()); + // WMF uses 100-nanosecond units, Qt uses microseconds + LONGLONG startTime = 0; + auto hr = sample->GetSampleTime(&startTime); + if (SUCCEEDED(hr)) { + frame.setStartTime(startTime * 0.1); + + LONGLONG duration = -1; + if (SUCCEEDED(sample->GetSampleDuration(&duration))) + frame.setEndTime((startTime + duration) * 0.1); + } + return frame; } diff --git a/src/plugins/directshow/common/directshowutils.cpp b/src/plugins/directshow/common/directshowutils.cpp index 21b86926f..1457837ce 100644 --- a/src/plugins/directshow/common/directshowutils.cpp +++ b/src/plugins/directshow/common/directshowutils.cpp @@ -309,4 +309,17 @@ bool DirectShowUtils::connectFilters(IGraphBuilder *graph, return false; } +thread_local static int g_refCount = 0; +void DirectShowUtils::CoInitializeIfNeeded() +{ + if (++g_refCount == 1) + ::CoInitialize(nullptr); +} + +void DirectShowUtils::CoUninitializeIfNeeded() +{ + if (--g_refCount == 0) + ::CoUninitialize(); +} + QT_END_NAMESPACE diff --git a/src/plugins/directshow/common/directshowutils.h b/src/plugins/directshow/common/directshowutils.h index 09c81c257..5f2cfaa23 100644 --- a/src/plugins/directshow/common/directshowutils.h +++ b/src/plugins/directshow/common/directshowutils.h @@ -80,6 +80,10 @@ bool connectFilters(IGraphBuilder *graph, IBaseFilter *downstreamFilter, bool autoConnect = false, HRESULT *hrOut = nullptr); + +void CoInitializeIfNeeded(); +void CoUninitializeIfNeeded(); + } QT_END_NAMESPACE diff --git a/src/plugins/directshow/dsserviceplugin.cpp b/src/plugins/directshow/dsserviceplugin.cpp index e22bfe93b..18a807fd1 100644 --- a/src/plugins/directshow/dsserviceplugin.cpp +++ b/src/plugins/directshow/dsserviceplugin.cpp @@ -54,6 +54,7 @@ #include "directshowplayerservice.h" #include <qmediaserviceproviderplugin.h> +#include "directshowutils.h" extern const CLSID CLSID_VideoInputDeviceCategory; @@ -74,28 +75,15 @@ extern const CLSID CLSID_VideoInputDeviceCategory; QT_BEGIN_NAMESPACE Q_LOGGING_CATEGORY(qtDirectShowPlugin, "qt.multimedia.plugins.directshow") -static int g_refCount = 0; -void addRefCount() -{ - if (++g_refCount == 1) - CoInitialize(nullptr); -} - -void releaseRefCount() -{ - if (--g_refCount == 0) - CoUninitialize(); -} - QMediaService* DSServicePlugin::create(QString const& key) { if (key == QLatin1String(Q_MEDIASERVICE_CAMERA)) { - addRefCount(); + DirectShowUtils::CoInitializeIfNeeded(); return new DSCameraService; } if (key == QLatin1String(Q_MEDIASERVICE_MEDIAPLAYER)) { - addRefCount(); + DirectShowUtils::CoInitializeIfNeeded(); return new DirectShowPlayerService; } @@ -105,7 +93,7 @@ QMediaService* DSServicePlugin::create(QString const& key) void DSServicePlugin::release(QMediaService *service) { delete service; - releaseRefCount(); + DirectShowUtils::CoUninitializeIfNeeded(); } QMediaServiceProviderHint::Features DSServicePlugin::supportedFeatures( @@ -119,9 +107,9 @@ QMediaServiceProviderHint::Features DSServicePlugin::supportedFeatures( QByteArray DSServicePlugin::defaultDevice(const QByteArray &service) const { if (service == Q_MEDIASERVICE_CAMERA) { - addRefCount(); + DirectShowUtils::CoInitializeIfNeeded(); const QList<DSVideoDeviceInfo> &devs = DSVideoDeviceControl::availableDevices(); - releaseRefCount(); + DirectShowUtils::CoUninitializeIfNeeded(); if (!devs.isEmpty()) return devs.first().first; } @@ -133,9 +121,9 @@ QList<QByteArray> DSServicePlugin::devices(const QByteArray &service) const QList<QByteArray> result; if (service == Q_MEDIASERVICE_CAMERA) { - addRefCount(); + DirectShowUtils::CoInitializeIfNeeded(); const QList<DSVideoDeviceInfo> &devs = DSVideoDeviceControl::availableDevices(); - releaseRefCount(); + DirectShowUtils::CoUninitializeIfNeeded(); for (const DSVideoDeviceInfo &info : devs) result.append(info.first); } @@ -146,9 +134,9 @@ QList<QByteArray> DSServicePlugin::devices(const QByteArray &service) const QString DSServicePlugin::deviceDescription(const QByteArray &service, const QByteArray &device) { if (service == Q_MEDIASERVICE_CAMERA) { - addRefCount(); + DirectShowUtils::CoInitializeIfNeeded(); const QList<DSVideoDeviceInfo> &devs = DSVideoDeviceControl::availableDevices(); - releaseRefCount(); + DirectShowUtils::CoUninitializeIfNeeded(); for (const DSVideoDeviceInfo &info : devs) { if (info.first == device) return info.second; diff --git a/src/plugins/directshow/player/directshowplayerservice.cpp b/src/plugins/directshow/player/directshowplayerservice.cpp index cf0b5f84d..42105c471 100644 --- a/src/plugins/directshow/player/directshowplayerservice.cpp +++ b/src/plugins/directshow/player/directshowplayerservice.cpp @@ -303,6 +303,7 @@ void DirectShowPlayerService::load(const QMediaContent &media, QIODevice *stream 0x36b73882, 0xc2c8, 0x11cf, {0x8b, 0x46, 0x00, 0x80, 0x5f, 0x6c, 0xef, 0x60} }; m_graphStatus = Loading; + DirectShowUtils::CoInitializeIfNeeded(); m_graph = com_new<IFilterGraph2>(CLSID_FilterGraph, iid_IFilterGraph2); m_graphBuilder = com_new<ICaptureGraphBuilder2>(CLSID_CaptureGraphBuilder2, IID_ICaptureGraphBuilder2); @@ -640,6 +641,7 @@ void DirectShowPlayerService::releaseGraph() ::SetEvent(m_taskHandle); m_loop->wait(&m_mutex); + DirectShowUtils::CoUninitializeIfNeeded(); } } @@ -1436,6 +1438,9 @@ void DirectShowPlayerService::customEvent(QEvent *event) if (m_playerControl->mediaStatus() == QMediaPlayer::EndOfMedia) m_playerControl->updateStatus(QMediaPlayer::LoadedMedia); m_playerControl->updatePosition(m_position); + // Emits only when seek has been performed. + if (m_videoRendererControl) + emit m_videoRendererControl->positionChanged(m_position); } else { QMediaService::customEvent(event); } diff --git a/src/plugins/directshow/player/directshowvideorenderercontrol.cpp b/src/plugins/directshow/player/directshowvideorenderercontrol.cpp index 19be82141..0b1f0de2f 100644 --- a/src/plugins/directshow/player/directshowvideorenderercontrol.cpp +++ b/src/plugins/directshow/player/directshowvideorenderercontrol.cpp @@ -96,6 +96,7 @@ void DirectShowVideoRendererControl::setSurface(QAbstractVideoSurface *surface) if (!qgetenv("QT_DIRECTSHOW_NO_EVR").toInt()) { m_filter = com_new<IBaseFilter>(clsid_EnhancedVideoRenderer); m_evrPresenter = new EVRCustomPresenter(m_surface); + connect(this, &DirectShowVideoRendererControl::positionChanged, m_evrPresenter, &EVRCustomPresenter::positionChanged); if (!m_evrPresenter->isValid() || !qt_evr_setCustomPresenter(m_filter, m_evrPresenter)) { m_filter->Release(); m_filter = nullptr; diff --git a/src/plugins/directshow/player/directshowvideorenderercontrol.h b/src/plugins/directshow/player/directshowvideorenderercontrol.h index dcbcadb4b..9326a2748 100644 --- a/src/plugins/directshow/player/directshowvideorenderercontrol.h +++ b/src/plugins/directshow/player/directshowvideorenderercontrol.h @@ -68,6 +68,7 @@ public: Q_SIGNALS: void filterChanged(); + void positionChanged(qint64 position); private: DirectShowEventLoop *m_loop; diff --git a/src/plugins/gstreamer/camerabin/camerabinv4limageprocessing.cpp b/src/plugins/gstreamer/camerabin/camerabinv4limageprocessing.cpp index 46b9e4616..5b0c0d234 100644 --- a/src/plugins/gstreamer/camerabin/camerabinv4limageprocessing.cpp +++ b/src/plugins/gstreamer/camerabin/camerabinv4limageprocessing.cpp @@ -146,7 +146,7 @@ QVariant CameraBinV4LImageProcessing::parameter( qt_safe_close(fd); if (!ret) { - qWarning() << "Unable to get the parameter value:" << qt_error_string(errno); + qWarning() << "Unable to get the parameter value:" << parameter << ":" << qt_error_string(errno); return QVariant(); } @@ -229,7 +229,7 @@ void CameraBinV4LImageProcessing::setParameter( } if (::ioctl(fd, VIDIOC_S_CTRL, &control) != 0) - qWarning() << "Unable to set the parameter value:" << qt_error_string(errno); + qWarning() << "Unable to set the parameter value:" << parameter << ":" << qt_error_string(errno); qt_safe_close(fd); } @@ -266,7 +266,8 @@ void CameraBinV4LImageProcessing::updateParametersInfo( queryControl.id = supportedParametersEntries[i].cid; if (::ioctl(fd, VIDIOC_QUERYCTRL, &queryControl) != 0) { - qWarning() << "Unable to query the parameter info:" << qt_error_string(errno); + qWarning() << "Unable to query the parameter info:" << supportedParametersEntries[i].parameter + << ":" << qt_error_string(errno); continue; } diff --git a/src/plugins/gstreamer/mediaplayer/qgstreameravailabilitycontrol.h b/src/plugins/gstreamer/mediaplayer/qgstreameravailabilitycontrol.h index 78299b608..e100fccc8 100644 --- a/src/plugins/gstreamer/mediaplayer/qgstreameravailabilitycontrol.h +++ b/src/plugins/gstreamer/mediaplayer/qgstreameravailabilitycontrol.h @@ -57,7 +57,7 @@ private Q_SLOTS: void handleAvailabilityChanged(); private: - QMediaPlayerResourceSetInterface *m_resources; + QMediaPlayerResourceSetInterface *m_resources = nullptr; }; QT_END_NAMESPACE diff --git a/src/plugins/gstreamer/mediaplayer/qgstreamermetadataprovider.h b/src/plugins/gstreamer/mediaplayer/qgstreamermetadataprovider.h index bf8f7e842..691453a42 100644 --- a/src/plugins/gstreamer/mediaplayer/qgstreamermetadataprovider.h +++ b/src/plugins/gstreamer/mediaplayer/qgstreamermetadataprovider.h @@ -63,7 +63,7 @@ private slots: void updateTags(); private: - QGstreamerPlayerSession *m_session; + QGstreamerPlayerSession *m_session = nullptr; QVariantMap m_tags; }; diff --git a/src/plugins/gstreamer/mediaplayer/qgstreamerplayerservice.cpp b/src/plugins/gstreamer/mediaplayer/qgstreamerplayerservice.cpp index a28968145..4bf4a0a57 100644 --- a/src/plugins/gstreamer/mediaplayer/qgstreamerplayerservice.cpp +++ b/src/plugins/gstreamer/mediaplayer/qgstreamerplayerservice.cpp @@ -67,17 +67,8 @@ QT_BEGIN_NAMESPACE -QGstreamerPlayerService::QGstreamerPlayerService(QObject *parent): - QMediaService(parent) - , m_audioProbeControl(0) - , m_videoProbeControl(0) - , m_videoOutput(0) - , m_videoRenderer(0) - , m_videoWindow(0) -#if defined(HAVE_WIDGETS) - , m_videoWidget(0) -#endif - , m_videoReferenceCount(0) +QGstreamerPlayerService::QGstreamerPlayerService(QObject *parent) + : QMediaService(parent) { m_session = new QGstreamerPlayerSession(this); m_control = new QGstreamerPlayerControl(m_session, this); diff --git a/src/plugins/gstreamer/mediaplayer/qgstreamerplayerservice.h b/src/plugins/gstreamer/mediaplayer/qgstreamerplayerservice.h index ec0c0944b..f88f0ae38 100644 --- a/src/plugins/gstreamer/mediaplayer/qgstreamerplayerservice.h +++ b/src/plugins/gstreamer/mediaplayer/qgstreamerplayerservice.h @@ -73,25 +73,25 @@ public: void releaseControl(QMediaControl *control) override; private: - QGstreamerPlayerControl *m_control; - QGstreamerPlayerSession *m_session; - QGstreamerMetaDataProvider *m_metaData; - QGstreamerStreamsControl *m_streamsControl; - QGStreamerAvailabilityControl *m_availabilityControl; + QGstreamerPlayerControl *m_control = nullptr; + QGstreamerPlayerSession *m_session = nullptr; + QGstreamerMetaDataProvider *m_metaData = nullptr; + QGstreamerStreamsControl *m_streamsControl = nullptr; + QGStreamerAvailabilityControl *m_availabilityControl = nullptr; - QGstreamerAudioProbeControl *m_audioProbeControl; - QGstreamerVideoProbeControl *m_videoProbeControl; + QGstreamerAudioProbeControl *m_audioProbeControl = nullptr; + QGstreamerVideoProbeControl *m_videoProbeControl = nullptr; - QMediaControl *m_videoOutput; - QMediaControl *m_videoRenderer; - QGstreamerVideoWindow *m_videoWindow; + QMediaControl *m_videoOutput = nullptr; + QMediaControl *m_videoRenderer = nullptr; + QGstreamerVideoWindow *m_videoWindow = nullptr; #if defined(HAVE_WIDGETS) - QGstreamerVideoWidgetControl *m_videoWidget; + QGstreamerVideoWidgetControl *m_videoWidget = nullptr; #endif void increaseVideoRef(); void decreaseVideoRef(); - int m_videoReferenceCount; + int m_videoReferenceCount = 0; }; QT_END_NAMESPACE diff --git a/src/plugins/gstreamer/mediaplayer/qgstreamerstreamscontrol.h b/src/plugins/gstreamer/mediaplayer/qgstreamerstreamscontrol.h index 6f332c160..41932095c 100644 --- a/src/plugins/gstreamer/mediaplayer/qgstreamerstreamscontrol.h +++ b/src/plugins/gstreamer/mediaplayer/qgstreamerstreamscontrol.h @@ -62,7 +62,7 @@ public: void setActive(int streamNumber, bool state) override; private: - QGstreamerPlayerSession *m_session; + QGstreamerPlayerSession *m_session = nullptr; }; QT_END_NAMESPACE |