diff options
Diffstat (limited to 'src/multimedia/platform/gstreamer/common/qgstvideobuffer.cpp')
-rw-r--r-- | src/multimedia/platform/gstreamer/common/qgstvideobuffer.cpp | 60 |
1 files changed, 47 insertions, 13 deletions
diff --git a/src/multimedia/platform/gstreamer/common/qgstvideobuffer.cpp b/src/multimedia/platform/gstreamer/common/qgstvideobuffer.cpp index 711472f29..a345fc8c2 100644 --- a/src/multimedia/platform/gstreamer/common/qgstvideobuffer.cpp +++ b/src/multimedia/platform/gstreamer/common/qgstvideobuffer.cpp @@ -39,23 +39,27 @@ #include "qgstvideobuffer_p.h" -QT_BEGIN_NAMESPACE +#include <gst/video/video.h> +#include <gst/video/gstvideometa.h> + +#include "qgstutils_p.h" + +#if QT_CONFIG(gstreamer_gl) +#include <QtGui/private/qrhi_p.h> +#include <QtGui/private/qrhigles2_p.h> + +#include <gst/gl/gstglconfig.h> +#include <gst/gl/gstglmemory.h> +#endif -QGstVideoBuffer::QGstVideoBuffer(GstBuffer *buffer, const GstVideoInfo &info) - : QAbstractVideoBuffer(QVideoFrame::NoHandle) - , m_videoInfo(info) - , m_buffer(buffer) -{ - gst_buffer_ref(m_buffer); -} -QGstVideoBuffer::QGstVideoBuffer(GstBuffer *buffer, const GstVideoInfo &info, - QVideoFrame::HandleType handleType, - const QVariant &handle) - : QAbstractVideoBuffer(handleType) +QT_BEGIN_NAMESPACE + +QGstVideoBuffer::QGstVideoBuffer(GstBuffer *buffer, const GstVideoInfo &info, QRhi *rhi, BufferFormat format) + : QAbstractVideoBuffer(QVideoFrame::NoHandle, rhi) + , bufferFormat(format) , m_videoInfo(info) , m_buffer(buffer) - , m_handle(handle) { gst_buffer_ref(m_buffer); } @@ -116,4 +120,34 @@ void QGstVideoBuffer::unmap() m_mode = QVideoFrame::NotMapped; } +quint64 QGstVideoBuffer::textureHandle(int plane) const +{ + if (plane != 0) + return 0; +#if QT_CONFIG(gstreamer_gl) + if (bufferFormat == GLTexture) { + auto *memory = gst_buffer_peek_memory(m_buffer, 0); + if (gst_is_gl_memory(memory)) { + GstGLMemory *glmem = GST_GL_MEMORY_CAST(memory); + // ### Handle multiple planes + return gst_gl_memory_get_texture_id(glmem); + } + } else if (bufferFormat == VideoGLTextureUploadMeta) { + Q_ASSERT(rhi && rhi->backend() == QRhi::OpenGLES2); + + auto *upload = gst_buffer_get_video_gl_texture_upload_meta(m_buffer); + if (upload) { + rhi->makeThreadLocalNativeContextCurrent(); + // ### Handle multiple planes + guint textures[4]; + gst_video_gl_texture_upload_meta_upload(upload, textures); + return textures[0]; + } else { + qWarning() << "Could not use GstVideoGLTextureUploadMeta"; + } + } +#endif + return 0; +} + QT_END_NAMESPACE |