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 |
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)); |