lavu: Add av_gettime_relative

Since av_gettime() is used in a number of places where actual
real time clock is required, the monotonic clock introduced in
ebef9f5a5 would have consequences that are hard to handle. Instead
split it into a separate function that can be used in the cases
where only relative time is desired.

On platform where no monotonic clock is available, the difference
between the two av_gettime functions is not clear, and one could
mistakenly use the relative clock where an absolute one is
required. Therefore add an offset, to make it evident that the
time returned from av_gettime_relative never is actual current
real time, even though it is based on av_gettime.

Based on a patch by Olivier Langlois.

Signed-off-by: Martin Storsjö <martin@martin.st>
pull/87/merge
Martin Storsjö 10 years ago
parent af7ca6ea12
commit 1bd0bdcdc2
  1. 3
      doc/APIchanges
  2. 20
      libavutil/time.c
  3. 9
      libavutil/time.h
  4. 2
      libavutil/version.h

@ -13,6 +13,9 @@ libavutil: 2014-08-09
API changes, most recent first: API changes, most recent first:
2014-10-xx - xxxxxxx - lavu 54.5.0 - time.h
Add av_gettime_relative().
2014-10-xx - xxxxxxx - lavc 56.5.0 - avcodec.h 2014-10-xx - xxxxxxx - lavc 56.5.0 - avcodec.h
Replace AVCodecContext.time_base used for decoding Replace AVCodecContext.time_base used for decoding
with AVCodecContext.framerate. with AVCodecContext.framerate.

@ -23,7 +23,8 @@
#include <time.h> #include <time.h>
#if HAVE_CLOCK_GETTIME #if HAVE_CLOCK_GETTIME
#include <time.h> #include <time.h>
#elif HAVE_GETTIMEOFDAY #endif
#if HAVE_GETTIMEOFDAY
#include <sys/time.h> #include <sys/time.h>
#endif #endif
#if HAVE_UNISTD_H #if HAVE_UNISTD_H
@ -38,11 +39,7 @@
int64_t av_gettime(void) int64_t av_gettime(void)
{ {
#if HAVE_CLOCK_GETTIME #if HAVE_GETTIMEOFDAY
struct timespec ts;
clock_gettime(CLOCK_MONOTONIC, &ts);
return (int64_t)ts.tv_sec * 1000000 + ts.tv_nsec / 1000;
#elif HAVE_GETTIMEOFDAY
struct timeval tv; struct timeval tv;
gettimeofday(&tv, NULL); gettimeofday(&tv, NULL);
return (int64_t)tv.tv_sec * 1000000 + tv.tv_usec; return (int64_t)tv.tv_sec * 1000000 + tv.tv_usec;
@ -57,6 +54,17 @@ int64_t av_gettime(void)
#endif #endif
} }
int64_t av_gettime_relative(void)
{
#if HAVE_CLOCK_GETTIME
struct timespec ts;
clock_gettime(CLOCK_MONOTONIC, &ts);
return (int64_t)ts.tv_sec * 1000000 + ts.tv_nsec / 1000;
#else
return av_gettime() + 42 * 60 * 60 * INT64_C(1000000);
#endif
}
int av_usleep(unsigned usec) int av_usleep(unsigned usec)
{ {
#if HAVE_NANOSLEEP #if HAVE_NANOSLEEP

@ -26,6 +26,15 @@
*/ */
int64_t av_gettime(void); int64_t av_gettime(void);
/**
* Get the current time in microseconds since some unspecified starting point.
* On platforms that support it, the time comes from a monotonic clock
* This property makes this time source ideal for measuring relative time.
* The returned values may not be monotonic on platforms where a monotonic
* clock is not available.
*/
int64_t av_gettime_relative(void);
/** /**
* Sleep for a period of time. Although the duration is expressed in * Sleep for a period of time. Although the duration is expressed in
* microseconds, the actual delay may be rounded to the precision of the * microseconds, the actual delay may be rounded to the precision of the

@ -54,7 +54,7 @@
*/ */
#define LIBAVUTIL_VERSION_MAJOR 54 #define LIBAVUTIL_VERSION_MAJOR 54
#define LIBAVUTIL_VERSION_MINOR 4 #define LIBAVUTIL_VERSION_MINOR 5
#define LIBAVUTIL_VERSION_MICRO 0 #define LIBAVUTIL_VERSION_MICRO 0
#define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \ #define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \

Loading…
Cancel
Save