outputselector: Recheck pending switch after pushing buffer
authorThiago Santos <thiago.sousa.santos@collabora.co.uk>
Fri, 17 Sep 2010 12:44:02 +0000 (09:44 -0300)
committerTim-Philipp Müller <tim.muller@collabora.co.uk>
Fri, 31 Dec 2010 00:54:05 +0000 (00:54 +0000)
This patch makes output-selector always recheck if there's a
pending pad switch after pushing a buffer, preventing that
it pushes a buffer on the 'wrong' pad.

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

plugins/elements/gstoutputselector.c

index 21501f1..088bed0 100644 (file)
@@ -394,7 +394,18 @@ gst_output_selector_chain (GstPad * pad, GstBuffer * buf)
 
   osel = GST_OUTPUT_SELECTOR (gst_pad_get_parent (pad));
 
-  if (osel->pending_srcpad) {
+  /*
+   * The _switch function might push a buffer if 'resend-latest' is true.
+   *
+   * Elements/Applications (e.g. camerabin) might use pad probes to
+   * switch output-selector's active pad. If we simply switch and don't
+   * recheck any pending pad switch the following codepath could end
+   * up pushing a buffer on a non-active pad. This is bad.
+   *
+   * So we always should check the pending_srcpad before going further down
+   * the chain and pushing the new buffer
+   */
+  while (osel->pending_srcpad) {
     /* Do the switch */
     gst_output_selector_switch (osel);
   }