diff options
author | David Schleef <ds@schleef.org> | 2009-09-09 17:51:19 -0700 |
---|---|---|
committer | David Schleef <ds@schleef.org> | 2009-09-09 18:19:56 -0700 |
commit | 3dc2c2472c0b70a05b09c2248e9c332fdb08b98d (patch) | |
tree | 892d68dfd5be62647d5a43fd723f29badd8624b2 /ext/raw1394/gstdv1394src.c | |
parent | a9909c1abfd11787954baaf87676505d57da6fae (diff) |
dv1394src: Add a clock based on isochronous cycle counter
Partial fix for #169383.
Diffstat (limited to 'ext/raw1394/gstdv1394src.c')
-rw-r--r-- | ext/raw1394/gstdv1394src.c | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/ext/raw1394/gstdv1394src.c b/ext/raw1394/gstdv1394src.c index 5bcaa7d7..6e3b4c10 100644 --- a/ext/raw1394/gstdv1394src.c +++ b/ext/raw1394/gstdv1394src.c @@ -56,6 +56,7 @@ #include "gstdv1394src.h" #include "gst1394probe.h" +#include "gst1394clock.h" #define CONTROL_STOP 'S' /* stop the select call */ @@ -136,6 +137,8 @@ static void gst_dv1394src_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static void gst_dv1394src_dispose (GObject * object); +static GstClock *gst_dv1394src_provide_clock (GstElement * element); + static gboolean gst_dv1394src_start (GstBaseSrc * bsrc); static gboolean gst_dv1394src_stop (GstBaseSrc * bsrc); static gboolean gst_dv1394src_unlock (GstBaseSrc * bsrc); @@ -183,10 +186,12 @@ static void gst_dv1394src_class_init (GstDV1394SrcClass * klass) { GObjectClass *gobject_class; + GstElementClass *gstelement_class; GstBaseSrcClass *gstbasesrc_class; GstPushSrcClass *gstpushsrc_class; gobject_class = (GObjectClass *) klass; + gstelement_class = (GstElementClass *) klass; gstbasesrc_class = (GstBaseSrcClass *) klass; gstpushsrc_class = (GstPushSrcClass *) klass; @@ -194,6 +199,8 @@ gst_dv1394src_class_init (GstDV1394SrcClass * klass) gobject_class->get_property = gst_dv1394src_get_property; gobject_class->dispose = gst_dv1394src_dispose; + gstelement_class->provide_clock = gst_dv1394src_provide_clock; + gst_dv1394src_signals[SIGNAL_FRAME_DROPPED] = g_signal_new ("frame-dropped", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GstDV1394SrcClass, frame_dropped), @@ -274,6 +281,8 @@ gst_dv1394src_init (GstDV1394Src * dv1394src, GstDV1394SrcClass * klass) dv1394src->buf = NULL; dv1394src->frame = NULL; dv1394src->frame_sequence = 0; + + dv1394src->provided_clock = gst_1394_clock_new ("dv1394clock"); } static void @@ -281,6 +290,10 @@ gst_dv1394src_dispose (GObject * object) { GstDV1394Src *src = GST_DV1394SRC (object); + if (src->provided_clock) { + g_object_unref (src->provided_clock); + } + g_free (src->uri); src->uri = NULL; @@ -363,6 +376,14 @@ gst_dv1394src_get_property (GObject * object, guint prop_id, GValue * value, } } +static GstClock * +gst_dv1394src_provide_clock (GstElement * element) +{ + GstDV1394Src *dv1394src = GST_DV1394SRC (element); + + return GST_CLOCK_CAST (gst_object_ref (dv1394src->provided_clock)); +} + #ifdef HAVE_LIBIEC61883 static GstDV1394Src * gst_dv1394src_from_raw1394handle (raw1394handle_t handle) @@ -833,6 +854,8 @@ gst_dv1394src_start (GstBaseSrc * bsrc) } } + gst_1394_clock_set_handle (src->provided_clock, src->handle); + return TRUE; socket_pair: @@ -927,6 +950,8 @@ gst_dv1394src_stop (GstBaseSrc * bsrc) } } + gst_1394_clock_unset_handle (src->provided_clock); + raw1394_destroy_handle (src->handle); return TRUE; |