Go to the documentation of this file.
   26 #ifndef AVUTIL_TIMER_H 
   27 #define AVUTIL_TIMER_H 
   36 # include <sys/ioctl.h> 
   37 # include <asm/unistd.h> 
   38 # include <linux/perf_event.h> 
   45 #if HAVE_MACH_ABSOLUTE_TIME 
   46 #include <mach/mach_time.h> 
   61 #if !defined(AV_READ_TIME) 
   63 #       define AV_READ_TIME gethrtime 
   64 #   elif HAVE_MACH_ABSOLUTE_TIME 
   65 #       define AV_READ_TIME mach_absolute_time 
   69 #ifndef FF_TIMER_UNITS 
   70 #   define FF_TIMER_UNITS "UNITS" 
   73 #define TIMER_REPORT(id, tdiff)                                           \ 
   75         static uint64_t tsum   = 0;                                       \ 
   76         static int tcount      = 0;                                       \ 
   77         static int tskip_count = 0;                                       \ 
   78         static int thistogram[32] = {0};                                  \ 
   79         thistogram[av_log2(tdiff)]++;                                     \ 
   81             (tdiff) < 8 * tsum / tcount ||                                \ 
   87         if (((tcount + tskip_count) & (tcount + tskip_count - 1)) == 0) { \ 
   89             av_log(NULL, AV_LOG_ERROR,                                    \ 
   90                    "%7"PRIu64" " FF_TIMER_UNITS " in %s,%8d runs,%7d skips",          \ 
   91                    tsum * 10 / tcount, id, tcount, tskip_count);          \ 
   92             for (i = 0; i < 32; i++)                                      \ 
   93                 av_log(NULL, AV_LOG_VERBOSE, " %2d", av_log2(2*thistogram[i]));\ 
   94             av_log(NULL, AV_LOG_ERROR, "\n");                             \ 
  100 #define START_TIMER                                                         \ 
  101     static int linux_perf_fd;                                               \ 
  103     if (!linux_perf_fd) {                                                   \ 
  104         struct perf_event_attr attr = {                                     \ 
  105             .type           = PERF_TYPE_HARDWARE,                           \ 
  106             .size           = sizeof(struct perf_event_attr),               \ 
  107             .config         = PERF_COUNT_HW_CPU_CYCLES,                     \ 
  109             .exclude_kernel = 1,                                            \ 
  112         linux_perf_fd = syscall(__NR_perf_event_open, &attr,                \ 
  115     if (linux_perf_fd == -1) {                                              \ 
  116         av_log(NULL, AV_LOG_ERROR, "perf_event_open failed: %s\n",          \ 
  117                av_err2str(AVERROR(errno)));                                 \ 
  119         ioctl(linux_perf_fd, PERF_EVENT_IOC_RESET, 0);                      \ 
  120         ioctl(linux_perf_fd, PERF_EVENT_IOC_ENABLE, 0);                     \ 
  123 #define STOP_TIMER(id)                                                      \ 
  124     ioctl(linux_perf_fd, PERF_EVENT_IOC_DISABLE, 0);                        \ 
  125     read(linux_perf_fd, &tperf, sizeof(tperf));                             \ 
  126     TIMER_REPORT(id, tperf) 
  128 #elif defined(AV_READ_TIME) 
  129 #define START_TIMER                             \ 
  131     uint64_t tstart = AV_READ_TIME();           \ 
  133 #define STOP_TIMER(id)                                                    \ 
  134     tend = AV_READ_TIME();                                                \ 
  135     TIMER_REPORT(id, tend - tstart) 
  138 #define STOP_TIMER(id) { }