From c1053e17d58c44f5509aaf9949c02b82332cb193 Mon Sep 17 00:00:00 2001 From: Michael Olbrich Date: Wed, 4 Jul 2018 09:17:11 +0200 Subject: [PATCH] glupload: try to use the last method after reconfigure Reconfigure will trigger a set_caps which clears the upload method. Remember the method in this case and start with it. Wrap around once to try all methods if necessary. https://bugzilla.gnome.org/show_bug.cgi?id=783521 --- gst-libs/gst/gl/gstglupload.c | 32 +++++++++++++++++++++++++++----- 1 file changed, 27 insertions(+), 5 deletions(-) diff --git a/gst-libs/gst/gl/gstglupload.c b/gst-libs/gst/gl/gstglupload.c index 2d2eba8..e97d182 100644 --- a/gst-libs/gst/gl/gstglupload.c +++ b/gst-libs/gst/gl/gstglupload.c @@ -103,6 +103,9 @@ struct _GstGLUploadPrivate const UploadMethod *method; gpointer method_impl; int method_i; + + /* saved method for reconfigure */ + int saved_method_i; }; #define DEBUG_INIT \ @@ -1895,14 +1898,29 @@ gst_gl_upload_get_caps (GstGLUpload * upload, GstCaps ** in_caps, } static gboolean -_upload_find_method (GstGLUpload * upload) +_upload_find_method (GstGLUpload * upload, gpointer last_impl) { gint method_i; - if (upload->priv->method_i >= G_N_ELEMENTS (upload_methods)) - return FALSE; + /* start with the last used method after explicitly reconfiguring to + * negotiate caps for this method */ + if (upload->priv->method_i == 0) { + upload->priv->method_i = upload->priv->saved_method_i; + upload->priv->saved_method_i = 0; + } + + if (upload->priv->method_i >= G_N_ELEMENTS (upload_methods)) { + if (last_impl) + upload->priv->method_i = 0; + else + return FALSE; + } method_i = upload->priv->method_i; + + if (last_impl == upload->priv->upload_impl[method_i]) + return FALSE; + upload->priv->method = upload_methods[method_i]; upload->priv->method_impl = upload->priv->upload_impl[method_i]; @@ -1931,6 +1949,7 @@ gst_gl_upload_perform_with_buffer (GstGLUpload * upload, GstBuffer * buffer, { GstGLUploadReturn ret = GST_GL_UPLOAD_ERROR; GstBuffer *outbuf; + gpointer last_impl = upload->priv->method_impl; g_return_val_if_fail (GST_IS_GL_UPLOAD (upload), FALSE); g_return_val_if_fail (GST_IS_BUFFER (buffer), FALSE); @@ -1940,7 +1959,7 @@ gst_gl_upload_perform_with_buffer (GstGLUpload * upload, GstBuffer * buffer, #define NEXT_METHOD \ do { \ - if (!_upload_find_method (upload)) { \ + if (!_upload_find_method (upload, last_impl)) { \ GST_OBJECT_UNLOCK (upload); \ return FALSE; \ } \ @@ -1948,7 +1967,7 @@ do { \ } while (0) if (!upload->priv->method_impl) - _upload_find_method (upload); + _upload_find_method (upload, last_impl); restart: if (!upload->priv->method->accept (upload->priv->method_impl, buffer, @@ -1992,6 +2011,9 @@ restart: GST_BUFFER_COPY_FLAGS | GST_BUFFER_COPY_TIMESTAMPS, 0, -1); *outbuf_ptr = outbuf; + if (ret == GST_GL_UPLOAD_RECONFIGURE) + upload->priv->saved_method_i = upload->priv->method_i - 1; + GST_OBJECT_UNLOCK (upload); return ret; -- 2.7.4