baseparse: prevent infinite loop when draining
authorMark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
Fri, 7 Aug 2009 11:07:17 +0000 (13:07 +0200)
committerTim-Philipp Müller <tim.muller@collabora.co.uk>
Fri, 8 Apr 2011 17:06:58 +0000 (18:06 +0100)
gst/aacparse/gstbaseparse.c

index ffb17f3..cdd8b18 100644 (file)
@@ -872,6 +872,8 @@ gst_base_parse_drain (GstBaseParse * parse)
 {
   guint avail;
 
+  GST_DEBUG_OBJECT (parse, "draining");
+
   for (;;) {
     avail = gst_adapter_available (parse->adapter);
     if (!avail)
@@ -881,6 +883,12 @@ gst_base_parse_drain (GstBaseParse * parse)
     if (gst_base_parse_chain (parse->sinkpad, NULL) != GST_FLOW_OK) {
       break;
     }
+
+    /* nothing changed, maybe due to truncated frame; break infinite loop */
+    if (avail == gst_adapter_available (parse->adapter)) {
+      GST_DEBUG_OBJECT (parse, "no change during draining; flushing");
+      gst_adapter_clear (parse->adapter);
+    }
   }
 }