glupload: try to use the last method after reconfigure
authorMichael Olbrich <m.olbrich@pengutronix.de>
Wed, 4 Jul 2018 07:17:11 +0000 (09:17 +0200)
committerNicolas Dufresne <nicolas.dufresne@collabora.com>
Tue, 11 Sep 2018 03:29:10 +0000 (23:29 -0400)
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

index 2d2eba8..e97d182 100644 (file)
@@ -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;