gstqmlgl: wrap raw GstGLContext into GWeakRef

Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/-/merge_requests/1032>
This commit is contained in:
Dmitry Shusharin 2021-07-30 16:52:23 +07:00 committed by GStreamer Marge Bot
parent b8cb9ae526
commit a338ed98d6
2 changed files with 13 additions and 8 deletions

View file

@ -45,16 +45,18 @@ GstQSGTexture::GstQSGTexture ()
g_once_init_leave (&_debug, 1); g_once_init_leave (&_debug, 1);
} }
g_weak_ref_init (&this->qt_context_ref_, NULL);
gst_video_info_init (&this->v_info); gst_video_info_init (&this->v_info);
this->buffer_ = NULL; this->buffer_ = NULL;
this->buffer_was_bound = FALSE; this->buffer_was_bound = FALSE;
this->qt_context_ = NULL;
this->sync_buffer_ = gst_buffer_new (); this->sync_buffer_ = gst_buffer_new ();
this->dummy_tex_id_ = 0; this->dummy_tex_id_ = 0;
} }
GstQSGTexture::~GstQSGTexture () GstQSGTexture::~GstQSGTexture ()
{ {
g_weak_ref_clear (&this->qt_context_ref_);
gst_buffer_replace (&this->buffer_, NULL); gst_buffer_replace (&this->buffer_, NULL);
gst_buffer_replace (&this->sync_buffer_, NULL); gst_buffer_replace (&this->sync_buffer_, NULL);
this->buffer_was_bound = FALSE; this->buffer_was_bound = FALSE;
@ -83,7 +85,8 @@ GstQSGTexture::setBuffer (GstBuffer * buffer)
return FALSE; return FALSE;
this->buffer_was_bound = FALSE; this->buffer_was_bound = FALSE;
this->qt_context_ = gst_gl_context_get_current ();
g_weak_ref_set (&this->qt_context_ref_, gst_gl_context_get_current ());
return TRUE; return TRUE;
} }
@ -107,13 +110,14 @@ void
GstQSGTexture::bind () GstQSGTexture::bind ()
{ {
const GstGLFuncs *gl; const GstGLFuncs *gl;
GstGLContext *context; GstGLContext *context, *qt_context;
GstGLSyncMeta *sync_meta; GstGLSyncMeta *sync_meta;
GstMemory *mem; GstMemory *mem;
guint tex_id; guint tex_id;
gboolean use_dummy_tex = TRUE; gboolean use_dummy_tex = TRUE;
if (!GST_IS_GL_CONTEXT(this->qt_context_)) qt_context = GST_GL_CONTEXT (g_weak_ref_get (&this->qt_context_ref_));
if (!qt_context)
goto out; goto out;
if (!this->buffer_) if (!this->buffer_)
@ -125,8 +129,7 @@ GstQSGTexture::bind ()
if (!this->mem_) if (!this->mem_)
goto out; goto out;
g_assert (this->qt_context_); gl = qt_context->gl_vtable;
gl = this->qt_context_->gl_vtable;
/* FIXME: should really lock the memory to prevent write access */ /* FIXME: should really lock the memory to prevent write access */
if (!gst_video_frame_map (&this->v_frame, &this->v_info, this->buffer_, if (!gst_video_frame_map (&this->v_frame, &this->v_info, this->buffer_,
@ -146,7 +149,7 @@ GstQSGTexture::bind ()
gst_gl_sync_meta_set_sync_point (sync_meta, context); gst_gl_sync_meta_set_sync_point (sync_meta, context);
gst_gl_sync_meta_wait (sync_meta, this->qt_context_); gst_gl_sync_meta_wait (sync_meta, qt_context);
tex_id = *(guint *) this->v_frame.data[0]; tex_id = *(guint *) this->v_frame.data[0];
GST_LOG ("%p binding Qt texture %u", this, tex_id); GST_LOG ("%p binding Qt texture %u", this, tex_id);
@ -162,6 +165,8 @@ GstQSGTexture::bind ()
this->buffer_was_bound = TRUE; this->buffer_was_bound = TRUE;
out: out:
gst_clear_object (&qt_context);
if (G_UNLIKELY (use_dummy_tex)) { if (G_UNLIKELY (use_dummy_tex)) {
QOpenGLContext *qglcontext = QOpenGLContext::currentContext (); QOpenGLContext *qglcontext = QOpenGLContext::currentContext ();
QOpenGLFunctions *funcs = qglcontext->functions (); QOpenGLFunctions *funcs = qglcontext->functions ();

View file

@ -51,7 +51,7 @@ private:
GstBuffer * buffer_; GstBuffer * buffer_;
gboolean buffer_was_bound; gboolean buffer_was_bound;
GstBuffer * sync_buffer_; GstBuffer * sync_buffer_;
GstGLContext * qt_context_; GWeakRef qt_context_ref_;
GstMemory * mem_; GstMemory * mem_;
GLuint dummy_tex_id_; GLuint dummy_tex_id_;
GstVideoInfo v_info; GstVideoInfo v_info;