From 17d5dbd337aa40212a376063c3bc5f05510ddf07 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Olivier=20Cr=C3=AAte?= Date: Fri, 22 Feb 2013 13:32:21 -0500 Subject: [PATCH] rtsprange: Add function to convert a range between formats Also add unit tests. --- docs/libs/gst-plugins-base-libs-sections.txt | 4 +- gst-libs/gst/rtsp/gstrtsprange.c | 99 +++++++++++++++++ gst-libs/gst/rtsp/gstrtsprange.h | 3 + tests/check/libs/rtsp.c | 108 +++++++++++++++++++ 4 files changed, 213 insertions(+), 1 deletion(-) diff --git a/docs/libs/gst-plugins-base-libs-sections.txt b/docs/libs/gst-plugins-base-libs-sections.txt index 482136bc13..5aa28b44f7 100644 --- a/docs/libs/gst-plugins-base-libs-sections.txt +++ b/docs/libs/gst-plugins-base-libs-sections.txt @@ -1540,14 +1540,16 @@ gst_rtsp_url_get_type
gstrtsprange -gst/rtsp/gstrtsrange.h +gst/rtsp/gstrtsprange.h GstRTSPRangeUnit GstRTSPTimeRange GstRTSPTime +GstRTSPTime2 GstRTSPTimeType gst_rtsp_range_parse gst_rtsp_range_get_times gst_rtsp_range_to_string +gst_rtsp_range_convert_units gst_rtsp_range_free
diff --git a/gst-libs/gst/rtsp/gstrtsprange.c b/gst-libs/gst/rtsp/gstrtsprange.c index 6bda1419d5..3a47305012 100644 --- a/gst-libs/gst/rtsp/gstrtsprange.c +++ b/gst-libs/gst/rtsp/gstrtsprange.c @@ -591,3 +591,102 @@ gst_rtsp_range_get_times (const GstRTSPTimeRange * range, return TRUE; } + +static void +set_time (GstRTSPTime * time, GstRTSPTime2 * time2, GstRTSPRangeUnit unit, + GstClockTime clock_time) +{ + memset (time, 0, sizeof (GstRTSPTime)); + memset (time2, 0, sizeof (GstRTSPTime2)); + + if (clock_time == GST_CLOCK_TIME_NONE) { + time->type = GST_RTSP_TIME_END; + return; + } + + switch (unit) { + case GST_RTSP_RANGE_SMPTE: + case GST_RTSP_RANGE_SMPTE_30_DROP: + { + time->seconds = (guint64) (clock_time / GST_SECOND); + time2->frames = 30003 * (clock_time % GST_SECOND) / + (gdouble) (1001 * GST_SECOND); + time->type = GST_RTSP_TIME_FRAMES; + g_assert (time2->frames < 30); + break; + } + case GST_RTSP_RANGE_SMPTE_25: + { + time->seconds = (guint64) (clock_time / GST_SECOND); + time2->frames = (25 * (clock_time % GST_SECOND)) / (gdouble) GST_SECOND; + time->type = GST_RTSP_TIME_FRAMES; + g_assert (time2->frames < 25); + break; + } + case GST_RTSP_RANGE_NPT: + { + time->seconds = (gdouble) clock_time / (gdouble) GST_SECOND; + time->type = GST_RTSP_TIME_SECONDS; + break; + } + case GST_RTSP_RANGE_CLOCK: + { + GDateTime *bt, *datetime; + GstClockTime subsecond = clock_time % GST_SECOND; + + bt = g_date_time_new_utc (1900, 1, 1, 0, 0, 0.0); + datetime = g_date_time_add_seconds (bt, clock_time / GST_SECOND); + + time2->year = g_date_time_get_year (datetime); + time2->month = g_date_time_get_month (datetime); + time2->day = g_date_time_get_day_of_month (datetime); + + time->seconds = g_date_time_get_hour (datetime) * 60 * 60; + time->seconds += g_date_time_get_minute (datetime) * 60; + time->seconds += g_date_time_get_seconds (datetime); + time->seconds += (gdouble) subsecond / (gdouble) GST_SECOND; + time->type = GST_RTSP_TIME_UTC; + + g_date_time_unref (bt); + g_date_time_unref (datetime); + break; + } + } + + if (time->seconds < 0.000000001) + time->seconds = 0; + if (time2->frames < 0.000000001) + time2->frames = 0; +} + +/** + * gst_rtsp_range_convert_units: + * @range: a #GstRTSPTimeRange + * @unit: the unit to convert the range into + * + * Converts the range in-place between different types of units. + * Ranges containing the special value #GST_RTSP_TIME_NOW can not be + * converted as these are only valid for #GST_RTSP_RANGE_NPT. + * + * Returns: %TRUE if the range could be converted + */ + +gboolean +gst_rtsp_range_convert_units (GstRTSPTimeRange * range, GstRTSPRangeUnit unit) +{ + if (range->unit == unit) + return TRUE; + + if (range->min.type == GST_RTSP_TIME_NOW || + range->max.type == GST_RTSP_TIME_NOW) + return FALSE; + + set_time (&range->min, &range->min2, unit, + get_time (range->unit, &range->min, &range->min2)); + set_time (&range->max, &range->max2, unit, + get_time (range->unit, &range->max, &range->max2)); + + range->unit = unit; + + return TRUE; +} diff --git a/gst-libs/gst/rtsp/gstrtsprange.h b/gst-libs/gst/rtsp/gstrtsprange.h index d3fceecd95..2dc046986b 100644 --- a/gst-libs/gst/rtsp/gstrtsprange.h +++ b/gst-libs/gst/rtsp/gstrtsprange.h @@ -149,6 +149,9 @@ void gst_rtsp_range_free (GstRTSPTimeRange *range); gboolean gst_rtsp_range_get_times (const GstRTSPTimeRange *range, GstClockTime *min, GstClockTime *max); +gboolean gst_rtsp_range_convert_units (GstRTSPTimeRange * range, + GstRTSPRangeUnit unit); + G_END_DECLS #endif /* __GST_RTSP_RANGE_H__ */ diff --git a/tests/check/libs/rtsp.c b/tests/check/libs/rtsp.c index 50a55a86f6..c817c3f3cc 100644 --- a/tests/check/libs/rtsp.c +++ b/tests/check/libs/rtsp.c @@ -432,6 +432,113 @@ GST_START_TEST (test_rtsp_range_clock) GST_END_TEST; + +GST_START_TEST (test_rtsp_range_convert) +{ + GstRTSPTimeRange *range; + gchar *str; + + fail_unless (gst_rtsp_range_parse ("npt=now-100", &range) == GST_RTSP_OK); + fail_unless (gst_rtsp_range_convert_units (range, GST_RTSP_RANGE_NPT)); + fail_unless (!gst_rtsp_range_convert_units (range, GST_RTSP_RANGE_CLOCK)); + fail_unless (!gst_rtsp_range_convert_units (range, GST_RTSP_RANGE_SMPTE)); + str = gst_rtsp_range_to_string (range); + fail_unless_equals_string (str, "npt=now-100"); + g_free (str); + gst_rtsp_range_free (range); + + fail_unless (gst_rtsp_range_parse ("npt=0-100", &range) == GST_RTSP_OK); + fail_unless (gst_rtsp_range_convert_units (range, GST_RTSP_RANGE_SMPTE)); + fail_unless (gst_rtsp_range_convert_units (range, GST_RTSP_RANGE_NPT)); + str = gst_rtsp_range_to_string (range); + fail_unless_equals_string (str, "npt=0-100"); + g_free (str); + gst_rtsp_range_free (range); + + fail_unless (gst_rtsp_range_parse ("npt=0-100", &range) == GST_RTSP_OK); + fail_unless (gst_rtsp_range_convert_units (range, GST_RTSP_RANGE_SMPTE_25)); + fail_unless (gst_rtsp_range_convert_units (range, GST_RTSP_RANGE_NPT)); + str = gst_rtsp_range_to_string (range); + fail_unless_equals_string (str, "npt=0-100"); + g_free (str); + gst_rtsp_range_free (range); + + fail_unless (gst_rtsp_range_parse ("npt=0-100", &range) == GST_RTSP_OK); + fail_unless (gst_rtsp_range_convert_units (range, GST_RTSP_RANGE_CLOCK)); + fail_unless (gst_rtsp_range_convert_units (range, GST_RTSP_RANGE_NPT)); + str = gst_rtsp_range_to_string (range); + fail_unless_equals_string (str, "npt=0-100"); + g_free (str); + gst_rtsp_range_free (range); + + fail_unless (gst_rtsp_range_parse ("smpte-25=10:07:00-10:07:33:05.01", &range) + == GST_RTSP_OK); + fail_unless (gst_rtsp_range_convert_units (range, GST_RTSP_RANGE_NPT)); + fail_unless (gst_rtsp_range_convert_units (range, GST_RTSP_RANGE_SMPTE_25)); + str = gst_rtsp_range_to_string (range); + fail_unless_equals_string (str, "smpte-25=10:07:00-10:07:33:05.01"); + g_free (str); + gst_rtsp_range_free (range); + + fail_unless (gst_rtsp_range_parse ("smpte=77:07:59-", &range) + == GST_RTSP_OK); + fail_unless (gst_rtsp_range_convert_units (range, GST_RTSP_RANGE_NPT)); + fail_unless (gst_rtsp_range_convert_units (range, GST_RTSP_RANGE_SMPTE)); + str = gst_rtsp_range_to_string (range); + fail_unless_equals_string (str, "smpte=77:07:59-"); + g_free (str); + gst_rtsp_range_free (range); + + fail_unless (gst_rtsp_range_parse ("smpte=10:07:00-10:07:33:05.01", &range) + == GST_RTSP_OK); + fail_unless (gst_rtsp_range_convert_units (range, GST_RTSP_RANGE_NPT)); + fail_unless (gst_rtsp_range_convert_units (range, GST_RTSP_RANGE_SMPTE)); + str = gst_rtsp_range_to_string (range); + fail_unless_equals_string (str, "smpte=10:07:00-10:07:33:05.01"); + g_free (str); + gst_rtsp_range_free (range); + + fail_unless (gst_rtsp_range_parse ("smpte-25=10:07:00-10:07:33:05.01", &range) + == GST_RTSP_OK); + fail_unless (gst_rtsp_range_convert_units (range, GST_RTSP_RANGE_CLOCK)); + fail_unless (gst_rtsp_range_convert_units (range, GST_RTSP_RANGE_SMPTE_25)); + str = gst_rtsp_range_to_string (range); + fail_unless_equals_string (str, "smpte-25=10:07:00-10:07:33:05.01"); + g_free (str); + gst_rtsp_range_free (range); + + fail_unless (gst_rtsp_range_parse ("smpte=10:07:00-10:07:33:05.01", &range) + == GST_RTSP_OK); + fail_unless (gst_rtsp_range_convert_units (range, GST_RTSP_RANGE_CLOCK)); + fail_unless (gst_rtsp_range_convert_units (range, GST_RTSP_RANGE_SMPTE)); + str = gst_rtsp_range_to_string (range); + fail_unless_equals_string (str, "smpte=10:07:00-10:07:33:05.01"); + g_free (str); + gst_rtsp_range_free (range); + + fail_unless (gst_rtsp_range_parse + ("clock=20001010T120023Z-20320518T152245.12Z", &range) + == GST_RTSP_OK); + fail_unless (gst_rtsp_range_convert_units (range, GST_RTSP_RANGE_NPT)); + fail_unless (gst_rtsp_range_convert_units (range, GST_RTSP_RANGE_CLOCK)); + str = gst_rtsp_range_to_string (range); + fail_unless_equals_string (str, "clock=20001010T120023Z-20320518T152245.12Z"); + g_free (str); + gst_rtsp_range_free (range); + + fail_unless (gst_rtsp_range_parse + ("clock=20001010T120023Z-20320518T152245.12Z", &range) + == GST_RTSP_OK); + fail_unless (gst_rtsp_range_convert_units (range, GST_RTSP_RANGE_SMPTE)); + fail_unless (gst_rtsp_range_convert_units (range, GST_RTSP_RANGE_CLOCK)); + str = gst_rtsp_range_to_string (range); + fail_unless_equals_string (str, "clock=20001010T120023Z-20320518T152245.12Z"); + g_free (str); + gst_rtsp_range_free (range); +} + +GST_END_TEST; + static Suite * rtsp_suite (void) { @@ -446,6 +553,7 @@ rtsp_suite (void) tcase_add_test (tc_chain, test_rtsp_range_npt); tcase_add_test (tc_chain, test_rtsp_range_smpte); tcase_add_test (tc_chain, test_rtsp_range_clock); + tcase_add_test (tc_chain, test_rtsp_range_convert); return s; }