gst_plugins_base/gst-libs/gst/rtsp/gstrtsprange.c
branchRCL_3
changeset 29 567bb019e3e3
parent 0 0e761a78d257
child 30 7e817e7e631c
--- a/gst_plugins_base/gst-libs/gst/rtsp/gstrtsprange.c	Wed Mar 31 22:03:18 2010 +0300
+++ b/gst_plugins_base/gst-libs/gst/rtsp/gstrtsprange.c	Tue Aug 31 15:30:33 2010 +0300
@@ -69,7 +69,7 @@
 static GstRTSPResult
 parse_npt_time (const gchar * str, GstRTSPTime * time)
 {
-  if (strcmp (str, "now") == 0) {
+  if (strncmp (str, "now", 3) == 0) {
     time->type = GST_RTSP_TIME_NOW;
   } else if (str[0] == '\0') {
     time->type = GST_RTSP_TIME_END;
@@ -167,9 +167,10 @@
   } else
     goto invalid;
 
-  if (ret == GST_RTSP_OK)
-    *range = res;
+  if (ret != GST_RTSP_OK)
+    goto invalid;
 
+  *range = res;
   return ret;
 
   /* ERRORS */
@@ -180,6 +181,88 @@
   }
 }
 
+static gboolean
+npt_time_string (const GstRTSPTime * time, GString * string)
+{
+  gboolean res = TRUE;;
+
+  switch (time->type) {
+    case GST_RTSP_TIME_SECONDS:
+      g_string_append_printf (string, "%f", time->seconds);
+      break;
+    case GST_RTSP_TIME_NOW:
+      g_string_append (string, "now");
+      break;
+    case GST_RTSP_TIME_END:
+      break;
+    default:
+      res = FALSE;
+      break;
+  }
+  return res;
+}
+
+static gboolean
+npt_range_string (const GstRTSPTimeRange * range, GString * string)
+{
+  gboolean res;
+
+  if (!(res = npt_time_string (&range->min, string)))
+    goto done;
+
+  g_string_append (string, "-");
+
+  if (!(res = npt_time_string (&range->max, string)))
+    goto done;
+
+done:
+  return res;
+}
+
+/**
+ * gst_rtsp_range_to_string:
+ * @range: a #GstRTSPTimeRange
+ *
+ * Convert @range into a string representation.
+ *
+ * Returns: The string representation of @range. g_free() after usage.
+ *
+ * Since: 0.10.23
+ */
+gchar *
+gst_rtsp_range_to_string (const GstRTSPTimeRange * range)
+{
+  gchar *result = NULL;
+  GString *string;
+
+  g_return_val_if_fail (range != NULL, NULL);
+
+  string = g_string_new ("");
+
+  switch (range->unit) {
+    case GST_RTSP_RANGE_NPT:
+      g_string_append (string, "npt=");
+      if (!npt_range_string (range, string)) {
+        g_string_free (string, TRUE);
+        string = NULL;
+      }
+      break;
+    case GST_RTSP_RANGE_SMPTE:
+    case GST_RTSP_RANGE_SMPTE_30_DROP:
+    case GST_RTSP_RANGE_SMPTE_25:
+    case GST_RTSP_RANGE_CLOCK:
+    default:
+      g_warning ("time range unit not yet implemented");
+      g_string_free (string, TRUE);
+      string = NULL;
+      break;
+  }
+  if (string)
+    result = g_string_free (string, FALSE);
+
+  return result;
+}
+
 /**
  * gst_rtsp_range_free:
  * @range: a #GstRTSPTimeRange
@@ -189,8 +272,5 @@
 void
 gst_rtsp_range_free (GstRTSPTimeRange * range)
 {
-  if (range == NULL)
-    return;
-
   g_free (range);
 }