Revision control

++ // Copyright (C) 2024 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 "qvideoframetexturefromsource_p.h"
++
++ QT_BEGIN_NAMESPACE
++
++ using namespace QVideoTextureHelper;
++
++ QVideoFrameTexturesFromRhiTextureArray::QVideoFrameTexturesFromRhiTextureArray(
++ RhiTextureArray &&rhiTextures, QVideoFrame sourceFrame)
++ : QVideoFrameTextures(std::move(sourceFrame)), m_rhiTextures(std::move(rhiTextures))
++ {
++ }
++
++ // out-of-line destructor to get arount potential RTTI problems
++ QVideoFrameTexturesFromRhiTextureArray::~QVideoFrameTexturesFromRhiTextureArray() = default;
++
++ QRhiTexture *QVideoFrameTexturesFromRhiTextureArray::texture(uint plane) const
++ {
++ return plane < m_rhiTextures.size() ? m_rhiTextures[plane].get() : nullptr;
++ }
++
++ RhiTextureArray QVideoFrameTexturesFromRhiTextureArray::takeTextureArray() &&
++ {
++ return std::move(m_rhiTextures);
++ }
++
++ QVideoFrameTexturesFromMemory::QVideoFrameTexturesFromMemory(RhiTextureArray &&rhiTextures,
++ QVideoFrame mappedFrame)
++ : QVideoFrameTexturesFromRhiTextureArray(std::move(rhiTextures), mappedFrame),
++ m_mappedFrame(std::move(mappedFrame))
++ {
++ Q_ASSERT(!m_mappedFrame.isValid() || m_mappedFrame.isReadable());
++ }
++
++ // We keep the source frame mapped until QRhi::endFrame is invoked.
++ // QRhi::endFrame ensures that the mapped frame's memory has been loaded into the texture.
++ // See QTBUG-123174 for bug's details.
++ QVideoFrameTexturesFromMemory::~QVideoFrameTexturesFromMemory()
++ {
++ m_mappedFrame.unmap();
++ }
++
++ void QVideoFrameTexturesFromMemory::onFrameEndInvoked()
++ {
++ // After invoking QRhi::endFrame, the texture is loaded, and we don't need to
++ // to store the source mapped frame anymore
++ m_mappedFrame.unmap();
++ m_mappedFrame = {};
++ }
++
++ QVideoFrameTexturesFromHandlesSet::QVideoFrameTexturesFromHandlesSet(
++ RhiTextureArray &&rhiTextures, QVideoFrameTexturesHandlesUPtr handles,
++ QVideoFrame sourceFrame)
++ : QVideoFrameTexturesFromRhiTextureArray(std::move(rhiTextures), std::move(sourceFrame)),
++ m_textureHandles(std::move(handles))
++ {
++ }
++
++ // out-of-line destructor to get arount potential RTTI problems
++ QVideoFrameTexturesFromHandlesSet::~QVideoFrameTexturesFromHandlesSet() = default;
++
++ QVideoFrameTexturesHandlesUPtr QVideoFrameTexturesFromHandlesSet::takeHandles()
++ {
++ return std::move(m_textureHandles);
++ }
++
++ QT_END_NAMESPACE