gluploadelement: try to avoid dropping buffers
authorMichael Olbrich <m.olbrich@pengutronix.de>
Wed, 4 Jul 2018 07:29:57 +0000 (09:29 +0200)
committerMichael Olbrich <m.olbrich@pengutronix.de>
Tue, 30 Oct 2018 11:25:08 +0000 (12:25 +0100)
Without this, a buffer is dropped if glupload indicates that it is
necessary to reconfigure.
Avoid this by explicitly reconfiguring immediately and uploading the buffer
again.

https://bugzilla.gnome.org/show_bug.cgi?id=783521

ext/gl/gstgluploadelement.c

index 1998c77..eaaeaed 100644 (file)
@@ -232,9 +232,21 @@ gst_gl_upload_element_prepare_output_buffer (GstBaseTransform * bt,
   if (!upload->upload)
     return GST_FLOW_NOT_NEGOTIATED;
 
+again:
   ret = gst_gl_upload_perform_with_buffer (upload->upload, buffer, outbuf);
   if (ret == GST_GL_UPLOAD_RECONFIGURE) {
-    gst_base_transform_reconfigure_src (bt);
+    GstPad *sinkpad = GST_BASE_TRANSFORM_SINK_PAD (bt);
+    GstCaps *incaps = gst_pad_get_current_caps (sinkpad);
+    GST_DEBUG_OBJECT (bt,
+        "Failed to upload with curren caps -- reconfiguring.");
+    /* Note: gst_base_transform_reconfigure_src() cannot be used here.
+     * Reconfiguring must be synchronous to avoid dropping the current
+     * buffer */
+    gst_pad_send_event (sinkpad, gst_event_new_caps (incaps));
+    if (!gst_pad_needs_reconfigure (GST_BASE_TRANSFORM_SRC_PAD (bt))) {
+      GST_DEBUG_OBJECT (bt, "Retry uploading with new caps");
+      goto again;
+    }
     return GST_FLOW_OK;
   }