1fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
2fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin/*
3fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * Copyright (C) Texas Instruments - http://www.ti.com/
4fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin *
5fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * This library is free software; you can redistribute it and/or
6fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * modify it under the terms of the GNU Lesser General Public
7fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * License as published by the Free Software Foundation; either
8fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * version 2.1 of the License, or (at your option) any later version.
9fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin *
10fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin *
11fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * This library is distributed in the hope that it will be useful,
12fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * but WITHOUT ANY WARRANTY; without even the implied warranty of
13fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * Lesser General Public License for more details.
15fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin *
16fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin *
17fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * You should have received a copy of the GNU Lesser General Public
18fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * License along with this library; if not, write to the Free Software
19fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
20fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin */
21fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
22fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin#ifdef __PERF_CUSTOMIZABLE__
23fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
24fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    #define __PERF_RT_C__
25fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
26fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    #include "perf_config.h"
27fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    #include "perf.h"
28fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    #include "perf_rt.h"
29fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    #include "math.h"
30fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
31fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin/* ============================================================================
32fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin   DEBUG RT METHODS
33fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin============================================================================ */
34fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
35fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin#define MAX_RATES_TRACKED   10
36fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin#define MAX_GRANULARITY     15
37fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin#define MIN_FRAMES_FOR_RATE 10
38fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
39fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavinstatic int uptime_started = 0;
40fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
41fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavinstatic void init_delay(PERF_RTdata_delay *dDelay, long n0)
42fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin{
43fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    dDelay->xx = dDelay->x = 0;
44fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    dDelay->n = n0;
45fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin}
46fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
47fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz ZavinPERF_RT_Private *
48fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz ZavinPERF_RT_create(PERF_Private *perf, PERF_Config *config,
49fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin               PERF_MODULETYPE eModule)
50fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin{
51fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    char *fOutFile = NULL;
52fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    FILE *fOut = NULL;
53fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
54fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    /* check if we support this component */
55fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    if (perf->ulID != PERF_FOURS("CAM_") && perf->ulID != PERF_FOURS("CAMT") &&
56fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        perf->ulID != PERF_FOURS("VP__") && perf->ulID != PERF_FOURS("VP_T") &&
57fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        perf->ulID != PERF_FOURS("VD__") && perf->ulID != PERF_FOURS("VD_T") &&
58fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        perf->ulID != PERF_FOURS("VE__") && perf->ulID != PERF_FOURS("VE_T"))
59fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    {
60fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        /* if we don't support this component, we don't create the real-time
61fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin           interface */
62fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        return (NULL);
63fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    }
64fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
65fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    PERF_RT_Private *me =
66fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    perf->cip.pRT = malloc(sizeof(PERF_RT_Private));
67fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
68fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    if (me)
69fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    {
70fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        int succeed = 1;
71fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
72fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        /* we track steady state on the component thread only */
73fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        me->needSteadyState = (perf->ulID & 0xff) == 'T';
74fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        me->steadyState = 0;
75fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
76fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        /* allocate rate tracking structures */
77fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        me->maxDRate = MAX_RATES_TRACKED;
78fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        me->dRate = malloc(sizeof(PERF_RTdata_rate) * me->maxDRate);
79fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        succeed = succeed && me->dRate;
80fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
81fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        me->decoder = (perf->ulID == PERF_FOURS("VD__") || perf->ulID == PERF_FOURS("VD_T"));
82fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        me->encoder = (perf->ulID == PERF_FOURS("VE__") || perf->ulID == PERF_FOURS("VE_T"));
83fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        me->nDRate = 0;
84fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
85fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        /* allocate shot-to-shot tracking structures */
86fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        if (succeed && perf->ulID == PERF_FOURS("CAMT"))
87fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        {
88fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            me->dSTS = malloc(sizeof(PERF_RTdata_sts));
89fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            succeed = succeed && me->dSTS;
90fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            if (me->dSTS)
91fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            {
92fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                init_delay(&me->dSTS->dBurst, -1);   /* no first timestamp yet */
93fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                init_delay(&me->dSTS->dABurst, 0);
94fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                init_delay(&me->dSTS->dBurst2, 0);
95fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                init_delay(&me->dSTS->dABurst2, 0);
96fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                init_delay(&me->dSTS->dSingle, -1);  /* no first timestamp yet */
97fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                me->dSTS->size_max = me->dSTS->size_min = me->dSTS->capturing = 0;
98fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            }
99fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        }
100fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        else
101fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        {
102fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            me->dSTS = NULL;
103fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        }
104fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
105fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        /* allocate uptime tracking structures */
106fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
107fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        /* :NOTE: for now we restrict creations of uptime to steady state
108fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            only */
109fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        if (succeed && !uptime_started && me->needSteadyState &&
110fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            !(perf->uMode & PERF_Mode_Replay))
111fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        {
112fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            me->dUptime = malloc(sizeof(PERF_RTdata_uptime));
113fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            succeed = succeed && me->dUptime;
114fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
115fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            if (succeed)
116fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            {
117fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                uptime_started = 1;
118fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                me->dUptime->measuring = 0;
119fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                me->dUptime->last_idletime = me->dUptime->last_uptime = 0;
120fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                me->dUptime->start_idletime = me->dUptime->start_uptime = 0;
121fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                me->dUptime->success = 1;
122fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                me->dUptime->xx = me->dUptime->x = me->dUptime->n = 0;
123fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                TIME_GET(me->dUptime->last_reporting);
124fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            }
125fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        }
126fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        else
127fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        {
128fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            me->dUptime = NULL;
129fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        }
130fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
131fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        /* configuration */
132fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        me->summary     = config->rt_summary != 0;
133fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        me->debug       = config->rt_debug & 0x1FF;
134b65f253fdc60f6208a54911bee793d225f23cdf8James Dong        me->detailed    = (config->rt_detailed > 2) ? 2 : (int) config->rt_detailed;
135fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
136fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        me->granularity = (config->rt_granularity < 1) ? 1 :
137fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                          (config->rt_granularity > MAX_GRANULARITY) ?
138fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                          MAX_GRANULARITY : (long) config->rt_granularity;
139fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        me->granularity *= 1000000;  /* convert to microsecs */
140fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        TIME_COPY(me->first_time, perf->time);
141fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
142fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        /* if we do not care about detailed statistics, only report significant
143fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin           statistics for each component */
144fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        if (succeed && !me->detailed)
145fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        {
146fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            /* VP_T - display rate */
147fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            if (perf->ulID == PERF_FOURS("VP_T"))
148fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            {
149fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                me->only_moduleandflags = PERF_FlagSending | PERF_FlagFrame | PERF_ModuleHardware;
150fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            }
151fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            /* VD_T - decode rate */
152fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            else if (perf->ulID == PERF_FOURS("VD_T"))
153fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            {
154fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                me->only_moduleandflags = PERF_FlagSending | PERF_FlagFrame | PERF_ModuleLLMM;
155fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            }
156fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            /* VE_T - encode rate */
157fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            else if (perf->ulID == PERF_FOURS("VE_T"))
158fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            {
159fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                me->only_moduleandflags = PERF_FlagSending | PERF_FlagFrame | PERF_ModuleLLMM;
160fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            }
161fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            /* CAMT - capture rate */
162fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            else if (perf->ulID == PERF_FOURS("CAMT"))
163fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            {
164fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                me->only_moduleandflags = PERF_FlagReceived | PERF_FlagFrame | PERF_ModuleHardware;
165fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            }
166fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            /* otherwise, we don't care about rates */
167fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            else
168fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            {
169fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                free(me->dRate);
170fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                me->dRate = NULL;
171fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                me->maxDRate = 0;
172fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            }
173fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        }
174fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
175fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        /* set up fRt file pointers */
176fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        if (config->rt_file && succeed)
177fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        {
178fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            /* open log file unless STDOUT or STDERR is specified */
179fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            if (!strcasecmp(config->rt_file, "STDOUT")) fOut = stdout;
180fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            else if (!strcasecmp(config->rt_file, "STDERR")) fOut = stderr;
181fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            else
182fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            {
183fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                /* expand file name with PID and name */
184fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                fOutFile = (char *) malloc (strlen(config->rt_file) + 32);
185fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                if (fOutFile)
186fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                {
187fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                    sprintf(fOutFile, "%s-%05lu-%08lx-%c%c%c%c.log",
188fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                            config->rt_file, perf->ulPID, (unsigned long) perf,
189fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                            PERF_FOUR_CHARS(perf->ulID));
190fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                    fOut = fopen(fOutFile, "at");
191fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
192fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                    /* free new file name */
193fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                    free(fOutFile);
194fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                    fOutFile = NULL;
195fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                }
196fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
197fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                /* if could not open output, set it to STDOUT */
198fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                if (!fOut) fOut = stderr;
199fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            }
200fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            me->fRt = fOut;
201fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        }
202fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
203fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        /* if we had allocation failures, free resources and return NULL */
204fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        if (succeed)
205fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        {
206fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            perf->uMode |= PERF_Mode_RealTime;
207fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        }
208fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        else
209fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        {
210fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            PERF_RT_done(perf);
211fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            me = NULL;
212fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        }
213fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    }
214fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
215fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    return(me);
216fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin}
217fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
218fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavinvoid PERF_RT_done(PERF_Private *perf)
219fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin{
220fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    PERF_RT_Private *me = perf->cip.pRT;
221fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
222fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    /* close debug file unless stdout or stderr */
223fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    if (me->fRt && me->fRt != stdout &&
224fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        me->fRt != stderr) fclose(me->fRt);
225fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
226fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    /* free allocated structures */
227fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    free(me->dRate);   me->dRate = NULL;
228fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    free(me->dUptime); me->dUptime = NULL;
229fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    free(me->dSTS);    me->dSTS = NULL;
230fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
231fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    /* free private structure */
232fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    free(me);
233fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    perf->cip.pRT = NULL;
234fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin}
235fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
236fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavinstatic void get_uptime(double *uptime, double *idletime)
237fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin{
238fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    FILE *fUptime = fopen("/proc/uptime", "r");
239fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    if (fUptime)
240fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    {
241fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        fscanf(fUptime, "%lg %lg", uptime, idletime);
242fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        fclose (fUptime);
243fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    }
244fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    else
245fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    {
246fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        *uptime = *idletime = 0.;
247fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    }
248fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin}
249fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
250fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavinstatic void start_stop_uptime(PERF_RTdata_uptime *dUptime, int start)
251fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin{
252fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    double uptime, idletime;
253fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
254fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    if (dUptime && dUptime->measuring != start)
255fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    {
256fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        /* add uptime since last time */
257fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        get_uptime(&uptime, &idletime);
258fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
259fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        /* if successful */
260fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        if (dUptime->success && uptime && idletime)
261fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        {
262fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            dUptime->start_idletime = idletime - dUptime->start_idletime;
263fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            dUptime->start_uptime = uptime - dUptime->start_uptime;
264fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            dUptime->last_idletime = idletime - dUptime->last_idletime;
265fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            dUptime->last_uptime = uptime - dUptime->last_uptime;
266fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        }
267fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        else
268fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        {
269fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            dUptime->start_idletime = dUptime->start_uptime = dUptime->success = 0;
270fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            dUptime->last_idletime = dUptime->last_uptime = 0;
271fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        }
272fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
273fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        dUptime->measuring = start;
274fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    }
275fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin}
276fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
277fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavinextern char const * const PERF_ModuleTypes[];
278fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
279fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavindouble my_sqrt(double a)
280fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin{
281fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    double b = (a + 1) / 2;
282fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    b = (b + a/b) / 2;
283fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    b = (b + a/b) / 2;
284fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    b = (b + a/b) / 2;
285fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    b = (b + a/b) / 2;
286fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    b = (b + a/b) / 2;
287fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    b = (b + a/b) / 2;
288fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    return (b + a/b) / 2;
289fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin}
290fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
291fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavinstatic const char *sendRecvTxt[] = {
292fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        "received", "sending", "requesting", "sent",
293fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    };
294fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
295fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavinstatic void print_rate_info(FILE *fOut,
296fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                            unsigned long ID, PERF_MODULETYPE modulesAndFlags,
297fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                            unsigned long size, long n)
298fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin{
299fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    unsigned long module1 = modulesAndFlags & PERF_ModuleMask;
300fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    unsigned long module2 = (modulesAndFlags >> PERF_ModuleBits) & PERF_ModuleMask;
301fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    int xfering  = PERF_IsXfering(modulesAndFlags);
302fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    int sendIx   = (PERF_GetSendRecv(modulesAndFlags) >> 28) & 3;
303fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    int sending  = PERF_IsSending(modulesAndFlags);
304fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    int frame    = PERF_IsFrame  (modulesAndFlags);
305fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
306fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    fprintf(fOut, "%c%c%c%c %s %ld+ %s[0x%lX]%s%s%s%s",
307fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            PERF_FOUR_CHARS(ID),
308fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            xfering ? "xfering" : sendRecvTxt[sendIx],
309fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            n,
310fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            frame ? "frames" : "buffers",
311fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            size,
312fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            (xfering || !sending) ? " from " : " to ",
313fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            (module1 < PERF_ModuleMax ? PERF_ModuleTypes[module1] : "INVALID"),
314fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            xfering ? " to " : "",
315fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            xfering ? (module2 < PERF_ModuleMax ? PERF_ModuleTypes[module2] : "INVALID") : "");
316fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin}
317fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
318fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavinvoid count_temporal_rate(unsigned long ID, PERF_RT_Private *me, PERF_RTdata_rate *dRate)
319fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin{
320fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    /* get the temporal rate */
321fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    double x = (dRate->tn ? (dRate->tx ? ((1e6 * dRate->tn) / dRate->tx) : 1e6) : 0.);
322fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    if (me->debug)
323fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    {
324fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        fprintf(me->fRt, "rtPERF: [%ld] ", TIME_DELTA(dRate->last_reporting, me->first_time)/1000000);
325fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        print_rate_info(me->fRt,
326fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                        ID, dRate->modulesAndFlags, dRate->size, dRate->tn);
327fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
328fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        /* calculate smoothness */
329fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        double s = dRate->txx ? (dRate->tx * (double) dRate->tx / dRate->txx / dRate->tn) : 1;
330fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
331fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        fprintf(me->fRt, ": %.3g fps (s=%.3g)\n", x, s);
332fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    }
333fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
334fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    /* calculate the average of the temporal rate */
335fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    dRate->axx += x * x;
336fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    dRate->ax  += x;
337fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    dRate->an  ++;
338fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
339fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    dRate->txx = dRate->tx = dRate->tn = 0;
340fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin}
341fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
342fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavinstatic void delay_add(PERF_RTdata_delay *dDelay, unsigned long delta)
343fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin{
344fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    dDelay->x  += delta;
345fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    dDelay->xx += delta * (double) delta;
346fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    dDelay->n  ++;
347fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin}
348fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
349fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavinstatic void delay_delta(PERF_RTdata_delay *dDelay, PERF_Private *perf)
350fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin{
351fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    if (dDelay->n < 0)
352fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    {
353fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        dDelay->n++;
354fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    }
355fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    else
356fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    {
357fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        delay_add(dDelay, TIME_DELTA(perf->time, dDelay->last_timestamp));
358fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    }
359fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    TIME_COPY(dDelay->last_timestamp, perf->time);
360fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin}
361fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
362fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavinstatic void count_delay(PERF_RT_Private *me, char *tag, PERF_RTdata_delay *dDelay, long n0)
363fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin{
364fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    fprintf(me->fRt, "rtPERF: %s[0x%lX]: ", tag, me->dSTS->size_min);
365fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    if (dDelay->n > 0)
366fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    {
367fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        double x = 1e-6 * dDelay->x / dDelay->n;
368fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        double xx = 1e-12 * dDelay->xx / dDelay->n;
369fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        xx = my_sqrt(xx - x * x);
370fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
371fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        if (dDelay->n > 1)
372fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        {
373fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            fprintf(me->fRt, "%.3g +- %.3g s (%ld samples)\n",
374fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                    x, xx, dDelay->n);
375fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        }
376fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        else
377fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        {
378fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            fprintf(me->fRt, "%.3g\n", x);
379fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        }
380fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    }
381fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    else
382fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    {
383fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        fprintf(me->fRt, "UNABLE TO CALCULATE\n");
384fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    }
385fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
386fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    dDelay->n = n0;
387fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    dDelay->xx = dDelay->x = 0;
388fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin}
389fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
390fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavinvoid __rt_Boundary(PERF_Private *perf, PERF_BOUNDARYTYPE eBoundary)
391fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin{
392fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    /* get real-time private structure */
393fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    PERF_RT_Private *me = perf->cip.pRT;
394fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
395fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    /* check steady state if we need it */
396fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    if (me->needSteadyState)
397fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    {
398fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        if (eBoundary == (PERF_BoundaryStart | PERF_BoundarySteadyState))
399fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        {
400fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            if (!me->steadyState)
401fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            {
402fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                /* continue uptime measurement */
403fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                start_stop_uptime(me->dUptime, 1);
404fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
405fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                /* for each rate, reset skip count as well as tn0 */
406fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                int i;
407fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                for (i = 0; i < me->nDRate; i++)
408fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                {
409fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                    me->dRate[i].txx = me->dRate[i].tx = me->dRate[i].tn = me->dRate[i].tn0 = 0;
410fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                    me->dRate[i].skip = 0;
411fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                }
412fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            }
413fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
414fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            me->steadyState = 1;
415fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        }
416fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        else if (eBoundary == (PERF_BoundaryComplete | PERF_BoundarySteadyState))
417fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        {
418fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            if (me->steadyState)
419fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            {
420fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                /* stop uptime measurement */
421fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                start_stop_uptime(me->dUptime, 0);
422fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
423fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                /* complete any temporary rate measurements */
424fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                int i;
425fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                for (i = 0; i < me->nDRate; i++)
426fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                {
427fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                    /* only if we had any buffers in this cycle */
428fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                    if (me->dRate[i].tn0 >= MIN_FRAMES_FOR_RATE ||
429fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                        (me->dRate[i].tn && me->debug & 4))
430fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                    {
431fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                        count_temporal_rate(perf->ulID, me, me->dRate + i);
432fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                    }
433fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                }
434fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            }
435fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
436fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            me->steadyState = 0;
437fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        }
438fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    }
439fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    else
440fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    {
441fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        /* if we do not check steady state, we still complete on cleanup */
442fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        if (eBoundary == (PERF_BoundaryStart | PERF_BoundaryCleanup))
443fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        {
444fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            /* stop measurements */
445fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            start_stop_uptime(me->dUptime, 0);
446fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        }
447fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    }
448fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin}
449fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
450fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavinvoid __rt_Buffer(PERF_Private *perf,
451fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                 unsigned long ulAddress1,
452fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                 unsigned long ulAddress2,
453fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                 unsigned long ulSize,
454fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                 PERF_MODULETYPE eModuleAndFlags)
455fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin{
456fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    /* get real-time private structure */
457fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    PERF_RT_Private *me = perf->cip.pRT;
458fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
459fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    /* see if we care about this buffer in the rate calculation */
460fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    unsigned long module = eModuleAndFlags & PERF_ModuleMask;
461fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
462fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    /* ------------------------ RATE METRICS ------------------------ */
463fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
464fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    /* change HLMM to LLMM for detailed = 0 and 1 */
465fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    if (me->detailed < 2 && module == PERF_ModuleHLMM)
466fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    {
467fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        module = PERF_ModuleLLMM;
468fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    }
469fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
470fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    int rate = (me->detailed == 2) ||
471fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin               (me->detailed == 0 &&
472fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                (eModuleAndFlags == me->only_moduleandflags && ulSize >= 8)) ||
473fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin               (me->detailed == 1 &&
474fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                ((module == PERF_ModuleHardware || module == PERF_ModuleLLMM)));
475fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
476fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    if (rate && me->dRate && (!me->needSteadyState || me->steadyState))
477fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    {
478fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        /* change encoded filled frame sizes to 0xBEEFED, as they tend to
479fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin           have varying sizes and thus not be counted */
480fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        unsigned long sending = PERF_GetXferSendRecv(eModuleAndFlags);
481fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        unsigned long size = ulSize;
482fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        if ((me->encoder || me->decoder) && !PERF_IsXfering(sending))
483fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        {
484fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            /* reverse sending direction to common layer or socket node */
485fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            if (module >= PERF_ModuleCommonLayer &&
486fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                module <= PERF_ModuleSocketNode)
487fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            {
488fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                sending ^= PERF_FlagSending;
489fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            }
490fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
491fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            if ((me->encoder && (sending == PERF_FlagSending)) ||
492fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                (me->decoder && (sending == PERF_FlagReceived)))
493fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            {
494fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                size = size ? 0xBEEFED : 0;
495fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            }
496fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        }
497fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
498fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        /* see if we are tracking this buffer size */
499fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        int i, j = -1;  /* j is one of the lest used indexes */
500fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        for (i=0; i < me->nDRate; i++)
501fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        {
502fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            if (me->dRate[i].modulesAndFlags == eModuleAndFlags &&
503fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                me->dRate[i].size == size) break;
504fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            if (j < 0 || me->dRate[i].n < me->dRate[j].n)
505fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            {
506fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                j = i;
507fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            }
508fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        }
509fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
510fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        /* if we are not yet tracking this buffer, see if we can track
511fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin           it. */
512fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        if (i == me->nDRate)
513fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        {
514fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            /* we have space to track it */
515fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            if (i < me->maxDRate)
516fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            {
517fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                me->nDRate++;
518fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            }
519fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            /* if we cannot replace another rate, we don't track it */
520fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            else if (j < 0 || me->dRate[j].n < 2)
521fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            {
522fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                i = me->maxDRate;
523fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            }
524fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            else
525fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            {
526fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                i = j;
527fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            }
528fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
529fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            /* start tracking */
530fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            if (i < me->maxDRate)
531fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            {
532fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                me->dRate[i].modulesAndFlags = eModuleAndFlags;
533fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                me->dRate[i].size = size;
534fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                me->dRate[i].xx = me->dRate[i].x = me->dRate[i].n = 0;
535fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                me->dRate[i].txx = me->dRate[i].tx = me->dRate[i].tn = me->dRate[i].tn0 = 0;
536fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                me->dRate[i].axx = me->dRate[i].ax = me->dRate[i].an = 0;
537fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                me->dRate[i].skip = me->needSteadyState ? 0 : 4;
538fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                TIME_COPY(me->dRate[i].last_timestamp, perf->time);
539fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                TIME_COPY(me->dRate[i].last_reporting, perf->time);
540fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            }
541fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        }
542fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        else
543fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        {
544fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            if (me->dRate[i].skip == 0)
545fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            {
546fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                /* see if we passed our granularity */
547fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                int steps = TIME_DELTA(perf->time, me->dRate[i].last_reporting);
548fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                if (steps >= me->granularity)
549fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                {
550fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                    steps /= me->granularity;
551fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
552fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                    /* unless debug bit 4 is set, ignore temporal statistics if
553fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                       we passed the last time by more than a second, and less than
554fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                       the minimul frames were processed in this burst so far, and
555fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                       the last fps was less than 1. */
556fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                    if (!(me->debug & 4) &&
557fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                        (me->dRate[i].tn0 < MIN_FRAMES_FOR_RATE) &&
558fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                        (me->dRate[i].tn < me->granularity * steps))
559fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                    {
560fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                        if (me->debug & 256)
561fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                        {
562fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                            fprintf(me->fRt, "rtPERF: [%ld] IGNORED (steps=%d, tn0=%ld, tn=%ld)\n",
563fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                                    TIME_DELTA(me->dRate[i].last_reporting, me->first_time)/1000000,
564fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                                    steps, me->dRate[i].tn0, me->dRate[i].tn);
565fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                        }
566fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                        me->dRate[i].txx = me->dRate[i].tx = me->dRate[i].tn = me->dRate[i].tn0 = 0;
567fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
568fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                        TIME_INCREASE(me->dRate[i].last_reporting, me->granularity * steps);
569fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                        steps = 0;
570fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                    }
571fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                    else if (me->debug & 256)
572fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                    {
573fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                        fprintf(me->fRt, "rtPERF: [%ld] not-ignored (steps=%d, tn0=%ld, tn=%ld)\n",
574fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                                TIME_DELTA(me->dRate[i].last_reporting, me->first_time)/1000000,
575fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                                steps, me->dRate[i].tn0, me->dRate[i].tn);
576fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                    }
577fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
578fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                    /* see if we surpassed our granularity.  if yes, calculate
579fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                       temporal statistics */
580fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                    while (steps)
581fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                    {
582fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                        /* count temporal rate */
583fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                        count_temporal_rate(perf->ulID, me, me->dRate + i);
584fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
585fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                        TIME_INCREASE(me->dRate[i].last_reporting, me->granularity);
586fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                        steps--;
587fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                    }
588fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                }
589fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
590fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                /* rate is */
591fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                unsigned long delta = TIME_DELTA(perf->time, me->dRate[i].last_timestamp);
592fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                me->dRate[i].x   += delta;
593fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                me->dRate[i].tx  += delta;
594fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                me->dRate[i].xx  += delta * (double) delta;
595fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                me->dRate[i].txx += delta * (double) delta;
596fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                me->dRate[i].n   ++;
597fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                me->dRate[i].tn  ++;
598fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                me->dRate[i].tn0 ++;
599fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            }
600fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            else
601fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            {
602fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                me->dRate[i].skip--;
603fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                if (me->dRate[i].skip == 0)
604fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                {
605fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                    TIME_COPY(me->dRate[i].last_reporting, perf->time);
606fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                    me->dRate[i].txx = me->dRate[i].tx = me->dRate[i].tn = 0;
607fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                }
608fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            }
609fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
610fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            TIME_COPY(me->dRate[i].last_timestamp, perf->time);
611fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        }
612fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    }
613fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
614fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    /* ------------------------ SHOT-TO-SHOT METRICS ------------------------ */
615fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    if (me->dSTS)
616fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    {
617fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        if (eModuleAndFlags == (PERF_FlagSending | PERF_FlagFrame | PERF_ModuleHardware))
618fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        {
619fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            /* queueing buffers to camera */
620fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
621fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            /* see if resolution has changed */
622fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            if (ulSize < me->dSTS->size_min ||
623fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                ulSize > me->dSTS->size_max)
624fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            {
625fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                /* report burst rate if we have any */
626fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                if (me->debug)
627fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                {
628fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                    if (me->dSTS->dBurst2.n > 0)
629fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                    {
630fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                        count_delay(me, "Modified burst shot-to-shot", &me->dSTS->dBurst2, 0);
631fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                    }
632fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                    if (me->dSTS->dBurst.n > 0)
633fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                    {
634fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                        count_delay(me, "Raw burst shot-to-shot", &me->dSTS->dBurst, -1);
635fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                    }
636fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                }
637fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
638fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                me->dSTS->dBurst.n = -1;
639fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                me->dSTS->dBurst2.n = 0;
640fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
641fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                /* set new size */
642fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                me->dSTS->size_min = ulSize > 2048 ? ulSize - 2048 : 0;
643fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                me->dSTS->size_max = ulSize;
644fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
645fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                /* if more than D1-PAL, we assume it is an image, not a preview */
646fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                if (ulSize > 0x119000)
647fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                {
648fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                    /* new burst mode start */
649fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                    me->dSTS->capturing = 1;
650fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                }
651fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                else
652fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                {
653fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                    /* preview start */
654fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                    me->dSTS->capturing = 0;
655fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                }
656fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            }
657fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        }
658fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        else if (eModuleAndFlags == (PERF_FlagReceived | PERF_FlagFrame | PERF_ModuleHardware))
659fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        {
660fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            /* gotten buffers from camera */
661fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            if (me->dSTS->capturing &&
662fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                ulSize >= me->dSTS->size_min &&
663fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                ulSize <= me->dSTS->size_max)
664fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            {
665fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                /* see if we have a capture already (we ignore the first) to
666fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                   count into the modified capture */
667fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                if (me->dSTS->dBurst.n > 1)
668fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                {
669fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                    /* count last time delta */
670fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                    if (me->dSTS->dBurst.n > 2)
671fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                    {
672fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                        delay_add(&me->dSTS->dBurst2, me->dSTS->last_burst);
673fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                        delay_add(&me->dSTS->dABurst2, me->dSTS->last_burst);
674fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                        if (me->debug)
675fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                        {
676fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                            fprintf(me->fRt, "rtPERF: [%ld] Modified burst shot-to-shot[0x%lX]: %.3g s\n",
677fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                                    me->dSTS->dBurst2.n, me->dSTS->size_min, 1e-6 * me->dSTS->last_burst);
678fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                        }
679fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                    }
680fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                    me->dSTS->last_burst = TIME_DELTA(perf->time, me->dSTS->dBurst.last_timestamp);
681fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                }
682fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                else if (me->dSTS->dBurst.n < 0)
683fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                {
684fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                    /* if this is the first shot in the burst sequence */
685fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                    /* calculate single shot-to-shot delay */
686fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                    if (me->dSTS->dSingle.n >= 0)
687fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                    {
688fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                        if (me->debug)
689fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                        {
690fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                            fprintf(me->fRt, "rtPERF: [#%ld] Single shot-to-shot[0x%lX]: %.3g s\n",
691fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                                    me->dSTS->dSingle.n + 1, me->dSTS->size_min, 1e-6 * TIME_DELTA(perf->time, me->dSTS->dSingle.last_timestamp));
692fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                        }
693fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                        delay_delta(&me->dSTS->dSingle, perf);
694fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                    }
695fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                }
696fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
697fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                if (me->dSTS->dBurst.n >= 0)
698fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                {
699fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                    if (me->debug)
700fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                    {
701fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                        fprintf(me->fRt, "rtPERF: [#%ld] Raw burst shot-to-shot[0x%lX]: %.3g s\n",
702fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                                me->dSTS->dBurst.n + 1, me->dSTS->size_min, 1e-6 * TIME_DELTA(perf->time, me->dSTS->dBurst.last_timestamp));
703fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                    }
704fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                    delay_add(&me->dSTS->dABurst, TIME_DELTA(perf->time, me->dSTS->dBurst.last_timestamp));
705fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                }
706fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                delay_delta(&me->dSTS->dBurst, perf);
707fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
708fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                /* keep last captured image time stamp for single shot-to-shot */
709fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                TIME_COPY(me->dSTS->dSingle.last_timestamp, perf->time);
710fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                if (me->dSTS->dSingle.n < 0)
711fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                {
712fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                    me->dSTS->dSingle.n = 0;  /* captured first time stamp */
713fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                }
714fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            }
715fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        }
716fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    }
717fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
718fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    /* ------------------------ UPTIME METRICS ------------------------ */
719fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    if (0 && me->dUptime && me->dUptime->measuring)
720fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    {
721fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        /* see if we passed our granularity.  if yes, calculate uptime */
722fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        int steps = TIME_DELTA(perf->time, me->dUptime->last_reporting);
723fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        if (steps >= me->granularity)
724fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        {
725fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            steps /= me->granularity;
726fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
727fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            double uptime, idletime, load = 0;
728fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
729fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            /* calculate MHz load */
730fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            get_uptime(&uptime, &idletime);
731fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            if (uptime > 0 && me->dUptime->success)
732fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            {
733fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                me->dUptime->last_idletime = idletime - me->dUptime->last_idletime;
734fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                me->dUptime->last_uptime = uptime - me->dUptime->last_uptime;
735fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                if (me->dUptime->last_uptime > 0)
736fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                {
737fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                    load = 100. * ((me->dUptime->last_uptime - me->dUptime->last_idletime) /
738fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                                   me->dUptime->last_uptime);
739fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
740fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                    me->dUptime->n += steps;
741fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                    me->dUptime->x += load * steps;
742fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                    me->dUptime->xx += load * load * steps;
743fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                }
744fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            }
745fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
746fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            TIME_INCREASE(me->dUptime->last_reporting, steps * me->granularity);
747fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
748fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            if (uptime > 0 && me->dUptime->success)
749fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            {
750fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                me->dUptime->last_uptime = uptime;
751fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                me->dUptime->last_idletime = idletime;
752fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                if (me->debug)
753fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                {
754fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                    fprintf(me->fRt, "rtPERF: [%ld] ARM CPU-load is %.3g%%\n",
755fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                            TIME_DELTA(perf->time, me->first_time)/1000000,
756fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                            load);
757fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                }
758fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            }
759fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            else
760fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            {
761fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                me->dUptime->success = 0;
762fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            }
763fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        }
764fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    }
765fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin}
766fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
767fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavinvoid __rt_Command(PERF_Private *perf,
768fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                  unsigned long ulCommand,
769fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                  unsigned long ulArgument,
770fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                  PERF_MODULETYPE eModule)
771fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin{
772fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    /* get real-time private structure */
773fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    /* PERF_RT_Private *me = perf->cip.pRT; */
774fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
775fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    /* there is nothing to do at this point */
776fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin}
777fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
778fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavinvoid __rt_Log(PERF_Private *perf,
779fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin              unsigned long ulData1, unsigned long ulData2,
780fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin              unsigned long ulData3)
781fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin{
782fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    /* get real-time private structure */
783fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    /* PERF_RT_Private *me = perf->cip.pRT; */
784fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
785fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    /* there is nothing to do at this point */
786fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin}
787fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
788fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavinvoid __rt_SyncAV(PERF_Private *perf,
789fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                 float pfTimeAudio,
790fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                 float pfTimeVideo,
791fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                 PERF_SYNCOPTYPE eSyncOperation)
792fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin{
793fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    /* get real-time private structure */
794fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    /* PERF_RT_Private *me = perf->cip.pRT; */
795fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
796fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    /* there is nothing to do at this point */
797fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin}
798fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
799fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavinvoid __rt_ThreadCreated(PERF_Private *perf,
800fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                        unsigned long ulThreadID,
801fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                        unsigned long ulThreadName)
802fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin{
803fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    /* get real-time private structure */
804fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    /* PERF_RT_Private *me = perf->cip.pRT; */
805fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
806fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    /* there is nothing to do at this point. Perhaps we can enable uptime if
807fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin       we still have not created it and it is an audio thread. */
808fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin}
809fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
810fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavinvoid __rt_Done(PERF_Private *perf)
811fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin{
812fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    /* get real-time private structure */
813fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    PERF_RT_Private *me = perf->cip.pRT;
814fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
815fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    /* print summaries if required */
816fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    if (me->summary)
817fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    {
818fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        /* uptime summary */
819fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        if (me->dUptime)
820fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        {
821fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            /* get last uptime */
822fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            start_stop_uptime(me->dUptime, 0);
823fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
824fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            fprintf(me->fRt, "rtPERF: ARM CPU-load for%s %c%c%c%c component: ",
825fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                    me->needSteadyState ? " steady state of" : "",
826fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                    PERF_FOUR_CHARS(perf->ulID));
827fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
828fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            if (me->dUptime->success && me->dUptime->start_uptime)
829fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            {
830fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                double load = (100. * (me->dUptime->start_uptime -
831fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                                      me->dUptime->start_idletime) /
832fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                               me->dUptime->start_uptime);
833fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                if (me->dUptime->n)
834fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                {
835fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                    double x = me->dUptime->x / me->dUptime->n;
836fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                    double xx = me->dUptime->xx / me->dUptime->n;
837fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                    xx = my_sqrt(xx - x * x);
838fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                    if (me->debug & 2)
839fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                    {
840fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                        fprintf(me->fRt, ": %.3g +- %.3g%%\n"
841fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                                "(temporal difference is: %.3g)\n",
842fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                                load, xx, x - load);
843fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                    }
844fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                    else
845fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                    {
846fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                        fprintf(me->fRt, ": %.3g +- %.3g%%\n",
847fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                                load, xx);
848fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                    }
849fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                }
850fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                else
851fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                {
852fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                    fprintf(me->fRt, "%.3g%%\n", load);
853fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                }
854fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            }
855fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            else
856fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            {
857fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                fprintf(me->fRt, "FAILED TO CALCULATE\n");
858fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            }
859fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        }
860fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
861fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        /* rate summary */
862fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        if (me->nDRate)
863fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        {
864fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            int i;
865fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            for (i = 0; i < me->nDRate; i++)
866fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            {
867fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                if (me->dRate[i].n >= MIN_FRAMES_FOR_RATE &&
868fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                    ((me->debug & 4) || me->dRate[i].tn0 >= MIN_FRAMES_FOR_RATE))
869fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                {
870fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
871fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                    double x = me->dRate[i].x * 1e-6 / me->dRate[i].n;
872fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
873fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                    double s = (me->dRate[i].xx ?
874fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                                (me->dRate[i].x * (double) me->dRate[i].x /
875fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                                 me->dRate[i].xx / me->dRate[i].n) : 1);
876fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
877fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                    fprintf(me->fRt, "rtPERF: ");
878fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                    print_rate_info(me->fRt,
879fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                                    perf->ulID, me->dRate[i].modulesAndFlags,
880fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                                    me->dRate[i].size, me->dRate[i].n);
881fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                    if (x > 0)
882fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                    {
883fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                        if (me->dRate[i].an)
884fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                        {
885fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                            double x2 = me->dRate[i].ax / me->dRate[i].an;
886fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                            double xx = me->dRate[i].axx / me->dRate[i].an;
887fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                            xx = my_sqrt(xx - x2 * x2);
888fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                            if (me->debug & 2)
889fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                            {
890fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                                fprintf(me->fRt, ": %.3g +- %.3g fps (s=%.3g)\n"
891fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                                        "(temporal difference is: %.3g)\n",
892fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                                        1/x, xx, s, x2-1/x);
893fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                            }
894fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                            else
895fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                            {
896fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                                fprintf(me->fRt, ": %.3g +- %.3g fps (s=%.3g)\n",
897fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                                        1/x, xx, s);
898fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                            }
899fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                        }
900fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                        else
901fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                        {
902fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                            fprintf(me->fRt, ": %.3g fps (s=%.3g)\n", 1/x, s);
903fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                        }
904fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                    }
905fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                    else
906fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                    {
907fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                        fprintf(me->fRt, ": FAILED TO CALCULATE\n");
908fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                    }
909fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                }
910fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            }
911fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        }
912fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
913fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        /* shot-to-shot summary */
914fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        if (me->dSTS)
915fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        {
916fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            if (me->dSTS->dABurst2.n > 0)
917fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            {
918fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                count_delay(me, "Avg. modified burst shot-to-shot", &me->dSTS->dABurst2, 0);
919fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            }
920fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            if (me->dSTS->dABurst.n > 0)
921fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            {
922fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                count_delay(me, "Avg. raw burst shot-to-shot", &me->dSTS->dABurst, 0);
923fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            }
924fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            if (me->dSTS->dSingle.n > 0)
925fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            {
926fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin                count_delay(me, "Avg. single shot-to-shot", &me->dSTS->dSingle, -1);
927fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin            }
928fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin        }
929fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin    }
930fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin}
931fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
932fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin
933fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin#endif
934