basesink: Check if buffers are too late before calling prepare/prepare_list

https://bugzilla.gnome.org/show_bug.cgi?id=690936
This commit is contained in:
Sebastian Dröge 2013-01-01 10:23:59 +01:00
parent d0c8831f1f
commit c859a1719c

View file

@ -3259,17 +3259,36 @@ gst_base_sink_chain_unlocked (GstBaseSink * basesink, GstPad * pad,
goto out_of_segment; goto out_of_segment;
} }
if (!is_list) { if (bclass->prepare || bclass->prepare_list) {
if (bclass->prepare) { gboolean late = FALSE;
ret = bclass->prepare (basesink, GST_BUFFER_CAST (obj)); gboolean do_sync = TRUE, stepped = FALSE, step_end, syncable = TRUE;
if (G_UNLIKELY (ret != GST_FLOW_OK)) GstClockTime sstart, sstop, rstart, rstop;
goto prepare_failed; GstStepInfo *current;
}
} else { current = &priv->current_step;
if (bclass->prepare_list) { syncable =
ret = bclass->prepare_list (basesink, GST_BUFFER_LIST_CAST (obj)); gst_base_sink_get_sync_times (basesink, obj, &sstart, &sstop, &rstart,
if (G_UNLIKELY (ret != GST_FLOW_OK)) &rstop, &do_sync, &stepped, current, &step_end);
goto prepare_failed;
if (!stepped && syncable && do_sync)
late =
gst_base_sink_is_too_late (basesink, obj, rstart, rstop,
GST_CLOCK_EARLY, 0);
if (late)
goto dropped;
if (!is_list) {
if (bclass->prepare) {
ret = bclass->prepare (basesink, GST_BUFFER_CAST (obj));
if (G_UNLIKELY (ret != GST_FLOW_OK))
goto prepare_failed;
}
} else {
if (bclass->prepare_list) {
ret = bclass->prepare_list (basesink, GST_BUFFER_LIST_CAST (obj));
if (G_UNLIKELY (ret != GST_FLOW_OK))
goto prepare_failed;
}
} }
} }