4#include <QtFFmpegMediaPluginImpl/private/qffmpeghwaccel_videotoolbox_p.h>
6#if !defined(Q_OS_DARWIN)
7#error "Configuration error"
10#include <QtCore/qloggingcategory.h>
12#include <QtFFmpegMediaPluginImpl/private/qffmpegvideobuffer_p.h>
14#include <QtGui/qopenglcontext.h>
15#include <QtGui/rhi/qrhi.h>
17#include <QtMultimedia/private/qvideotexturehelper_p.h>
18#include <QtMultimedia/qvideoframeformat.h>
20#include <CoreVideo/CVMetalTexture.h>
21#include <CoreVideo/CVMetalTextureCache.h>
24#import <AppKit/AppKit.h>
27#import <OpenGLES/EAGL.h>
29#import <Metal/Metal.h>
39CVMetalTextureCacheRef &mtc(
void *&cache) {
return reinterpret_cast<CVMetalTextureCacheRef &>(cache); }
41class VideoToolBoxTextureHandles :
public QVideoFrameTexturesHandles
44 ~VideoToolBoxTextureHandles();
45 quint64 textureHandle(QRhi &,
int plane)
override;
47 TextureConverterBackendPtr parentConverterBackend;
50 CVMetalTextureRef cvMetalTexture[3] = {};
52#if defined(Q_OS_MACOS)
53 CVOpenGLTextureRef cvOpenGLTexture =
nullptr;
54#elif defined(Q_OS_IOS)
55 CVOpenGLESTextureRef cvOpenGLESTexture =
nullptr;
58 CVImageBufferRef m_buffer =
nullptr;
79 qWarning() <<
"Metal texture cache creation failed";
98 qWarning() <<
"OpenGL texture cache creation failed";
110 qWarning() <<
"OpenGL texture cache creation failed";
130#if defined(Q_OS_MACOS)
134#elif defined(Q_OS_IOS)
145 case QRhiTexture::UnknownFormat:
146 return MTLPixelFormatInvalid;
147 case QRhiTexture::RGBA8:
148 return MTLPixelFormatRGBA8Unorm;
149 case QRhiTexture::BGRA8:
150 return MTLPixelFormatBGRA8Unorm;
151 case QRhiTexture::R8:
152 case QRhiTexture::RED_OR_ALPHA8:
153 return MTLPixelFormatR8Unorm;
154 case QRhiTexture::RG8:
155 return MTLPixelFormatRG8Unorm;
156 case QRhiTexture::R16:
157 return MTLPixelFormatR16Unorm;
158 case QRhiTexture::RG16:
159 return MTLPixelFormatRG16Unorm;
161 case QRhiTexture::RGBA16F:
162 return MTLPixelFormatRGBA16Float;
163 case QRhiTexture::RGBA32F:
164 return MTLPixelFormatRGBA32Float;
165 case QRhiTexture::R16F:
166 return MTLPixelFormatR16Float;
167 case QRhiTexture::R32F:
168 return MTLPixelFormatR32Float;
279VideoToolBoxTextureHandles::~VideoToolBoxTextureHandles()
281 for (
int i = 0; i < 4; ++i)
282 if (cvMetalTexture[i])
283 CFRelease(cvMetalTexture[i]);
284#if defined(Q_OS_MACOS)
286 CVOpenGLTextureRelease(cvOpenGLTexture);
287#elif defined(Q_OS_IOS)
288 if (cvOpenGLESTexture)
289 CFRelease(cvOpenGLESTexture);
291 CVPixelBufferRelease(m_buffer);
294quint64 VideoToolBoxTextureHandles::textureHandle(QRhi &,
int plane)
296 if (rhi->backend() == QRhi::Metal)
297 return cvMetalTexture[plane] ? qint64(CVMetalTextureGetTexture(cvMetalTexture[plane])) : 0;
299 Q_ASSERT(plane == 0);
301 return CVOpenGLTextureGetName(cvOpenGLTexture);
304 return CVOpenGLESTextureGetName(cvOpenGLESTexture);
static MTLPixelFormat rhiTextureFormatToMetalFormat(QRhiTexture::Format f)
std::conditional_t< QT_FFMPEG_AVIO_WRITE_CONST, const uint8_t *, uint8_t * > AvioWriteBufferType
Q_STATIC_LOGGING_CATEGORY(lcAccessibilityCore, "qt.accessibility.core")