diff options
Diffstat (limited to 'examples/multimedia/video/qmlvideofilter_opencl/rgbframehelper.h')
-rw-r--r-- | examples/multimedia/video/qmlvideofilter_opencl/rgbframehelper.h | 141 |
1 files changed, 0 insertions, 141 deletions
diff --git a/examples/multimedia/video/qmlvideofilter_opencl/rgbframehelper.h b/examples/multimedia/video/qmlvideofilter_opencl/rgbframehelper.h deleted file mode 100644 index 1c8dbd857..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 QAbstractVideoBuffer::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 - QAbstractVideoBuffer::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() == QAbstractVideoBuffer::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; } - uchar *map(MapMode, int *, int *) { return 0; } - 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, QVideoFrame::PixelFormat format) -{ -#ifndef QT_NO_OPENGL - return QVideoFrame(new TextureBuffer(textureId), size, format); -#else - return QVideoFrame(); -#endif // QT_NO_OPENGL -} - -#endif |