2005-10-08 Wim Taymans <wim@fluendo.com>
+ * gst/base/gstbasesink.c: (gst_base_sink_handle_object),
+ (gst_base_sink_do_sync), (gst_base_sink_handle_buffer):
+ Prepare for doing QOS.
+
+2005-10-08 Wim Taymans <wim@fluendo.com>
+
* check/gst/gstbin.c: (GST_START_TEST):
* check/pipelines/cleanup.c: (GST_START_TEST):
* check/pipelines/simple_launch_lines.c: (GST_START_TEST):
* 4) wait on the clock, this blocks
* 5) unref the clockid again
*/
-static gboolean
+static GstClockReturn
gst_base_sink_do_sync (GstBaseSink * basesink, GstBuffer * buffer)
{
- gboolean result = TRUE;
+ GstClockReturn result = GST_CLOCK_OK;
GstClockTime start, end;
GstClockTimeDiff stream_start, stream_end;
GstBaseSinkClass *bclass;
/* now do clocking */
if (basesink->clock && basesink->sync) {
- GstClockReturn ret;
GstClockTime base_time;
GST_LOCK (basesink);
else
basesink->end_time = GST_CLOCK_TIME_NONE;
- ret = gst_base_sink_wait (basesink, stream_start + base_time);
+ result = gst_base_sink_wait (basesink, stream_start + base_time);
GST_UNLOCK (basesink);
- GST_LOG_OBJECT (basesink, "clock entry done: %d", ret);
- if (ret == GST_CLOCK_UNSCHEDULED)
- result = FALSE;
+ GST_LOG_OBJECT (basesink, "clock entry done: %d", result);
}
done:
out_of_segment:
{
GST_LOG_OBJECT (basesink, "buffer skipped, not in segment");
- return FALSE;
+ return GST_CLOCK_UNSCHEDULED;
}
}
gst_base_sink_handle_buffer (GstBaseSink * basesink, GstBuffer * buf)
{
GstFlowReturn ret = GST_FLOW_OK;
- gboolean render;
-
- render = gst_base_sink_do_sync (basesink, buf);
-
- if (render) {
- GstBaseSinkClass *bclass;
+ GstClockReturn status;
+
+ status = gst_base_sink_do_sync (basesink, buf);
+ switch (status) {
+ case GST_CLOCK_EARLY:
+ GST_DEBUG_OBJECT (basesink, "late frame !");
+ /* fallthrough for now */
+ case GST_CLOCK_OK:
+ {
+ GstBaseSinkClass *bclass;
- bclass = GST_BASE_SINK_GET_CLASS (basesink);
- if (bclass->render)
- ret = bclass->render (basesink, buf);
+ bclass = GST_BASE_SINK_GET_CLASS (basesink);
+ if (bclass->render)
+ ret = bclass->render (basesink, buf);
+ break;
+ }
+ default:
+ break;
}
GST_DEBUG_OBJECT (basesink, "buffer unref after render %p", basesink, buf);
* 4) wait on the clock, this blocks
* 5) unref the clockid again
*/
-static gboolean
+static GstClockReturn
gst_base_sink_do_sync (GstBaseSink * basesink, GstBuffer * buffer)
{
- gboolean result = TRUE;
+ GstClockReturn result = GST_CLOCK_OK;
GstClockTime start, end;
GstClockTimeDiff stream_start, stream_end;
GstBaseSinkClass *bclass;
/* now do clocking */
if (basesink->clock && basesink->sync) {
- GstClockReturn ret;
GstClockTime base_time;
GST_LOCK (basesink);
else
basesink->end_time = GST_CLOCK_TIME_NONE;
- ret = gst_base_sink_wait (basesink, stream_start + base_time);
+ result = gst_base_sink_wait (basesink, stream_start + base_time);
GST_UNLOCK (basesink);
- GST_LOG_OBJECT (basesink, "clock entry done: %d", ret);
- if (ret == GST_CLOCK_UNSCHEDULED)
- result = FALSE;
+ GST_LOG_OBJECT (basesink, "clock entry done: %d", result);
}
done:
out_of_segment:
{
GST_LOG_OBJECT (basesink, "buffer skipped, not in segment");
- return FALSE;
+ return GST_CLOCK_UNSCHEDULED;
}
}
gst_base_sink_handle_buffer (GstBaseSink * basesink, GstBuffer * buf)
{
GstFlowReturn ret = GST_FLOW_OK;
- gboolean render;
-
- render = gst_base_sink_do_sync (basesink, buf);
-
- if (render) {
- GstBaseSinkClass *bclass;
+ GstClockReturn status;
+
+ status = gst_base_sink_do_sync (basesink, buf);
+ switch (status) {
+ case GST_CLOCK_EARLY:
+ GST_DEBUG_OBJECT (basesink, "late frame !");
+ /* fallthrough for now */
+ case GST_CLOCK_OK:
+ {
+ GstBaseSinkClass *bclass;
- bclass = GST_BASE_SINK_GET_CLASS (basesink);
- if (bclass->render)
- ret = bclass->render (basesink, buf);
+ bclass = GST_BASE_SINK_GET_CLASS (basesink);
+ if (bclass->render)
+ ret = bclass->render (basesink, buf);
+ break;
+ }
+ default:
+ break;
}
GST_DEBUG_OBJECT (basesink, "buffer unref after render %p", basesink, buf);