summaryrefslogtreecommitdiffstats
path: root/src/multimedia/platform/gstreamer/common/qgstvideobuffer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/multimedia/platform/gstreamer/common/qgstvideobuffer.cpp')
-rw-r--r--src/multimedia/platform/gstreamer/common/qgstvideobuffer.cpp60
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