diff options
Diffstat (limited to 'tests/auto/unit')
10 files changed, 364 insertions, 75 deletions
diff --git a/tests/auto/unit/qabstractvideosurface/tst_qabstractvideosurface.cpp b/tests/auto/unit/qabstractvideosurface/tst_qabstractvideosurface.cpp index 61299a964..b18dba5f7 100644 --- a/tests/auto/unit/qabstractvideosurface/tst_qabstractvideosurface.cpp +++ b/tests/auto/unit/qabstractvideosurface/tst_qabstractvideosurface.cpp @@ -58,7 +58,7 @@ private slots: void supportedFormatsChanged(); }; -typedef QMap<QAbstractVideoBuffer::HandleType, QVideoFrame::PixelFormat> SupportedFormatMap; +using SupportedFormatMap = QMultiMap<QAbstractVideoBuffer::HandleType, QVideoFrame::PixelFormat>; Q_DECLARE_METATYPE(SupportedFormatMap) @@ -86,7 +86,7 @@ public: /* fun to generate supportedFormatsChanged signal */ QList<QVideoFrame::PixelFormat> supportedPixelFormatsChange(QList<QVideoFrame::PixelFormat> formats) { - supportedFormats.insertMulti(QAbstractVideoBuffer::NoHandle, QVideoFrame::Format_RGB32); + supportedFormats.insert(QAbstractVideoBuffer::NoHandle, QVideoFrame::Format_RGB32); QList<QVideoFrame::PixelFormat> supportedFormats = supportedPixelFormats(); if (supportedFormats.count() != formats.count()) { emit supportedFormatsChanged(); @@ -189,10 +189,10 @@ void tst_QAbstractVideoSurface::isFormatSupported_data() 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); + formats.insert(QAbstractVideoBuffer::NoHandle, QVideoFrame::Format_RGB32); + formats.insert(QAbstractVideoBuffer::NoHandle, QVideoFrame::Format_RGB24); + formats.insert(QAbstractVideoBuffer::NoHandle, QVideoFrame::Format_YUV444); + formats.insert(QAbstractVideoBuffer::GLTextureHandle, QVideoFrame::Format_RGB32); QTest::newRow("supported: rgb32") << formats @@ -228,8 +228,8 @@ void tst_QAbstractVideoSurface::isFormatSupported_data() QAbstractVideoBuffer::GLTextureHandle) << false; - formats.insertMulti(QAbstractVideoBuffer::NoHandle, QVideoFrame::Format_YV12); - formats.insertMulti(QAbstractVideoBuffer::GLTextureHandle, QVideoFrame::Format_RGB24); + formats.insert(QAbstractVideoBuffer::NoHandle, QVideoFrame::Format_YV12); + formats.insert(QAbstractVideoBuffer::GLTextureHandle, QVideoFrame::Format_RGB24); QTest::newRow("supported: yv12") << formats @@ -377,7 +377,7 @@ void tst_QAbstractVideoSurface::nativeResolution() void tst_QAbstractVideoSurface::supportedFormatsChanged() { SupportedFormatMap formatMap; - formatMap.insertMulti(QAbstractVideoBuffer::NoHandle, QVideoFrame::Format_RGB24); + formatMap.insert(QAbstractVideoBuffer::NoHandle, QVideoFrame::Format_RGB24); QtTestVideoSurface surface(formatMap); QSignalSpy spy(&surface, SIGNAL(supportedFormatsChanged())); QList<QVideoFrame::PixelFormat> formats = surface.supportedPixelFormats(); diff --git a/tests/auto/unit/qcamera/tst_qcamera.cpp b/tests/auto/unit/qcamera/tst_qcamera.cpp index 4b6202173..643b552f9 100644 --- a/tests/auto/unit/qcamera/tst_qcamera.cpp +++ b/tests/auto/unit/qcamera/tst_qcamera.cpp @@ -2039,7 +2039,7 @@ void tst_QCamera::testErrorSignal() QCamera camera; - QSignalSpy spyError(&camera, SIGNAL(error(QCamera::Error))); + QSignalSpy spyError(&camera, SIGNAL(errorOccurred(QCamera::Error))); /* Set the QCameraControl error and verify if the signal is emitted correctly in QCamera */ service.mockControl->setError(QCamera::CameraError,QString("Camera Error")); diff --git a/tests/auto/unit/qdeclarativeaudio/qdeclarativeaudio.pro b/tests/auto/unit/qdeclarativeaudio/qdeclarativeaudio.pro index f59027bc2..6d8b3c215 100644 --- a/tests/auto/unit/qdeclarativeaudio/qdeclarativeaudio.pro +++ b/tests/auto/unit/qdeclarativeaudio/qdeclarativeaudio.pro @@ -1,7 +1,7 @@ CONFIG += testcase TARGET = tst_qdeclarativeaudio -QT += multimedia-private qml testlib +QT += multimedia-private qml testlib qtmultimediaquicktools-private HEADERS += \ ../../../../src/imports/multimedia/qdeclarativeaudio_p.h \ diff --git a/tests/auto/unit/qdeclarativeaudio/tst_qdeclarativeaudio.cpp b/tests/auto/unit/qdeclarativeaudio/tst_qdeclarativeaudio.cpp index 87c72521c..ded188d72 100644 --- a/tests/auto/unit/qdeclarativeaudio/tst_qdeclarativeaudio.cpp +++ b/tests/auto/unit/qdeclarativeaudio/tst_qdeclarativeaudio.cpp @@ -40,7 +40,9 @@ #include <qmediaplayercontrol.h> #include <qmediaservice.h> #include <private/qmediaserviceprovider_p.h> +#include <private/qdeclarativevideooutput_p.h> #include <qmetadatareadercontrol.h> +#include <QAbstractVideoSurface> #include <QtGui/qguiapplication.h> #include <QtQml/qqmlengine.h> @@ -75,6 +77,7 @@ private slots: void loops(); void audioRole(); void customAudioRole(); + void videoOutput(); private: void enumerator(const QMetaObject *object, const char *name, QMetaEnum *result); @@ -1201,6 +1204,52 @@ int tst_QDeclarativeAudio::keyToValue(const QMetaEnum &enumeration, const char * return result; } +struct Surface : QAbstractVideoSurface +{ + Surface(QObject *parent = nullptr) : QAbstractVideoSurface(parent) { } + QList<QVideoFrame::PixelFormat> supportedPixelFormats(QAbstractVideoBuffer::HandleType) const override + { + return QList<QVideoFrame::PixelFormat>() << QVideoFrame::Format_RGB32; + } + + bool present(const QVideoFrame &) override { return true; } +}; + +void tst_QDeclarativeAudio::videoOutput() +{ + QtTestMediaPlayerControl playerControl; + QtTestMediaServiceProvider provider(&playerControl, 0); + + QDeclarativeAudio audio; + QSignalSpy spy(&audio, &QDeclarativeAudio::videoOutputChanged); + + audio.classBegin(); + audio.componentComplete(); + + QVERIFY(audio.videoOutput().isNull()); + + QVariant surface; + surface.setValue(new Surface(this)); + audio.setVideoOutput(surface); + QCOMPARE(audio.videoOutput(), surface); + QCOMPARE(spy.count(), 1); + + QQmlEngine engine; + QJSValue jsArray = engine.newArray(5); + jsArray.setProperty(0, engine.newQObject(new Surface(this))); + jsArray.setProperty(1, engine.newQObject(new Surface(this))); + QDeclarativeVideoOutput output; + jsArray.setProperty(2, engine.newQObject(&output)); + jsArray.setProperty(3, 123); + jsArray.setProperty(4, QLatin1String("ignore this")); + + QVariant surfaces; + surfaces.setValue(jsArray); + audio.setVideoOutput(surfaces); + QCOMPARE(audio.videoOutput(), surfaces); + QCOMPARE(spy.count(), 2); +} + QTEST_MAIN(tst_QDeclarativeAudio) #include "tst_qdeclarativeaudio.moc" diff --git a/tests/auto/unit/qgraphicsvideoitem/tst_qgraphicsvideoitem.cpp b/tests/auto/unit/qgraphicsvideoitem/tst_qgraphicsvideoitem.cpp index f4759bbf7..41805f49a 100644 --- a/tests/auto/unit/qgraphicsvideoitem/tst_qgraphicsvideoitem.cpp +++ b/tests/auto/unit/qgraphicsvideoitem/tst_qgraphicsvideoitem.cpp @@ -70,6 +70,7 @@ private slots: void boundingRect(); void paint(); + void paintSurface(); }; Q_DECLARE_METATYPE(const uchar *) @@ -656,6 +657,48 @@ void tst_QGraphicsVideoItem::paint() QCOMPARE(surface->isReady(), true); } +void tst_QGraphicsVideoItem::paintSurface() +{ + QtTestGraphicsVideoItem *item = new QtTestGraphicsVideoItem; + QVERIFY(item->videoSurface()); + + QGraphicsScene graphicsScene; + graphicsScene.addItem(item); + QGraphicsView graphicsView(&graphicsScene); + graphicsView.show(); + QVERIFY(item->waitForPaint(1)); + + QPainterVideoSurface *surface = qobject_cast<QPainterVideoSurface *>( + item->videoSurface()); + if (!surface) + QSKIP("QGraphicsVideoItem is not QPainterVideoSurface based"); + + QVideoSurfaceFormat format(QSize(2, 2), QVideoFrame::Format_RGB32); + + QVERIFY(surface->start(format)); + QCOMPARE(surface->isActive(), true); + QCOMPARE(surface->isReady(), true); + + QVERIFY(item->waitForPaint(1)); + + QCOMPARE(surface->isActive(), true); + QCOMPARE(surface->isReady(), true); + + QVideoFrame frame(sizeof(rgb32ImageData), QSize(2, 2), 8, QVideoFrame::Format_RGB32); + + frame.map(QAbstractVideoBuffer::WriteOnly); + memcpy(frame.bits(), rgb32ImageData, frame.mappedBytes()); + frame.unmap(); + + QVERIFY(surface->present(frame)); + QCOMPARE(surface->isActive(), true); + QCOMPARE(surface->isReady(), false); + + QVERIFY(item->waitForPaint(1)); + + QCOMPARE(surface->isActive(), true); + QCOMPARE(surface->isReady(), true); +} QTEST_MAIN(tst_QGraphicsVideoItem) diff --git a/tests/auto/unit/qmediaserviceprovider/mockserviceplugin2/mockserviceplugin2.cpp b/tests/auto/unit/qmediaserviceprovider/mockserviceplugin2/mockserviceplugin2.cpp index 66ace2045..4167b18ea 100644 --- a/tests/auto/unit/qmediaserviceprovider/mockserviceplugin2/mockserviceplugin2.cpp +++ b/tests/auto/unit/qmediaserviceprovider/mockserviceplugin2/mockserviceplugin2.cpp @@ -75,10 +75,10 @@ public: QMediaServiceProviderHint::Features supportedFeatures(const QByteArray &service) const { + QMediaServiceProviderHint::Features result; if (service == QByteArray(Q_MEDIASERVICE_MEDIAPLAYER)) - return QMediaServiceProviderHint::LowLatencyPlayback; - else - return 0; + result |= QMediaServiceProviderHint::LowLatencyPlayback; + return result; } }; diff --git a/tests/auto/unit/qmediaserviceprovider/mockserviceplugin4/mockserviceplugin4.cpp b/tests/auto/unit/qmediaserviceprovider/mockserviceplugin4/mockserviceplugin4.cpp index 92707169c..6a7725fee 100644 --- a/tests/auto/unit/qmediaserviceprovider/mockserviceplugin4/mockserviceplugin4.cpp +++ b/tests/auto/unit/qmediaserviceprovider/mockserviceplugin4/mockserviceplugin4.cpp @@ -75,10 +75,10 @@ public: QMediaServiceProviderHint::Features supportedFeatures(const QByteArray &service) const { + QMediaServiceProviderHint::Features result; if (service == QByteArray(Q_MEDIASERVICE_MEDIAPLAYER)) - return QMediaServiceProviderHint::StreamPlayback; - else - return 0; + result |= QMediaServiceProviderHint::StreamPlayback; + return result; } }; diff --git a/tests/auto/unit/qpaintervideosurface/tst_qpaintervideosurface.cpp b/tests/auto/unit/qpaintervideosurface/tst_qpaintervideosurface.cpp index 7ba631e58..be5c85ab9 100644 --- a/tests/auto/unit/qpaintervideosurface/tst_qpaintervideosurface.cpp +++ b/tests/auto/unit/qpaintervideosurface/tst_qpaintervideosurface.cpp @@ -35,9 +35,9 @@ #include <qvideosurfaceformat.h> #if QT_CONFIG(opengl) -#include <QtOpenGL/qgl.h> -#include <QtOpenGL/qglframebufferobject.h> -#include <QtGui/qopenglfunctions.h> +#include <QOpenGLContext> +#include <QOpenGLFunctions> +#include <QOpenGLWidget> #endif QT_USE_NAMESPACE @@ -481,8 +481,7 @@ void tst_QPainterVideoSurface::present() QCOMPARE(surface.isActive(), true); QCOMPARE(surface.isReady(), false); - // Not ready. - QVERIFY(!surface.present(frameA)); + QVERIFY(surface.present(frameA)); QCOMPARE(frameSpy.count(), 1); surface.setReady(true); @@ -560,20 +559,19 @@ void tst_QPainterVideoSurface::presentOpaqueFrame() void tst_QPainterVideoSurface::shaderType() { QPainterVideoSurface surface; - QGLWidget widget; - if (!widget.context() - || !widget.context()->isValid()) { - QSKIP("Platform does not support GLContext"); - } - + QOpenGLWidget widget; widget.show(); + QVERIFY(QTest::qWaitForWindowExposed(&widget)); - widget.makeCurrent(); + + if (!widget.context() || !widget.context()->isValid()) + QSKIP("Platform does not support OpenGLContext"); QCOMPARE(surface.shaderType(), QPainterVideoSurface::NoShaders); QCOMPARE(surface.supportedShaderTypes(), QPainterVideoSurface::NoShaders); - surface.setGLContext(const_cast<QGLContext *>(widget.context())); + widget.makeCurrent(); + surface.updateGLContext(); QCOMPARE(surface.glContext(), widget.context()); { @@ -613,12 +611,14 @@ void tst_QPainterVideoSurface::shaderType() { QSignalSpy spy(&surface, SIGNAL(supportedFormatsChanged())); - surface.setGLContext(const_cast<QGLContext *>(widget.context())); + widget.makeCurrent(); + surface.updateGLContext(); QCOMPARE(surface.glContext(), widget.context()); QCOMPARE(spy.count(), 0); } - surface.setGLContext(0); + widget.doneCurrent(); + surface.updateGLContext(); QCOMPARE(surface.shaderType(), QPainterVideoSurface::NoShaders); QCOMPARE(surface.supportedShaderTypes(), QPainterVideoSurface::NoShaders); @@ -657,19 +657,18 @@ void tst_QPainterVideoSurface::shaderTypeStarted() { QFETCH(QPainterVideoSurface::ShaderType, shaderType); - QGLWidget widget; - if (!widget.context() - || !widget.context()->isValid()) { - QSKIP("Platform does not support GLContext"); - } - + QOpenGLWidget widget; widget.show(); + QVERIFY(QTest::qWaitForWindowExposed(&widget)); - widget.makeCurrent(); + + if (!widget.context() || !widget.context()->isValid()) + QSKIP("Platform does not support OpenGLContext"); QPainterVideoSurface surface; - surface.setGLContext(const_cast<QGLContext *>(widget.context())); + widget.makeCurrent(); + surface.updateGLContext(); if (!(surface.supportedShaderTypes() & shaderType)) QSKIP("Shader type unsupported on this platform"); @@ -713,7 +712,8 @@ void tst_QPainterVideoSurface::shaderTypeStarted() QCOMPARE(surface.isActive(), true); QCOMPARE(spy.count(), 0); - surface.setGLContext(0); + widget.doneCurrent(); + surface.updateGLContext(); QCOMPARE(surface.shaderType(), QPainterVideoSurface::NoShaders); QCOMPARE(surface.isActive(), false); QCOMPARE(spy.count(), 1); @@ -905,18 +905,17 @@ void tst_QPainterVideoSurface::shaderSupportedFormat() QFETCH(bool, supportedPixelFormat); QFETCH(bool, supportedFormat); - QGLWidget widget; - if (!widget.context() - || !widget.context()->isValid()) { - QSKIP("Platform does not support GLContext"); - } - + QOpenGLWidget widget; widget.show(); + QVERIFY(QTest::qWaitForWindowExposed(&widget)); - widget.makeCurrent(); + + if (!widget.context() || !widget.context()->isValid()) + QSKIP("Platform does not support GLContext"); QPainterVideoSurface surface; - surface.setGLContext(const_cast<QGLContext *>(widget.context())); + widget.makeCurrent(); + surface.updateGLContext(); if (!(surface.supportedShaderTypes() & shaderType)) @@ -1027,18 +1026,17 @@ void tst_QPainterVideoSurface::shaderPresent() QFETCH(int, bytesB); QFETCH(int, bytesPerLineB); - QGLWidget widget; - if (!widget.context() - || !widget.context()->isValid()) { - QSKIP("Platform does not support GLContext"); - } - + QOpenGLWidget widget; widget.show(); + QVERIFY(QTest::qWaitForWindowExposed(&widget)); - widget.makeCurrent(); + + if (!widget.context() || !widget.context()->isValid()) + QSKIP("Platform does not support GLContext"); QPainterVideoSurface surface; - surface.setGLContext(const_cast<QGLContext *>(widget.context())); + widget.makeCurrent(); + surface.updateGLContext(); if (!(surface.supportedShaderTypes() & shaderType)) QSKIP("Shader type unsupported on this platform"); @@ -1093,8 +1091,9 @@ void tst_QPainterVideoSurface::shaderPresent() QCOMPARE(surface.isActive(), true); QCOMPARE(surface.isReady(), false); - // Not ready. - QVERIFY(!surface.present(frameA)); + // If present() fails for any other reason the surface should immediately enter the stopped state + // and an error() value will be set. + QVERIFY(surface.present(frameA)); QCOMPARE(frameSpy.count(), 1); surface.setReady(true); @@ -1163,18 +1162,17 @@ void tst_QPainterVideoSurface::shaderPresentOpaqueFrame() { QFETCH(QPainterVideoSurface::ShaderType, shaderType); - QGLWidget widget; - if (!widget.context() - || !widget.context()->isValid()) { - QSKIP("Platform does not support GLContext"); - } - + QOpenGLWidget widget; widget.show(); + QVERIFY(QTest::qWaitForWindowExposed(&widget)); - widget.makeCurrent(); + + if (!widget.context() || !widget.context()->isValid()) + QSKIP("Platform does not support GLContext"); QPainterVideoSurface surface; - surface.setGLContext(const_cast<QGLContext *>(widget.context())); + widget.makeCurrent(); + surface.updateGLContext(); if (!(surface.supportedShaderTypes() & shaderType)) QSKIP("Shader type unsupported on this platform"); @@ -1217,18 +1215,17 @@ void tst_QPainterVideoSurface::shaderPresentGLFrame() { QFETCH(QPainterVideoSurface::ShaderType, shaderType); - QGLWidget widget; - if (!widget.context() - || !widget.context()->isValid()) { - QSKIP("Platform does not support GLContext"); - } - + QOpenGLWidget widget; widget.show(); + QVERIFY(QTest::qWaitForWindowExposed(&widget)); - widget.makeCurrent(); + + if (!widget.context() || !widget.context()->isValid()) + QSKIP("Platform does not support GLContext"); QPainterVideoSurface surface; - surface.setGLContext(const_cast<QGLContext *>(widget.context())); + widget.makeCurrent(); + surface.updateGLContext(); if (!(surface.supportedShaderTypes() & shaderType)) QSKIP("Shader type unsupported on this platform"); diff --git a/tests/auto/unit/qvideoframe/tst_qvideoframe.cpp b/tests/auto/unit/qvideoframe/tst_qvideoframe.cpp index 6be039108..943051435 100644 --- a/tests/auto/unit/qvideoframe/tst_qvideoframe.cpp +++ b/tests/auto/unit/qvideoframe/tst_qvideoframe.cpp @@ -33,6 +33,7 @@ #include <qvideoframe.h> #include <QtGui/QImage> #include <QtCore/QPointer> +#include <QtMultimedia/private/qtmultimedia-config_p.h> // Adds an enum, and the stringized version #define ADD_ENUM_TEST(x) \ @@ -85,6 +86,9 @@ private slots: void isMapped(); void isReadable(); void isWritable(); + + void image_data(); + void image(); }; Q_DECLARE_METATYPE(QImage::Format) @@ -1128,6 +1132,173 @@ void tst_QVideoFrame::isWritable() frame.unmap(); } +void tst_QVideoFrame::image_data() +{ + QTest::addColumn<QSize>("size"); + QTest::addColumn<QVideoFrame::PixelFormat>("pixelFormat"); + QTest::addColumn<int>("bytes"); + QTest::addColumn<int>("bytesPerLine"); + QTest::addColumn<QImage::Format>("imageFormat"); + + QTest::newRow("64x64 ARGB32") + << QSize(64, 64) + << QVideoFrame::Format_ARGB32 + << 16384 + << 256 + << QImage::Format_ARGB32; + + QTest::newRow("64x64 ARGB32_Premultiplied") + << QSize(64, 64) + << QVideoFrame::Format_ARGB32_Premultiplied + << 16384 + << 256 + << QImage::Format_ARGB32_Premultiplied; + + QTest::newRow("64x64 RGB32") + << QSize(64, 64) + << QVideoFrame::Format_RGB32 + << 16384 + << 256 + << QImage::Format_RGB32; + + QTest::newRow("64x64 RGB24") + << QSize(64, 64) + << QVideoFrame::Format_RGB24 + << 16384 + << 192 + << QImage::Format_RGB888; + + QTest::newRow("64x64 RGB565") + << QSize(64, 64) + << QVideoFrame::Format_RGB565 + << 16384 + << 128 + << QImage::Format_RGB16; + + QTest::newRow("64x64 RGB555") + << QSize(64, 64) + << QVideoFrame::Format_RGB555 + << 16384 + << 128 + << QImage::Format_RGB555; + + QTest::newRow("64x64 BGRA32") + << QSize(64, 64) + << QVideoFrame::Format_BGRA32 + << 16384 + << 256 + << QImage::Format_ARGB32; + + QTest::newRow("64x64 BGRA32_Premultiplied") + << QSize(64, 64) + << QVideoFrame::Format_BGRA32_Premultiplied + << 16384 + << 256 + << QImage::Format_ARGB32; + + QTest::newRow("64x64 BGR32") + << QSize(64, 64) + << QVideoFrame::Format_BGR32 + << 16384 + << 256 + << QImage::Format_ARGB32; + + QTest::newRow("64x64 BGR24") + << QSize(64, 64) + << QVideoFrame::Format_BGR24 + << 16384 + << 256 + << QImage::Format_ARGB32; + + QTest::newRow("64x64 BGR565") + << QSize(64, 64) + << QVideoFrame::Format_BGR565 + << 16384 + << 256 + << QImage::Format_ARGB32; + + QTest::newRow("64x64 BGR555") + << QSize(64, 64) + << QVideoFrame::Format_BGR555 + << 16384 + << 256 + << QImage::Format_ARGB32; +#if !QT_CONFIG(directshow) + QTest::newRow("64x64 AYUV444") + << QSize(64, 64) + << QVideoFrame::Format_AYUV444 + << 16384 + << 256 + << QImage::Format_ARGB32; + + QTest::newRow("64x64 YUV444") + << QSize(64, 64) + << QVideoFrame::Format_YUV444 + << 16384 + << 256 + << QImage::Format_ARGB32; + + QTest::newRow("64x64 YUV420P") + << QSize(64, 64) + << QVideoFrame::Format_YUV420P + << 13288 + << 256 + << QImage::Format_ARGB32; + + QTest::newRow("64x64 YV12") + << QSize(64, 64) + << QVideoFrame::Format_YV12 + << 16384 + << 256 + << QImage::Format_ARGB32; + + QTest::newRow("64x64 UYVY") + << QSize(64, 64) + << QVideoFrame::Format_UYVY + << 16384 + << 256 + << QImage::Format_ARGB32; + + QTest::newRow("64x64 YUYV") + << QSize(64, 64) + << QVideoFrame::Format_YUYV + << 16384 + << 256 + << QImage::Format_ARGB32; + + QTest::newRow("64x64 NV12") + << QSize(64, 64) + << QVideoFrame::Format_NV12 + << 16384 + << 256 + << QImage::Format_ARGB32; + + QTest::newRow("64x64 NV21") + << QSize(64, 64) + << QVideoFrame::Format_NV21 + << 16384 + << 256 + << QImage::Format_ARGB32; +#endif +} + +void tst_QVideoFrame::image() +{ + QFETCH(QSize, size); + QFETCH(QVideoFrame::PixelFormat, pixelFormat); + QFETCH(int, bytes); + QFETCH(int, bytesPerLine); + QFETCH(QImage::Format, imageFormat); + + QVideoFrame frame(bytes, size, bytesPerLine, pixelFormat); + QImage img = frame.image(); + + QVERIFY(!img.isNull()); + QCOMPARE(img.format(), imageFormat); + QCOMPARE(img.size(), size); + QCOMPARE(img.bytesPerLine(), bytesPerLine); +} + QTEST_MAIN(tst_QVideoFrame) #include "tst_qvideoframe.moc" diff --git a/tests/auto/unit/qvideowidget/tst_qvideowidget.cpp b/tests/auto/unit/qvideowidget/tst_qvideowidget.cpp index 3baa72281..bcc4acb3a 100644 --- a/tests/auto/unit/qvideowidget/tst_qvideowidget.cpp +++ b/tests/auto/unit/qvideowidget/tst_qvideowidget.cpp @@ -100,6 +100,7 @@ private slots: void saturationRendererControl(); void paintRendererControl(); + void paintSurface(); private: void sizeHint_data(); @@ -1609,6 +1610,34 @@ void tst_QVideoWidget::paintRendererControl() QCOMPARE(surface->isReady(), true); } +void tst_QVideoWidget::paintSurface() +{ + QtTestVideoWidget widget; + widget.resize(640,480); + widget.show(); + QVERIFY(QTest::qWaitForWindowExposed(&widget)); + + QVERIFY(widget.videoSurface()); + auto surface = qobject_cast<QPainterVideoSurface *>( + widget.videoSurface()); + QVERIFY(surface); + + QVideoSurfaceFormat format(QSize(2, 2), QVideoFrame::Format_RGB32); + QVERIFY(surface->start(format)); + QCOMPARE(surface->isActive(), true); + + QVideoFrame frame(sizeof(rgb32ImageData), QSize(2, 2), 8, QVideoFrame::Format_RGB32); + frame.map(QAbstractVideoBuffer::WriteOnly); + memcpy(frame.bits(), rgb32ImageData, frame.mappedBytes()); + frame.unmap(); + + QVERIFY(surface->present(frame)); + QCOMPARE(surface->isReady(), false); + QTRY_COMPARE(surface->isReady(), true); + QCOMPARE(surface->isActive(), true); + QCOMPARE(surface->isReady(), true); +} + QTEST_MAIN(tst_QVideoWidget) #include "tst_qvideowidget.moc" |