datetime: Use seconds as double
authorThiago Santos <thiago.sousa.santos@collabora.co.uk>
Tue, 12 Oct 2010 18:13:48 +0000 (15:13 -0300)
committerThiago Santos <thiago.sousa.santos@collabora.co.uk>
Wed, 13 Oct 2010 14:48:57 +0000 (11:48 -0300)
Use seconds as double to make API similar to glib's
gdatetime. Also move timezone parameter to the
first position, just like glib's.

https://bugzilla.gnome.org/show_bug.cgi?id=628408

gst/gstdatetime.c
gst/gstdatetime.h
gst/gstvalue.c
tests/check/gst/gstdatetime.c
tests/check/gst/gstvalue.c

index ad83349887ead45f8261f710bc24c0a0bf410874..97ddc6026e7f0372c8d301a8165823545dfd4158 100644 (file)
@@ -25,6 +25,7 @@
 #include "gst_private.h"
 #include "gstdatetime.h"
 #include <glib.h>
+#include <math.h>
 
 /**
  * SECTION:gstdatetime
 
 /**
  * gst_date_time_new:
+ * @tzoffset: Offset from UTC in hours.
  * @year: the gregorian year
  * @month: the gregorian month
  * @day: the day of the gregorian month
  * @minute: the minute of the hour
  * @second: the second of the minute
  * @microsecond: the microsecond of the second
- * @tzoffset: Offset from UTC in hours.
  *
  * Creates a new #GstDateTime using the date and times in the gregorian calendar
  * in the supplied timezone.
@@ -422,20 +423,19 @@ gst_date_time_new_from_unix_epoch (gint64 secs)
   memcpy (&tm, localtime (&tt), sizeof (struct tm));
 #endif
 
-  dt = gst_date_time_new (tm.tm_year + 1900,
-      tm.tm_mon + 1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec, 0, 0);
+  dt = gst_date_time_new (0, tm.tm_year + 1900,
+      tm.tm_mon + 1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec);
   gst_date_time_set_local_timezone (dt);
   return dt;
 }
 
 GstDateTime *
 gst_date_time_new_local_time (gint year, gint month, gint day, gint hour,
-    gint minute, gint second, gint microsecond)
+    gint minute, gdouble seconds)
 {
   GstDateTime *dt;
 
-  dt = gst_date_time_new (year, month, day, hour, minute, second, microsecond,
-      0);
+  dt = gst_date_time_new (0, year, month, day, hour, minute, seconds);
 
   gst_date_time_set_local_timezone (dt);
 
@@ -443,24 +443,25 @@ gst_date_time_new_local_time (gint year, gint month, gint day, gint hour,
 }
 
 GstDateTime *
-gst_date_time_new (gint year, gint month, gint day, gint hour,
-    gint minute, gint second, gint microsecond, gfloat tzoffset)
+gst_date_time_new (gfloat tzoffset, gint year, gint month, gint day, gint hour,
+    gint minute, gdouble seconds)
 {
   GstDateTime *dt;
 
   g_return_val_if_fail (hour >= 0 && hour < 24, NULL);
   g_return_val_if_fail (minute >= 0 && minute < 60, NULL);
-  g_return_val_if_fail (second >= 0 && second < 60, NULL);
-  g_return_val_if_fail (microsecond >= 0 && microsecond < 1000000, NULL);
+  g_return_val_if_fail (seconds >= 0 && seconds < 60, NULL);
+  g_return_val_if_fail (tzoffset >= -12.0 && tzoffset <= 12.0, NULL);
 
   if (!(dt = gst_date_time_new_from_date (year, month, day)))
     return NULL;
 
   dt->usec = (hour * GST_DATE_TIME_USEC_PER_HOUR)
       + (minute * GST_DATE_TIME_USEC_PER_MINUTE)
-      + (second * GST_DATE_TIME_USEC_PER_SECOND)
-      + microsecond;
-  dt->tzoffset = (gint) (60 * tzoffset);
+      + (guint64) (floor (seconds * GST_DATE_TIME_USEC_PER_SECOND + 0.5));
+
+  /* we store in minutes */
+  dt->tzoffset = (gint) tzoffset *60.0;
 
   return dt;
 }
@@ -663,10 +664,10 @@ gst_date_time_new_from_unix_epoch (gint64 secs)
 
 GstDateTime *
 gst_date_time_new_local_time (gint year, gint month, gint day, gint hour,
-    gint minute, gint second, gint microsecond)
+    gint minute, gdouble seconds)
 {
   return gst_date_time_new_from_gdatetime (g_date_time_new_local (year, month,
-          day, hour, minute, second + (microsecond / 1000000.0)));
+          day, hour, minute, seconds));
 }
 
 GstDateTime *
@@ -690,8 +691,8 @@ priv_gst_date_time_compare (gconstpointer dt1, gconstpointer dt2)
 }
 
 GstDateTime *
-gst_date_time_new (gint year, gint month, gint day, gint hour, gint minute,
-    gint second, gint microsecond, gfloat tzoffset)
+gst_date_time_new (gfloat tzoffset, gint year, gint month, gint day, gint hour,
+    gint minute, gdouble seconds)
 {
   gchar buf[6];
   GTimeZone *tz;
@@ -705,8 +706,7 @@ gst_date_time_new (gint year, gint month, gint day, gint hour, gint minute,
       tzminute);
 
   tz = g_time_zone_new (buf);
-  dt = g_date_time_new (tz, year, month, day, hour, minute,
-      second + (microsecond / 1000000.0));
+  dt = g_date_time_new (tz, year, month, day, hour, minute, seconds);
   g_time_zone_unref (tz);
   return gst_date_time_new_from_gdatetime (dt);
 }
index 5317a18a7ad557e40dae586b5cc7878e70e39025..957faaefe71cc23371ee750eb3dec80b40fb3cc1 100644 (file)
@@ -49,14 +49,12 @@ GstDateTime         *gst_date_time_new_from_unix_epoch      (gint64 secs);
 GstDateTime    *gst_date_time_new_local_time           (gint year, gint month,
                                                         gint day, gint hour,
                                                         gint minute,
-                                                        gint second,
-                                                        gint microsecond);
-GstDateTime    *gst_date_time_new                      (gint year, gint month,
+                                                        gdouble seconds);
+GstDateTime    *gst_date_time_new                      (gfloat tzoffset,
+                                                        gint year, gint month,
                                                         gint day, gint hour,
                                                         gint minute,
-                                                        gint second,
-                                                        gint microsecond,
-                                                        gfloat tzoffset);
+                                                        gdouble seconds);
 GstDateTime    *gst_date_time_new_now_local_time (void);
 GstDateTime    *gst_date_time_new_now_utc      (void);
 
index 883356a751c26d2df14f62bc5dbff79956810581..ca449bc45a318beeccc065954882384c506becb0 100644 (file)
@@ -4376,7 +4376,7 @@ static gchar *
 gst_value_serialize_date_time (const GValue * val)
 {
   GstDateTime *date = (GstDateTime *) g_value_get_boxed (val);
-  gint offset;
+  gfloat offset;
   gint tzhour, tzminute;
 
   if (date == NULL)
@@ -4417,8 +4417,8 @@ gst_value_deserialize_date_time (GValue * dest, const gchar * s)
   } else
     return FALSE;
 
-  g_value_take_boxed (dest, gst_date_time_new (year, month, day, hour,
-          minute, second, usecond, tzoffset));
+  g_value_take_boxed (dest, gst_date_time_new (tzoffset, year, month, day, hour,
+          minute, second + (usecond / 1000000.0)));
   return TRUE;
 }
 
index 8fea42adca70486ab4bb12941a7f23a456cf26e7..74e2291afb9a6a7c2013c57fe4625a57910d20ba 100644 (file)
@@ -111,19 +111,19 @@ GST_START_TEST (test_GstDateTime_get_hour)
 {
   GstDateTime *dt;
 
-  dt = gst_date_time_new (2009, 10, 19, 15, 13, 11, 0, 0);
+  dt = gst_date_time_new (0, 2009, 10, 19, 15, 13, 11);
   assert_equals_int (15, gst_date_time_get_hour (dt));
   gst_date_time_unref (dt);
 
-  dt = gst_date_time_new (100, 10, 19, 1, 0, 0, 0, 0);
+  dt = gst_date_time_new (0, 100, 10, 19, 1, 0, 0);
   assert_equals_int (1, gst_date_time_get_hour (dt));
   gst_date_time_unref (dt);
 
-  dt = gst_date_time_new (100, 10, 19, 0, 0, 0, 0, 0);
+  dt = gst_date_time_new (0, 100, 10, 19, 0, 0, 0);
   assert_equals_int (0, gst_date_time_get_hour (dt));
   gst_date_time_unref (dt);
 
-  dt = gst_date_time_new (100, 10, 1, 23, 59, 59, 0, 0);
+  dt = gst_date_time_new (0, 100, 10, 1, 23, 59, 59);
   assert_equals_int (23, gst_date_time_get_hour (dt));
   gst_date_time_unref (dt);
 }
@@ -136,7 +136,8 @@ GST_START_TEST (test_GstDateTime_get_microsecond)
   GstDateTime *dt;
 
   g_get_current_time (&tv);
-  dt = gst_date_time_new (2010, 7, 15, 11, 12, 13, tv.tv_usec, 0);
+  dt = gst_date_time_new (0, 2010, 7, 15, 11, 12,
+      13 + (tv.tv_usec / 1000000.0));
   assert_equals_int (tv.tv_usec, gst_date_time_get_microsecond (dt));
   gst_date_time_unref (dt);
 }
@@ -147,7 +148,7 @@ GST_START_TEST (test_GstDateTime_get_minute)
 {
   GstDateTime *dt;
 
-  dt = gst_date_time_new (2009, 12, 1, 1, 31, 0, 0, 0);
+  dt = gst_date_time_new (0, 2009, 12, 1, 1, 31, 0);
   assert_equals_int (31, gst_date_time_get_minute (dt));
   gst_date_time_unref (dt);
 }
@@ -158,7 +159,7 @@ GST_START_TEST (test_GstDateTime_get_second)
 {
   GstDateTime *dt;
 
-  dt = gst_date_time_new (2009, 12, 1, 1, 31, 44, 0, 0);
+  dt = gst_date_time_new (0, 2009, 12, 1, 1, 31, 44);
   assert_equals_int (44, gst_date_time_get_second (dt));
   gst_date_time_unref (dt);
 }
@@ -169,7 +170,7 @@ GST_START_TEST (test_GstDateTime_new_full)
 {
   GstDateTime *dt;
 
-  dt = gst_date_time_new (2009, 12, 11, 12, 11, 10, 1234, 0);
+  dt = gst_date_time_new (0, 2009, 12, 11, 12, 11, 10.001234);
   assert_equals_int (2009, gst_date_time_get_year (dt));
   assert_equals_int (12, gst_date_time_get_month (dt));
   assert_equals_int (11, gst_date_time_get_day (dt));
index ae0d1169daa7fb4ee0427bac664bac149f8cac48..4d981e2f7df20d9b67d337f61bb05a00ee037946 100644 (file)
@@ -2010,7 +2010,7 @@ GST_START_TEST (test_date_time)
   gchar *str;
 
   /* utc timezone */
-  datetime = gst_date_time_new (2010, 6, 23, 7, 40, 10, 0, 0);
+  datetime = gst_date_time_new (0, 2010, 6, 23, 7, 40, 10);
 
   s = gst_structure_new ("media/x-type", "SOME_DATE_TIME_TAG",
       GST_TYPE_DATE_TIME, datetime, NULL);
@@ -2066,7 +2066,7 @@ GST_START_TEST (test_date_time)
   str = NULL;
 
   /* with timezone */
-  datetime = gst_date_time_new (2010, 6, 23, 7, 40, 10, 1, -3.0);
+  datetime = gst_date_time_new (-3.0, 2010, 6, 23, 7, 40, 10.000001);
 
   s = gst_structure_new ("media/x-type", "SOME_DATE_TIME_TAG",
       GST_TYPE_DATE_TIME, datetime, NULL);
@@ -2122,7 +2122,7 @@ GST_START_TEST (test_date_time)
   str = NULL;
 
   /* with positive timezone */
-  datetime = gst_date_time_new (2010, 6, 23, 7, 40, 10, 1, 2);
+  datetime = gst_date_time_new (2.0, 2010, 6, 23, 7, 40, 10.000001);
 
   s = gst_structure_new ("media/x-type", "SOME_DATE_TIME_TAG",
       GST_TYPE_DATE_TIME, datetime, NULL);