summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@qt.io>2021-04-12 09:18:08 +0200
committerLars Knoll <lars.knoll@qt.io>2021-04-14 14:00:59 +0000
commit50309974fd82f52877f96ee3cfffafa24600d397 (patch)
tree92440f5e3fb01f2007ee4944d6c7ddaa069e679c
parent389c1e3bd122b7bb40b5834bf164a69eecbb6635 (diff)
Remove QAbstractVideoFilter
The API covers a relatively rare use case, and is far from ideal, as it doesn't cooperate very well with HW accerlerated rendering. Since QVideoFrame and the QML VideoOutput item offer the option to get a texture for the frame, it's probably better to use that as the basis for further processing. Change-Id: I89deb915f660312fb3a83b066a5371f5454346da Reviewed-by: Doris Verria <doris.verria@qt.io> Reviewed-by: Lars Knoll <lars.knoll@qt.io>
-rw-r--r--examples/multimedia/video/qmlvideofilter_opencl/CMakeLists.txt74
-rw-r--r--examples/multimedia/video/qmlvideofilter_opencl/README15
-rw-r--r--examples/multimedia/video/qmlvideofilter_opencl/main.cpp526
-rw-r--r--examples/multimedia/video/qmlvideofilter_opencl/main.qml131
-rw-r--r--examples/multimedia/video/qmlvideofilter_opencl/qmlvideofilter_opencl.pro17
-rw-r--r--examples/multimedia/video/qmlvideofilter_opencl/qmlvideofilter_opencl.qrc5
-rw-r--r--examples/multimedia/video/qmlvideofilter_opencl/rgbframehelper.h141
-rw-r--r--src/imports/multimedia/multimedia.cpp2
-rw-r--r--src/imports/multimedia/plugins.qmltypes6
-rw-r--r--src/multimedia/CMakeLists.txt1
-rw-r--r--src/multimedia/video/qabstractvideofilter.cpp319
-rw-r--r--src/multimedia/video/qabstractvideofilter.h91
-rw-r--r--src/multimedia/video/video.pri2
-rw-r--r--src/plugins/videonode/imx6/qsgvivantevideomaterial.cpp2
-rw-r--r--src/qtmultimediaquicktools/qdeclarativevideooutput.cpp48
-rw-r--r--src/qtmultimediaquicktools/qdeclarativevideooutput_p.h11
-rw-r--r--src/qtmultimediaquicktools/qdeclarativevideooutput_render.cpp87
-rw-r--r--src/qtmultimediaquicktools/qdeclarativevideooutput_render_p.h13
-rw-r--r--src/qtmultimediaquicktools/qsgvideonode_p.cpp2
-rw-r--r--src/qtmultimediaquicktools/qsgvideonode_p.h9
-rw-r--r--tests/auto/integration/qdeclarativevideooutput/tst_qdeclarativevideooutput.cpp1
21 files changed, 7 insertions, 1496 deletions
diff --git a/examples/multimedia/video/qmlvideofilter_opencl/CMakeLists.txt b/examples/multimedia/video/qmlvideofilter_opencl/CMakeLists.txt
deleted file mode 100644
index a3c1d6a19..000000000
--- a/examples/multimedia/video/qmlvideofilter_opencl/CMakeLists.txt
+++ /dev/null
@@ -1,74 +0,0 @@
-# Generated from qmlvideofilter_opencl.pro.
-
-cmake_minimum_required(VERSION 3.14)
-project(qmlvideofilter_opencl LANGUAGES CXX)
-
-set(CMAKE_INCLUDE_CURRENT_DIR ON)
-
-set(CMAKE_AUTOMOC ON)
-set(CMAKE_AUTORCC ON)
-set(CMAKE_AUTOUIC ON)
-
-if(NOT DEFINED INSTALL_EXAMPLESDIR)
- set(INSTALL_EXAMPLESDIR "examples")
-endif()
-
-set(INSTALL_EXAMPLEDIR "${INSTALL_EXAMPLESDIR}/multimedia/video/qmlvideofilter_opencl")
-
-find_package(Qt6 COMPONENTS Core)
-find_package(Qt6 COMPONENTS Gui)
-find_package(Qt6 COMPONENTS Quick)
-find_package(Qt6 COMPONENTS Multimedia)
-
-qt_add_executable(qmlvideofilter_opencl
- main.cpp
- rgbframehelper.h
-)
-set_target_properties(qmlvideofilter_opencl PROPERTIES
- WIN32_EXECUTABLE TRUE
- MACOSX_BUNDLE TRUE
-)
-target_link_libraries(qmlvideofilter_opencl PUBLIC
- Qt::Core
- Qt::Gui
- Qt::Multimedia
- Qt::Quick
-)
-
-
-# Resources:
-set(qmlvideofilter_opencl_resource_files
- "main.qml"
-)
-
-qt6_add_resources(qmlvideofilter_opencl "qmlvideofilter_opencl"
- PREFIX
- "/"
- FILES
- ${qmlvideofilter_opencl_resource_files}
-)
-
-if(MACOS)
- target_link_libraries(qmlvideofilter_opencl PUBLIC
- "-framework OpenCL"
- )
-endif()
-
-if(UNIX AND NOT MACOS)
- target_link_libraries(qmlvideofilter_opencl PUBLIC
- OpenCL
- )
-endif()
-
-if(WIN32 AND NOT WINRT)
- target_link_libraries(qmlvideofilter_opencl PUBLIC
- OpenCL
- opengl32
- )
-endif()
-
-install(TARGETS qmlvideofilter_opencl
- RUNTIME DESTINATION "${INSTALL_EXAMPLEDIR}"
- BUNDLE DESTINATION "${INSTALL_EXAMPLEDIR}"
- LIBRARY DESTINATION "${INSTALL_EXAMPLEDIR}"
-)
diff --git a/examples/multimedia/video/qmlvideofilter_opencl/README b/examples/multimedia/video/qmlvideofilter_opencl/README
deleted file mode 100644
index cc351e430..000000000
--- a/examples/multimedia/video/qmlvideofilter_opencl/README
+++ /dev/null
@@ -1,15 +0,0 @@
-This example performs some simple OpenCL operations on camera or video input
-which is assumed to be provided in RGB format. The OpenCL operation is done on
-an OpenGL texture using CL-GL interop, without any further readbacks or copies
-(except for the initial texture upload, when necessary).
-
-Currently OS X, Windows with real OpenGL (opengl32.dll) and Linux (GLX) are
-supported. Note that an OpenCL implementation with GPU support is required. The
-platform and device selection logic supports NVIDIA, AMD and Intel. Porting to
-other platforms is probably simple, see clCreateContextFromType.
-
-YUV formats are not supported in this example. This is probably not an issue an
-OS X and Windows, but will most likely disable the example on Linux.
-
-Pass the name of a video file to perform video playback or launch without
-arguments to use the camera.
diff --git a/examples/multimedia/video/qmlvideofilter_opencl/main.cpp b/examples/multimedia/video/qmlvideofilter_opencl/main.cpp
deleted file mode 100644
index 2ee2d8bf4..000000000
--- a/examples/multimedia/video/qmlvideofilter_opencl/main.cpp
+++ /dev/null
@@ -1,526 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the examples of the Qt Multimedia module.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** 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.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "Redistribution and use in source and binary forms, with or without
-** modification, are permitted provided that the following conditions are
-** met:
-** * Redistributions of source code must retain the above copyright
-** notice, this list of conditions and the following disclaimer.
-** * Redistributions in binary form must reproduce the above copyright
-** notice, this list of conditions and the following disclaimer in
-** the documentation and/or other materials provided with the
-** distribution.
-** * Neither the name of The Qt Company Ltd nor the names of its
-** contributors may be used to endorse or promote products derived
-** from this software without specific prior written permission.
-**
-**
-** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include <QGuiApplication>
-#include <QQuickView>
-#include <QOpenGLContext>
-#include <QOpenGLFunctions>
-#include <QAbstractVideoFilter>
-#include <QQmlContext>
-#include <QFileInfo>
-
-#ifdef Q_OS_OSX
-#include <OpenCL/opencl.h>
-#include <OpenGL/OpenGL.h>
-#else
-#include <CL/opencl.h>
-#endif
-
-#ifdef Q_OS_LINUX
-#include <QtPlatformHeaders/QGLXNativeContext>
-#endif
-
-#include "rgbframehelper.h"
-
-static const char *openclSrc =
- "__constant sampler_t sampler = CLK_NORMALIZED_COORDS_FALSE | CLK_ADDRESS_CLAMP_TO_EDGE | CLK_FILTER_NEAREST;\n"
- "__kernel void Emboss(__read_only image2d_t imgIn, __write_only image2d_t imgOut, float factor) {\n"
- " const int2 pos = { get_global_id(0), get_global_id(1) };\n"
- " float4 diff = read_imagef(imgIn, sampler, pos + (int2)(1,1)) - read_imagef(imgIn, sampler, pos - (int2)(1,1));\n"
- " float color = (diff.x + diff.y + diff.z) / factor + 0.5f;\n"
- " write_imagef(imgOut, pos, (float4)(color, color, color, 1.0f));\n"
- "}\n";
-
-class CLFilter : public QAbstractVideoFilter
-{
- Q_OBJECT
- Q_PROPERTY(qreal factor READ factor WRITE setFactor NOTIFY factorChanged)
-
-public:
- CLFilter() : m_factor(1) { }
- qreal factor() const { return m_factor; }
- void setFactor(qreal v);
-
- QVideoFilterRunnable *createFilterRunnable() override;
-
-signals:
- void factorChanged();
-
-private:
- qreal m_factor;
-};
-
-class CLFilterRunnable : public QVideoFilterRunnable
-{
-public:
- CLFilterRunnable(CLFilter *filter);
- ~CLFilterRunnable();
- QVideoFrame run(QVideoFrame *input, const QVideoSurfaceFormat &surfaceFormat, RunFlags flags) override;
-
-private:
- void releaseTextures();
- uint newTexture();
-
- CLFilter *m_filter;
- QSize m_size;
- uint m_tempTexture;
- uint m_outTexture;
- uint m_lastInputTexture;
- cl_context m_clContext;
- cl_device_id m_clDeviceId;
- cl_mem m_clImage[2];
- cl_command_queue m_clQueue;
- cl_program m_clProgram;
- cl_kernel m_clKernel;
-};
-
-QVideoFilterRunnable *CLFilter::createFilterRunnable()
-{
- return new CLFilterRunnable(this);
-}
-
-CLFilterRunnable::CLFilterRunnable(CLFilter *filter) :
- m_filter(filter),
- m_tempTexture(0),
- m_outTexture(0),
- m_lastInputTexture(0),
- m_clContext(0),
- m_clQueue(0),
- m_clProgram(0),
- m_clKernel(0)
-{
- m_clImage[0] = m_clImage[1] = 0;
-
- // Set up OpenCL.
- QOpenGLFunctions *f = QOpenGLContext::currentContext()->functions();
- cl_uint n;
- cl_int err = clGetPlatformIDs(0, 0, &n);
- if (err != CL_SUCCESS) {
- qWarning("Failed to get platform ID count (error %d)", err);
- if (err == -1001) {
- qDebug("Could not find OpenCL implementation. ICD missing?"
-#ifdef Q_OS_LINUX
- " Check /etc/OpenCL/vendors."
-#endif
- );
- }
- return;
- }
- if (n == 0) {
- qWarning("No OpenCL platform found");
- return;
- }
- QList<cl_platform_id> platformIds;
- platformIds.resize(n);
- if (clGetPlatformIDs(n, platformIds.data(), 0) != CL_SUCCESS) {
- qWarning("Failed to get platform IDs");
- return;
- }
- cl_platform_id platform = platformIds[0];
- const char *vendor = (const char *) f->glGetString(GL_VENDOR);
- qDebug("GL_VENDOR: %s", vendor);
- const bool isNV = vendor && strstr(vendor, "NVIDIA");
- const bool isIntel = vendor && strstr(vendor, "Intel");
- const bool isAMD = vendor && strstr(vendor, "ATI");
- qDebug("Found %u OpenCL platforms:", n);
- for (cl_uint i = 0; i < n; ++i) {
- QByteArray name;
- name.resize(1024);
- clGetPlatformInfo(platformIds[i], CL_PLATFORM_NAME, name.size(), name.data(), 0);
- qDebug("Platform %p: %s", platformIds[i], name.constData());
- // Running with an OpenCL platform without GPU support is not going
- // to cut it. In practice we want the platform for the GPU which we
- // are using with OpenGL.
- if (isNV && name.contains(QByteArrayLiteral("NVIDIA")))
- platform = platformIds[i];
- else if (isIntel && name.contains(QByteArrayLiteral("Intel")))
- platform = platformIds[i];
- else if (isAMD && name.contains(QByteArrayLiteral("AMD")))
- platform = platformIds[i];
- }
- qDebug("Using platform %p", platform);
-
- // Set up the context with OpenCL/OpenGL interop.
-#if defined (Q_OS_OSX)
- cl_context_properties contextProps[] = { CL_CONTEXT_PROPERTY_USE_CGL_SHAREGROUP_APPLE,
- (cl_context_properties) CGLGetShareGroup(CGLGetCurrentContext()),
- 0 };
-#elif defined(Q_OS_WIN)
- cl_context_properties contextProps[] = { CL_CONTEXT_PLATFORM, (cl_context_properties) platform,
- CL_GL_CONTEXT_KHR, (cl_context_properties) wglGetCurrentContext(),
- CL_WGL_HDC_KHR, (cl_context_properties) wglGetCurrentDC(),
- 0 };
-#elif defined(Q_OS_LINUX)
- QVariant nativeGLXHandle = QOpenGLContext::currentContext()->nativeHandle();
- QGLXNativeContext nativeGLXContext;
- if (!nativeGLXHandle.isNull() && nativeGLXHandle.canConvert<QGLXNativeContext>())
- nativeGLXContext = nativeGLXHandle.value<QGLXNativeContext>();
- else
- qWarning("Failed to get the underlying GLX context from the current QOpenGLContext");
- cl_context_properties contextProps[] = { CL_CONTEXT_PLATFORM, (cl_context_properties) platform,
- CL_GL_CONTEXT_KHR, (cl_context_properties) nativeGLXContext.context(),
- CL_GLX_DISPLAY_KHR, (cl_context_properties) glXGetCurrentDisplay(),
- 0 };
-#endif
-
- m_clContext = clCreateContextFromType(contextProps, CL_DEVICE_TYPE_GPU, 0, 0, &err);
- if (!m_clContext) {
- qWarning("Failed to create OpenCL context: %d", err);
- return;
- }
-
- // Get the GPU device id
-#if defined(Q_OS_OSX)
- // On OS X, get the "online" device/GPU. This is required for OpenCL/OpenGL context sharing.
- err = clGetGLContextInfoAPPLE(m_clContext, CGLGetCurrentContext(),
- CL_CGL_DEVICE_FOR_CURRENT_VIRTUAL_SCREEN_APPLE,
- sizeof(cl_device_id), &m_clDeviceId, 0);
- if (err != CL_SUCCESS) {
- qWarning("Failed to get OpenCL device for current screen: %d", err);
- return;
- }
-#else
- clGetGLContextInfoKHR_fn getGLContextInfo = (clGetGLContextInfoKHR_fn) clGetExtensionFunctionAddress("clGetGLContextInfoKHR");
- if (!getGLContextInfo || getGLContextInfo(contextProps, CL_CURRENT_DEVICE_FOR_GL_CONTEXT_KHR,
- sizeof(cl_device_id), &m_clDeviceId, 0) != CL_SUCCESS) {
- err = clGetDeviceIDs(platform, CL_DEVICE_TYPE_GPU, 1, &m_clDeviceId, 0);
- if (err != CL_SUCCESS) {
- qWarning("Failed to get OpenCL device: %d", err);
- return;
- }
- }
-#endif
-
- m_clQueue = clCreateCommandQueue(m_clContext, m_clDeviceId, 0, &err);
- if (!m_clQueue) {
- qWarning("Failed to create OpenCL command queue: %d", err);
- return;
- }
- // Build the program.
- m_clProgram = clCreateProgramWithSource(m_clContext, 1, &openclSrc, 0, &err);
- if (!m_clProgram) {
- qWarning("Failed to create OpenCL program: %d", err);
- return;
- }
- if (clBuildProgram(m_clProgram, 1, &m_clDeviceId, 0, 0, 0) != CL_SUCCESS) {
- qWarning("Failed to build OpenCL program");
- QByteArray log;
- log.resize(2048);
- clGetProgramBuildInfo(m_clProgram, m_clDeviceId, CL_PROGRAM_BUILD_LOG, log.size(), log.data(), 0);
- qDebug("Build log: %s", log.constData());
- return;
- }
- m_clKernel = clCreateKernel(m_clProgram, "Emboss", &err);
- if (!m_clKernel) {
- qWarning("Failed to create emboss OpenCL kernel: %d", err);
- return;
- }
-}
-
-CLFilterRunnable::~CLFilterRunnable()
-{
- releaseTextures();
- if (m_clKernel)
- clReleaseKernel(m_clKernel);
- if (m_clProgram)
- clReleaseProgram(m_clProgram);
- if (m_clQueue)
- clReleaseCommandQueue(m_clQueue);
- if (m_clContext)
- clReleaseContext(m_clContext);
-}
-
-void CLFilterRunnable::releaseTextures()
-{
- QOpenGLFunctions *f = QOpenGLContext::currentContext()->functions();
- if (m_tempTexture)
- f->glDeleteTextures(1, &m_tempTexture);
- if (m_outTexture)
- f->glDeleteTextures(1, &m_outTexture);
- m_tempTexture = m_outTexture = m_lastInputTexture = 0;
- if (m_clImage[0])
- clReleaseMemObject(m_clImage[0]);
- if (m_clImage[1])
- clReleaseMemObject(m_clImage[1]);
- m_clImage[0] = m_clImage[1] = 0;
-}
-
-uint CLFilterRunnable::newTexture()
-{
- QOpenGLFunctions *f = QOpenGLContext::currentContext()->functions();
- GLuint texture;
- f->glGenTextures(1, &texture);
- f->glBindTexture(GL_TEXTURE_2D, texture);
- f->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
- f->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
- f->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
- f->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
- f->glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, m_size.width(), m_size.height(),
- 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
- return texture;
-}
-
-QVideoFrame CLFilterRunnable::run(QVideoFrame *input, const QVideoSurfaceFormat &surfaceFormat, RunFlags flags)
-{
- Q_UNUSED(surfaceFormat);
- Q_UNUSED(flags);
-
- // This example supports RGB data only, either in system memory (typical with cameras on all
- // platforms) or as an OpenGL texture (e.g. video playback on OS X).
- // The latter is the fast path where everything happens on GPU. THe former involves a texture upload.
-
- if (!input->isValid()
- || (input->handleType() != QVideoFrame::NoHandle
- && input->handleType() != QVideoFrame::GLTextureHandle)) {
- qWarning("Invalid input format");
- return *input;
- }
-
- if (input->pixelFormat() == QVideoSurfaceFormat::Format_YUV420P
- || input->pixelFormat() == QVideoSurfaceFormat::Format_YV12) {
- qWarning("YUV data is not supported");
- return *input;
- }
-
- if (m_size != input->size()) {
- releaseTextures();
- m_size = input->size();
- }
-
- // Create a texture from the image data.
- QOpenGLFunctions *f = QOpenGLContext::currentContext()->functions();
- GLuint texture;
- if (input->handleType() == QVideoFrame::NoHandle) {
- // Upload.
- if (m_tempTexture)
- f->glBindTexture(GL_TEXTURE_2D, m_tempTexture);
- else
- m_tempTexture = newTexture();
- input->map(QVideoFrame::ReadOnly);
- // glTexImage2D only once and use TexSubImage later on. This avoids the need
- // to recreate the CL image object on every frame.
- f->glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, m_size.width(), m_size.height(),
- GL_RGBA, GL_UNSIGNED_BYTE, input->bits());
- input->unmap();
- texture = m_tempTexture;
- } else {
- // Already an OpenGL texture.
- texture = input->handle().toUInt();
- f->glBindTexture(GL_TEXTURE_2D, texture);
- // Unlike on the other branch, the input texture may change, so m_clImage[0] may need to be recreated.
- if (m_lastInputTexture && m_lastInputTexture != texture && m_clImage[0]) {
- clReleaseMemObject(m_clImage[0]);
- m_clImage[0] = 0;
- }
- m_lastInputTexture = texture;
- }
-
- // OpenCL image objects cannot be read and written at the same time. So use
- // a separate texture for the result.
- if (!m_outTexture)
- m_outTexture = newTexture();
-
- // Create the image objects if not yet done.
- cl_int err;
- if (!m_clImage[0]) {
- m_clImage[0] = clCreateFromGLTexture2D(m_clContext, CL_MEM_READ_ONLY, GL_TEXTURE_2D, 0, texture, &err);
- if (!m_clImage[0]) {
- qWarning("Failed to create OpenGL image object from OpenGL texture: %d", err);
- return *input;
- }
- cl_image_format fmt;
- if (clGetImageInfo(m_clImage[0], CL_IMAGE_FORMAT, sizeof(fmt), &fmt, 0) != CL_SUCCESS) {
- qWarning("Failed to query image format");
- return *input;
- }
- if (fmt.image_channel_order != CL_RGBA)
- qWarning("OpenCL image is not RGBA, expect errors");
- }
- if (!m_clImage[1]) {
- m_clImage[1] = clCreateFromGLTexture2D(m_clContext, CL_MEM_WRITE_ONLY, GL_TEXTURE_2D, 0, m_outTexture, &err);
- if (!m_clImage[1]) {
- qWarning("Failed to create output OpenGL image object from OpenGL texture: %d", err);
- return *input;
- }
- }
-
- // We are all set. Queue acquiring the image objects.
- f->glFinish();
- clEnqueueAcquireGLObjects(m_clQueue, 2, m_clImage, 0, 0, 0);
-
- // Set up the kernel arguments.
- clSetKernelArg(m_clKernel, 0, sizeof(cl_mem), &m_clImage[0]);
- clSetKernelArg(m_clKernel, 1, sizeof(cl_mem), &m_clImage[1]);
- // Accessing dynamic properties on the filter element is simple:
- cl_float factor = m_filter->factor();
- clSetKernelArg(m_clKernel, 2, sizeof(cl_float), &factor);
-
- // And queue the kernel.
- const size_t workSize[] = { size_t(m_size.width()), size_t(m_size.height()) };
- err = clEnqueueNDRangeKernel(m_clQueue, m_clKernel, 2, 0, workSize, 0, 0, 0, 0);
- if (err != CL_SUCCESS)
- qWarning("Failed to enqueue kernel: %d", err);
-
- // Return the texture from our output image object.
- // We return a texture even when the original video frame had pixel data in system memory.
- // Qt Multimedia is smart enough to handle this. Once the data is on the GPU, it stays there. No readbacks, no copies.
- clEnqueueReleaseGLObjects(m_clQueue, 2, m_clImage, 0, 0, 0);
- clFinish(m_clQueue);
- return frameFromTexture(m_outTexture, m_size, input->pixelFormat());
-}
-
-// InfoFilter will just provide some information about the video frame, to demonstrate
-// passing arbitrary data to QML via its finished() signal.
-class InfoFilter : public QAbstractVideoFilter
-{
- Q_OBJECT
-
-public:
- QVideoFilterRunnable *createFilterRunnable() override;
-
-signals:
- void finished(QObject *result);
-
-private:
- friend class InfoFilterRunnable;
-};
-
-class InfoFilterRunnable : public QVideoFilterRunnable
-{
-public:
- InfoFilterRunnable(InfoFilter *filter) : m_filter(filter) { }
- QVideoFrame run(QVideoFrame *input, const QVideoSurfaceFormat &surfaceFormat, RunFlags flags) override;
-
-private:
- InfoFilter *m_filter;
-};
-
-class InfoFilterResult : public QObject
-{
- Q_OBJECT
- Q_PROPERTY(QSize frameResolution READ frameResolution)
- Q_PROPERTY(QString handleType READ handleType)
- Q_PROPERTY(int pixelFormat READ pixelFormat)
-
-public:
- InfoFilterResult() : m_pixelFormat(0) { }
- QSize frameResolution() const { return m_frameResolution; }
- QString handleType() const { return m_handleType; }
- int pixelFormat() const { return m_pixelFormat; }
-
-private:
- QSize m_frameResolution;
- QString m_handleType;
- int m_pixelFormat;
- friend class InfoFilterRunnable;
-};
-
-void CLFilter::setFactor(qreal v)
-{
- if (m_factor != v) {
- m_factor = v;
- emit factorChanged();
- }
-}
-
-QVideoFilterRunnable *InfoFilter::createFilterRunnable()
-{
- return new InfoFilterRunnable(this);
-}
-
-QVideoFrame InfoFilterRunnable::run(QVideoFrame *input, const QVideoSurfaceFormat &surfaceFormat, RunFlags flags)
-{
- Q_UNUSED(surfaceFormat);
- Q_UNUSED(flags);
- InfoFilterResult *result = new InfoFilterResult;
- result->m_frameResolution = input->size();
- switch (input->handleType()) {
- case QVideoFrame::NoHandle:
- result->m_handleType = QLatin1String("pixel data");
- result->m_pixelFormat = input->pixelFormat();
- break;
- case QVideoFrame::GLTextureHandle:
- result->m_handleType = QLatin1String("OpenGL texture");
- break;
- default:
- result->m_handleType = QLatin1String("unknown");
- break;
- }
- emit m_filter->finished(result); // parent-less QObject -> ownership transferred to the JS engine
- return *input;
-}
-
-int main(int argc, char **argv)
-{
-#ifdef Q_OS_WIN // avoid ANGLE on Windows
- QCoreApplication::setAttribute(Qt::AA_UseDesktopOpenGL);
-#endif
- QGuiApplication app(argc, argv);
-
- qmlRegisterType<CLFilter>("qmlvideofilter.cl.test", 1, 0, "CLFilter");
- qmlRegisterType<InfoFilter>("qmlvideofilter.cl.test", 1, 0, "InfoFilter");
-
- QQuickView view;
- QString fn;
- if (argc > 1) {
- fn = QUrl::fromLocalFile(QFileInfo(QString::fromUtf8(argv[1])).absoluteFilePath()).toString();
- qDebug("Playing video %s", qPrintable(fn));
- } else {
- qDebug("No video file specified, using camera instead.");
- }
- view.rootContext()->setContextProperty("videoFilename", fn);
- view.setSource(QUrl("qrc:///main.qml"));
-
- view.show();
-
- return app.exec();
-}
-
-#include "main.moc"
diff --git a/examples/multimedia/video/qmlvideofilter_opencl/main.qml b/examples/multimedia/video/qmlvideofilter_opencl/main.qml
deleted file mode 100644
index 3d3205398..000000000
--- a/examples/multimedia/video/qmlvideofilter_opencl/main.qml
+++ /dev/null
@@ -1,131 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the examples of the Qt Multimedia module.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** 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.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "Redistribution and use in source and binary forms, with or without
-** modification, are permitted provided that the following conditions are
-** met:
-** * Redistributions of source code must retain the above copyright
-** notice, this list of conditions and the following disclaimer.
-** * Redistributions in binary form must reproduce the above copyright
-** notice, this list of conditions and the following disclaimer in
-** the documentation and/or other materials provided with the
-** distribution.
-** * Neither the name of The Qt Company Ltd nor the names of its
-** contributors may be used to endorse or promote products derived
-** from this software without specific prior written permission.
-**
-**
-** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-import QtQuick 2.0
-import QtMultimedia 5.5
-import qmlvideofilter.cl.test 1.0
-
-Item {
- width: 1024
- height: 768
-
- Camera {
- id: camera
- }
-
- MediaPlayer {
- id: player
- autoPlay: true
- source: videoFilename
- }
-
- VideoOutput {
- id: output
- source: videoFilename !== "" ? player : camera
- filters: [ infofilter, clfilter ]
- anchors.fill: parent
- }
-
- CLFilter {
- id: clfilter
- // Animate a property which is passed to the OpenCL kernel.
- SequentialAnimation on factor {
- loops: Animation.Infinite
- NumberAnimation {
- from: 1
- to: 20
- duration: 6000
- }
- NumberAnimation {
- from: 20
- to: 1
- duration: 3000
- }
- }
- }
-
- InfoFilter {
- // This filter does not change the image. Instead, it provides some results calculated from the frame.
- id: infofilter
- onFinished: {
- info.res = result.frameResolution.width + "x" + result.frameResolution.height;
- info.type = result.handleType;
- info.fmt = result.pixelFormat;
- }
- }
-
- Column {
- Text {
- font.pointSize: 20
- color: "green"
- text: "Transformed with OpenCL on GPU\nClick to disable and enable the emboss filter"
- }
- Text {
- font.pointSize: 12
- color: "green"
- text: "Emboss factor " + Math.round(clfilter.factor)
- visible: clfilter.active
- }
- Text {
- id: info
- font.pointSize: 12
- color: "green"
- property string res
- property string type
- property int fmt
- text: "Input resolution: " + res + " Input frame type: " + type + (fmt ? " Pixel format: " + fmt : "")
- }
- }
-
- MouseArea {
- anchors.fill: parent
- onClicked: clfilter.active = !clfilter.active
- }
-}
diff --git a/examples/multimedia/video/qmlvideofilter_opencl/qmlvideofilter_opencl.pro b/examples/multimedia/video/qmlvideofilter_opencl/qmlvideofilter_opencl.pro
deleted file mode 100644
index f7f191d2b..000000000
--- a/examples/multimedia/video/qmlvideofilter_opencl/qmlvideofilter_opencl.pro
+++ /dev/null
@@ -1,17 +0,0 @@
-TEMPLATE = app
-TARGET = qmlvideofilter_opencl
-
-QT += quick multimedia
-
-SOURCES = main.cpp
-HEADERS = rgbframehelper.h
-
-RESOURCES = qmlvideofilter_opencl.qrc
-OTHER_FILES = main.qml
-
-target.path = $$[QT_INSTALL_EXAMPLES]/multimedia/video/qmlvideofilter_opencl
-INSTALLS += target
-
-osx: LIBS += -framework OpenCL
-unix: !osx: LIBS += -lOpenCL
-win32:!winrt: LIBS += -lopengl32 -lOpenCL
diff --git a/examples/multimedia/video/qmlvideofilter_opencl/qmlvideofilter_opencl.qrc b/examples/multimedia/video/qmlvideofilter_opencl/qmlvideofilter_opencl.qrc
deleted file mode 100644
index 5f6483ac3..000000000
--- a/examples/multimedia/video/qmlvideofilter_opencl/qmlvideofilter_opencl.qrc
+++ /dev/null
@@ -1,5 +0,0 @@
-<RCC>
- <qresource prefix="/">
- <file>main.qml</file>
- </qresource>
-</RCC>
diff --git a/examples/multimedia/video/qmlvideofilter_opencl/rgbframehelper.h b/examples/multimedia/video/qmlvideofilter_opencl/rgbframehelper.h
deleted file mode 100644
index 79e577a40..000000000
--- a/examples/multimedia/video/qmlvideofilter_opencl/rgbframehelper.h
+++ /dev/null
@@ -1,141 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the examples of the Qt Multimedia module.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** 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.
-**
-** BSD License Usage
-** Alternatively, you may use this file under the terms of the BSD license
-** as follows:
-**
-** "Redistribution and use in source and binary forms, with or without
-** modification, are permitted provided that the following conditions are
-** met:
-** * Redistributions of source code must retain the above copyright
-** notice, this list of conditions and the following disclaimer.
-** * Redistributions in binary form must reproduce the above copyright
-** notice, this list of conditions and the following disclaimer in
-** the documentation and/or other materials provided with the
-** distribution.
-** * Neither the name of The Qt Company Ltd nor the names of its
-** contributors may be used to endorse or promote products derived
-** from this software without specific prior written permission.
-**
-**
-** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef RGBFRAMEHELPER_H
-#define RGBFRAMEHELPER_H
-
-#include <QImage>
-#include <QAbstractVideoBuffer>
-#include <QOpenGLContext>
-#include <QOpenGLFunctions>
-#include <QOpenGLFramebufferObject>
-
-/*
- Returns a QImage that wraps the given video frame.
-
- This is suitable only for QVideoFrame::NoHandle frames with RGB (or BGR)
- data. YUV is not supported here.
-
- The QVideoFrame must be mapped and kept mapped as long as the wrapping QImage
- exists.
-
- As a convenience the function also supports frames with a handle type of
- QVideoFrame::GLTextureHandle. This allows creating a system memory backed
- QVideoFrame containing the image data from an OpenGL texture. However, readback is a
- slow operation and may stall the GPU pipeline and should be avoided in production code.
-*/
-QImage imageWrapper(const QVideoFrame &frame)
-{
-#ifndef QT_NO_OPENGL
- if (frame.handleType() == QVideoFrame::GLTextureHandle) {
- // Slow and inefficient path. Ideally what's on the GPU should remain on the GPU, instead of readbacks like this.
- QImage img(frame.width(), frame.height(), QImage::Format_RGBA8888);
- GLuint textureId = frame.handle().toUInt();
- QOpenGLContext *ctx = QOpenGLContext::currentContext();
- QOpenGLFunctions *f = ctx->functions();
- GLuint fbo;
- f->glGenFramebuffers(1, &fbo);
- GLuint prevFbo;
- f->glGetIntegerv(GL_FRAMEBUFFER_BINDING, (GLint *) &prevFbo);
- f->glBindFramebuffer(GL_FRAMEBUFFER, fbo);
- f->glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, textureId, 0);
- f->glReadPixels(0, 0, frame.width(), frame.height(), GL_RGBA, GL_UNSIGNED_BYTE, img.bits());
- f->glBindFramebuffer(GL_FRAMEBUFFER, prevFbo);
- return img;
- } else
-#endif // QT_NO_OPENGL
- {
- if (!frame.isReadable()) {
- qWarning("imageFromVideoFrame: No mapped image data available for read");
- return QImage();
- }
-
- QImage::Format fmt = QVideoFrame::imageFormatFromPixelFormat(frame.pixelFormat());
- if (fmt != QImage::Format_Invalid)
- return QImage(frame.bits(), frame.width(), frame.height(), fmt);
-
- qWarning("imageFromVideoFrame: No matching QImage format");
- }
-
- return QImage();
-}
-
-#ifndef QT_NO_OPENGL
-class TextureBuffer : public QAbstractVideoBuffer
-{
-public:
- TextureBuffer(uint id) : QAbstractVideoBuffer(GLTextureHandle), m_id(id) { }
- MapMode mapMode() const { return NotMapped; }
- virtual MapData map(MapMode mode) { return {}; }
- void unmap() { }
- QVariant handle() const { return QVariant::fromValue<uint>(m_id); }
-
-private:
- GLuint m_id;
-};
-#endif // QT_NO_OPENGL
-
-/*
- Creates and returns a new video frame wrapping the OpenGL texture textureId. The size
- must be passed in size, together with the format of the underlying image data in
- format. When the texture originates from a QImage, use
- QVideoFrame::imageFormatFromPixelFormat() to get a suitable format. Ownership is not
- altered, the new QVideoFrame will not destroy the texture.
-*/
-QVideoFrame frameFromTexture(uint textureId, const QSize &size, QVideoSurfaceFormat::PixelFormat format)
-{
-#ifndef QT_NO_OPENGL
- return QVideoFrame(new TextureBuffer(textureId), size, format);
-#else
- return QVideoFrame();
-#endif // QT_NO_OPENGL
-}
-
-#endif
diff --git a/src/imports/multimedia/multimedia.cpp b/src/imports/multimedia/multimedia.cpp
index 663c24645..d98921dc1 100644
--- a/src/imports/multimedia/multimedia.cpp
+++ b/src/imports/multimedia/multimedia.cpp
@@ -44,7 +44,6 @@
#include "qsoundeffect.h"
#include <private/qdeclarativevideooutput_p.h>
-#include "qabstractvideofilter.h"
#include "qdeclarativemultimediaglobal_p.h"
#include "qdeclarativemediametadata_p.h"
@@ -149,7 +148,6 @@ public:
tr("CameraImageProcessing is provided by Camera"));
qmlRegisterAnonymousType<QDeclarativeMediaMetaData>(uri, 5);
- qmlRegisterAnonymousType<QAbstractVideoFilter>(uri, 5);
// 5.13 types
qmlRegisterType<QDeclarativeVideoOutput, 13>(uri, 5, 13, "VideoOutput");
diff --git a/src/imports/multimedia/plugins.qmltypes b/src/imports/multimedia/plugins.qmltypes
index 6bd4664c5..14e0f5878 100644
--- a/src/imports/multimedia/plugins.qmltypes
+++ b/src/imports/multimedia/plugins.qmltypes
@@ -283,11 +283,6 @@ Module {
}
Component { name: "QAbstractListModel"; prototype: "QAbstractItemModel" }
Component {
- name: "QAbstractVideoFilter"
- prototype: "QObject"
- Property { name: "active"; type: "bool" }
- }
- Component {
name: "QCamera"
prototype: "QObject"
Enum {
@@ -1577,7 +1572,6 @@ Module {
Property { name: "autoOrientation"; revision: 2; type: "bool" }
Property { name: "sourceRect"; type: "QRectF"; isReadonly: true }
Property { name: "contentRect"; type: "QRectF"; isReadonly: true }
- Property { name: "filters"; type: "QAbstractVideoFilter"; isList: true; isReadonly: true }
Property { name: "flushMode"; revision: 13; type: "FlushMode" }
Property {
name: "videoSurface"
diff --git a/src/multimedia/CMakeLists.txt b/src/multimedia/CMakeLists.txt
index 0de527d4b..f1f8a27a3 100644
--- a/src/multimedia/CMakeLists.txt
+++ b/src/multimedia/CMakeLists.txt
@@ -62,7 +62,6 @@ qt_internal_add_module(Multimedia
recording/qmediaencodersettings.cpp recording/qmediaencodersettings.h
recording/qmediarecorder.cpp recording/qmediarecorder.h recording/qmediarecorder_p.h
video/qabstractvideobuffer.cpp video/qabstractvideobuffer_p.h
- video/qabstractvideofilter.cpp video/qabstractvideofilter.h
video/qimagevideobuffer.cpp video/qimagevideobuffer_p.h
video/qmemoryvideobuffer.cpp video/qmemoryvideobuffer_p.h
video/qvideoframe.cpp video/qvideoframe.h
diff --git a/src/multimedia/video/qabstractvideofilter.cpp b/src/multimedia/video/qabstractvideofilter.cpp
deleted file mode 100644
index 7bdee2177..000000000
--- a/src/multimedia/video/qabstractvideofilter.cpp
+++ /dev/null
@@ -1,319 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** 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 Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** 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-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qabstractvideofilter.h"
-
-QT_BEGIN_NAMESPACE
-
-/*!
- \class QAbstractVideoFilter
- \since 5.5
- \brief The QAbstractVideoFilter class represents a filter that is applied to the video frames
- received by a VideoOutput type.
- \inmodule QtMultimedia
-
- \ingroup multimedia
- \ingroup multimedia_video
-
- QAbstractVideoFilter provides a convenient way for applications to run image
- processing, computer vision algorithms or any generic transformation or
- calculation on the output of a VideoOutput type, regardless of the source
- (video or camera). By providing a simple interface it allows applications and
- third parties to easily develop QML types that provide image processing
- algorithms using popular frameworks like \l{http://opencv.org}{OpenCV}. Due to
- the close integration with the final stages of the Qt Multimedia video
- pipeline, accelerated and possibly zero-copy solutions are feasible too: for
- instance, a plugin providing OpenCL-based algorithms can use OpenCL's OpenGL
- interop to use the OpenGL textures created by a hardware accelerated video
- decoder, without additional readbacks and copies.
-
- \note QAbstractVideoFilter is not always the best choice. To apply effects or
- transformations using OpenGL shaders to the image shown on screen, the
- standard Qt Quick approach of using ShaderEffect items in combination with
- VideoOutput should be used. VideoFilter is not a replacement for this. It is
- rather targeted for performing computations (that do not necessarily change
- the image shown on screen) and computer vision algorithms provided by
- external frameworks.
-
- QAbstractVideoFilter is meant to be subclassed. The subclasses are then registered to
- the QML engine, so they can be used as a QML type. The list of filters are
- assigned to a VideoOutput type via its \l{QtMultimedia::VideoOutput::filters}{filters}
- property.
-
- A single filter represents one transformation or processing step on
- a video frame. The output is a modified video frame, some arbitrary data or
- both. For example, image transformations will result in a different image,
- whereas an algorithm for detecting objects on an image will likely provide
- a list of rectangles.
-
- Arbitrary data can be represented as properties on the QAbstractVideoFilter subclass
- and on the QObject or QJSValue instances passed to its signals. What exactly
- these properties and signals are, is up to the individual video
- filters. Completion of the operations can be indicated by
- signals. Computations that do not result in a modified image will pass the
- input image through so that subsequent filters can be placed after them.
-
- Properties set on QAbstractVideoFilter serve as input to the computation, similarly
- to how uniform values are specified in ShaderEffect types. The changed
- property values are taken into use when the next video frame is processed.
-
- The typical usage is to subclass QAbstractVideoFilter and QVideoFilterRunnable:
-
- \badcode
- class MyFilterRunnable : public QVideoFilterRunnable {
- public:
- QVideoFrame run(QVideoFrame *input, const QVideoSurfaceFormat &surfaceFormat, RunFlags flags) { ... }
- };
-
- class MyFilter : public QAbstractVideoFilter {
- public:
- QVideoFilterRunnable *createFilterRunnable() { return new MyFilterRunnable; }
- signals:
- void finished(QObject *result);
- };
-
- int main(int argc, char **argv) {
- ...
- qmlRegisterType<MyFilter>("my.uri", 1, 0, "MyFilter");
- ...
- }
- \endcode
-
- MyFilter is thus accessible from QML:
-
- \badcode
- import my.uri 1.0
-
- Camera {
- id: camera
- }
- MyFilter {
- id: filter
- // set properties, they can also be animated
- onFinished: console.log("results of the computation: " + result)
- }
- VideoOutput {
- source: camera
- filters: [ filter ]
- anchors.fill: parent
- }
- \endcode
-
- This also allows providing filters in QML plugins, separately from the application.
-
- \sa VideoOutput, Camera, MediaPlayer, QVideoFilterRunnable
-*/
-
-/*!
- \class QVideoFilterRunnable
- \since 5.5
- \brief The QVideoFilterRunnable class represents the implementation of a filter
- that owns all graphics and computational resources, and performs the actual filtering
- or calculations.
- \inmodule QtMultimedia
-
- \ingroup multimedia
- \ingroup multimedia_video
-
- Video filters are split into QAbstractVideoFilter and corresponding QVideoFilterRunnable
- instances, similar to QQuickItem and QSGNode. This is necessary to support
- threaded rendering scenarios. When using the threaded render loop of the Qt
- Quick scene graph, all rendering happens on a dedicated thread.
- QVideoFilterRunnable instances always live on this thread and all its functions,
- run(), the constructor, and the destructor, are guaranteed to be invoked on
- that thread with the OpenGL context bound. QAbstractVideoFilter instances live on
- the main (GUI) thread, like any other QObject and QQuickItem instances
- created from QML.
-
- Once created, QVideoFilterRunnable instances are managed by Qt Multimedia and
- will be automatically destroyed and recreated when necessary, for example
- when the scene graph is invalidated or the QQuickWindow changes or is closed.
- Creation happens via the QAbstractVideoFilter::createFilterRunnable() factory function.
-
- \sa QAbstractVideoFilter
- */
-
-/*!
- \fn QVideoFrame QVideoFilterRunnable::run(QVideoFrame *input, const QVideoSurfaceFormat &surfaceFormat, RunFlags flags)
-
- Reimplement this function to perform filtering or computation on the \a
- input video frame. Like the constructor and destructor, this function is
- always called on the render thread with the OpenGL context bound.
-
- Implementations that do not modify the video frame can simply return \a input.
-
- It is safe to access properties of the associated QAbstractVideoFilter instance from
- this function.
-
- \a input will not be mapped, it is up to this function to call QVideoFrame::map()
- and QVideoFrame::unmap() as necessary.
-
- \a surfaceFormat provides additional information, for example it can be used
- to determine which way is up in the input image as that is important for
- filters to operate on multiple platforms with multiple cameras.
-
- \a flags contains additional information about the filter's invocation. For
- example the LastInChain flag indicates that the filter is the last in a
- VideoOutput's associated filter list. This can be very useful in cases where
- multiple filters are chained together and the work is performed on image data
- in some custom format (for example a format specific to some computer vision
- framework). To avoid conversion on every filter in the chain, all
- intermediate filters can return a QVideoFrame hosting data in the custom
- format. Only the last, where the flag is set, returns a QVideoFrame in a
- format compatible with Qt.
-
- Filters that want to expose the results of their computation to Javascript
- code in QML can declare their own custom signals in the QAbstractVideoFilter
- subclass to indicate the completion of the operation. For filters that only
- calculate some results and do not modify the video frame, it is also possible
- to operate asynchronously. They can queue the necessary operations using the
- compute API and return from this function without emitting any signals. The
- signal indicating the completion is then emitted only when the compute API
- indicates that the operations were done and the results are available. Note
- that it is strongly recommended to represent the filter's output data as a
- separate instance of QJSValue or a QObject-derived class which is passed as a
- parameter to the signal and becomes exposed to the Javascript engine. In case
- of QObject the ownership of this object is controlled by the standard QML
- rules: if it has no parent, ownership is transferred to the Javascript engine,
- otherwise it stays with the emitter. Note that the signal connection may be
- queued,for example when using the threaded render loop of Qt Quick, and so the
- object must stay valid for a longer time, destroying it right after calling
- this function is not safe. Using a dedicated results object is guaranteed to
- be safe even when using threaded rendering. The same is not necessarily true
- for properties on the QAbstractVideoFilter instance itself: properties can
- safely be read in run() since the gui thread is blocked during that time but
- writing may become problematic.
-
- \note Avoid time consuming operations in this function as they block the
- entire rendering of the application.
-
- \note The handleType() and pixelFormat() of \a input is completely up to the
- video decoding backend on the platform in use. On some platforms different
- forms of input are used depending on the graphics stack. For example, when
- playing back videos on Windows with the WMF backend, QVideoFrame contains
- OpenGL-wrapped Direct3D textures in case of using ANGLE, but regular pixel
- data when using desktop OpenGL (opengl32.dll). Similarly, the video file
- format will often decide if the data is RGB or YUV, but this may also depend
- on the decoder and the configuration in use. The returned video frame does
- not have to be in the same format as the input, for example a filter with an
- input of a QVideoFrame backed by system memory can output a QVideoFrame with
- an OpenGL texture handle.
-
- \sa QVideoFrame, QVideoSurfaceFormat
- */
-
-/*!
- \enum QVideoFilterRunnable::RunFlag
-
- \value LastInChain Indicates that the filter runnable's associated QAbstractVideoFilter
- is the last in the corresponding VideoOutput type's filters list, meaning
- that the returned frame is the one that is going to be presented to the scene
- graph without invoking any further filters.
- */
-
-class QAbstractVideoFilterPrivate
-{
-public:
- bool active = true;
-};
-
-/*!
- \internal
- */
-QVideoFilterRunnable::~QVideoFilterRunnable() = default;
-
-/*!
- Constructs a new QAbstractVideoFilter instance with parent object \a parent.
- */
-QAbstractVideoFilter::QAbstractVideoFilter(QObject *parent) :
- QObject(parent),
- d_ptr(new QAbstractVideoFilterPrivate)
-{
-}
-
-/*!
- \internal
- */
-QAbstractVideoFilter::~QAbstractVideoFilter()
-{
- delete d_ptr;
-}
-
-/*!
- \property QAbstractVideoFilter::active
- \brief the active status of the filter.
-
- This is true if the filter is active, false otherwise.
-
- By default filters are active. When set to \c false, the filter will be
- ignored by the VideoOutput type.
- */
-bool QAbstractVideoFilter::isActive() const
-{
- Q_D(const QAbstractVideoFilter);
- return d->active;
-}
-
-void QAbstractVideoFilter::setActive(bool v)
-{
- Q_D(QAbstractVideoFilter);
- if (d->active != v) {
- d->active = v;
- emit activeChanged();
- }
-}
-
-/*!
- \fn QVideoFilterRunnable *QAbstractVideoFilter::createFilterRunnable()
-
- Factory function to create a new instance of a QVideoFilterRunnable subclass
- corresponding to this filter.
-
- This function is called on the thread on which the Qt Quick scene graph
- performs rendering, with the OpenGL context bound. Ownership of the returned
- instance is transferred: the returned instance will live on the render thread
- and will be destroyed automatically when necessary.
-
- Typically, implementations of the function will simply construct a new
- QVideoFilterRunnable instance, passing \c this to the constructor as the
- filter runnables must know their associated QAbstractVideoFilter instance to
- access dynamic properties and optionally emit signals.
- */
-
-QT_END_NAMESPACE
diff --git a/src/multimedia/video/qabstractvideofilter.h b/src/multimedia/video/qabstractvideofilter.h
deleted file mode 100644
index 6263f4730..000000000
--- a/src/multimedia/video/qabstractvideofilter.h
+++ /dev/null
@@ -1,91 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** 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 Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** 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-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QABSTRACTVIDEOFILTER_H
-#define QABSTRACTVIDEOFILTER_H
-
-#include <QtCore/qobject.h>
-#include <QtMultimedia/qvideoframe.h>
-#include <QtMultimedia/qvideosurfaceformat.h>
-
-QT_BEGIN_NAMESPACE
-
-class QAbstractVideoFilterPrivate;
-
-class Q_MULTIMEDIA_EXPORT QVideoFilterRunnable
-{
-public:
- enum RunFlag {
- LastInChain = 0x01
- };
- Q_DECLARE_FLAGS(RunFlags, RunFlag)
-
- virtual ~QVideoFilterRunnable();
- virtual QVideoFrame run(QVideoFrame *input, const QVideoSurfaceFormat &surfaceFormat, RunFlags flags) = 0;
-};
-
-Q_DECLARE_OPERATORS_FOR_FLAGS(QVideoFilterRunnable::RunFlags)
-
-class Q_MULTIMEDIA_EXPORT QAbstractVideoFilter : public QObject
-{
- Q_OBJECT
- Q_PROPERTY(bool active READ isActive WRITE setActive NOTIFY activeChanged)
-
-public:
- explicit QAbstractVideoFilter(QObject *parent = nullptr);
- ~QAbstractVideoFilter();
-
- bool isActive() const;
- void setActive(bool v);
-
- virtual QVideoFilterRunnable *createFilterRunnable() = 0;
-
-Q_SIGNALS:
- void activeChanged();
-
-private:
- Q_DECLARE_PRIVATE(QAbstractVideoFilter)
- Q_DISABLE_COPY(QAbstractVideoFilter)
-
- QAbstractVideoFilterPrivate *d_ptr;
-};
-
-QT_END_NAMESPACE
-
-#endif // QABSTRACTVIDEOFILTER_H
diff --git a/src/multimedia/video/video.pri b/src/multimedia/video/video.pri
index 6fa650d96..50d1a260b 100644
--- a/src/multimedia/video/video.pri
+++ b/src/multimedia/video/video.pri
@@ -5,7 +5,6 @@ PUBLIC_HEADERS += \
video/qabstractvideosurface.h \
video/qvideoframe.h \
video/qvideosurfaceformat.h \
- video/qabstractvideofilter.h
PRIVATE_HEADERS += \
video/qabstractvideobuffer_p.h \
@@ -23,7 +22,6 @@ SOURCES += \
video/qvideoframe.cpp \
video/qvideooutputorientationhandler.cpp \
video/qvideosurfaceformat.cpp \
- video/qabstractvideofilter.cpp \
video/qvideoframeconversionhelper.cpp \
video/qvideosurfaces.cpp
diff --git a/src/plugins/videonode/imx6/qsgvivantevideomaterial.cpp b/src/plugins/videonode/imx6/qsgvivantevideomaterial.cpp
index 10e065ca1..320ad9b86 100644
--- a/src/plugins/videonode/imx6/qsgvivantevideomaterial.cpp
+++ b/src/plugins/videonode/imx6/qsgvivantevideomaterial.cpp
@@ -107,7 +107,7 @@ void QSGVivanteVideoMaterial::setCurrentFrame(const QVideoFrame &frame, QSGVideo
{
QMutexLocker lock(&mFrameMutex);
mCurrentFrame = frame;
- mMappable = mMapError == GL_NO_ERROR && !flags.testFlag(QSGVideoNode::FrameFiltered);
+ mMappable = mMapError == GL_NO_ERROR;
#ifdef QT_VIVANTE_VIDEO_DEBUG
qDebug() << Q_FUNC_INFO << " new frame: " << frame;
diff --git a/src/qtmultimediaquicktools/qdeclarativevideooutput.cpp b/src/qtmultimediaquicktools/qdeclarativevideooutput.cpp
index 72e04bbe2..1ccea41e1 100644
--- a/src/qtmultimediaquicktools/qdeclarativevideooutput.cpp
+++ b/src/qtmultimediaquicktools/qdeclarativevideooutput.cpp
@@ -196,10 +196,6 @@ bool QDeclarativeVideoOutput::createBackend()
// Since new backend has been created needs to update its geometry.
m_geometryDirty = true;
- m_backend->clearFilters();
- for (int i = 0; i < m_filters.count(); ++i)
- m_backend->appendFilter(m_filters[i]);
-
return true;
}
@@ -684,50 +680,6 @@ void QDeclarativeVideoOutput::geometryChange(const QRectF &newGeometry, const QR
_q_updateGeometry();
}
-/*!
- \qmlproperty list<object> QtMultimedia::VideoOutput::filters
-
- This property holds the list of video filters that are run on the video
- frames. The order of the filters in the list matches the order in which
- they will be invoked on the video frames. The objects in the list must be
- instances of a subclass of QAbstractVideoFilter.
-
- \sa QAbstractVideoFilter
-*/
-
-QQmlListProperty<QAbstractVideoFilter> QDeclarativeVideoOutput::filters()
-{
- return QQmlListProperty<QAbstractVideoFilter>(this, nullptr, filter_append, filter_count, filter_at, filter_clear);
-}
-
-void QDeclarativeVideoOutput::filter_append(QQmlListProperty<QAbstractVideoFilter> *property, QAbstractVideoFilter *value)
-{
- QDeclarativeVideoOutput *self = static_cast<QDeclarativeVideoOutput *>(property->object);
- self->m_filters.append(value);
- if (self->m_backend)
- self->m_backend->appendFilter(value);
-}
-
-qsizetype QDeclarativeVideoOutput::filter_count(QQmlListProperty<QAbstractVideoFilter> *property)
-{
- QDeclarativeVideoOutput *self = static_cast<QDeclarativeVideoOutput *>(property->object);
- return self->m_filters.count();
-}
-
-QAbstractVideoFilter *QDeclarativeVideoOutput::filter_at(QQmlListProperty<QAbstractVideoFilter> *property, qsizetype index)
-{
- QDeclarativeVideoOutput *self = static_cast<QDeclarativeVideoOutput *>(property->object);
- return self->m_filters.at(index);
-}
-
-void QDeclarativeVideoOutput::filter_clear(QQmlListProperty<QAbstractVideoFilter> *property)
-{
- QDeclarativeVideoOutput *self = static_cast<QDeclarativeVideoOutput *>(property->object);
- self->m_filters.clear();
- if (self->m_backend)
- self->m_backend->clearFilters();
-}
-
void QDeclarativeVideoOutput::_q_invalidateSceneGraph()
{
if (m_backend)
diff --git a/src/qtmultimediaquicktools/qdeclarativevideooutput_p.h b/src/qtmultimediaquicktools/qdeclarativevideooutput_p.h
index 93bb8177e..7543cbeac 100644
--- a/src/qtmultimediaquicktools/qdeclarativevideooutput_p.h
+++ b/src/qtmultimediaquicktools/qdeclarativevideooutput_p.h
@@ -56,7 +56,6 @@
#include <QtCore/qsharedpointer.h>
#include <QtQuick/qquickitem.h>
#include <QtCore/qpointer.h>
-#include <QtMultimedia/qabstractvideofilter.h>
#include <private/qtmultimediaquickdefs_p.h>
@@ -65,6 +64,7 @@ QT_BEGIN_NAMESPACE
class QDeclarativeVideoBackend;
class QVideoOutputOrientationHandler;
class QVideoSink;
+class QVideoFrame;
class Q_MULTIMEDIAQUICK_EXPORT QDeclarativeVideoOutput : public QQuickItem
{
@@ -76,7 +76,6 @@ class Q_MULTIMEDIAQUICK_EXPORT QDeclarativeVideoOutput : public QQuickItem
Q_PROPERTY(bool autoOrientation READ autoOrientation WRITE setAutoOrientation NOTIFY autoOrientationChanged REVISION 2)
Q_PROPERTY(QRectF sourceRect READ sourceRect NOTIFY sourceRectChanged)
Q_PROPERTY(QRectF contentRect READ contentRect NOTIFY contentRectChanged)
- Q_PROPERTY(QQmlListProperty<QAbstractVideoFilter> filters READ filters);
Q_PROPERTY(FlushMode flushMode READ flushMode WRITE setFlushMode NOTIFY flushModeChanged REVISION 13)
Q_PROPERTY(QVideoSink* videoSink READ videoSink CONSTANT REVISION 15)
Q_ENUMS(FlushMode)
@@ -135,8 +134,6 @@ public:
};
SourceType sourceType() const;
- QQmlListProperty<QAbstractVideoFilter> filters();
-
FlushMode flushMode() const { return m_flushMode; }
void setFlushMode(FlushMode mode);
@@ -164,11 +161,6 @@ private Q_SLOTS:
private:
bool createBackend();
- static void filter_append(QQmlListProperty<QAbstractVideoFilter> *property, QAbstractVideoFilter *value);
- static qsizetype filter_count(QQmlListProperty<QAbstractVideoFilter> *property);
- static QAbstractVideoFilter *filter_at(QQmlListProperty<QAbstractVideoFilter> *property, qsizetype index);
- static void filter_clear(QQmlListProperty<QAbstractVideoFilter> *property);
-
QPointer<QObject> m_source;
FillMode m_fillMode;
@@ -183,7 +175,6 @@ private:
QScopedPointer<QDeclarativeVideoBackend> m_backend;
- QList<QAbstractVideoFilter *> m_filters;
FlushMode m_flushMode = EmptyFrame;
};
diff --git a/src/qtmultimediaquicktools/qdeclarativevideooutput_render.cpp b/src/qtmultimediaquicktools/qdeclarativevideooutput_render.cpp
index f62a6c891..17dd61706 100644
--- a/src/qtmultimediaquicktools/qdeclarativevideooutput_render.cpp
+++ b/src/qtmultimediaquicktools/qdeclarativevideooutput_render.cpp
@@ -40,7 +40,6 @@
#include "qdeclarativevideooutput_render_p.h"
#include "qdeclarativevideooutput_p.h"
-#include <QtMultimedia/qabstractvideofilter.h>
#include <QtCore/qobject.h>
#include <QtCore/qloggingcategory.h>
#include <private/qmediapluginloader_p.h>
@@ -66,52 +65,6 @@ QDeclarativeVideoBackend::~QDeclarativeVideoBackend()
delete m_sink;
}
-void QDeclarativeVideoBackend::appendFilter(QAbstractVideoFilter *filter)
-{
- QMutexLocker lock(&m_frameMutex);
- m_filters.append(Filter(filter));
-}
-
-void QDeclarativeVideoBackend::clearFilters()
-{
- QMutexLocker lock(&m_frameMutex);
- scheduleDeleteFilterResources();
- m_filters.clear();
-}
-
-class FilterRunnableDeleter : public QRunnable
-{
-public:
- FilterRunnableDeleter(const QList<QVideoFilterRunnable *> &runnables) : m_runnables(runnables) { }
- void run() override {
- for (QVideoFilterRunnable *runnable : qAsConst(m_runnables))
- delete runnable;
- }
-private:
- QList<QVideoFilterRunnable *> m_runnables;
-};
-
-void QDeclarativeVideoBackend::scheduleDeleteFilterResources()
-{
- if (!q->window())
- return;
-
- QList<QVideoFilterRunnable *> runnables;
- for (int i = 0; i < m_filters.count(); ++i) {
- if (m_filters[i].runnable) {
- runnables.append(m_filters[i].runnable);
- m_filters[i].runnable = nullptr;
- }
- }
-
- if (!runnables.isEmpty()) {
- // Request the scenegraph to run our cleanup job on the render thread.
- // The execution of our QRunnable may happen after the QML tree including the QAbstractVideoFilter instance is
- // destroyed on the main thread so no references to it must be used during cleanup.
- q->window()->scheduleRenderJob(new FilterRunnableDeleter(runnables), QQuickWindow::BeforeSynchronizingStage);
- }
-}
-
void QDeclarativeVideoBackend::releaseResources()
{
// Called on the gui thread when the window is closed or changed.
@@ -121,13 +74,7 @@ void QDeclarativeVideoBackend::releaseResources()
void QDeclarativeVideoBackend::invalidateSceneGraph()
{
// Called on the render thread, e.g. when the context is lost.
- QMutexLocker lock(&m_frameMutex);
- for (int i = 0; i < m_filters.count(); ++i) {
- if (m_filters[i].runnable) {
- delete m_filters[i].runnable;
- m_filters[i].runnable = nullptr;
- }
- }
+// QMutexLocker lock(&m_frameMutex);
}
void QDeclarativeVideoBackend::itemChange(QQuickItem::ItemChange change,
@@ -210,34 +157,7 @@ QSGNode *QDeclarativeVideoBackend::updatePaintNode(QSGNode *oldNode,
QMutexLocker lock(&m_frameMutex);
- bool isFrameModified = false;
if (m_frameChanged) {
- // Run the VideoFilter if there is one. This must be done before potentially changing the videonode below.
- if (m_frame.isValid() && !m_filters.isEmpty()) {
- for (int i = 0; i < m_filters.count(); ++i) {
- QAbstractVideoFilter *filter = m_filters[i].filter;
- QVideoFilterRunnable *&runnable = m_filters[i].runnable;
- if (filter && filter->isActive()) {
- // Create the filter runnable if not yet done. Ownership is taken and is tied to this thread, on which rendering happens.
- if (!runnable)
- runnable = filter->createFilterRunnable();
- if (!runnable)
- continue;
-
- QVideoFilterRunnable::RunFlags flags;
- if (i == m_filters.count() - 1)
- flags |= QVideoFilterRunnable::LastInChain;
-
- QVideoFrame newFrame = runnable->run(&m_frame, m_surfaceFormat, flags);
-
- if (newFrame.isValid() && newFrame != m_frame) {
- isFrameModified = true;
- m_frame = newFrame;
- }
- }
- }
- }
-
if (videoNode && videoNode->pixelFormat() != m_frame.pixelFormat()) {
qCDebug(qLcVideo) << "updatePaintNode: deleting old video node because frame format changed";
delete videoNode;
@@ -269,10 +189,7 @@ QSGNode *QDeclarativeVideoBackend::updatePaintNode(QSGNode *oldNode,
videoNode->setTexturedRectGeometry(m_renderedRect, m_sourceTextureRect,
qNormalizedOrientation(q->orientation()));
if (m_frameChanged) {
- QSGVideoNode::FrameFlags flags;
- if (isFrameModified)
- flags |= QSGVideoNode::FrameFiltered;
- videoNode->setCurrentFrame(m_frame, flags);
+ videoNode->setCurrentFrame(m_frame);
if ((q->flushMode() == QDeclarativeVideoOutput::FirstFrame && !m_frameOnFlush.isValid())
|| q->flushMode() == QDeclarativeVideoOutput::LastFrame) {
diff --git a/src/qtmultimediaquicktools/qdeclarativevideooutput_render_p.h b/src/qtmultimediaquicktools/qdeclarativevideooutput_render_p.h
index 4fa6e5980..b23b74da2 100644
--- a/src/qtmultimediaquicktools/qdeclarativevideooutput_render_p.h
+++ b/src/qtmultimediaquicktools/qdeclarativevideooutput_render_p.h
@@ -62,8 +62,6 @@ QT_BEGIN_NAMESPACE
class QVideoSink;
class QObject;
-class QAbstractVideoFilter;
-class QVideoFilterRunnable;
class QDeclarativeVideoOutput;
class QDeclarativeVideoBackend
@@ -83,13 +81,10 @@ public:
void present(const QVideoFrame &frame);
void stop();
- void appendFilter(QAbstractVideoFilter *filter);
- void clearFilters();
void releaseResources();
void invalidateSceneGraph();
private:
- void scheduleDeleteFilterResources();
QDeclarativeVideoOutput *q;
mutable QVideoSink *m_sink = nullptr;
@@ -101,14 +96,6 @@ private:
QMutex m_frameMutex;
QRectF m_renderedRect; // Destination pixel coordinates, clipped
QRectF m_sourceTextureRect; // Source texture coordinates
-
- struct Filter {
- Filter() : filter(0), runnable(0) { }
- Filter(QAbstractVideoFilter *filter) : filter(filter), runnable(0) { }
- QAbstractVideoFilter *filter;
- QVideoFilterRunnable *runnable;
- };
- QList<Filter> m_filters;
};
namespace {
diff --git a/src/qtmultimediaquicktools/qsgvideonode_p.cpp b/src/qtmultimediaquicktools/qsgvideonode_p.cpp
index 30faf95ef..eb6a31d31 100644
--- a/src/qtmultimediaquicktools/qsgvideonode_p.cpp
+++ b/src/qtmultimediaquicktools/qsgvideonode_p.cpp
@@ -273,7 +273,7 @@ QSGVideoNode::QSGVideoNode(const QVideoSurfaceFormat &format)
setMaterial(m_material);
}
-void QSGVideoNode::setCurrentFrame(const QVideoFrame &frame, FrameFlags)
+void QSGVideoNode::setCurrentFrame(const QVideoFrame &frame)
{
m_material->setCurrentFrame(frame);
markDirty(DirtyMaterial);
diff --git a/src/qtmultimediaquicktools/qsgvideonode_p.h b/src/qtmultimediaquicktools/qsgvideonode_p.h
index 36239cdcd..2422f1388 100644
--- a/src/qtmultimediaquicktools/qsgvideonode_p.h
+++ b/src/qtmultimediaquicktools/qsgvideonode_p.h
@@ -65,17 +65,12 @@ class QSGVideoMaterial;
class QSGVideoNode : public QSGGeometryNode
{
public:
- enum FrameFlag {
- FrameFiltered = 0x01
- };
- Q_DECLARE_FLAGS(FrameFlags, FrameFlag)
-
QSGVideoNode(const QVideoSurfaceFormat &format);
QVideoSurfaceFormat::PixelFormat pixelFormat() const {
return m_format.pixelFormat();
}
- void setCurrentFrame(const QVideoFrame &frame, FrameFlags flags);
+ void setCurrentFrame(const QVideoFrame &frame);
void setTexturedRectGeometry(const QRectF &boundingRect, const QRectF &textureRect, int orientation);
@@ -88,8 +83,6 @@ private:
QSGVideoMaterial *m_material;
};
-Q_DECLARE_OPERATORS_FOR_FLAGS(QSGVideoNode::FrameFlags)
-
QT_END_NAMESPACE
#endif // QSGVIDEONODE_H
diff --git a/tests/auto/integration/qdeclarativevideooutput/tst_qdeclarativevideooutput.cpp b/tests/auto/integration/qdeclarativevideooutput/tst_qdeclarativevideooutput.cpp
index 23ee22d7c..025b11bdf 100644
--- a/tests/auto/integration/qdeclarativevideooutput/tst_qdeclarativevideooutput.cpp
+++ b/tests/auto/integration/qdeclarativevideooutput/tst_qdeclarativevideooutput.cpp
@@ -39,6 +39,7 @@
#include <qobject.h>
#include <qvideosurfaceformat.h>
+#include <qvideoframe.h>
class SurfaceHolder : public QObject
{