summaryrefslogtreecommitdiffstats
path: root/tests/auto/qpaintervideosurface/tst_qpaintervideosurface.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tests/auto/qpaintervideosurface/tst_qpaintervideosurface.cpp')
-rw-r--r--tests/auto/qpaintervideosurface/tst_qpaintervideosurface.cpp1249
1 files changed, 0 insertions, 1249 deletions
diff --git a/tests/auto/qpaintervideosurface/tst_qpaintervideosurface.cpp b/tests/auto/qpaintervideosurface/tst_qpaintervideosurface.cpp
deleted file mode 100644
index 53ed906..0000000
--- a/tests/auto/qpaintervideosurface/tst_qpaintervideosurface.cpp
+++ /dev/null
@@ -1,1249 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part 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 <private/qpaintervideosurface_p.h>
-#include <QtTest/QtTest>
-
-#include <QtWidgets/qapplication.h>
-#include <qvideosurfaceformat.h>
-
-#if !defined(QT_NO_OPENGL) && !defined(QT_OPENGL_ES_1_CL) && !defined(QT_OPENGL_ES_1)
-#include <QtOpenGL/qgl.h>
-#include <QtOpenGL/qglframebufferobject.h>
-#endif
-
-QT_USE_NAMESPACE
-class tst_QPainterVideoSurface : public QObject
-{
- Q_OBJECT
-private slots:
- void cleanup() {}
- void cleanupTestCase() {}
-
- void colors();
-
- void supportedFormat_data();
- void supportedFormat();
-
- void present_data();
- void present();
- void presentOpaqueFrame();
-
-#if !defined(QT_NO_OPENGL) && !defined(QT_OPENGL_ES_1_CL) && !defined(QT_OPENGL_ES_1)
-
- void shaderType();
-
- void shaderTypeStarted_data();
- void shaderTypeStarted();
-
- void shaderSupportedFormat_data();
- void shaderSupportedFormat();
-
- void shaderPresent_data();
- void shaderPresent();
- void shaderPresentOpaqueFrame_data();
- void shaderPresentOpaqueFrame();
- void shaderPresentGLFrame_data();
- void shaderPresentGLFrame();
-#endif
-};
-
-Q_DECLARE_METATYPE(const uchar *)
-
-#if !defined(QT_NO_OPENGL) && !defined(QT_OPENGL_ES_1_CL) && !defined(QT_OPENGL_ES_1)
-Q_DECLARE_METATYPE(QPainterVideoSurface::ShaderType);
-
-class QtTestGLVideoBuffer : public QAbstractVideoBuffer
-{
-public:
- QtTestGLVideoBuffer()
- : QAbstractVideoBuffer(GLTextureHandle)
- , m_textureId(0)
- {
- glGenTextures(1, &m_textureId);
- }
-
- ~QtTestGLVideoBuffer()
- {
- glDeleteTextures(1, &m_textureId);
- }
-
- GLuint textureId() const { return m_textureId; }
-
- QVariant handle() const { return m_textureId; }
-
- uchar *map(MapMode, int *, int *) { return 0; }
- void unmap() {}
- MapMode mapMode() const { return NotMapped; }
-
-private:
- GLuint m_textureId;
-};
-
-#endif
-
-class QtTestOpaqueVideoBuffer : public QAbstractVideoBuffer
-{
-public:
- QtTestOpaqueVideoBuffer()
- : QAbstractVideoBuffer(UserHandle)
- {}
-
- uchar *map(MapMode, int *, int *) { return 0; }
- void unmap() {}
- MapMode mapMode() const { return NotMapped; }
-};
-
-void tst_QPainterVideoSurface::colors()
-{
- QPainterVideoSurface surface;
-
- QCOMPARE(surface.brightness(), 0);
- QCOMPARE(surface.contrast(), 0);
- QCOMPARE(surface.hue(), 0);
- QCOMPARE(surface.saturation(), 0);
-
- surface.setBrightness(56);
- QCOMPARE(surface.brightness(), 56);
-
- surface.setContrast(43);
- QCOMPARE(surface.contrast(), 43);
-
- surface.setHue(-84);
- QCOMPARE(surface.hue(), -84);
-
- surface.setSaturation(100);
- QCOMPARE(surface.saturation(), 100);
-}
-
-static const uchar rgb32ImageData[] =
-{
- 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00,
- 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00
-};
-
-static const uchar argb32ImageData[] =
-{
- 0x00, 0xff, 0x00, 0x00, 0xcc, 0x00, 0xff, 0xcc,
- 0x77, 0x00, 0x00, 0x77, 0x00, 0xff, 0xff, 0x00
-};
-
-static const uchar rgb24ImageData[] =
-{
- 0x00, 0xff, 0x00, 0x00, 0xcc, 0x00, 0x00, 0x00,
- 0xcc, 0x00, 0xcc, 0x77, 0xff, 0x77, 0x00, 0x00
-};
-
-static const uchar rgb565ImageData[] =
-{
- 0xff, 0xff, 0xff, 0xff,
- 0x00, 0x00, 0x00, 0x00
-};
-
-static const uchar yuvPlanarImageData[] =
-{
- 0x00, 0x00, 0x0f, 0xff, 0xff, 0x0f, 0x00, 0x00,
- 0x00, 0x0f, 0xff, 0x0f, 0x0f, 0xff, 0x0f, 0x00,
- 0x00, 0xff, 0x0f, 0x00, 0x00, 0x0f, 0xff, 0x00,
- 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff,
- 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff,
- 0x0f, 0xff, 0x0f, 0x00, 0x00, 0x0f, 0xff, 0x0f,
- 0x00, 0x0f, 0xff, 0x0f, 0x0f, 0xff, 0x0f, 0x00,
- 0x00, 0x00, 0x0f, 0xff, 0xff, 0x0f, 0x00, 0x00,
- 0x00, 0x0f, 0x0f, 0x00,
- 0x0f, 0x00, 0x00, 0x0f,
- 0x0f, 0x00, 0x00, 0x0f,
- 0x00, 0x0f, 0x0f, 0x00,
- 0x00, 0x0f, 0x0f, 0x00,
- 0x0f, 0x00, 0x00, 0x0f,
- 0x0f, 0x00, 0x00, 0x0f,
- 0x00, 0x0f, 0x0f, 0x00,
-};
-
-void tst_QPainterVideoSurface::supportedFormat_data()
-{
- QTest::addColumn<QAbstractVideoBuffer::HandleType>("handleType");
- QTest::addColumn<QVideoFrame::PixelFormat>("pixelFormat");
- QTest::addColumn<QSize>("frameSize");
- QTest::addColumn<bool>("supportedPixelFormat");
- QTest::addColumn<bool>("supportedFormat");
-
- QTest::newRow("rgb32 640x480")
- << QAbstractVideoBuffer::NoHandle
- << QVideoFrame::Format_RGB32
- << QSize(640, 480)
- << true
- << true;
- QTest::newRow("rgb32 -640x480")
- << QAbstractVideoBuffer::NoHandle
- << QVideoFrame::Format_RGB32
- << QSize(-640, 480)
- << true
- << false;
- QTest::newRow("rgb24 1024x768")
- << QAbstractVideoBuffer::NoHandle
- << QVideoFrame::Format_RGB24
- << QSize(1024, 768)
-#ifndef QT_OPENGL_ES
- << true
- << true;
-#else
- << false
- << false;
-#endif
- QTest::newRow("rgb24 -1024x-768")
- << QAbstractVideoBuffer::NoHandle
- << QVideoFrame::Format_RGB24
- << QSize(-1024, -768)
-#ifndef QT_OPENGL_ES
- << true
-#else
- << false
-#endif
- << false;
- QTest::newRow("rgb565 0x0")
- << QAbstractVideoBuffer::NoHandle
- << QVideoFrame::Format_RGB565
- << QSize(0, 0)
- << true
- << false;
- QTest::newRow("YUV420P 640x480")
- << QAbstractVideoBuffer::NoHandle
- << QVideoFrame::Format_YUV420P
- << QSize(640, 480)
- << false
- << false;
- QTest::newRow("YUV420P 640x-480")
- << QAbstractVideoBuffer::NoHandle
- << QVideoFrame::Format_YUV420P
- << QSize(640, -480)
- << false
- << false;
- QTest::newRow("Y8 640x480")
- << QAbstractVideoBuffer::NoHandle
- << QVideoFrame::Format_Y8
- << QSize(640, 480)
- << false
- << false;
- QTest::newRow("Texture: rgb32 640x480")
- << QAbstractVideoBuffer::GLTextureHandle
- << QVideoFrame::Format_RGB32
- << QSize(640, 480)
- << false
- << false;
- QTest::newRow("Texture: rgb32 -640x480")
- << QAbstractVideoBuffer::GLTextureHandle
- << QVideoFrame::Format_RGB32
- << QSize(-640, 480)
- << false
- << false;
- QTest::newRow("rgb565 32x32")
- << QAbstractVideoBuffer::NoHandle
- << QVideoFrame::Format_RGB565
- << QSize(32, 32)
- << true
- << true;
- QTest::newRow("rgb565 0x0")
- << QAbstractVideoBuffer::NoHandle
- << QVideoFrame::Format_RGB565
- << QSize(0, 0)
- << true
- << false;
- QTest::newRow("argb32 256x256")
- << QAbstractVideoBuffer::NoHandle
- << QVideoFrame::Format_ARGB32
- << QSize(256, 256)
- << true
- << true;
- QTest::newRow("Texture: rgb24 1024x768")
- << QAbstractVideoBuffer::GLTextureHandle
- << QVideoFrame::Format_RGB24
- << QSize(1024, 768)
- << false
- << false;
- QTest::newRow("Texture: rgb24 -1024x-768")
- << QAbstractVideoBuffer::GLTextureHandle
- << QVideoFrame::Format_RGB24
- << QSize(-1024, -768)
- << false
- << false;
- QTest::newRow("Texture: YUV420P 640x480")
- << QAbstractVideoBuffer::GLTextureHandle
- << QVideoFrame::Format_YUV420P
- << QSize(640, 480)
- << false
- << false;
- QTest::newRow("Texture: YUV420P 640x-480")
- << QAbstractVideoBuffer::GLTextureHandle
- << QVideoFrame::Format_YUV420P
- << QSize(640, -480)
- << false
- << false;
- QTest::newRow("User Buffer: rgb32 256x256")
- << QAbstractVideoBuffer::UserHandle
- << QVideoFrame::Format_RGB32
- << QSize(256, 256)
- << false
- << false;
-#if !defined(Q_OS_MAC)
- QTest::newRow("Pixmap: rgb32 640x480")
- << QAbstractVideoBuffer::QPixmapHandle
- << QVideoFrame::Format_RGB32
- << QSize(640, 480)
- << true
- << true;
- QTest::newRow("Pixmap: YUV420P 640x480")
- << QAbstractVideoBuffer::QPixmapHandle
- << QVideoFrame::Format_YUV420P
- << QSize(640, 480)
- << false
- << true;
-#endif
-}
-
-void tst_QPainterVideoSurface::supportedFormat()
-{
- QFETCH(QAbstractVideoBuffer::HandleType, handleType);
- QFETCH(QVideoFrame::PixelFormat, pixelFormat);
- QFETCH(QSize, frameSize);
- QFETCH(bool, supportedPixelFormat);
- QFETCH(bool, supportedFormat);
-
- QPainterVideoSurface surface;
-
- const QList<QVideoFrame::PixelFormat> pixelFormats = surface.supportedPixelFormats(handleType);
-
- QCOMPARE(pixelFormats.contains(pixelFormat), QBool(supportedPixelFormat));
-
- QVideoSurfaceFormat format(frameSize, pixelFormat, handleType);
-
- QCOMPARE(surface.isFormatSupported(format), supportedFormat);
- QCOMPARE(surface.start(format), supportedFormat);
-}
-
-void tst_QPainterVideoSurface::present_data()
-{
- QTest::addColumn<QVideoFrame::PixelFormat>("pixelFormatA");
- QTest::addColumn<QSize>("frameSizeA");
- QTest::addColumn<const uchar *>("frameDataA");
- QTest::addColumn<int>("bytesA");
- QTest::addColumn<int>("bytesPerLineA");
- QTest::addColumn<QVideoFrame::PixelFormat>("pixelFormatB");
- QTest::addColumn<QSize>("frameSizeB");
- QTest::addColumn<const uchar *>("frameDataB");
- QTest::addColumn<int>("bytesB");
- QTest::addColumn<int>("bytesPerLineB");
-
- QTest::newRow("rgb32 -> argb32")
- << QVideoFrame::Format_RGB32
- << QSize(2, 2)
- << static_cast<const uchar *>(rgb32ImageData)
- << int(sizeof(rgb32ImageData))
- << 8
- << QVideoFrame::Format_ARGB32
- << QSize(2, 2)
- << static_cast<const uchar *>(argb32ImageData)
- << int(sizeof(argb32ImageData))
- << 8;
-
-#ifndef QT_OPENGL_ES
- QTest::newRow("rgb32 -> rgb24")
- << QVideoFrame::Format_RGB32
- << QSize(2, 2)
- << static_cast<const uchar *>(rgb32ImageData)
- << int(sizeof(rgb32ImageData))
- << 8
- << QVideoFrame::Format_RGB24
- << QSize(2, 2)
- << static_cast<const uchar *>(rgb24ImageData)
- << int(sizeof(rgb24ImageData))
- << 8;
-#endif
-
- QTest::newRow("rgb32 -> rgb565")
- << QVideoFrame::Format_RGB32
- << QSize(2, 2)
- << static_cast<const uchar *>(rgb32ImageData)
- << int(sizeof(rgb32ImageData))
- << 8
- << QVideoFrame::Format_RGB565
- << QSize(2, 2)
- << static_cast<const uchar *>(rgb565ImageData)
- << int(sizeof(rgb565ImageData))
- << 4;
-
-#ifndef QT_OPENGL_ES
- QTest::newRow("rgb24 -> rgb565")
- << QVideoFrame::Format_RGB24
- << QSize(2, 2)
- << static_cast<const uchar *>(rgb24ImageData)
- << int(sizeof(rgb24ImageData))
- << 8
- << QVideoFrame::Format_RGB565
- << QSize(2, 2)
- << static_cast<const uchar *>(rgb565ImageData)
- << int(sizeof(rgb565ImageData))
- << 4;
-#endif
-}
-
-void tst_QPainterVideoSurface::present()
-{
- QFETCH(QVideoFrame::PixelFormat, pixelFormatA);
- QFETCH(QSize, frameSizeA);
- QFETCH(const uchar *, frameDataA);
- QFETCH(int, bytesA);
- QFETCH(int, bytesPerLineA);
- QFETCH(QVideoFrame::PixelFormat, pixelFormatB);
- QFETCH(QSize, frameSizeB);
- QFETCH(const uchar *, frameDataB);
- QFETCH(int, bytesB);
- QFETCH(int, bytesPerLineB);
-
- QPainterVideoSurface surface;
-
- QImage image(320, 240, QImage::Format_RGB32);
-
- QSignalSpy frameSpy(&surface, SIGNAL(frameChanged()));
-
- const QList<QVideoFrame::PixelFormat> pixelFormats = surface.supportedPixelFormats();
-
- { // Test painting before started.
- QPainter painter(&image);
- surface.paint(&painter, QRect(0, 0, 320, 240));
- }
-
- QVideoSurfaceFormat formatA(frameSizeA, pixelFormatA);
-
- QVERIFY(surface.start(formatA));
- QCOMPARE(surface.isActive(), true);
- QCOMPARE(surface.isReady(), true);
-
- { // Test painting before receiving a frame.
- QPainter painter(&image);
- surface.paint(&painter, QRect(0, 0, 320, 240));
- }
- QCOMPARE(surface.error(), QAbstractVideoSurface::NoError);
-
- QVideoFrame frameA(bytesA, frameSizeA, bytesPerLineA, pixelFormatA);
-
- frameA.map(QAbstractVideoBuffer::WriteOnly);
- memcpy(frameA.bits(), frameDataA, frameA.mappedBytes());
- frameA.unmap();
-
- QVERIFY(surface.present(frameA));
- QCOMPARE(surface.isReady(), false);
- QCOMPARE(frameSpy.count(), 1);
-
- {
- QPainter painter(&image);
- surface.paint(&painter, QRect(0, 0, 320, 240));
- }
- QCOMPARE(surface.isActive(), true);
- QCOMPARE(surface.isReady(), false);
-
- { // Test repainting before receiving another frame.
- QPainter painter(&image);
- surface.paint(&painter, QRect(0, 0, 320, 240));
- }
- QCOMPARE(surface.isActive(), true);
- QCOMPARE(surface.isReady(), false);
-
- // Not ready.
- QVERIFY(!surface.present(frameA));
- QCOMPARE(frameSpy.count(), 1);
-
- surface.setReady(true);
- QCOMPARE(surface.isReady(), true);
- QVERIFY(surface.present(frameA));
- QCOMPARE(frameSpy.count(), 2);
-
- // Try switching to a different format after starting.
- QVideoSurfaceFormat formatB(frameSizeB, pixelFormatB);
-
- QVERIFY(surface.start(formatB));
- QCOMPARE(surface.isActive(), true);
- QCOMPARE(surface.isReady(), true);
-
- QVideoFrame frameB(bytesB, frameSizeB, bytesPerLineB, pixelFormatB);
-
- frameB.map(QAbstractVideoBuffer::WriteOnly);
- memcpy(frameB.bits(), frameDataB, frameB.mappedBytes());
- frameB.unmap();
-
- QVERIFY(surface.present(frameB));
- QCOMPARE(surface.isReady(), false);
- QCOMPARE(frameSpy.count(), 3);
-
- {
- QPainter painter(&image);
- surface.paint(&painter, QRect(0, 0, 320, 240));
- }
- QVERIFY(surface.isActive());
-
- surface.stop();
-
- QCOMPARE(surface.isActive(), false);
- QCOMPARE(surface.isReady(), false);
-
- // Try presenting a frame while stopped.
- QVERIFY(!surface.present(frameB));
- QCOMPARE(surface.isReady(), false);
- QCOMPARE(surface.error(), QAbstractVideoSurface::StoppedError);
-
- // Try presenting a frame with a different format.
- QVERIFY(surface.start(formatB));
- QVERIFY(!surface.present(frameA));
- QCOMPARE(surface.isActive(), false);
- QCOMPARE(surface.isReady(), false);
- QCOMPARE(surface.error(), QAbstractVideoSurface::IncorrectFormatError);
-}
-
-void tst_QPainterVideoSurface::presentOpaqueFrame()
-{
- QPainterVideoSurface surface;
-
- QImage image(320, 240, QImage::Format_RGB32);
-
- QVideoSurfaceFormat format(QSize(64, 64), QVideoFrame::Format_RGB32);
-
- QVERIFY(surface.start(format));
- QCOMPARE(surface.isActive(), true);
- QCOMPARE(surface.isReady(), true);
-
- QVideoFrame frame(new QtTestOpaqueVideoBuffer, QSize(64, 64), QVideoFrame::Format_RGB32);
-
- if (surface.present(frame)) {
- QPainter painter(&image);
- surface.paint(&painter, QRect(0, 0, 320, 240));
- }
-
- QCOMPARE(surface.isActive(), false);
- QCOMPARE(surface.isReady(), false);
- QCOMPARE(surface.error(), QAbstractVideoSurface::IncorrectFormatError);
-}
-
-#if !defined(QT_NO_OPENGL) && !defined(QT_OPENGL_ES_1_CL) && !defined(QT_OPENGL_ES_1)
-
-void tst_QPainterVideoSurface::shaderType()
-{
- QPainterVideoSurface surface;
- QGLWidget widget;
- widget.makeCurrent();
-
- QCOMPARE(surface.shaderType(), QPainterVideoSurface::NoShaders);
- QCOMPARE(surface.supportedShaderTypes(), QPainterVideoSurface::NoShaders);
-
- surface.setGLContext(const_cast<QGLContext *>(widget.context()));
- QCOMPARE(surface.glContext(), widget.context());
-
- {
- QSignalSpy spy(&surface, SIGNAL(supportedFormatsChanged()));
-
- surface.setShaderType(QPainterVideoSurface::NoShaders);
- QCOMPARE(surface.shaderType(), QPainterVideoSurface::NoShaders);
- QCOMPARE(spy.count(), 0);
- }
-
-#ifndef QT_OPENGL_ES
- if (surface.supportedShaderTypes() & QPainterVideoSurface::FragmentProgramShader) {
- QSignalSpy spy(&surface, SIGNAL(supportedFormatsChanged()));
-
- surface.setShaderType(QPainterVideoSurface::FragmentProgramShader);
- QCOMPARE(surface.shaderType(), QPainterVideoSurface::FragmentProgramShader);
- QCOMPARE(spy.count(), 1);
-
- surface.setShaderType(QPainterVideoSurface::FragmentProgramShader);
- QCOMPARE(surface.shaderType(), QPainterVideoSurface::FragmentProgramShader);
- QCOMPARE(spy.count(), 1);
- }
-#endif
-
- if (surface.supportedShaderTypes() & QPainterVideoSurface::GlslShader) {
- QSignalSpy spy(&surface, SIGNAL(supportedFormatsChanged()));
-
- surface.setShaderType(QPainterVideoSurface::GlslShader);
- QCOMPARE(surface.shaderType(), QPainterVideoSurface::GlslShader);
- QCOMPARE(spy.count(), 1);
-
- surface.setShaderType(QPainterVideoSurface::GlslShader);
- QCOMPARE(surface.shaderType(), QPainterVideoSurface::GlslShader);
- QCOMPARE(spy.count(), 1);
- }
-
- {
- QSignalSpy spy(&surface, SIGNAL(supportedFormatsChanged()));
-
- surface.setGLContext(const_cast<QGLContext *>(widget.context()));
- QCOMPARE(surface.glContext(), widget.context());
- QCOMPARE(spy.count(), 0);
- }
-
- surface.setGLContext(0);
- QCOMPARE(surface.shaderType(), QPainterVideoSurface::NoShaders);
- QCOMPARE(surface.supportedShaderTypes(), QPainterVideoSurface::NoShaders);
-
- {
- QSignalSpy spy(&surface, SIGNAL(supportedFormatsChanged()));
-
- surface.setShaderType(QPainterVideoSurface::NoShaders);
- QCOMPARE(surface.shaderType(), QPainterVideoSurface::NoShaders);
- QCOMPARE(spy.count(), 0);
-
-#ifndef QT_OPENGL_ES
- surface.setShaderType(QPainterVideoSurface::FragmentProgramShader);
- QCOMPARE(surface.shaderType(), QPainterVideoSurface::NoShaders);
- QCOMPARE(spy.count(), 0);
-#endif
-
- surface.setShaderType(QPainterVideoSurface::GlslShader);
- QCOMPARE(surface.shaderType(), QPainterVideoSurface::NoShaders);
- QCOMPARE(spy.count(), 0);
- }
-}
-
-void tst_QPainterVideoSurface::shaderTypeStarted_data()
-{
- QTest::addColumn<QPainterVideoSurface::ShaderType>("shaderType");
-
-#ifndef QT_OPENGL_ES
- QTest::newRow("ARBfp")
- << QPainterVideoSurface::FragmentProgramShader;
-#endif
- QTest::newRow("GLSL")
- << QPainterVideoSurface::GlslShader;
-}
-
-void tst_QPainterVideoSurface::shaderTypeStarted()
-{
- QFETCH(QPainterVideoSurface::ShaderType, shaderType);
-
- QGLWidget widget;
- widget.makeCurrent();
-
- QPainterVideoSurface surface;
-
- surface.setGLContext(const_cast<QGLContext *>(widget.context()));
-
- if (!(surface.supportedShaderTypes() & shaderType))
- QSKIP("Shader type unsupported on this platform", SkipSingle);
-
- surface.setShaderType(shaderType);
- QCOMPARE(surface.shaderType(), shaderType);
-
- QVERIFY(surface.start(QVideoSurfaceFormat(QSize(640, 480), QVideoFrame::Format_RGB32)));
- {
- QSignalSpy spy(&surface, SIGNAL(activeChanged(bool)));
-
- surface.setShaderType(QPainterVideoSurface::NoShaders);
- QCOMPARE(surface.shaderType(), QPainterVideoSurface::NoShaders);
- QCOMPARE(surface.isActive(), false);
- QCOMPARE(spy.count(), 1);
- QCOMPARE(spy.last().value(0).toBool(), false);
- }
-
- QVERIFY(surface.start(QVideoSurfaceFormat(QSize(640, 480), QVideoFrame::Format_RGB32)));
- {
- QSignalSpy spy(&surface, SIGNAL(activeChanged(bool)));
-
- surface.setShaderType(QPainterVideoSurface::NoShaders);
- QCOMPARE(surface.shaderType(), QPainterVideoSurface::NoShaders);
- QCOMPARE(surface.isActive(), true);
- QCOMPARE(spy.count(), 0);
-
- surface.setShaderType(shaderType);
- QCOMPARE(surface.shaderType(), shaderType);
- QCOMPARE(surface.isActive(), false);
- QCOMPARE(spy.count(), 1);
- QCOMPARE(spy.last().value(0).toBool(), false);
- }
-
- QVERIFY(surface.start(QVideoSurfaceFormat(QSize(640, 480), QVideoFrame::Format_RGB32)));
- {
- QSignalSpy spy(&surface, SIGNAL(activeChanged(bool)));
-
- surface.setShaderType(shaderType);
- QCOMPARE(surface.shaderType(), shaderType);
- QCOMPARE(surface.isActive(), true);
- QCOMPARE(spy.count(), 0);
-
- surface.setGLContext(0);
- QCOMPARE(surface.shaderType(), QPainterVideoSurface::NoShaders);
- QCOMPARE(surface.isActive(), false);
- QCOMPARE(spy.count(), 1);
- QCOMPARE(spy.last().value(0).toBool(), false);
- }
-}
-
-void tst_QPainterVideoSurface::shaderSupportedFormat_data()
-{
- QTest::addColumn<QPainterVideoSurface::ShaderType>("shaderType");
- QTest::addColumn<QAbstractVideoBuffer::HandleType>("handleType");
- QTest::addColumn<QVideoFrame::PixelFormat>("pixelFormat");
- QTest::addColumn<QSize>("frameSize");
- QTest::addColumn<bool>("supportedPixelFormat");
- QTest::addColumn<bool>("supportedFormat");
-
- QList<QPair<QPainterVideoSurface::ShaderType, QByteArray> > types;
-
-
-#ifndef QT_OPENGL_ES
- types << qMakePair(QPainterVideoSurface::FragmentProgramShader, QByteArray("ARBfp: "));
-#endif
- types << qMakePair(QPainterVideoSurface::GlslShader, QByteArray("GLSL: "));
-
- QPair<QPainterVideoSurface::ShaderType, QByteArray> type;
- foreach (type, types) {
- QTest::newRow((type.second + "rgb32 640x480").constData())
- << type.first
- << QAbstractVideoBuffer::NoHandle
- << QVideoFrame::Format_RGB32
- << QSize(640, 480)
- << true
- << true;
- QTest::newRow((type.second + "rgb32 -640x480").constData())
- << type.first
- << QAbstractVideoBuffer::NoHandle
- << QVideoFrame::Format_RGB32
- << QSize(-640, 480)
- << true
- << false;
- QTest::newRow((type.second + "rgb565 32x32").constData())
- << type.first
- << QAbstractVideoBuffer::NoHandle
- << QVideoFrame::Format_RGB565
- << QSize(32, 32)
- << true
- << true;
- QTest::newRow((type.second + "rgb565 0x0").constData())
- << type.first
- << QAbstractVideoBuffer::NoHandle
- << QVideoFrame::Format_RGB565
- << QSize(0, 0)
- << true
- << false;
- QTest::newRow((type.second + "argb32 256x256").constData())
- << type.first
- << QAbstractVideoBuffer::NoHandle
- << QVideoFrame::Format_ARGB32
- << QSize(256, 256)
- << true
- << true;
- QTest::newRow((type.second + "rgb24 1024x768").constData())
- << type.first
- << QAbstractVideoBuffer::NoHandle
- << QVideoFrame::Format_RGB24
- << QSize(1024, 768)
-#ifndef QT_OPENGL_ES
- << true
- << true;
-#else
- << false
- << false;
-#endif
- QTest::newRow((type.second + "rgb24 -1024x-768").constData())
- << type.first
- << QAbstractVideoBuffer::NoHandle
- << QVideoFrame::Format_RGB24
- << QSize(-1024, -768)
-#ifndef QT_OPENGL_ES
- << true
-#else
- << false
-#endif
- << false;
-#ifndef Q_WS_MAC
- QTest::newRow((type.second + "YUV420P 640x480").constData())
- << type.first
- << QAbstractVideoBuffer::NoHandle
- << QVideoFrame::Format_YUV420P
- << QSize(640, 480)
- << true
- << true;
- QTest::newRow((type.second + "YUV420P 640x-480").constData())
- << type.first
- << QAbstractVideoBuffer::NoHandle
- << QVideoFrame::Format_YUV420P
- << QSize(640, -480)
- << true
- << false;
-#endif
- QTest::newRow((type.second + "Y8 640x480").constData())
- << type.first
- << QAbstractVideoBuffer::NoHandle
- << QVideoFrame::Format_Y8
- << QSize(640, 480)
- << false
- << false;
- QTest::newRow((type.second + "Texture: rgb32 640x480").constData())
- << type.first
- << QAbstractVideoBuffer::GLTextureHandle
- << QVideoFrame::Format_RGB32
- << QSize(640, 480)
- << true
- << true;
- QTest::newRow((type.second + "Texture: rgb32 -640x480").constData())
- << type.first
- << QAbstractVideoBuffer::GLTextureHandle
- << QVideoFrame::Format_RGB32
- << QSize(-640, 480)
- << true
- << false;
-#ifndef Q_WS_MAC
- QTest::newRow((type.second + "Texture: rgb565 32x32").constData())
- << type.first
- << QAbstractVideoBuffer::GLTextureHandle
- << QVideoFrame::Format_RGB565
- << QSize(32, 32)
- << false
- << false;
- QTest::newRow((type.second + "Texture: rgb565 0x0").constData())
- << type.first
- << QAbstractVideoBuffer::GLTextureHandle
- << QVideoFrame::Format_RGB565
- << QSize(0, 0)
- << false
- << false;
-#endif
- QTest::newRow((type.second + "Texture argb32 256x256").constData())
- << type.first
- << QAbstractVideoBuffer::GLTextureHandle
- << QVideoFrame::Format_ARGB32
- << QSize(256, 256)
- << true
- << true;
-#ifndef Q_WS_MAC
- QTest::newRow((type.second + "Texture: rgb24 1024x768").constData())
- << type.first
- << QAbstractVideoBuffer::GLTextureHandle
- << QVideoFrame::Format_RGB24
- << QSize(1024, 768)
- << false
- << false;
- QTest::newRow((type.second + "Texture: rgb24 -1024x-768").constData())
- << type.first
- << QAbstractVideoBuffer::GLTextureHandle
- << QVideoFrame::Format_RGB24
- << QSize(-1024, -768)
- << false
- << false;
- QTest::newRow((type.second + "Texture: YUV420P 640x480").constData())
- << type.first
- << QAbstractVideoBuffer::GLTextureHandle
- << QVideoFrame::Format_YUV420P
- << QSize(640, 480)
- << false
- << false;
- QTest::newRow((type.second + "Texture: YUV420P 640x-480").constData())
- << type.first
- << QAbstractVideoBuffer::GLTextureHandle
- << QVideoFrame::Format_YUV420P
- << QSize(640, -480)
- << false
- << false;
-#endif
- QTest::newRow(type.second + "User Buffer: rgb32 256x256")
- << type.first
- << QAbstractVideoBuffer::UserHandle
- << QVideoFrame::Format_RGB32
- << QSize(256, 256)
- << false
- << false;
- }
-}
-
-void tst_QPainterVideoSurface::shaderSupportedFormat()
-{
- QFETCH(QPainterVideoSurface::ShaderType, shaderType);
- QFETCH(QAbstractVideoBuffer::HandleType, handleType);
- QFETCH(QVideoFrame::PixelFormat, pixelFormat);
- QFETCH(QSize, frameSize);
- QFETCH(bool, supportedPixelFormat);
- QFETCH(bool, supportedFormat);
-
- QGLWidget widget;
- widget.makeCurrent();
-
- QPainterVideoSurface surface;
- surface.setGLContext(const_cast<QGLContext *>(widget.context()));
-
-
- if (!(surface.supportedShaderTypes() & shaderType))
- QSKIP("Shader type not supported on this platform", SkipSingle);
-
- surface.setShaderType(shaderType);
- if (surface.shaderType() != shaderType)
- QSKIP("Shader type couldn't be set", SkipSingle);
-
- const QList<QVideoFrame::PixelFormat> pixelFormats = surface.supportedPixelFormats(handleType);
-
- QCOMPARE(pixelFormats.contains(pixelFormat), QBool(supportedPixelFormat));
-
- QVideoSurfaceFormat format(frameSize, pixelFormat, handleType);
-
- QCOMPARE(surface.isFormatSupported(format), supportedFormat);
- QCOMPARE(surface.start(format), supportedFormat);
-}
-
-void tst_QPainterVideoSurface::shaderPresent_data()
-{
- QTest::addColumn<QPainterVideoSurface::ShaderType>("shaderType");
- QTest::addColumn<QVideoFrame::PixelFormat>("pixelFormatA");
- QTest::addColumn<QSize>("frameSizeA");
- QTest::addColumn<const uchar *>("frameDataA");
- QTest::addColumn<int>("bytesA");
- QTest::addColumn<int>("bytesPerLineA");
- QTest::addColumn<QVideoFrame::PixelFormat>("pixelFormatB");
- QTest::addColumn<QSize>("frameSizeB");
- QTest::addColumn<const uchar *>("frameDataB");
- QTest::addColumn<int>("bytesB");
- QTest::addColumn<int>("bytesPerLineB");
-
- QList<QPair<QPainterVideoSurface::ShaderType, QByteArray> > types;
-#ifndef QT_OPENGL_ES
- types << qMakePair(QPainterVideoSurface::FragmentProgramShader, QByteArray("ARBfp: "));
-#endif
- types << qMakePair(QPainterVideoSurface::GlslShader, QByteArray("GLSL: "));
-
- QPair<QPainterVideoSurface::ShaderType, QByteArray> type;
- foreach (type, types) {
- QTest::newRow((type.second + "rgb32 -> argb32").constData())
- << type.first
- << QVideoFrame::Format_RGB32
- << QSize(2, 2)
- << static_cast<const uchar *>(rgb32ImageData)
- << int(sizeof(rgb32ImageData))
- << 8
- << QVideoFrame::Format_ARGB32
- << QSize(2, 2)
- << static_cast<const uchar *>(argb32ImageData)
- << int(sizeof(argb32ImageData))
- << 8;
-
- QTest::newRow((type.second + "rgb32 -> rgb565").constData())
- << type.first
- << QVideoFrame::Format_RGB32
- << QSize(2, 2)
- << static_cast<const uchar *>(rgb32ImageData)
- << int(sizeof(rgb32ImageData))
- << 8
- << QVideoFrame::Format_RGB565
- << QSize(2, 2)
- << static_cast<const uchar *>(rgb565ImageData)
- << int(sizeof(rgb565ImageData))
- << 4;
-#ifndef Q_WS_MAC
- QTest::newRow((type.second + "rgb32 -> yuv420p").constData())
- << type.first
- << QVideoFrame::Format_RGB32
- << QSize(2, 2)
- << static_cast<const uchar *>(rgb32ImageData)
- << int(sizeof(rgb32ImageData))
- << 8
- << QVideoFrame::Format_YUV420P
- << QSize(8, 8)
- << static_cast<const uchar *>(yuvPlanarImageData)
- << int(sizeof(yuvPlanarImageData))
- << 8;
-
- QTest::newRow((type.second + "yv12 -> rgb32").constData())
- << type.first
- << QVideoFrame::Format_YV12
- << QSize(8, 8)
- << static_cast<const uchar *>(yuvPlanarImageData)
- << int(sizeof(yuvPlanarImageData))
- << 8
- << QVideoFrame::Format_RGB32
- << QSize(2, 2)
- << static_cast<const uchar *>(rgb32ImageData)
- << int(sizeof(rgb32ImageData))
- << 8;
-#endif
- }
-}
-
-void tst_QPainterVideoSurface::shaderPresent()
-{
- QFETCH(QPainterVideoSurface::ShaderType, shaderType);
- QFETCH(QVideoFrame::PixelFormat, pixelFormatA);
- QFETCH(QSize, frameSizeA);
- QFETCH(const uchar *, frameDataA);
- QFETCH(int, bytesA);
- QFETCH(int, bytesPerLineA);
- QFETCH(QVideoFrame::PixelFormat, pixelFormatB);
- QFETCH(QSize, frameSizeB);
- QFETCH(const uchar *, frameDataB);
- QFETCH(int, bytesB);
- QFETCH(int, bytesPerLineB);
-
- QGLWidget widget;
- widget.makeCurrent();
-
- QPainterVideoSurface surface;
- surface.setGLContext(const_cast<QGLContext *>(widget.context()));
-
- if (!(surface.supportedShaderTypes() & shaderType))
- QSKIP("Shader type unsupported on this platform", SkipSingle);
-
- surface.setShaderType(shaderType);
- if (surface.shaderType() != shaderType)
- QSKIP("Shader type couldn't be set", SkipSingle);
-
- QSignalSpy frameSpy(&surface, SIGNAL(frameChanged()));
-
- { // Test painting before starting the surface.
- QPainter painter(&widget);
- surface.paint(&painter, QRect(0, 0, 320, 240));
- }
- QCOMPARE(surface.error(), QAbstractVideoSurface::NoError);
-
- QVideoSurfaceFormat formatA(frameSizeA, pixelFormatA);
-
- QVERIFY(surface.start(formatA));
- QCOMPARE(surface.isActive(), true);
- QCOMPARE(surface.isReady(), true);
-
- // Test painting before receiving a frame.
- {
- QPainter painter(&widget);
- surface.paint(&painter, QRect(0, 0, 320, 240));
- }
- QCOMPARE(surface.isActive(), true);
- QCOMPARE(surface.isReady(), true);
-
- QVideoFrame frameA(bytesA, frameSizeA, bytesPerLineA, pixelFormatA);
-
- frameA.map(QAbstractVideoBuffer::WriteOnly);
- memcpy(frameA.bits(), frameDataA, frameA.mappedBytes());
- frameA.unmap();
-
- QVERIFY(surface.present(frameA));
- QCOMPARE(surface.isReady(), false);
- QCOMPARE(frameSpy.count(), 1);
-
- {
- QPainter painter(&widget);
- surface.paint(&painter, QRect(0, 0, 320, 240));
- }
- QCOMPARE(surface.isActive(), true);
- QCOMPARE(surface.isReady(), false);
-
- { // Test repainting before receiving another frame.
- QPainter painter(&widget);
- surface.paint(&painter, QRect(0, 0, 320, 240));
- }
- QCOMPARE(surface.isActive(), true);
- QCOMPARE(surface.isReady(), false);
-
- // Not ready.
- QVERIFY(!surface.present(frameA));
- QCOMPARE(frameSpy.count(), 1);
-
- surface.setReady(true);
- QCOMPARE(surface.isReady(), true);
- QVERIFY(surface.present(frameA));
- QCOMPARE(frameSpy.count(), 2);
-
- // Try switching to a different format after starting.
- QVideoSurfaceFormat formatB(frameSizeB, pixelFormatB);
-
- QVERIFY(surface.start(formatB));
- QCOMPARE(surface.isActive(), true);
- QCOMPARE(surface.isReady(), true);
-
- QVideoFrame frameB(bytesB, frameSizeB, bytesPerLineB, pixelFormatB);
-
- frameB.map(QAbstractVideoBuffer::WriteOnly);
- memcpy(frameB.bits(), frameDataB, frameB.mappedBytes());
- frameB.unmap();
-
- QVERIFY(surface.present(frameB));
- QCOMPARE(surface.isReady(), false);
- QCOMPARE(frameSpy.count(), 3);
-
- {
- QPainter painter(&widget);
- surface.paint(&painter, QRect(0, 0, 320, 240));
- }
- QCOMPARE(surface.isActive(), true);
-
- surface.stop();
- QCOMPARE(surface.isActive(), false);
- QCOMPARE(surface.isReady(), false);
-
- // Try presenting a frame while stopped.
- QVERIFY(!surface.present(frameB));
- QCOMPARE(surface.isReady(), false);
- QCOMPARE(surface.error(), QAbstractVideoSurface::StoppedError);
-
- // Try stopping while already stopped.
- surface.stop();
- QCOMPARE(surface.isActive(), false);
- QCOMPARE(surface.isReady(), false);
-
- // Try presenting a frame with a different format.
- QVERIFY(surface.start(formatB));
- QVERIFY(!surface.present(frameA));
- QCOMPARE(surface.isActive(), false);
- QCOMPARE(surface.isReady(), false);
- QCOMPARE(surface.error(), QAbstractVideoSurface::IncorrectFormatError);
-}
-
-void tst_QPainterVideoSurface::shaderPresentOpaqueFrame_data()
-{
- QTest::addColumn<QPainterVideoSurface::ShaderType>("shaderType");
-
-#ifndef QT_OPENGL_ES
- QTest::newRow("ARBfp")
- << QPainterVideoSurface::FragmentProgramShader;
-#endif
- QTest::newRow("GLSL")
- << QPainterVideoSurface::GlslShader;
-}
-
-void tst_QPainterVideoSurface::shaderPresentOpaqueFrame()
-{
- QFETCH(QPainterVideoSurface::ShaderType, shaderType);
-
- QGLWidget widget;
- widget.makeCurrent();
-
- QPainterVideoSurface surface;
- surface.setGLContext(const_cast<QGLContext *>(widget.context()));
-
- if (!(surface.supportedShaderTypes() & shaderType))
- QSKIP("Shader type unsupported on this platform", SkipSingle);
-
- surface.setShaderType(shaderType);
- if (surface.shaderType() != shaderType)
- QSKIP("Shader type couldn't be set", SkipSingle);
-
- QVideoSurfaceFormat format(QSize(64, 64), QVideoFrame::Format_RGB32);
-
- QVERIFY(surface.start(format));
- QCOMPARE(surface.isActive(), true);
- QCOMPARE(surface.isReady(), true);
-
- QVideoFrame frame(new QtTestOpaqueVideoBuffer, QSize(64, 64), QVideoFrame::Format_RGB32);
-
- if (surface.present(frame)) {
- QPainter painter(&widget);
- surface.paint(&painter, QRect(0, 0, 320, 240));
- }
-
- QCOMPARE(surface.isActive(), false);
- QCOMPARE(surface.isReady(), false);
- QCOMPARE(surface.error(), QAbstractVideoSurface::IncorrectFormatError);
-}
-
-void tst_QPainterVideoSurface::shaderPresentGLFrame_data()
-{
- QTest::addColumn<QPainterVideoSurface::ShaderType>("shaderType");
-
-#ifndef QT_OPENGL_ES
- QTest::newRow("ARBfp")
- << QPainterVideoSurface::FragmentProgramShader;
-#endif
- QTest::newRow("GLSL")
- << QPainterVideoSurface::GlslShader;
-}
-
-void tst_QPainterVideoSurface::shaderPresentGLFrame()
-{
- QFETCH(QPainterVideoSurface::ShaderType, shaderType);
-
- QGLWidget widget;
- widget.makeCurrent();
-
- QPainterVideoSurface surface;
- surface.setGLContext(const_cast<QGLContext *>(widget.context()));
-
- if (!(surface.supportedShaderTypes() & shaderType))
- QSKIP("Shader type unsupported on this platform", SkipSingle);
-
- surface.setShaderType(shaderType);
- if (surface.shaderType() != shaderType)
- QSKIP("Shader type couldn't be set", SkipSingle);
-
- QVideoSurfaceFormat format(
- QSize(2, 2), QVideoFrame::Format_RGB32, QAbstractVideoBuffer::GLTextureHandle);
-
- QVERIFY(surface.start(format));
- QCOMPARE(surface.isActive(), true);
- QCOMPARE(surface.isReady(), true);
-
- QtTestGLVideoBuffer *buffer = new QtTestGLVideoBuffer;
-
- glBindTexture(GL_TEXTURE_2D, buffer->textureId());
- glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 2, 2, 0, GL_RGB, GL_UNSIGNED_BYTE, rgb32ImageData);
- glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
- glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
- glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
- glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
-
- QVideoFrame frame(buffer, QSize(2, 2), QVideoFrame::Format_RGB32);
-
- QVERIFY(surface.present(frame));
-
- {
- QPainter painter(&widget);
- surface.paint(&painter, QRect(0, 0, 320, 240));
- }
-
- QCOMPARE(surface.isActive(), true);
- QCOMPARE(surface.isReady(), false);
-
- {
- QPainter painter(&widget);
- surface.paint(&painter, QRect(0, 0, 320, 240));
- }
-
- QCOMPARE(surface.isActive(), true);
- QCOMPARE(surface.isReady(), false);
-}
-
-#endif
-
-QTEST_MAIN(tst_QPainterVideoSurface)
-
-#include "tst_qpaintervideosurface.moc"