summaryrefslogtreecommitdiffstats
path: root/debian/transcode/transcode-1.1.7/libtc/tctimer.c
diff options
context:
space:
mode:
Diffstat (limited to 'debian/transcode/transcode-1.1.7/libtc/tctimer.c')
-rw-r--r--debian/transcode/transcode-1.1.7/libtc/tctimer.c136
1 files changed, 136 insertions, 0 deletions
diff --git a/debian/transcode/transcode-1.1.7/libtc/tctimer.c b/debian/transcode/transcode-1.1.7/libtc/tctimer.c
new file mode 100644
index 00000000..aceb02b5
--- /dev/null
+++ b/debian/transcode/transcode-1.1.7/libtc/tctimer.c
@@ -0,0 +1,136 @@
+/*
+ * tctimer.c -- simple timer code implementation for transcode.
+ * (C) 2006-2010 - Francesco Romani <fromani -at- gmail -dot- com>
+ *
+ * This file is part of transcode, a video stream processing tool.
+ *
+ * transcode is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * transcode is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+
+#include "config.h"
+
+#ifndef HAVE_GETTIMEOFDAY
+# error "this module REQUIRES gettimeofday presence!"
+#endif
+
+#include <sys/time.h>
+#include <time.h>
+#include <errno.h>
+
+#include "tctimer.h"
+#include "libtc.h"
+
+/*
+ * Internal time representation:
+ * XXX WRITEME
+ */
+
+/*************************************************************************/
+/* utilities */
+
+static uint64_t tc_timeval_to_microsecs(const struct timeval *tv)
+{
+ return (tv->tv_sec * 1000000 + tv->tv_usec);
+}
+
+uint64_t tc_gettime(void)
+{
+ struct timeval tv;
+
+ gettimeofday(&tv, NULL);
+
+ return tc_timeval_to_microsecs(&tv);
+}
+
+/*************************************************************************/
+/* generics */
+
+/*************************************************************************/
+
+static uint64_t tc_timer_generic_elapsed(TCTimer *timer)
+{
+ uint64_t r = 0, t = tc_gettime();
+ r = t - timer->last_time;
+ timer->last_time = t;
+ return r;
+}
+
+/*************************************************************************/
+/* timer-specific code */
+
+/*************************************************************************/
+
+static int tc_timer_soft_fini(TCTimer *timer)
+{
+ return 0; /* no internal state -> nothing to finalize */
+}
+
+static int tc_timer_soft_sleep(TCTimer *timer, uint64_t amount)
+{
+ struct timespec ts, tr;
+ int ret;
+
+ ts.tv_sec = amount / 1000000;
+ ts.tv_nsec = (amount % 1000000) * 1000;
+
+ do {
+ ret = nanosleep(&ts, &tr);
+ if (ret == -1) {
+ if (errno != EINTR) {
+ /* report fault */
+ break;
+ } else {
+ /* reload */
+ ts.tv_sec = tr.tv_sec;
+ ts.tv_nsec = tr.tv_nsec;
+ }
+ }
+ } while (ret != 0);
+ return ret;
+}
+
+/*************************************************************************/
+/* entry points */
+
+/*************************************************************************/
+
+int tc_timer_init_soft(TCTimer *timer, uint16_t frequency)
+{
+ int ret = -1;
+
+ if (timer != NULL) {
+ /* frequency: ignored, we relies on nanosleep() */
+ timer->last_time = tc_gettime();
+
+ timer->elapsed = tc_timer_generic_elapsed;
+ timer->sleep = tc_timer_soft_sleep;
+ timer->fini = tc_timer_soft_fini;
+
+ ret = 0;
+ }
+ return ret;
+}
+
+/*************************************************************************/
+
+/*
+ * Local variables:
+ * c-file-style: "stroustrup"
+ * c-file-offsets: ((case-label . *) (statement-case-intro . *))
+ * indent-tabs-mode: nil
+ * End:
+ *
+ * vim: expandtab shiftwidth=4:
+ */