summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFrederik Gladhorn <frederik.gladhorn@digia.com>2013-07-23 11:14:35 +0200
committerFrederik Gladhorn <frederik.gladhorn@digia.com>2013-07-23 11:14:36 +0200
commitc1520e8aeb0ff56cd5f00ed454babab2d5c8234a (patch)
treed032ed62cb1d7648fcd83c21cf02322ad79e89c7
parent680c9cab916491cdc4310df5f87c946a50f606b4 (diff)
parentc74b544610376c753ea0a29ff2465e2bcfe70e1d (diff)
Merge remote-tracking branch 'origin/stable' into dev
-rw-r--r--src/plugins/directshow/camera/dscameraservice.cpp40
-rw-r--r--src/plugins/directshow/camera/dscameraservice.h6
-rw-r--r--src/plugins/directshow/camera/dscamerasession.cpp2
-rw-r--r--src/plugins/wmf/player/mfplayersession.cpp16
4 files changed, 45 insertions, 19 deletions
diff --git a/src/plugins/directshow/camera/dscameraservice.cpp b/src/plugins/directshow/camera/dscameraservice.cpp
index 2c6ea0e94..9d99c6dd6 100644
--- a/src/plugins/directshow/camera/dscameraservice.cpp
+++ b/src/plugins/directshow/camera/dscameraservice.cpp
@@ -62,6 +62,10 @@ QT_BEGIN_NAMESPACE
DSCameraService::DSCameraService(QObject *parent):
QMediaService(parent)
+#if defined(HAVE_WIDGETS)
+ , m_viewFinderWidget(0)
+ #endif
+ , m_videoRenderer(0)
{
m_session = new DSCameraSession(this);
@@ -69,14 +73,8 @@ DSCameraService::DSCameraService(QObject *parent):
m_videoDevice = new DSVideoDeviceControl(m_session);
- m_videoRenderer = new DSVideoRendererControl(m_session, this);
-
m_imageCapture = new DSImageCaptureControl(m_session);
-#if defined(HAVE_WIDGETS)
- m_viewFinderWidget = new DSVideoWidgetControl(m_session);
-#endif
-
m_device = QByteArray("default");
}
@@ -102,14 +100,23 @@ QMediaControl* DSCameraService::requestControl(const char *name)
#if defined(HAVE_WIDGETS)
if (qstrcmp(name, QVideoWidgetControl_iid) == 0) {
- if (m_viewFinderWidget) {
+ if (!m_viewFinderWidget && !m_videoRenderer) {
+ m_viewFinderWidget = new DSVideoWidgetControl(m_session);
return m_viewFinderWidget;
}
}
#endif
- if(qstrcmp(name,QVideoRendererControl_iid) == 0)
- return m_videoRenderer;
+ if (qstrcmp(name,QVideoRendererControl_iid) == 0) {
+#if defined(HAVE_WIDGETS)
+ if (!m_videoRenderer && !m_viewFinderWidget) {
+#else
+ if (!m_videoRenderer) {
+#endif
+ m_videoRenderer = new DSVideoRendererControl(m_session, this);
+ return m_videoRenderer;
+ }
+ }
if (qstrcmp(name,QVideoDeviceSelectorControl_iid) == 0)
return m_videoDevice;
@@ -119,8 +126,19 @@ QMediaControl* DSCameraService::requestControl(const char *name)
void DSCameraService::releaseControl(QMediaControl *control)
{
- Q_UNUSED(control)
- // Implemented as a singleton, so we do nothing.
+ if (control == m_videoRenderer) {
+ delete m_videoRenderer;
+ m_videoRenderer = 0;
+ return;
+ }
+
+#if defined(HAVE_WIDGETS)
+ if (control == m_viewFinderWidget) {
+ delete m_viewFinderWidget;
+ m_viewFinderWidget = 0;
+ return;
+ }
+#endif
}
QT_END_NAMESPACE
diff --git a/src/plugins/directshow/camera/dscameraservice.h b/src/plugins/directshow/camera/dscameraservice.h
index e39ea0adc..fb8b7886a 100644
--- a/src/plugins/directshow/camera/dscameraservice.h
+++ b/src/plugins/directshow/camera/dscameraservice.h
@@ -52,9 +52,7 @@ class DSCameraControl;
class DSCameraSession;
class DSVideoOutputControl;
class DSVideoDeviceControl;
-class DSVideoRendererControl;
class DSImageCaptureControl;
-class DSVideoWidgetControl;
class DSCameraService : public QMediaService
@@ -73,10 +71,10 @@ private:
DSCameraSession *m_session;
DSVideoOutputControl *m_videoOutput;
#if defined(HAVE_WIDGETS)
- DSVideoWidgetControl *m_viewFinderWidget;
+ QMediaControl *m_viewFinderWidget;
#endif
DSVideoDeviceControl *m_videoDevice;
- DSVideoRendererControl *m_videoRenderer;
+ QMediaControl *m_videoRenderer;
DSImageCaptureControl *m_imageCapture;
QByteArray m_device;
};
diff --git a/src/plugins/directshow/camera/dscamerasession.cpp b/src/plugins/directshow/camera/dscamerasession.cpp
index 353078f43..cc1594feb 100644
--- a/src/plugins/directshow/camera/dscamerasession.cpp
+++ b/src/plugins/directshow/camera/dscamerasession.cpp
@@ -595,7 +595,7 @@ void DSCameraSession::captureFrame()
mutex.lock();
image = QImage(frames.at(0)->buffer,m_windowSize.width(),m_windowSize.height(),
- QImage::Format_RGB32).rgbSwapped().mirrored(true);
+ QImage::Format_RGB32).mirrored(true);
QVideoFrame frame(image);
frame.setStartTime(frames.at(0)->time);
diff --git a/src/plugins/wmf/player/mfplayersession.cpp b/src/plugins/wmf/player/mfplayersession.cpp
index c52498f63..fb150c3e9 100644
--- a/src/plugins/wmf/player/mfplayersession.cpp
+++ b/src/plugins/wmf/player/mfplayersession.cpp
@@ -1326,8 +1326,6 @@ void MFPlayerSession::start()
switch (m_status) {
case QMediaPlayer::EndOfMedia:
m_varStart.hVal.QuadPart = 0;
- //since it must be loaded already, just fallthrough
- case QMediaPlayer::LoadedMedia:
changeStatus(QMediaPlayer::BufferedMedia);
return;
}
@@ -1911,10 +1909,12 @@ void MFPlayerSession::handleSessionEvent(IMFMediaEvent *sessionEvent)
switch (meType) {
case MEBufferingStarted:
- changeStatus(QMediaPlayer::StalledMedia);
+ changeStatus(m_status == QMediaPlayer::LoadedMedia ? QMediaPlayer::BufferingMedia : QMediaPlayer::StalledMedia);
emit bufferStatusChanged(bufferStatus());
break;
case MEBufferingStopped:
+ if (m_status == QMediaPlayer::BufferingMedia)
+ stop(true);
changeStatus(QMediaPlayer::BufferedMedia);
emit bufferStatusChanged(bufferStatus());
break;
@@ -1979,6 +1979,16 @@ void MFPlayerSession::handleSessionEvent(IMFMediaEvent *sessionEvent)
}
}
MFGetService(m_session, MFNETSOURCE_STATISTICS_SERVICE, IID_PPV_ARGS(&m_netsourceStatistics));
+
+ if (!m_netsourceStatistics || bufferStatus() == 100) {
+ // If the source reader doesn't implement the statistics service, just set the status
+ // to buffered, since there is no way to query the buffering progress...
+ changeStatus(QMediaPlayer::BufferedMedia);
+ } else {
+ // Start to trigger buffering. Once enough buffering is done, the session will
+ // be automatically stopped unless the user has explicitly started playback.
+ start();
+ }
}
}
}