diff options
Diffstat (limited to 'src/multimedia/video/qmemoryvideobuffer.cpp')
-rw-r--r-- | src/multimedia/video/qmemoryvideobuffer.cpp | 112 |
1 files changed, 24 insertions, 88 deletions
diff --git a/src/multimedia/video/qmemoryvideobuffer.cpp b/src/multimedia/video/qmemoryvideobuffer.cpp index febcd66c8..bc7ec9a95 100644 --- a/src/multimedia/video/qmemoryvideobuffer.cpp +++ b/src/multimedia/video/qmemoryvideobuffer.cpp @@ -1,63 +1,10 @@ -/**************************************************************************** -** -** 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$ -** -****************************************************************************/ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only #include "qmemoryvideobuffer_p.h" -#include "qabstractvideobuffer_p.h" -#include <qbytearray.h> - QT_BEGIN_NAMESPACE -class QMemoryVideoBufferPrivate : public QAbstractVideoBufferPrivate -{ -public: - QMemoryVideoBufferPrivate() - : bytesPerLine(0) - , mapMode(QAbstractVideoBuffer::NotMapped) - { - } - - int bytesPerLine; - QAbstractVideoBuffer::MapMode mapMode; - QByteArray data; -}; - /*! \class QMemoryVideoBuffer \brief The QMemoryVideoBuffer class provides a system memory allocated video data buffer. @@ -70,50 +17,39 @@ public: /*! Constructs a video buffer with an image stride of \a bytesPerLine from a byte \a array. */ -QMemoryVideoBuffer::QMemoryVideoBuffer(const QByteArray &array, int bytesPerLine) - : QAbstractVideoBuffer(*new QMemoryVideoBufferPrivate, NoHandle) +QMemoryVideoBuffer::QMemoryVideoBuffer(QByteArray data, int bytesPerLine) + : QAbstractVideoBuffer(QVideoFrame::NoHandle), + m_bytesPerLine(bytesPerLine), + m_data(std::move(data)) { - Q_D(QMemoryVideoBuffer); - - d->data = array; - d->bytesPerLine = bytesPerLine; } /*! Destroys a system memory allocated video buffer. */ -QMemoryVideoBuffer::~QMemoryVideoBuffer() -{ -} +QMemoryVideoBuffer::~QMemoryVideoBuffer() = default; /*! \reimp */ -QAbstractVideoBuffer::MapMode QMemoryVideoBuffer::mapMode() const +QAbstractVideoBuffer::MapData QMemoryVideoBuffer::map(QVideoFrame::MapMode mode) { - return d_func()->mapMode; -} - -/*! - \reimp -*/ -uchar *QMemoryVideoBuffer::map(MapMode mode, int *numBytes, int *bytesPerLine) -{ - Q_D(QMemoryVideoBuffer); - - if (d->mapMode == NotMapped && d->data.size() && mode != NotMapped) { - d->mapMode = mode; - - if (numBytes) - *numBytes = d->data.size(); - - if (bytesPerLine) - *bytesPerLine = d->bytesPerLine; - - return reinterpret_cast<uchar *>(d->data.data()); - } else { - return nullptr; + MapData mapData; + if (m_mapMode == QVideoFrame::NotMapped && m_data.size() && mode != QVideoFrame::NotMapped) { + m_mapMode = mode; + + mapData.nPlanes = 1; + mapData.bytesPerLine[0] = m_bytesPerLine; + // avoid detaching and extra copying in case the underlyingByteArray is + // being held by textures or anything else. + if (mode == QVideoFrame::ReadOnly) + mapData.data[0] = reinterpret_cast<uchar *>(const_cast<char*>(m_data.constData())); + else + mapData.data[0] = reinterpret_cast<uchar *>(m_data.data()); + mapData.size[0] = m_data.size(); } + + return mapData; } /*! @@ -121,7 +57,7 @@ uchar *QMemoryVideoBuffer::map(MapMode mode, int *numBytes, int *bytesPerLine) */ void QMemoryVideoBuffer::unmap() { - d_func()->mapMode = NotMapped; + m_mapMode = QVideoFrame::NotMapped; } QT_END_NAMESPACE |