qtmobility/tests/auto/qmediaimageviewer/tst_qmediaimageviewer.cpp
changeset 14 6fbed849b4f4
parent 11 06b8e2af4411
equal deleted inserted replaced
11:06b8e2af4411 14:6fbed849b4f4
    42 #include <qmobilityglobal.h>
    42 #include <qmobilityglobal.h>
    43 #include <QtTest/QtTest>
    43 #include <QtTest/QtTest>
    44 
    44 
    45 #include <QtCore/qdir.h>
    45 #include <QtCore/qdir.h>
    46 
    46 
    47 #include "../../../src/multimedia/qmediaimageviewer.h"
    47 #include <qmediaimageviewer.h>
    48 #include "../../../src/multimedia/qmediaimageviewerservice_p.h"
    48 #include <qmediaimageviewerservice_p.h>
    49 #include "../../../src/multimedia/qmediaplaylist.h"
    49 #include <qmediaplaylist.h>
    50 #include "../../../src/multimedia/qmediaservice.h"
    50 #include <qmediaservice.h>
    51 #include "../../../src/multimedia/qvideooutputcontrol.h"
    51 #include <qvideorenderercontrol.h>
    52 #include "../../../src/multimedia/qvideorenderercontrol.h"
    52 #include <qvideowidgetcontrol.h>
    53 #include "../../../src/multimedia/qvideowidgetcontrol.h"
       
    54 
    53 
    55 #include <QtCore/qfile.h>
    54 #include <QtCore/qfile.h>
    56 #include <QtNetwork/qnetworkaccessmanager.h>
    55 #include <QtNetwork/qnetworkaccessmanager.h>
    57 #include <QtNetwork/qnetworkreply.h>
    56 #include <QtNetwork/qnetworkreply.h>
    58 
    57 
    59 #include <QtMultimedia/qabstractvideosurface.h>
    58 #include <qabstractvideosurface.h>
    60 #include <QtMultimedia/qvideosurfaceformat.h>
    59 #include <qvideosurfaceformat.h>
    61 
    60 
    62 #if defined(Q_OS_SYMBIAN)
    61 #if defined(Q_OS_SYMBIAN)
    63 # define TESTDATA_DIR "./tst_qmediaimageviewer_images"
    62 # define TESTDATA_DIR "./tst_qmediaimageviewer_images"
    64 #endif
    63 #endif
    65 
    64 
    80     void setInvalidMedia();
    79     void setInvalidMedia();
    81     void playlist();
    80     void playlist();
    82     void multiplePlaylists();
    81     void multiplePlaylists();
    83     void invalidPlaylist();
    82     void invalidPlaylist();
    84     void elapsedTime();
    83     void elapsedTime();
    85     void outputControl();
       
    86     void rendererControl();
    84     void rendererControl();
    87 
    85 
    88 public:
    86 public:
    89     tst_QMediaImageViewer() : m_network(0), m_imageDir(QLatin1String(TESTDATA_DIR)) {}
    87     tst_QMediaImageViewer() : m_network(0), m_imageDir(QLatin1String(TESTDATA_DIR)) {}
    90 
    88 
    98     QDir m_imageDir;
    96     QDir m_imageDir;
    99     QString m_fileProtocol;
    97     QString m_fileProtocol;
   100 };
    98 };
   101 
    99 
   102 Q_DECLARE_METATYPE(QMediaImageViewer::State)
   100 Q_DECLARE_METATYPE(QMediaImageViewer::State)
   103 Q_DECLARE_METATYPE(QMediaImageViewer::MediaStatus);
   101 Q_DECLARE_METATYPE(QMediaImageViewer::MediaStatus)
   104 
   102 
   105 class QtTestVideoSurface : public QAbstractVideoSurface
   103 class QtTestVideoSurface : public QAbstractVideoSurface
   106 {
   104 {
   107 public:
   105 public:
   108     QList<QVideoFrame::PixelFormat> supportedPixelFormats(
   106     QList<QVideoFrame::PixelFormat> supportedPixelFormats(
   531     viewer.pause();
   529     viewer.pause();
   532     QCOMPARE(viewer.state(), QMediaImageViewer::StoppedState);
   530     QCOMPARE(viewer.state(), QMediaImageViewer::StoppedState);
   533     QCOMPARE(stateSpy.count(), 0);
   531     QCOMPARE(stateSpy.count(), 0);
   534 
   532 
   535     QMediaPlaylist playlist;
   533     QMediaPlaylist playlist;
   536     playlist.setMediaObject(&viewer);
   534     viewer.setPlaylist(&playlist);
   537 
   535 
   538     // Empty playlist so can't exit stopped state.
   536     // Empty playlist so can't exit stopped state.
   539     viewer.play();
   537     viewer.play();
   540     QCOMPARE(viewer.state(), QMediaImageViewer::StoppedState);
   538     QCOMPARE(viewer.state(), QMediaImageViewer::StoppedState);
   541     QCOMPARE(stateSpy.count(), 0);
   539     QCOMPARE(stateSpy.count(), 0);
   702     QMediaContent coverArtMedia(imageUrl("coverart.png"));
   700     QMediaContent coverArtMedia(imageUrl("coverart.png"));
   703 
   701 
   704     QMediaImageViewer viewer;
   702     QMediaImageViewer viewer;
   705 
   703 
   706     QMediaPlaylist *playlist1 = new QMediaPlaylist;
   704     QMediaPlaylist *playlist1 = new QMediaPlaylist;
   707     playlist1->setMediaObject(&viewer);
   705     viewer.setPlaylist(playlist1);
   708     playlist1->addMedia(imageMedia);
   706     playlist1->addMedia(imageMedia);
   709     playlist1->addMedia(posterMedia);
   707     playlist1->addMedia(posterMedia);
   710 
   708 
   711     playlist1->setCurrentIndex(0);
   709     playlist1->setCurrentIndex(0);
   712     QCOMPARE(viewer.media(), imageMedia);
   710     QCOMPARE(viewer.media(), imageMedia);
   713 
   711 
   714     QMediaPlaylist *playlist2 = new QMediaPlaylist;
   712     QMediaPlaylist *playlist2 = new QMediaPlaylist;
   715 
   713 
   716     QTest::ignoreMessage(QtWarningMsg,
   714     viewer.setPlaylist(playlist2);
   717                          "QMediaImageViewer::bind(): already bound to a playlist, detaching the current one");
       
   718     playlist2->setMediaObject(&viewer);
       
   719     playlist2->addMedia(coverArtMedia);
   715     playlist2->addMedia(coverArtMedia);
   720 
       
   721     //the first playlist is detached
       
   722     QVERIFY(playlist1->mediaObject() == 0);
       
   723 
   716 
   724     QVERIFY(viewer.media().isNull());
   717     QVERIFY(viewer.media().isNull());
   725 
   718 
   726     playlist2->setCurrentIndex(0);
   719     playlist2->setCurrentIndex(0);
   727     QCOMPARE(viewer.media(), coverArtMedia);
   720     QCOMPARE(viewer.media(), coverArtMedia);
   728 
   721 
   729     delete playlist2;
   722     delete playlist2;
   730     QVERIFY(viewer.media().isNull());
   723     QVERIFY(viewer.media().isNull());
   731     QCOMPARE(viewer.state(), QMediaImageViewer::StoppedState);
   724     QCOMPARE(viewer.state(), QMediaImageViewer::StoppedState);
   732 
   725 
   733     playlist1->setMediaObject(&viewer);
   726     viewer.setPlaylist(playlist1);
   734     playlist1->setCurrentIndex(0);
   727     playlist1->setCurrentIndex(0);
   735     QCOMPARE(viewer.media(), imageMedia);
   728     QCOMPARE(viewer.media(), imageMedia);
   736 
   729 
   737     viewer.play();
   730     viewer.play();
   738     QCOMPARE(viewer.state(), QMediaImageViewer::PlayingState);
   731     QCOMPARE(viewer.state(), QMediaImageViewer::PlayingState);
   755 
   748 
   756     QSignalSpy stateSpy(&viewer, SIGNAL(stateChanged(QMediaImageViewer::State)));
   749     QSignalSpy stateSpy(&viewer, SIGNAL(stateChanged(QMediaImageViewer::State)));
   757     QSignalSpy statusSpy(&viewer, SIGNAL(mediaStatusChanged(QMediaImageViewer::MediaStatus)));
   750     QSignalSpy statusSpy(&viewer, SIGNAL(mediaStatusChanged(QMediaImageViewer::MediaStatus)));
   758 
   751 
   759     QMediaPlaylist playlist;
   752     QMediaPlaylist playlist;
   760     playlist.setMediaObject(&viewer);
   753     viewer.setPlaylist(&playlist);
   761     playlist.addMedia(invalidMedia);
   754     playlist.addMedia(invalidMedia);
   762     playlist.addMedia(imageMedia);
   755     playlist.addMedia(imageMedia);
   763     playlist.addMedia(invalidMedia);
   756     playlist.addMedia(invalidMedia);
   764 
   757 
   765     // Test play initially tries to load the first invalid image.
   758     // Test play initially tries to load the first invalid image.
   817     connect(&viewer, SIGNAL(elapsedTimeChanged(int)),
   810     connect(&viewer, SIGNAL(elapsedTimeChanged(int)),
   818             &QTestEventLoop::instance(), SLOT(exitLoop()));
   811             &QTestEventLoop::instance(), SLOT(exitLoop()));
   819 
   812 
   820 
   813 
   821     QMediaPlaylist playlist;
   814     QMediaPlaylist playlist;
   822     playlist.setMediaObject(&viewer);
   815     viewer.setPlaylist(&playlist);
   823     playlist.addMedia(imageMedia);
   816     playlist.addMedia(imageMedia);
   824 
   817 
   825     QCOMPARE(viewer.elapsedTime(), 0);
   818     QCOMPARE(viewer.elapsedTime(), 0);
   826 
   819 
   827     QTestEventLoop::instance().enterLoop(2);
   820     QTestEventLoop::instance().enterLoop(2);
   886     QTestEventLoop::instance().enterLoop(2);
   879     QTestEventLoop::instance().enterLoop(2);
   887     QCOMPARE(viewer.state(), QMediaImageViewer::StoppedState);
   880     QCOMPARE(viewer.state(), QMediaImageViewer::StoppedState);
   888 
   881 
   889 }
   882 }
   890 
   883 
   891 void tst_QMediaImageViewer::outputControl()
   884 void tst_QMediaImageViewer::rendererControl()
   892 {
   885 {
       
   886     QtTestVideoSurface surfaceA;
       
   887     QtTestVideoSurface surfaceB;
       
   888     QAbstractVideoSurface *nullSurface = 0;
       
   889 
   893     QMediaImageViewer viewer;
   890     QMediaImageViewer viewer;
   894 
   891 
   895     QMediaService *service = viewer.service();
   892     QMediaService *service = viewer.service();
   896     if (service == 0)
   893     if (service == 0)
   897         QSKIP("Image viewer object has no service.", SkipSingle);
   894         QSKIP("Image viewer object has no service.", SkipSingle);
   898 
   895 
   899     QVideoOutputControl *outputControl = qobject_cast<QVideoOutputControl *>(
   896     QMediaControl *mediaControl = service->requestControl(QVideoRendererControl_iid);
   900             service->control(QVideoOutputControl_iid));
   897     QVERIFY(mediaControl != 0);
   901 
   898 
   902     QVERIFY(outputControl != 0);
   899     QVideoRendererControl *rendererControl = qobject_cast<QVideoRendererControl *>(mediaControl);
   903 
       
   904     QVERIFY(outputControl->availableOutputs().contains(QVideoOutputControl::RendererOutput));
       
   905     QVERIFY(!outputControl->availableOutputs().contains(QVideoOutputControl::WidgetOutput));
       
   906     QVERIFY(!outputControl->availableOutputs().contains(QVideoOutputControl::UserOutput));
       
   907 
       
   908     QCOMPARE(outputControl->output(), QVideoOutputControl::NoOutput);
       
   909 
       
   910     outputControl->setOutput(QVideoOutputControl::WidgetOutput);
       
   911     QCOMPARE(outputControl->output(), QVideoOutputControl::NoOutput);
       
   912 
       
   913     outputControl->setOutput(QVideoOutputControl::RendererOutput);
       
   914     QCOMPARE(outputControl->output(), QVideoOutputControl::RendererOutput);
       
   915 
       
   916     outputControl->setOutput(QVideoOutputControl::UserOutput);
       
   917     QCOMPARE(outputControl->output(), QVideoOutputControl::NoOutput);
       
   918 }
       
   919 
       
   920 void tst_QMediaImageViewer::rendererControl()
       
   921 {
       
   922     QtTestVideoSurface surfaceA;
       
   923     QtTestVideoSurface surfaceB;
       
   924     QAbstractVideoSurface *nullSurface = 0;
       
   925 
       
   926     QMediaImageViewer viewer;
       
   927 
       
   928     QMediaService *service = viewer.service();
       
   929     if (service == 0)
       
   930         QSKIP("Image viewer object has no service.", SkipSingle);
       
   931 
       
   932     QVideoOutputControl *outputControl = qobject_cast<QVideoOutputControl *>(
       
   933             service->control(QVideoOutputControl_iid));
       
   934     if (outputControl == 0)
       
   935         QSKIP("Image viewer object has no video output control.", SkipSingle);
       
   936 
       
   937     QVideoRendererControl *rendererControl = qobject_cast<QVideoRendererControl *>(
       
   938             service->control(QVideoRendererControl_iid));
       
   939     QVERIFY(rendererControl != 0);
   900     QVERIFY(rendererControl != 0);
   940 
   901 
   941     rendererControl->setSurface(&surfaceA);
   902     rendererControl->setSurface(&surfaceA);
   942     QCOMPARE(rendererControl->surface(), (QAbstractVideoSurface *)&surfaceA);
   903     QCOMPARE(rendererControl->surface(), (QAbstractVideoSurface *)&surfaceA);
   943 
       
   944     outputControl->setOutput(QVideoOutputControl::RendererOutput);
       
   945 
   904 
   946     // Load an image so the viewer has some dimensions to work with.
   905     // Load an image so the viewer has some dimensions to work with.
   947     viewer.setMedia(QMediaContent(imageUrl("image.png")));
   906     viewer.setMedia(QMediaContent(imageUrl("image.png")));
   948 
   907 
   949     connect(&viewer, SIGNAL(mediaStatusChanged(QMediaImageViewer::MediaStatus)),
   908     connect(&viewer, SIGNAL(mediaStatusChanged(QMediaImageViewer::MediaStatus)),
   965         QCOMPARE(frame.handleType(), QAbstractVideoBuffer::NoHandle);
   924         QCOMPARE(frame.handleType(), QAbstractVideoBuffer::NoHandle);
   966         QCOMPARE(frame.pixelFormat(), QVideoFrame::Format_RGB32);
   925         QCOMPARE(frame.pixelFormat(), QVideoFrame::Format_RGB32);
   967         QCOMPARE(frame.size(), QSize(75, 50));
   926         QCOMPARE(frame.size(), QSize(75, 50));
   968     }
   927     }
   969     // Test clearing the output stops the video surface.
   928     // Test clearing the output stops the video surface.
   970     outputControl->setOutput(QVideoOutputControl::NoOutput);
   929     service->releaseControl(rendererControl);
   971     QCOMPARE(surfaceA.isActive(), false);
   930     QCOMPARE(surfaceA.isActive(), false);
   972 
   931 
   973     // Test reseting the output restarts it.
   932     // Test reseting the output restarts it.
   974     outputControl->setOutput(QVideoOutputControl::RendererOutput);
   933     mediaControl = service->requestControl(QVideoRendererControl_iid);
       
   934     QVERIFY(mediaControl != 0);
       
   935 
       
   936     rendererControl = qobject_cast<QVideoRendererControl *>(mediaControl);
       
   937     rendererControl->setSurface(&surfaceA);
       
   938     QVERIFY(rendererControl != 0);
   975     {
   939     {
   976         QVideoSurfaceFormat format = surfaceA.surfaceFormat();
   940         QVideoSurfaceFormat format = surfaceA.surfaceFormat();
   977         QCOMPARE(format.handleType(), QAbstractVideoBuffer::NoHandle);
   941         QCOMPARE(format.handleType(), QAbstractVideoBuffer::NoHandle);
   978         QCOMPARE(format.pixelFormat(), QVideoFrame::Format_RGB32);
   942         QCOMPARE(format.pixelFormat(), QVideoFrame::Format_RGB32);
   979         QCOMPARE(format.frameSize(), QSize(75, 50));
   943         QCOMPARE(format.frameSize(), QSize(75, 50));