/**************************************************************************** ** ** Copyright (C) 2016 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:GPL-EXCEPT$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and The Qt Company. For licensing terms ** and conditions see https://www.qt.io/terms-conditions. For further ** information use the contact form at https://www.qt.io/contact-us. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3 as published by the Free Software ** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT ** included in the packaging of this file. Please review the following ** information to ensure the GNU General Public License requirements will ** be met: https://www.gnu.org/licenses/gpl-3.0.html. ** ** $QT_END_LICENSE$ ** ****************************************************************************/ //TESTED_COMPONENT=src/multimedia #include #include #include #include #include #include #include #include #include #include #include #include QT_USE_NAMESPACE class MockMediaServiceProvider : public QMediaServiceProvider { QMediaService* requestService(const QByteArray &type, const QMediaServiceProviderHint &) { Q_UNUSED(type); return 0; } void releaseService(QMediaService *service) { Q_UNUSED(service); } }; class tst_QMediaServiceProvider : public QObject { Q_OBJECT public slots: void initTestCase(); private slots: void testDefaultProviderAvailable(); void testObtainService(); void testHasSupport(); void testSupportedMimeTypes(); void testProviderHints(); void testDefaultDevice(); void testAvailableDevices(); void testCameraInfo(); private: QObjectList plugins; }; void tst_QMediaServiceProvider::initTestCase() { // QMediaPluginLoader::setStaticPlugins(QLatin1String("mediaservice"), plugins); #if QT_CONFIG(library) QCoreApplication::setLibraryPaths(QStringList() << QCoreApplication::applicationDirPath()); #endif } void tst_QMediaServiceProvider::testDefaultProviderAvailable() { // Must always be a default provider available QVERIFY(QMediaServiceProvider::defaultServiceProvider() != 0); } void tst_QMediaServiceProvider::testObtainService() { QMediaServiceProvider *provider = QMediaServiceProvider::defaultServiceProvider(); if (provider == 0) QSKIP("No default provider"); QMediaService *service = 0; // Player service = provider->requestService(Q_MEDIASERVICE_MEDIAPLAYER); QVERIFY(service != 0); provider->releaseService(service); } void tst_QMediaServiceProvider::testHasSupport() { MockMediaServiceProvider mockProvider; QCOMPARE(mockProvider.hasSupport(QByteArray(Q_MEDIASERVICE_MEDIAPLAYER), "video/ogv", QStringList()), QMultimedia::MaybeSupported); QMediaServiceProvider *provider = QMediaServiceProvider::defaultServiceProvider(); if (provider == 0) QSKIP("No default provider"); QCOMPARE(provider->hasSupport(QByteArray(Q_MEDIASERVICE_MEDIAPLAYER), "video/ogv", QStringList()), QMultimedia::MaybeSupported); QCOMPARE(provider->hasSupport(QByteArray(Q_MEDIASERVICE_MEDIAPLAYER), "audio/ogg", QStringList()), QMultimedia::ProbablySupported); //while the service returns PreferredService, provider should return ProbablySupported QCOMPARE(provider->hasSupport(QByteArray(Q_MEDIASERVICE_MEDIAPLAYER), "audio/wav", QStringList()), QMultimedia::ProbablySupported); //even while all the plugins with "hasSupport" returned NotSupported, //MockServicePlugin3 has no "hasSupport" interface, so MaybeSupported QCOMPARE(provider->hasSupport(QByteArray(Q_MEDIASERVICE_MEDIAPLAYER), "video/avi", QStringList() << "mpeg4"), QMultimedia::MaybeSupported); QCOMPARE(provider->hasSupport(QByteArray("non existing service"), "video/ogv", QStringList()), QMultimedia::NotSupported); QCOMPARE(QMediaPlayer::hasSupport("video/ogv"), QMultimedia::MaybeSupported); QCOMPARE(QMediaPlayer::hasSupport("audio/ogg"), QMultimedia::ProbablySupported); QCOMPARE(QMediaPlayer::hasSupport("audio/wav"), QMultimedia::ProbablySupported); //test low latency flag support QCOMPARE(QMediaPlayer::hasSupport("audio/wav", QStringList(), QMediaPlayer::LowLatency), QMultimedia::ProbablySupported); //plugin1 probably supports audio/ogg, it checked because it doesn't provide features iface QCOMPARE(QMediaPlayer::hasSupport("audio/ogg", QStringList(), QMediaPlayer::LowLatency), QMultimedia::ProbablySupported); //Plugin4 is not checked here, sine it's known not support low latency QCOMPARE(QMediaPlayer::hasSupport("video/quicktime", QStringList(), QMediaPlayer::LowLatency), QMultimedia::MaybeSupported); //test streaming flag support QCOMPARE(QMediaPlayer::hasSupport("video/quicktime", QStringList(), QMediaPlayer::StreamPlayback), QMultimedia::ProbablySupported); //Plugin2 is not checked here, sine it's known not support streaming QCOMPARE(QMediaPlayer::hasSupport("audio/wav", QStringList(), QMediaPlayer::StreamPlayback), QMultimedia::MaybeSupported); //ensure the correct media player plugin is chosen for mime type QMediaPlayer simplePlayer(0, QMediaPlayer::LowLatency); QCOMPARE(simplePlayer.service()->objectName(), QLatin1String("MockServicePlugin2")); QMediaPlayer mediaPlayer; QVERIFY(mediaPlayer.service()->objectName() != QLatin1String("MockServicePlugin2")); QMediaPlayer streamPlayer(0, QMediaPlayer::StreamPlayback); QCOMPARE(streamPlayer.service()->objectName(), QLatin1String("MockServicePlugin4")); } void tst_QMediaServiceProvider::testSupportedMimeTypes() { QMediaServiceProvider *provider = QMediaServiceProvider::defaultServiceProvider(); if (provider == 0) QSKIP("No default provider"); QVERIFY(provider->supportedMimeTypes(QByteArray(Q_MEDIASERVICE_MEDIAPLAYER)).contains("audio/ogg")); QVERIFY(!provider->supportedMimeTypes(QByteArray(Q_MEDIASERVICE_MEDIAPLAYER)).contains("audio/mp3")); } void tst_QMediaServiceProvider::testProviderHints() { { QMediaServiceProviderHint hint; QVERIFY(hint.isNull()); QCOMPARE(hint.type(), QMediaServiceProviderHint::Null); QVERIFY(hint.device().isEmpty()); QCOMPARE(hint.cameraPosition(), QCamera::UnspecifiedPosition); QVERIFY(hint.mimeType().isEmpty()); QVERIFY(hint.codecs().isEmpty()); QCOMPARE(hint.features(), 0); } { QByteArray deviceName(QByteArray("testDevice")); QMediaServiceProviderHint hint(deviceName); QVERIFY(!hint.isNull()); QCOMPARE(hint.type(), QMediaServiceProviderHint::Device); QCOMPARE(hint.device(), deviceName); QCOMPARE(hint.cameraPosition(), QCamera::UnspecifiedPosition); QVERIFY(hint.mimeType().isEmpty()); QVERIFY(hint.codecs().isEmpty()); QCOMPARE(hint.features(), 0); } { QMediaServiceProviderHint hint(QCamera::FrontFace); QVERIFY(!hint.isNull()); QCOMPARE(hint.type(), QMediaServiceProviderHint::CameraPosition); QVERIFY(hint.device().isEmpty()); QCOMPARE(hint.cameraPosition(), QCamera::FrontFace); QVERIFY(hint.mimeType().isEmpty()); QVERIFY(hint.codecs().isEmpty()); QCOMPARE(hint.features(), 0); } { QMediaServiceProviderHint hint(QMediaServiceProviderHint::LowLatencyPlayback); QVERIFY(!hint.isNull()); QCOMPARE(hint.type(), QMediaServiceProviderHint::SupportedFeatures); QVERIFY(hint.device().isEmpty()); QCOMPARE(hint.cameraPosition(), QCamera::UnspecifiedPosition); QVERIFY(hint.mimeType().isEmpty()); QVERIFY(hint.codecs().isEmpty()); QCOMPARE(hint.features(), QMediaServiceProviderHint::LowLatencyPlayback); } { QMediaServiceProviderHint hint(QMediaServiceProviderHint::RecordingSupport); QVERIFY(!hint.isNull()); QCOMPARE(hint.type(), QMediaServiceProviderHint::SupportedFeatures); QVERIFY(hint.device().isEmpty()); QCOMPARE(hint.cameraPosition(), QCamera::UnspecifiedPosition); QVERIFY(hint.mimeType().isEmpty()); QVERIFY(hint.codecs().isEmpty()); QCOMPARE(hint.features(), QMediaServiceProviderHint::RecordingSupport); } { QString mimeType(QLatin1String("video/ogg")); QStringList codecs; codecs << "theora" << "vorbis"; QMediaServiceProviderHint hint(mimeType,codecs); QVERIFY(!hint.isNull()); QCOMPARE(hint.type(), QMediaServiceProviderHint::ContentType); QVERIFY(hint.device().isEmpty()); QCOMPARE(hint.cameraPosition(), QCamera::UnspecifiedPosition); QCOMPARE(hint.mimeType(), mimeType); QCOMPARE(hint.codecs(), codecs); QMediaServiceProviderHint hint2(hint); QVERIFY(!hint2.isNull()); QCOMPARE(hint2.type(), QMediaServiceProviderHint::ContentType); QVERIFY(hint2.device().isEmpty()); QCOMPARE(hint.cameraPosition(), QCamera::UnspecifiedPosition); QCOMPARE(hint2.mimeType(), mimeType); QCOMPARE(hint2.codecs(), codecs); QMediaServiceProviderHint hint3; QVERIFY(hint3.isNull()); hint3 = hint; QVERIFY(!hint3.isNull()); QCOMPARE(hint3.type(), QMediaServiceProviderHint::ContentType); QVERIFY(hint3.device().isEmpty()); QCOMPARE(hint.cameraPosition(), QCamera::UnspecifiedPosition); QCOMPARE(hint3.mimeType(), mimeType); QCOMPARE(hint3.codecs(), codecs); QCOMPARE(hint, hint2); QCOMPARE(hint3, hint2); QMediaServiceProviderHint hint4(mimeType,codecs); QCOMPARE(hint, hint4); QMediaServiceProviderHint hint5(mimeType,QStringList()); QVERIFY(hint != hint5); } } void tst_QMediaServiceProvider::testDefaultDevice() { QMediaServiceProvider *provider = QMediaServiceProvider::defaultServiceProvider(); if (provider == 0) QSKIP("No default provider"); QCOMPARE(provider->defaultDevice(Q_MEDIASERVICE_AUDIOSOURCE), QByteArray("audiosource1")); QCOMPARE(provider->defaultDevice(Q_MEDIASERVICE_CAMERA), QByteArray("frontcamera")); } void tst_QMediaServiceProvider::testAvailableDevices() { QMediaServiceProvider *provider = QMediaServiceProvider::defaultServiceProvider(); if (provider == 0) QSKIP("No default provider"); QList devices = provider->devices(Q_MEDIASERVICE_AUDIOSOURCE); QCOMPARE(devices.count(), 2); QCOMPARE(devices.at(0), QByteArray("audiosource1")); QCOMPARE(devices.at(1), QByteArray("audiosource2")); devices = provider->devices(Q_MEDIASERVICE_CAMERA); QCOMPARE(devices.count(), 3); QCOMPARE(devices.at(0), QByteArray("frontcamera")); QCOMPARE(devices.at(1), QByteArray("backcamera")); QCOMPARE(devices.at(2), QByteArray("somecamera")); } void tst_QMediaServiceProvider::testCameraInfo() { QMediaServiceProvider *provider = QMediaServiceProvider::defaultServiceProvider(); if (provider == 0) QSKIP("No default provider"); QCOMPARE(provider->cameraPosition("backcamera"), QCamera::BackFace); QCOMPARE(provider->cameraOrientation("backcamera"), 90); QCOMPARE(provider->cameraPosition("frontcamera"), QCamera::FrontFace); QCOMPARE(provider->cameraOrientation("frontcamera"), 270); QCOMPARE(provider->cameraPosition("somecamera"), QCamera::UnspecifiedPosition); QCOMPARE(provider->cameraOrientation("somecamera"), 0); { QCamera camera; QVERIFY(camera.service()); QCOMPARE(camera.service()->objectName(), QLatin1String("MockServicePlugin3")); } { QCamera camera(QCameraInfo::defaultCamera()); QVERIFY(camera.service()); QCOMPARE(camera.service()->objectName(), QLatin1String("MockServicePlugin3")); } { QCamera camera(QCameraInfo::availableCameras().at(0)); QVERIFY(camera.service()); QCOMPARE(camera.service()->objectName(), QLatin1String("MockServicePlugin3")); } { QCamera camera(QCameraInfo::availableCameras().at(1)); QVERIFY(camera.service()); QCOMPARE(camera.service()->objectName(), QLatin1String("MockServicePlugin5")); } { QCamera camera(QCameraInfo::availableCameras().at(2)); QVERIFY(camera.service()); QCOMPARE(camera.service()->objectName(), QLatin1String("MockServicePlugin5")); } { QCamera camera(QCamera::FrontFace); QVERIFY(camera.service()); QCOMPARE(camera.service()->objectName(), QLatin1String("MockServicePlugin3")); } { QCamera camera(QCamera::BackFace); QVERIFY(camera.service()); QCOMPARE(camera.service()->objectName(), QLatin1String("MockServicePlugin5")); } { QCamera camera(QCamera::UnspecifiedPosition); QVERIFY(camera.service()); QCOMPARE(camera.service()->objectName(), QLatin1String("MockServicePlugin3")); } } QTEST_MAIN(tst_QMediaServiceProvider) #include "tst_qmediaserviceprovider.moc"