mirror of https://github.com/mpv-player/mpv
vo_opengl: refactor timer_pool_measure (again)
Instead of relying on power-of-two buffer sizes and unsigned overflow, make this code more robust (and also cleaner). Why can't C get a real modulo operator?
This commit is contained in:
parent
8a4f2f0ac0
commit
71c25df5e6
|
@ -293,20 +293,22 @@ struct mp_pass_perf timer_pool_measure(struct timer_pool *pool)
|
||||||
if (!pool)
|
if (!pool)
|
||||||
return (struct mp_pass_perf){0};
|
return (struct mp_pass_perf){0};
|
||||||
|
|
||||||
int last = (pool->sample_idx ? pool->sample_idx : VO_PERF_SAMPLE_COUNT) - 1;
|
|
||||||
struct mp_pass_perf res = {
|
struct mp_pass_perf res = {
|
||||||
.last = pool->samples[last],
|
|
||||||
.avg = pool->sample_count > 0 ? pool->sum / pool->sample_count : 0,
|
|
||||||
.peak = pool->peak,
|
.peak = pool->peak,
|
||||||
.count = pool->sample_count,
|
.count = pool->sample_count,
|
||||||
};
|
};
|
||||||
|
|
||||||
int idx = (pool->sample_idx - pool->sample_count);
|
int idx = pool->sample_idx - pool->sample_count + VO_PERF_SAMPLE_COUNT;
|
||||||
for (int i = 0; i < res.count; i++) {
|
for (int i = 0; i < res.count; i++) {
|
||||||
idx %= VO_PERF_SAMPLE_COUNT;
|
idx %= VO_PERF_SAMPLE_COUNT;
|
||||||
res.samples[i] = pool->samples[idx++];
|
res.samples[i] = pool->samples[idx++];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (res.count > 0) {
|
||||||
|
res.last = res.samples[res.count - 1];
|
||||||
|
res.avg = pool->sum / res.count;
|
||||||
|
}
|
||||||
|
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -143,7 +143,7 @@ struct voctrl_playback_state {
|
||||||
};
|
};
|
||||||
|
|
||||||
// VOCTRL_PERFORMANCE_DATA
|
// VOCTRL_PERFORMANCE_DATA
|
||||||
#define VO_PERF_SAMPLE_COUNT 256u
|
#define VO_PERF_SAMPLE_COUNT 256
|
||||||
|
|
||||||
struct mp_pass_perf {
|
struct mp_pass_perf {
|
||||||
// times are all in nanoseconds
|
// times are all in nanoseconds
|
||||||
|
|
Loading…
Reference in New Issue