From 75dd6425ed8dc6a65374afb6ad1b5c11658e07bf Mon Sep 17 00:00:00 2001 From: David Schleef Date: Thu, 1 May 2003 06:24:34 +0000 Subject: [PATCH] restore wtay's clocking changes in 1.17->1.18 Original commit message from CVS: restore wtay's clocking changes in 1.17->1.18 --- gst/videotestsrc/gstvideotestsrc.c | 30 +++++++++++++++++++++++++++--- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/gst/videotestsrc/gstvideotestsrc.c b/gst/videotestsrc/gstvideotestsrc.c index c640a57e1c..7bb87d151f 100644 --- a/gst/videotestsrc/gstvideotestsrc.c +++ b/gst/videotestsrc/gstvideotestsrc.c @@ -59,6 +59,7 @@ enum static void gst_videotestsrc_class_init (GstVideotestsrcClass * klass); static void gst_videotestsrc_init (GstVideotestsrc * videotestsrc); static GstElementStateReturn gst_videotestsrc_change_state (GstElement * element); +static void gst_videotestsrc_set_clock (GstElement *element, GstClock *clock); static void gst_videotestsrc_set_pattern (GstVideotestsrc *src, int pattern_type); static void gst_videotestsrc_set_property (GObject * object, guint prop_id, @@ -163,6 +164,17 @@ gst_videotestsrc_class_init (GstVideotestsrcClass * klass) gobject_class->get_property = gst_videotestsrc_get_property; gstelement_class->change_state = gst_videotestsrc_change_state; + gstelement_class->set_clock = gst_videotestsrc_set_clock; +} + +static void +gst_videotestsrc_set_clock (GstElement *element, GstClock *clock) +{ + GstVideotestsrc *v; + + v = GST_VIDEOTESTSRC (element); + + gst_object_replace ((GstObject **)&v->clock, (GstObject *)clock); } static GstPadLinkReturn @@ -290,6 +302,7 @@ gst_videotestsrc_get (GstPad * pad) GstVideotestsrc *videotestsrc; gulong newsize; GstBuffer *buf; + GstClockTimeDiff jitter = 0; GST_DEBUG (0, "gst_videotestsrc_get"); @@ -313,11 +326,22 @@ gst_videotestsrc_get (GstPad * pad) } g_return_val_if_fail (GST_BUFFER_DATA (buf) != NULL, NULL); - videotestsrc->timestamp += videotestsrc->interval; - GST_BUFFER_TIMESTAMP (buf) = videotestsrc->timestamp; - videotestsrc->make_image (videotestsrc, (void *) GST_BUFFER_DATA (buf), videotestsrc->width, videotestsrc->height); + + do { + GstClockID id; + + videotestsrc->timestamp += videotestsrc->interval; + GST_BUFFER_TIMESTAMP (buf) = videotestsrc->timestamp; + + if (videotestsrc->clock) { + id = gst_clock_new_single_shot_id (videotestsrc->clock, GST_BUFFER_TIMESTAMP (buf)); + gst_element_clock_wait (GST_ELEMENT (videotestsrc), id, &jitter); + gst_clock_id_free (id); + } + } + while (jitter > 100 * GST_MSECOND); return buf; }