dv1394src: Fix element for live usage... which has been broken for 2 years :(
authorEdward Hervey <bilboed@bilboed.com>
Fri, 3 Jul 2009 12:04:13 +0000 (14:04 +0200)
committerEdward Hervey <bilboed@bilboed.com>
Mon, 10 Aug 2009 07:58:34 +0000 (09:58 +0200)
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

index 543adc934bc7d3fce9e3257eb34def5337fa101a..5bcaa7d761f05155f0d6af6829881ffb1cdc416d 100644 (file)
@@ -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, &current);
-
-      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