From d522f94f9858014aef134c8683759183bd89af93 Mon Sep 17 00:00:00 2001 From: Edward Hervey Date: Fri, 3 Jul 2009 14:04:13 +0200 Subject: dv1394src: Fix element for live usage... which has been broken for 2 years :( This is a live source, therefore: * Use GST_FORMAT_TIME as the default format * set_timestamp to True * properly implement query latency. This allows expected live usage like : playbin2 uri=dv:// --- ext/raw1394/gstdv1394src.c | 140 +++------------------------------------------ 1 file changed, 9 insertions(+), 131 deletions(-) (limited to 'ext/raw1394') diff --git a/ext/raw1394/gstdv1394src.c b/ext/raw1394/gstdv1394src.c index 543adc93..5bcaa7d7 100644 --- a/ext/raw1394/gstdv1394src.c +++ b/ext/raw1394/gstdv1394src.c @@ -142,12 +142,7 @@ static gboolean gst_dv1394src_unlock (GstBaseSrc * bsrc); static GstFlowReturn gst_dv1394src_create (GstPushSrc * psrc, GstBuffer ** buf); -static gboolean gst_dv1394src_convert (GstPad * pad, - GstFormat src_format, gint64 src_value, - GstFormat * dest_format, gint64 * dest_value); - -static const GstQueryType *gst_dv1394src_get_query_types (GstPad * pad); -static gboolean gst_dv1394src_query (GstPad * pad, GstQuery * query); +static gboolean gst_dv1394src_query (GstBaseSrc * src, GstQuery * query); static void gst_dv1394src_update_device_name (GstDV1394Src * src); static void @@ -244,6 +239,7 @@ gst_dv1394src_class_init (GstDV1394SrcClass * klass) gstbasesrc_class->start = gst_dv1394src_start; gstbasesrc_class->stop = gst_dv1394src_stop; gstbasesrc_class->unlock = gst_dv1394src_unlock; + gstbasesrc_class->query = gst_dv1394src_query; gstpushsrc_class->create = gst_dv1394src_create; } @@ -254,11 +250,10 @@ gst_dv1394src_init (GstDV1394Src * dv1394src, GstDV1394SrcClass * klass) GstPad *srcpad = GST_BASE_SRC_PAD (dv1394src); gst_base_src_set_live (GST_BASE_SRC (dv1394src), TRUE); + gst_base_src_set_format (GST_BASE_SRC (dv1394src), GST_FORMAT_TIME); + gst_base_src_set_do_timestamp (GST_BASE_SRC (dv1394src), TRUE); gst_pad_use_fixed_caps (srcpad); - gst_pad_set_query_function (srcpad, gst_dv1394src_query); - gst_pad_set_query_type_function (srcpad, gst_dv1394src_get_query_types); - dv1394src->port = DEFAULT_PORT; dv1394src->channel = DEFAULT_CHANNEL; @@ -423,22 +418,12 @@ gst_dv1394src_iec61883_receive (unsigned char *data, int len, if (G_LIKELY ((dv1394src->frame_sequence + 1) % (dv1394src->skip + dv1394src->consecutive) < dv1394src->consecutive)) { if (complete && len == dv1394src->frame_size) { - gint64 i64; guint8 *bufdata; GstBuffer *buf; - GstFormat format; buf = gst_buffer_new_and_alloc (dv1394src->frame_size); - /* fill in offset, duration, timestamp */ GST_BUFFER_OFFSET (buf) = dv1394src->frame_sequence; - format = GST_FORMAT_TIME; - gst_dv1394src_convert (GST_BASE_SRC_PAD (dv1394src), GST_FORMAT_DEFAULT, - GST_BUFFER_OFFSET (buf), &format, &i64); - GST_BUFFER_TIMESTAMP (buf) = i64; - gst_dv1394src_convert (GST_BASE_SRC_PAD (dv1394src), GST_FORMAT_DEFAULT, - 1, &format, &i64); - GST_BUFFER_DURATION (buf) = i64; bufdata = GST_BUFFER_DATA (buf); memcpy (bufdata, data, len); dv1394src->buf = buf; @@ -510,7 +495,6 @@ gst_dv1394src_iso_receive (raw1394handle_t handle, int channel, size_t len, } if ((dv1394src->frame_sequence + 1) % (dv1394src->skip + dv1394src->consecutive) < dv1394src->consecutive) { - GstFormat format; GstBuffer *buf; gint64 i64; @@ -518,14 +502,6 @@ gst_dv1394src_iso_receive (raw1394handle_t handle, int channel, size_t len, /* fill in offset, duration, timestamp */ GST_BUFFER_OFFSET (buf) = dv1394src->frame_sequence; - format = GST_FORMAT_TIME; - gst_dv1394src_convert (GST_BASE_SRC_PAD (dv1394src), GST_FORMAT_DEFAULT, - GST_BUFFER_OFFSET (buf), &format, &i64); - GST_BUFFER_TIMESTAMP (buf) = i64; - gst_dv1394src_convert (GST_BASE_SRC_PAD (dv1394src), GST_FORMAT_DEFAULT, - 1, &format, &i64); - GST_BUFFER_DURATION (buf) = i64; - dv1394src->frame = buf; } dv1394src->frame_sequence++; @@ -643,7 +619,7 @@ gst_dv1394src_create (GstPushSrc * psrc, GstBuffer ** buf) pollfds[1].fd = READ_SOCKET (dv1394src); pollfds[1].events = POLLIN | POLLERR | POLLHUP | POLLPRI; - if (dv1394src->buf) { + if (G_UNLIKELY (dv1394src->buf)) { /* maybe we had an error before, and there's a stale buffer? */ gst_buffer_unref (dv1394src->buf); dv1394src->buf = NULL; @@ -967,120 +943,22 @@ gst_dv1394src_unlock (GstBaseSrc * bsrc) } static gboolean -gst_dv1394src_convert (GstPad * pad, - GstFormat src_format, gint64 src_value, - GstFormat * dest_format, gint64 * dest_value) +gst_dv1394src_query (GstBaseSrc * basesrc, GstQuery * query) { - GstDV1394Src *src; - - src = GST_DV1394SRC (gst_pad_get_parent (pad)); - - switch (src_format) { - case GST_FORMAT_TIME: - switch (*dest_format) { - case GST_FORMAT_BYTES: - src_value *= src->frame_size; - case GST_FORMAT_DEFAULT: - *dest_value = - gst_util_uint64_scale_int (src_value, src->frame_rate, - GST_SECOND); - break; - default: - goto not_supported; - } - break; - case GST_FORMAT_BYTES: - src_value /= src->frame_size; - case GST_FORMAT_DEFAULT: - switch (*dest_format) { - case GST_FORMAT_BYTES: - *dest_value = src_value * src->frame_size; - break; - case GST_FORMAT_TIME: - if (src->frame_rate != 0) - *dest_value = - gst_util_uint64_scale_int (src_value, GST_SECOND, - src->frame_rate); - else - goto not_supported; - break; - default: - goto not_supported; - } - break; - default: - goto not_supported; - } - - gst_object_unref (src); - return TRUE; - -not_supported: - { - GST_DEBUG_OBJECT (src, "unsupported conversion"); - gst_object_unref (src); - return FALSE; - } -} - -static const GstQueryType * -gst_dv1394src_get_query_types (GstPad * pad) -{ - static const GstQueryType src_query_types[] = { - GST_QUERY_CONVERT, - GST_QUERY_POSITION, - 0 - }; - - return src_query_types; -} - -static gboolean -gst_dv1394src_query (GstPad * pad, GstQuery * query) -{ - GstDV1394Src *src; - - src = GST_DV1394SRC (gst_pad_get_parent (pad)); - switch (GST_QUERY_TYPE (query)) { - case GST_QUERY_POSITION: + case GST_QUERY_LATENCY: { - GstFormat format; - gint64 current; - - gst_query_parse_position (query, &format, NULL); - - /* bring our current frame to the requested format */ - gst_pad_query_convert (pad, - GST_FORMAT_DEFAULT, src->frame_sequence, &format, ¤t); - - gst_query_set_position (query, format, current); - break; + gst_query_set_latency (query, TRUE, GST_SECOND / 25, GST_CLOCK_TIME_NONE); } - case GST_QUERY_CONVERT: - { - GstFormat src_fmt, dest_fmt; - gint64 src_val, dest_val; - - gst_query_parse_convert (query, &src_fmt, &src_val, &dest_fmt, &dest_val); - if (!(gst_dv1394src_convert (pad, src_fmt, src_val, &dest_fmt, - &dest_val))) - goto not_supported; - gst_query_set_convert (query, src_fmt, src_val, dest_fmt, dest_val); break; - } default: goto not_supported; } - gst_object_unref (src); return TRUE; not_supported: - { - gst_object_unref (src); - return FALSE; - } + return GST_BASE_SRC_CLASS (parent_class)->query (basesrc, query); } static void -- cgit