Files
qtmultimedia/tests/auto/unit/qabstractvideosurface/tst_qabstractvideosurface.cpp
Jason McDonald 5e801e2793 Remove "All rights reserved" line from license headers.
As in the past, to avoid rewriting various autotests that contain
line-number information, an extra blank line has been inserted at the
end of the license text to ensure that this commit does not change the
total number of lines in the license header.

Change-Id: I20e5215108c6ebd5f8474fed5c3665118e4791e6
Reviewed-by: Rohan McGovern <rohan.mcgovern@nokia.com>
2012-01-30 07:08:05 +01:00

410 lines
13 KiB
C++

/****************************************************************************
**
** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
** Contact: http://www.qt-project.org/
**
** This file is part of the test suite 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=src/multimedia
#include <QtTest/QtTest>
#include <qabstractvideosurface.h>
#include <qvideosurfaceformat.h>
class tst_QAbstractVideoSurface : public QObject
{
Q_OBJECT
public:
tst_QAbstractVideoSurface();
~tst_QAbstractVideoSurface();
public slots:
void initTestCase();
void cleanupTestCase();
void init();
void cleanup();
private slots:
void setError();
void isFormatSupported_data();
void isFormatSupported();
void nearestFormat_data();
void nearestFormat();
void start_data();
void start();
void nativeResolution();
void supportedFormatsChanged();
};
typedef QMap<QAbstractVideoBuffer::HandleType, QVideoFrame::PixelFormat> SupportedFormatMap;
Q_DECLARE_METATYPE(SupportedFormatMap)
class QtTestVideoSurface : public QAbstractVideoSurface
{
Q_OBJECT
public:
explicit QtTestVideoSurface(QObject *parent = 0) : QAbstractVideoSurface(parent) {}
explicit QtTestVideoSurface(SupportedFormatMap formats, QObject *parent = 0)
: QAbstractVideoSurface(parent), supportedFormats(formats) {}
QList<QVideoFrame::PixelFormat> supportedPixelFormats(
QAbstractVideoBuffer::HandleType handleType = QAbstractVideoBuffer::NoHandle) const
{
return supportedFormats.values(handleType);
}
bool present(const QVideoFrame &) { return false; }
using QAbstractVideoSurface::setError;
/* adding protected setNativeResolution*/
using QAbstractVideoSurface::setNativeResolution;
/* fun to generate supportedFormatsChanged signal */
QList<QVideoFrame::PixelFormat> supportedPixelFormatsChange(QList<QVideoFrame::PixelFormat> formats)
{
supportedFormats.insertMulti(QAbstractVideoBuffer::NoHandle, QVideoFrame::Format_RGB32);
QList<QVideoFrame::PixelFormat> supportedFormats = supportedPixelFormats();
if (supportedFormats.count() != formats.count()) {
emit supportedFormatsChanged();
}
return supportedFormats;
}
private:
SupportedFormatMap supportedFormats;
};
tst_QAbstractVideoSurface::tst_QAbstractVideoSurface()
{
}
tst_QAbstractVideoSurface::~tst_QAbstractVideoSurface()
{
}
void tst_QAbstractVideoSurface::initTestCase()
{
}
void tst_QAbstractVideoSurface::cleanupTestCase()
{
}
void tst_QAbstractVideoSurface::init()
{
}
void tst_QAbstractVideoSurface::cleanup()
{
}
void tst_QAbstractVideoSurface::setError()
{
qRegisterMetaType<QAbstractVideoSurface::Error>();
QtTestVideoSurface surface;
QCOMPARE(surface.error(), QAbstractVideoSurface::NoError);
QTest::ignoreMessage(QtDebugMsg, "NoError");
qDebug() << QAbstractVideoSurface::NoError;
surface.setError(QAbstractVideoSurface::StoppedError);
QCOMPARE(surface.error(), QAbstractVideoSurface::StoppedError);
QTest::ignoreMessage(QtDebugMsg, "StoppedError");
qDebug() << QAbstractVideoSurface::StoppedError;
surface.setError(QAbstractVideoSurface::ResourceError);
QCOMPARE(surface.error(), QAbstractVideoSurface::ResourceError);
QTest::ignoreMessage(QtDebugMsg, "ResourceError");
qDebug() << QAbstractVideoSurface::ResourceError;
surface.setError(QAbstractVideoSurface::NoError);
QCOMPARE(surface.error(), QAbstractVideoSurface::NoError);
QTest::ignoreMessage(QtDebugMsg, "NoError");
qDebug() << QAbstractVideoSurface::NoError;
surface.setError(QAbstractVideoSurface::UnsupportedFormatError);
QCOMPARE(surface.error(), QAbstractVideoSurface::UnsupportedFormatError);
QTest::ignoreMessage(QtDebugMsg, "UnsupportedFormatError");
qDebug() << QAbstractVideoSurface::UnsupportedFormatError;
surface.setError(QAbstractVideoSurface::IncorrectFormatError);
QCOMPARE(surface.error(), QAbstractVideoSurface::IncorrectFormatError);
QTest::ignoreMessage(QtDebugMsg, "IncorrectFormatError");
qDebug() << QAbstractVideoSurface::IncorrectFormatError;
}
void tst_QAbstractVideoSurface::isFormatSupported_data()
{
QTest::addColumn<SupportedFormatMap>("supportedFormats");
QTest::addColumn<QVideoSurfaceFormat>("format");
QTest::addColumn<bool>("supported");
SupportedFormatMap formats;
QTest::newRow("no formats: rgb32")
<< formats
<< QVideoSurfaceFormat(QSize(800, 600), QVideoFrame::Format_RGB32)
<< false;
QTest::newRow("no formats: yv12")
<< formats
<< QVideoSurfaceFormat(QSize(800, 600), QVideoFrame::Format_YV12)
<< false;
QTest::newRow("no formats: rgb32 gl")
<< formats
<< QVideoSurfaceFormat(
QSize(800, 600),
QVideoFrame::Format_RGB32,
QAbstractVideoBuffer::GLTextureHandle)
<< false;
QTest::newRow("no formats: rgb24 gl")
<< formats
<< QVideoSurfaceFormat(
QSize(800, 600),
QVideoFrame::Format_RGB24,
QAbstractVideoBuffer::GLTextureHandle)
<< false;
formats.insertMulti(QAbstractVideoBuffer::NoHandle, QVideoFrame::Format_RGB32);
formats.insertMulti(QAbstractVideoBuffer::NoHandle, QVideoFrame::Format_RGB24);
formats.insertMulti(QAbstractVideoBuffer::NoHandle, QVideoFrame::Format_YUV444);
formats.insertMulti(QAbstractVideoBuffer::GLTextureHandle, QVideoFrame::Format_RGB32);
QTest::newRow("supported: rgb32")
<< formats
<< QVideoSurfaceFormat(QSize(800, 600), QVideoFrame::Format_RGB32)
<< true;
QTest::newRow("supported: rgb24")
<< formats
<< QVideoSurfaceFormat(QSize(800, 600), QVideoFrame::Format_RGB24)
<< true;
QTest::newRow("unsupported: yv12")
<< formats
<< QVideoSurfaceFormat(QSize(800, 600), QVideoFrame::Format_YV12)
<< false;
QTest::newRow("supported: rgb32 gl")
<< formats
<< QVideoSurfaceFormat(
QSize(800, 600),
QVideoFrame::Format_RGB32,
QAbstractVideoBuffer::GLTextureHandle)
<< true;
QTest::newRow("unsupported: rgb24 gl")
<< formats
<< QVideoSurfaceFormat(
QSize(800, 600),
QVideoFrame::Format_RGB24,
QAbstractVideoBuffer::GLTextureHandle)
<< false;
QTest::newRow("unsupported: yv12 gl")
<< formats
<< QVideoSurfaceFormat(
QSize(800, 600),
QVideoFrame::Format_YV12,
QAbstractVideoBuffer::GLTextureHandle)
<< false;
formats.insertMulti(QAbstractVideoBuffer::NoHandle, QVideoFrame::Format_YV12);
formats.insertMulti(QAbstractVideoBuffer::GLTextureHandle, QVideoFrame::Format_RGB24);
QTest::newRow("supported: yv12")
<< formats
<< QVideoSurfaceFormat(QSize(800, 600), QVideoFrame::Format_YV12)
<< true;
QTest::newRow("supported: rgb24 gl")
<< formats
<< QVideoSurfaceFormat(
QSize(800, 600),
QVideoFrame::Format_RGB24,
QAbstractVideoBuffer::GLTextureHandle)
<< true;
}
void tst_QAbstractVideoSurface::isFormatSupported()
{
QFETCH(SupportedFormatMap, supportedFormats);
QFETCH(QVideoSurfaceFormat, format);
QFETCH(bool, supported);
QtTestVideoSurface surface(supportedFormats);
QCOMPARE(surface.isFormatSupported(format), supported);
}
void tst_QAbstractVideoSurface::nearestFormat_data()
{
isFormatSupported_data();
}
void tst_QAbstractVideoSurface::nearestFormat()
{
QFETCH(SupportedFormatMap, supportedFormats);
QFETCH(QVideoSurfaceFormat, format);
QFETCH(bool, supported);
QtTestVideoSurface surface(supportedFormats);
QCOMPARE(surface.nearestFormat(format) == format, supported);
}
void tst_QAbstractVideoSurface::start_data()
{
QTest::addColumn<QVideoSurfaceFormat>("format");
QTest::newRow("rgb32") << QVideoSurfaceFormat(
QSize(800, 600),
QVideoFrame::Format_RGB32);
QTest::newRow("yv12") << QVideoSurfaceFormat(
QSize(800, 600),
QVideoFrame::Format_YV12);
QTest::newRow("rgb32 gl") << QVideoSurfaceFormat(
QSize(800, 600),
QVideoFrame::Format_RGB32,
QAbstractVideoBuffer::GLTextureHandle);
}
void tst_QAbstractVideoSurface::start()
{
QFETCH(QVideoSurfaceFormat, format);
QtTestVideoSurface surface;
surface.setError(QAbstractVideoSurface::ResourceError);
QSignalSpy formatSpy(&surface, SIGNAL(surfaceFormatChanged(QVideoSurfaceFormat)));
QSignalSpy activeSpy(&surface, SIGNAL(activeChanged(bool)));
QVERIFY(!surface.isActive());
QCOMPARE(surface.surfaceFormat(), QVideoSurfaceFormat());
QVERIFY(surface.start(format));
QVERIFY(surface.isActive());
QCOMPARE(surface.surfaceFormat(), format);
QCOMPARE(formatSpy.count(), 1);
QCOMPARE(qvariant_cast<QVideoSurfaceFormat>(formatSpy.last().at(0)), format);
QCOMPARE(activeSpy.count(), 1);
QCOMPARE(activeSpy.last().at(0).toBool(), true);
// Starting twice won't change active
// XXX should this also not emit surfaceFormatChanged?
QVERIFY(surface.start(format));
QCOMPARE(activeSpy.count(), 1);
QVERIFY(surface.isActive());
// error() is reset on a successful start.
QCOMPARE(surface.error(), QAbstractVideoSurface::NoError);
surface.stop();
QVERIFY(!surface.isActive());
QCOMPARE(surface.surfaceFormat(), QVideoSurfaceFormat());
QCOMPARE(formatSpy.count(), 3);
QCOMPARE(qvariant_cast<QVideoSurfaceFormat>(formatSpy.last().at(0)), QVideoSurfaceFormat());
QCOMPARE(activeSpy.count(), 2);
QCOMPARE(activeSpy.last().at(0).toBool(), false);
// Stopping a stopped surface shouldn't hurt
surface.stop();
QVERIFY(!surface.isActive());
QCOMPARE(surface.surfaceFormat(), QVideoSurfaceFormat());
QCOMPARE(formatSpy.count(), 3);
QCOMPARE(qvariant_cast<QVideoSurfaceFormat>(formatSpy.last().at(0)), QVideoSurfaceFormat());
QCOMPARE(activeSpy.count(), 2);
QCOMPARE(activeSpy.last().at(0).toBool(), false);
}
// Test nativeResolution property
void tst_QAbstractVideoSurface::nativeResolution()
{
QtTestVideoSurface surface;
QSignalSpy spy(&surface, SIGNAL(nativeResolutionChanged(QSize)));
QSize size1 = surface.nativeResolution();
QVERIFY(size1.width() == -1);
QVERIFY(size1.height() == -1);
QVERIFY(spy.count() == 0);
QSize res(100,150);
surface.setNativeResolution(res);
QVERIFY(spy.count() == 1);
QSize size2 = qvariant_cast<QSize>(spy.at(0).at(0));
QVERIFY(size2.width() == 100);
QVERIFY(size2.height() == 150);
// Setting again should not emit
surface.setNativeResolution(res);
QVERIFY(spy.count() == 1);
size2 = qvariant_cast<QSize>(spy.at(0).at(0));
QVERIFY(size2.width() == 100);
QVERIFY(size2.height() == 150);
spy.clear();
}
// QAbstractVideoSurface's supported Formats Changed Signal
void tst_QAbstractVideoSurface::supportedFormatsChanged()
{
SupportedFormatMap formatMap;
formatMap.insertMulti(QAbstractVideoBuffer::NoHandle, QVideoFrame::Format_RGB24);
QtTestVideoSurface surface(formatMap);
QSignalSpy spy(&surface, SIGNAL(supportedFormatsChanged()));
QList<QVideoFrame::PixelFormat> formats = surface.supportedPixelFormats();
QVERIFY(formats.count() == 1);
QVERIFY(spy.count() == 0);
// user defined implementation for generation of supportedFormatsChanged signal
QList<QVideoFrame::PixelFormat> newFormats = surface.supportedPixelFormatsChange(formats);
QVERIFY(newFormats.count() == (formats.count() + 1));
QVERIFY(spy.count() == 1);
spy.clear();
}
QTEST_MAIN(tst_QAbstractVideoSurface)
#include "tst_qabstractvideosurface.moc"