summaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
authorThomas McGuire <thomas.mcguire@kdab.com>2012-04-05 15:53:44 +0200
committerQt by Nokia <qt-info@nokia.com>2012-05-03 10:34:10 +0200
commit025f4d2ee1cdc4a68e880854584f9bef0980b630 (patch)
tree239ad793d3a2d0e7116e97a948bbc21ec96e8e13 /tests
parent926049cb153b50afebad78d8da17ce964b4e0934 (diff)
Support QVideoWindowControl in the QtQuick Video element.
Change-Id: I953899a3ec92856955d36528057b0d45f9c26394 Reviewed-by: Sean Harmer <sean.harmer@kdab.com> Reviewed-by: Dmytro Poplavskiy <dmytro.poplavskiy@nokia.com>
Diffstat (limited to 'tests')
-rw-r--r--tests/auto/integration/multimedia.pro1
-rw-r--r--tests/auto/integration/qdeclarativevideooutput/tst_qdeclarativevideooutput.cpp1
-rw-r--r--tests/auto/integration/qdeclarativevideooutput_window/qdeclarativevideooutput_window.pro13
-rw-r--r--tests/auto/integration/qdeclarativevideooutput_window/tst_qdeclarativevideooutput_window.cpp298
4 files changed, 313 insertions, 0 deletions
diff --git a/tests/auto/integration/multimedia.pro b/tests/auto/integration/multimedia.pro
index d3f885a3b..d5708532c 100644
--- a/tests/auto/integration/multimedia.pro
+++ b/tests/auto/integration/multimedia.pro
@@ -6,6 +6,7 @@ SUBDIRS += \
qaudioinput \
qaudiooutput \
qdeclarativevideooutput \
+ qdeclarativevideooutput_window \
qmediaplayerbackend \
qcamerabackend \
qsoundeffect \
diff --git a/tests/auto/integration/qdeclarativevideooutput/tst_qdeclarativevideooutput.cpp b/tests/auto/integration/qdeclarativevideooutput/tst_qdeclarativevideooutput.cpp
index 6fb110fc4..e3de6ff03 100644
--- a/tests/auto/integration/qdeclarativevideooutput/tst_qdeclarativevideooutput.cpp
+++ b/tests/auto/integration/qdeclarativevideooutput/tst_qdeclarativevideooutput.cpp
@@ -50,6 +50,7 @@
#include <qabstractvideosurface.h>
#include <qvideorenderercontrol.h>
+#include <qvideosurfaceformat.h>
#include <qmediaobject.h>
diff --git a/tests/auto/integration/qdeclarativevideooutput_window/qdeclarativevideooutput_window.pro b/tests/auto/integration/qdeclarativevideooutput_window/qdeclarativevideooutput_window.pro
new file mode 100644
index 000000000..0cec3205c
--- /dev/null
+++ b/tests/auto/integration/qdeclarativevideooutput_window/qdeclarativevideooutput_window.pro
@@ -0,0 +1,13 @@
+TARGET = tst_qdeclarativevideooutput_window
+
+QT += multimedia-private qml testlib quick
+CONFIG += no_private_qt_headers_warning
+CONFIG += testcase
+
+OTHER_FILES += \
+ ../../../../src/imports/multimedia/qdeclarativevideooutput_p.h
+
+SOURCES += \
+ tst_qdeclarativevideooutput_window.cpp
+
+INCLUDEPATH += ../../../../src/imports/multimedia
diff --git a/tests/auto/integration/qdeclarativevideooutput_window/tst_qdeclarativevideooutput_window.cpp b/tests/auto/integration/qdeclarativevideooutput_window/tst_qdeclarativevideooutput_window.cpp
new file mode 100644
index 000000000..046b12d97
--- /dev/null
+++ b/tests/auto/integration/qdeclarativevideooutput_window/tst_qdeclarativevideooutput_window.cpp
@@ -0,0 +1,298 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Copyright (C) 2012 Research In Motion
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** This file may be used under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation and
+** appearing in the file LICENSE.LGPL included in the packaging of this
+** file. Please review the following information to ensure the GNU Lesser
+** General Public License version 2.1 requirements will be met:
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU General
+** Public License version 3.0 as published by the Free Software Foundation
+** and appearing in the file LICENSE.GPL included in the packaging of this
+** file. Please review the following information to ensure the GNU General
+** Public License version 3.0 requirements will be met:
+** http://www.gnu.org/copyleft/gpl.html.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+//TESTED_COMPONENT=plugins/declarative/multimedia
+
+#include "qdeclarativevideooutput_p.h"
+#include <QtCore/qobject.h>
+#include <QtTest/qtest.h>
+#include <QtQml/qqmlengine.h>
+#include <QtQml/qqmlcomponent.h>
+#include <QtQuick/qquickitem.h>
+#include <QtQuick/qquickview.h>
+#include <QtMultimedia/qmediaobject.h>
+#include <QtMultimedia/qmediaservice.h>
+#include <QtMultimedia/qvideowindowcontrol.h>
+
+Q_DECLARE_METATYPE(QDeclarativeVideoOutput::FillMode)
+
+class SourceObject : public QObject
+{
+ Q_OBJECT
+ Q_PROPERTY(QObject *mediaObject READ mediaObject CONSTANT)
+public:
+ explicit SourceObject(QMediaObject *mediaObject, QObject *parent = 0)
+ : QObject(parent), m_mediaObject(mediaObject)
+ {}
+
+ QObject *mediaObject() const
+ { return m_mediaObject; }
+
+private:
+ QMediaObject *m_mediaObject;
+};
+
+class QtTestWindowControl : public QVideoWindowControl
+{
+public:
+ QtTestWindowControl()
+ : m_winId(0)
+ , m_repaintCount(0)
+ , m_brightness(0)
+ , m_contrast(0)
+ , m_hue(0)
+ , m_saturation(0)
+ , m_aspectRatioMode(Qt::KeepAspectRatio)
+ , m_fullScreen(0)
+ {
+ }
+
+ WId winId() const { return m_winId; }
+ void setWinId(WId id) { m_winId = id; }
+
+ QRect displayRect() const { return m_displayRect; }
+ void setDisplayRect(const QRect &rect) { m_displayRect = rect; }
+
+ bool isFullScreen() const { return m_fullScreen; }
+ void setFullScreen(bool fullScreen) { emit fullScreenChanged(m_fullScreen = fullScreen); }
+
+ int repaintCount() const { return m_repaintCount; }
+ void setRepaintCount(int count) { m_repaintCount = count; }
+ void repaint() { ++m_repaintCount; }
+
+ QSize nativeSize() const { return m_nativeSize; }
+ void setNativeSize(const QSize &size) { m_nativeSize = size; emit nativeSizeChanged(); }
+
+ Qt::AspectRatioMode aspectRatioMode() const { return m_aspectRatioMode; }
+ void setAspectRatioMode(Qt::AspectRatioMode mode) { m_aspectRatioMode = mode; }
+
+ int brightness() const { return m_brightness; }
+ void setBrightness(int brightness) { emit brightnessChanged(m_brightness = brightness); }
+
+ int contrast() const { return m_contrast; }
+ void setContrast(int contrast) { emit contrastChanged(m_contrast = contrast); }
+
+ int hue() const { return m_hue; }
+ void setHue(int hue) { emit hueChanged(m_hue = hue); }
+
+ int saturation() const { return m_saturation; }
+ void setSaturation(int saturation) { emit saturationChanged(m_saturation = saturation); }
+
+private:
+ WId m_winId;
+ int m_repaintCount;
+ int m_brightness;
+ int m_contrast;
+ int m_hue;
+ int m_saturation;
+ Qt::AspectRatioMode m_aspectRatioMode;
+ QRect m_displayRect;
+ QSize m_nativeSize;
+ bool m_fullScreen;
+};
+
+class QtTestVideoService : public QMediaService
+{
+ Q_OBJECT
+public:
+ QtTestVideoService(QtTestWindowControl *window)
+ : QMediaService(0)
+ , windowControl(window)
+ {}
+
+ QMediaControl *requestControl(const char *name)
+ {
+ if (qstrcmp(name, QVideoWindowControl_iid) == 0)
+ return windowControl;
+ return 0;
+ }
+
+ void releaseControl(QMediaControl *control)
+ {
+ Q_ASSERT(control);
+ }
+
+ QtTestWindowControl *windowControl;
+};
+
+class QtTestVideoObject : public QMediaObject
+{
+ Q_OBJECT
+public:
+ explicit QtTestVideoObject(QtTestVideoService *service):
+ QMediaObject(0, service)
+ {
+ }
+};
+
+class tst_QDeclarativeVideoOutputWindow : public QObject
+{
+ Q_OBJECT
+public:
+ tst_QDeclarativeVideoOutputWindow()
+ : QObject(0)
+ , m_service(new QtTestVideoService(&m_windowControl))
+ , m_videoObject(m_service)
+ , m_sourceObject(&m_videoObject)
+ {
+ }
+
+ ~tst_QDeclarativeVideoOutputWindow()
+ {
+ }
+
+public slots:
+ void initTestCase();
+ void cleanupTestCase();
+
+private slots:
+ void winId();
+ void nativeSize();
+ void aspectRatio();
+ void geometryChange();
+ void resetCanvas();
+
+private:
+ QQmlEngine m_engine;
+ QQuickItem *m_videoItem;
+ QScopedPointer<QQuickItem> m_rootItem;
+ QtTestWindowControl m_windowControl;
+ QtTestVideoService *m_service;
+ QtTestVideoObject m_videoObject;
+ SourceObject m_sourceObject;
+ QQuickView m_view;
+};
+
+void tst_QDeclarativeVideoOutputWindow::initTestCase()
+{
+ qRegisterMetaType<QDeclarativeVideoOutput::FillMode>();
+
+ const QByteArray qmlSource =
+ "import QtQuick 2.0\n"
+ "import QtMultimedia 5.0\n\n"
+ "Item {"
+ " width: 200;"
+ " height: 200;"
+ " VideoOutput {"
+ " objectName: \"videoOutput\";"
+ " x: 25; y: 50;"
+ " width: 150;"
+ " height: 100;"
+ " }"
+ "}";
+
+ QQmlComponent component(&m_engine);
+ component.setData(qmlSource, QUrl());
+
+ m_rootItem.reset(qobject_cast<QQuickItem *>(component.create()));
+ m_videoItem = m_rootItem->findChild<QQuickItem *>("videoOutput");
+ QVERIFY(m_videoItem);
+ m_rootItem->setParentItem(m_view.rootItem());
+ m_videoItem->setProperty("source", QVariant::fromValue<QObject *>(&m_sourceObject));
+
+ m_windowControl.setNativeSize(QSize(400, 200));
+ m_view.resize(200, 200);
+ m_view.show();
+}
+
+void tst_QDeclarativeVideoOutputWindow::cleanupTestCase()
+{
+ // Make sure that QDeclarativeVideoOutput doesn't segfault when it is being destroyed after
+ // the service is already gone
+ delete m_service;
+ m_service = 0;
+ m_view.setSource(QUrl());
+ m_rootItem.reset();
+}
+
+void tst_QDeclarativeVideoOutputWindow::winId()
+{
+ QCOMPARE(m_windowControl.winId(), m_view.winId());
+}
+
+void tst_QDeclarativeVideoOutputWindow::nativeSize()
+{
+ QCOMPARE(m_videoItem->implicitWidth(), qreal(400.0f));
+ QCOMPARE(m_videoItem->implicitHeight(), qreal(200.0f));
+}
+
+void tst_QDeclarativeVideoOutputWindow::aspectRatio()
+{
+ const QRect expectedDisplayRect(25, 50, 150, 100);
+ int oldRepaintCount = m_windowControl.repaintCount();
+ m_videoItem->setProperty("fillMode", QDeclarativeVideoOutput::Stretch);
+ QTRY_COMPARE(m_windowControl.aspectRatioMode(), Qt::IgnoreAspectRatio);
+ QCOMPARE(m_windowControl.displayRect(), expectedDisplayRect);
+ QVERIFY(m_windowControl.repaintCount() > oldRepaintCount);
+
+ oldRepaintCount = m_windowControl.repaintCount();
+ m_videoItem->setProperty("fillMode", QDeclarativeVideoOutput::PreserveAspectFit);
+ QTRY_COMPARE(m_windowControl.aspectRatioMode(), Qt::KeepAspectRatio);
+ QCOMPARE(m_windowControl.displayRect(), expectedDisplayRect);
+ QVERIFY(m_windowControl.repaintCount() > oldRepaintCount);
+
+ oldRepaintCount = m_windowControl.repaintCount();
+ m_videoItem->setProperty("fillMode", QDeclarativeVideoOutput::PreserveAspectCrop);
+ QTRY_COMPARE(m_windowControl.aspectRatioMode(), Qt::KeepAspectRatioByExpanding);
+ QCOMPARE(m_windowControl.displayRect(), expectedDisplayRect);
+ QVERIFY(m_windowControl.repaintCount() > oldRepaintCount);
+}
+
+void tst_QDeclarativeVideoOutputWindow::geometryChange()
+{
+ m_videoItem->setWidth(50);
+ QTRY_COMPARE(m_windowControl.displayRect(), QRect(25, 50, 50, 100));
+
+ m_videoItem->setX(30);
+ QTRY_COMPARE(m_windowControl.displayRect(), QRect(30, 50, 50, 100));
+}
+
+void tst_QDeclarativeVideoOutputWindow::resetCanvas()
+{
+ m_rootItem->setParentItem(0);
+ QCOMPARE((int)m_windowControl.winId(), 0);
+}
+
+
+QTEST_MAIN(tst_QDeclarativeVideoOutputWindow)
+
+#include "tst_qdeclarativevideooutput_window.moc"