DirectShow: Don't create the widget and renderer controls until requested.

Task-number: QTBUG-32282
Change-Id: If37ed4c35bcc2cc879f50d3b2ea3720b90603e9a
Reviewed-by: Yoann Lopes <yoann.lopes@digia.com>
This commit is contained in:
Yoann Lopes
2013-07-19 12:29:12 +02:00
committed by The Qt Project
parent d599f7319a
commit d8e56bc4b8
2 changed files with 31 additions and 15 deletions

View File

@@ -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

View File

@@ -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;
};