baseparse: prevent infinite loop when draining

This commit is contained in:
Mark Nauwelaerts 2009-08-07 13:07:17 +02:00
parent 1f2a0d3b3d
commit 222322e7f3
3 changed files with 24 additions and 0 deletions

View file

@ -872,6 +872,8 @@ gst_base_parse_drain (GstBaseParse * parse)
{ {
guint avail; guint avail;
GST_DEBUG_OBJECT (parse, "draining");
for (;;) { for (;;) {
avail = gst_adapter_available (parse->adapter); avail = gst_adapter_available (parse->adapter);
if (!avail) if (!avail)
@ -881,6 +883,12 @@ gst_base_parse_drain (GstBaseParse * parse)
if (gst_base_parse_chain (parse->sinkpad, NULL) != GST_FLOW_OK) { if (gst_base_parse_chain (parse->sinkpad, NULL) != GST_FLOW_OK) {
break; 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);
}
} }
} }

View file

@ -872,6 +872,8 @@ gst_base_parse_drain (GstBaseParse * parse)
{ {
guint avail; guint avail;
GST_DEBUG_OBJECT (parse, "draining");
for (;;) { for (;;) {
avail = gst_adapter_available (parse->adapter); avail = gst_adapter_available (parse->adapter);
if (!avail) if (!avail)
@ -881,6 +883,12 @@ gst_base_parse_drain (GstBaseParse * parse)
if (gst_base_parse_chain (parse->sinkpad, NULL) != GST_FLOW_OK) { if (gst_base_parse_chain (parse->sinkpad, NULL) != GST_FLOW_OK) {
break; 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);
}
} }
} }

View file

@ -895,6 +895,8 @@ gst_base_parse_drain (GstBaseParse * parse)
{ {
guint avail; guint avail;
GST_DEBUG_OBJECT (parse, "draining");
for (;;) { for (;;) {
avail = gst_adapter_available (parse->priv->adapter); avail = gst_adapter_available (parse->priv->adapter);
if (!avail) if (!avail)
@ -904,6 +906,12 @@ gst_base_parse_drain (GstBaseParse * parse)
if (gst_base_parse_chain (parse->sinkpad, NULL) != GST_FLOW_OK) { if (gst_base_parse_chain (parse->sinkpad, NULL) != GST_FLOW_OK) {
break; 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);
}
} }
} }