Subversion Repositories Kolibri OS

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
6147 serge 1
/*
2
 * copyright (c) 2006 Michael Niedermayer 
3
 *
4
 * This file is part of FFmpeg.
5
 *
6
 * FFmpeg is free software; you can redistribute it and/or
7
 * modify it under the terms of the GNU Lesser General Public
8
 * License as published by the Free Software Foundation; either
9
 * version 2.1 of the License, or (at your option) any later version.
10
 *
11
 * FFmpeg is distributed in the hope that it will be useful,
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14
 * Lesser General Public License for more details.
15
 *
16
 * You should have received a copy of the GNU Lesser General Public
17
 * License along with FFmpeg; if not, write to the Free Software
18
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19
 */
20
 
21
/**
22
 * @file
23
 * high precision timer, useful to profile code
24
 */
25
 
26
#ifndef AVUTIL_TIMER_H
27
#define AVUTIL_TIMER_H
28
 
29
#include 
30
#include 
31
#include 
32
 
33
#include "config.h"
34
 
35
#if HAVE_MACH_MACH_TIME_H
36
#include 
37
#endif
38
 
39
#include "log.h"
40
 
41
#if   ARCH_ARM
42
#   include "arm/timer.h"
43
#elif ARCH_PPC
44
#   include "ppc/timer.h"
45
#elif ARCH_X86
46
#   include "x86/timer.h"
47
#endif
48
 
49
#if !defined(AV_READ_TIME)
50
#   if HAVE_GETHRTIME
51
#       define AV_READ_TIME gethrtime
52
#   elif HAVE_MACH_ABSOLUTE_TIME
53
#       define AV_READ_TIME mach_absolute_time
54
#   endif
55
#endif
56
 
57
#ifndef FF_TIMER_UNITS
58
#   define FF_TIMER_UNITS "UNITS"
59
#endif
60
 
61
#ifdef AV_READ_TIME
62
#define START_TIMER                             \
63
    uint64_t tend;                              \
64
    uint64_t tstart = AV_READ_TIME();           \
65
 
66
#define STOP_TIMER(id)                                                    \
67
    tend = AV_READ_TIME();                                                \
68
    {                                                                     \
69
        static uint64_t tsum   = 0;                                       \
70
        static int tcount      = 0;                                       \
71
        static int tskip_count = 0;                                       \
72
        static int thistogram[32] = {0};                                  \
73
        thistogram[av_log2(tend - tstart)]++;                             \
74
        if (tcount < 2                        ||                          \
75
            tend - tstart < 8 * tsum / tcount ||                          \
76
            tend - tstart < 2000) {                                       \
77
            tsum+= tend - tstart;                                         \
78
            tcount++;                                                     \
79
        } else                                                            \
80
            tskip_count++;                                                \
81
        if (((tcount + tskip_count) & (tcount + tskip_count - 1)) == 0) { \
82
            int i;                                                        \
83
            av_log(NULL, AV_LOG_ERROR,                                    \
84
                   "%7"PRIu64" " FF_TIMER_UNITS " in %s,%8d runs,%7d skips",          \
85
                   tsum * 10 / tcount, id, tcount, tskip_count);          \
86
            for (i = 0; i < 32; i++)                                      \
87
                av_log(NULL, AV_LOG_VERBOSE, " %2d", av_log2(2*thistogram[i]));\
88
            av_log(NULL, AV_LOG_ERROR, "\n");                             \
89
        }                                                                 \
90
    }
91
#else
92
#define START_TIMER
93
#define STOP_TIMER(id) { }
94
#endif
95
 
96
#endif /* AVUTIL_TIMER_H */