mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-24 17:20:36 +00:00
qmlglsrc: sync on the streaming thread
After rendering a QML scene the qmlglsrc element copies the contents of the scene to a GStreamer buffer. This happens on the Qt render thread. Then it attaches a sync point to the destination buffer. This sync point must be awaited by other threads which use the buffer later on. The current implementation relies on the downstream elements to wait for the sync point. However, there are situation where this does not work. The GstBaseTransform e.g. copies the buffer metadata (which overwrites the sync point without waiting for it) *before* waiting for the sync point. This commit waits for the sync point inside the qmlglsrc element before sending it downstream. The wait command is issued on the streaming thread with the pipeline OpenGL context, i.e. it will synchronize with the GStreamer OpenGL thread. Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5506>
This commit is contained in:
parent
b0d3d7644d
commit
24ae3de107
1 changed files with 6 additions and 0 deletions
|
@ -434,6 +434,8 @@ static GstFlowReturn
|
|||
gst_qt_src_fill (GstPushSrc * psrc, GstBuffer * buffer)
|
||||
{
|
||||
GstQtSrc *qt_src = GST_QT_SRC (psrc);
|
||||
GstGLContext* context = qt_src->context;
|
||||
GstGLSyncMeta *sync_meta;
|
||||
|
||||
GST_DEBUG_OBJECT (qt_src, "setting buffer %p", buffer);
|
||||
|
||||
|
@ -442,6 +444,10 @@ gst_qt_src_fill (GstPushSrc * psrc, GstBuffer * buffer)
|
|||
return GST_FLOW_ERROR;
|
||||
}
|
||||
|
||||
sync_meta = gst_buffer_get_gl_sync_meta(buffer);
|
||||
if (sync_meta)
|
||||
gst_gl_sync_meta_wait(sync_meta, context);
|
||||
|
||||
if (!qt_src->downstream_supports_affine_meta) {
|
||||
if (qt_src->pending_image_orientation) {
|
||||
/* let downstream know the image orientation is vertical filp */
|
||||
|
|
Loading…
Reference in a new issue