summaryrefslogtreecommitdiffstats
path: root/src/plugins
diff options
context:
space:
mode:
authorQt Forward Merge Bot <qt_forward_merge_bot@qt-project.org>2019-09-11 18:48:35 +0200
committerLiang Qi <liang.qi@qt.io>2019-09-12 08:50:11 +0000
commit324471ef9054911422f8f2d40a243c67b501c8f0 (patch)
treeb6fccceb55f338a8c53e31afb88a4fce965d305b /src/plugins
parentc9058d90d0b08781f14a494780c3094594c81f22 (diff)
parenta1bf811b1dd287fbb75b6d27dbc163f15001e28f (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')
-rw-r--r--src/plugins/common/evr/evrcustompresenter.cpp17
-rw-r--r--src/plugins/common/evr/evrcustompresenter.h4
-rw-r--r--src/plugins/common/evr/evrd3dpresentengine.cpp11
-rw-r--r--src/plugins/directshow/common/directshowutils.cpp13
-rw-r--r--src/plugins/directshow/common/directshowutils.h4
-rw-r--r--src/plugins/directshow/dsserviceplugin.cpp32
-rw-r--r--src/plugins/directshow/player/directshowplayerservice.cpp5
-rw-r--r--src/plugins/directshow/player/directshowvideorenderercontrol.cpp1
-rw-r--r--src/plugins/directshow/player/directshowvideorenderercontrol.h1
-rw-r--r--src/plugins/gstreamer/camerabin/camerabinv4limageprocessing.cpp7
-rw-r--r--src/plugins/gstreamer/mediaplayer/qgstreameravailabilitycontrol.h2
-rw-r--r--src/plugins/gstreamer/mediaplayer/qgstreamermetadataprovider.h2
-rw-r--r--src/plugins/gstreamer/mediaplayer/qgstreamerplayerservice.cpp13
-rw-r--r--src/plugins/gstreamer/mediaplayer/qgstreamerplayerservice.h24
-rw-r--r--src/plugins/gstreamer/mediaplayer/qgstreamerstreamscontrol.h2
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