summaryrefslogtreecommitdiffstats
path: root/ext/raw1394/gstdv1394src.c
diff options
context:
space:
mode:
Diffstat (limited to 'ext/raw1394/gstdv1394src.c')
-rw-r--r--ext/raw1394/gstdv1394src.c25
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;