static void compare_date_time (ExifEntry * entry, ExifTagCheckData * testdata) { gint year = 0, month = 1, day = 1, hour = 0, minute = 0, second = 0; GstDateTime *exif_datetime; GstDateTime *datetime; const gchar *str; if (!gst_tag_list_get_date_time_index (testdata->taglist, GST_TAG_DATE_TIME, 0, &datetime)) { GST_WARNING ("Failed to get datetime from taglist"); return; } str = (gchar *) entry->data; sscanf (str, "%04d:%02d:%02d %02d:%02d:%02d", &year, &month, &day, &hour, &minute, &second); exif_datetime = gst_date_time_new_local_time (year, month, day, hour, minute, second); fail_if (exif_datetime == NULL); fail_unless (gst_date_time_get_year (datetime) == gst_date_time_get_year (exif_datetime) && gst_date_time_get_month (datetime) == gst_date_time_get_month (exif_datetime) && gst_date_time_get_day (datetime) == gst_date_time_get_day (exif_datetime) && gst_date_time_get_hour (datetime) == gst_date_time_get_hour (exif_datetime) && gst_date_time_get_minute (datetime) == gst_date_time_get_minute (exif_datetime) && gst_date_time_get_second (datetime) == gst_date_time_get_second (exif_datetime)); gst_date_time_unref (exif_datetime); gst_date_time_unref (datetime); testdata->result = TRUE; }
static void gst_date_time_set_local_timezone (GstDateTime * dt) { struct tm tt; time_t t; g_return_if_fail (dt != NULL); memset (&tt, 0, sizeof (tt)); tt.tm_mday = gst_date_time_get_day (dt); tt.tm_mon = gst_date_time_get_month (dt) - 1; tt.tm_year = gst_date_time_get_year (dt) - 1900; tt.tm_hour = gst_date_time_get_hour (dt); tt.tm_min = gst_date_time_get_minute (dt); tt.tm_sec = gst_date_time_get_second (dt); t = mktime (&tt); dt->tzoffset = gmt_offset (&tt, t) / 60; }
gchar * __gst_date_time_serialize (GstDateTime * datetime, gboolean serialize_usecs) { GString *s; gfloat gmt_offset; guint msecs; /* we always have at least the year */ s = g_string_new (NULL); g_string_append_printf (s, "%04u", gst_date_time_get_year (datetime)); if (datetime->fields == GST_DATE_TIME_FIELDS_Y) goto done; /* add month */ g_string_append_printf (s, "-%02u", gst_date_time_get_month (datetime)); if (datetime->fields == GST_DATE_TIME_FIELDS_YM) goto done; /* add day of month */ g_string_append_printf (s, "-%02u", gst_date_time_get_day (datetime)); if (datetime->fields == GST_DATE_TIME_FIELDS_YMD) goto done; /* add time */ g_string_append_printf (s, "T%02u:%02u", gst_date_time_get_hour (datetime), gst_date_time_get_minute (datetime)); if (datetime->fields == GST_DATE_TIME_FIELDS_YMD_HM) goto add_timezone; /* add seconds */ g_string_append_printf (s, ":%02u", gst_date_time_get_second (datetime)); /* add microseconds */ if (serialize_usecs) { msecs = gst_date_time_get_microsecond (datetime); if (msecs != 0) { g_string_append_printf (s, ".%06u", msecs); /* trim trailing 0s */ while (s->str[s->len - 1] == '0') g_string_truncate (s, s->len - 1); } } /* add timezone */ add_timezone: gmt_offset = gst_date_time_get_time_zone_offset (datetime); if (gmt_offset == 0) { g_string_append_c (s, 'Z'); } else { guint tzhour, tzminute; tzhour = (guint) ABS (gmt_offset); tzminute = (guint) ((ABS (gmt_offset) - tzhour) * 60); g_string_append_c (s, (gmt_offset >= 0) ? '+' : '-'); g_string_append_printf (s, "%02u%02u", tzhour, tzminute); } done: return g_string_free (s, FALSE); }