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:
Niklas Haas 2017-09-11 02:28:15 +02:00
parent 8a4f2f0ac0
commit 71c25df5e6
No known key found for this signature in database
GPG Key ID: 9A09076581B27402
2 changed files with 7 additions and 5 deletions

View File

@ -293,20 +293,22 @@ struct mp_pass_perf timer_pool_measure(struct timer_pool *pool)
if (!pool)
return (struct mp_pass_perf){0};
int last = (pool->sample_idx ? pool->sample_idx : VO_PERF_SAMPLE_COUNT) - 1;
struct mp_pass_perf res = {
.last = pool->samples[last],
.avg = pool->sample_count > 0 ? pool->sum / pool->sample_count : 0,
.peak = pool->peak,
.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++) {
idx %= VO_PERF_SAMPLE_COUNT;
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;
}

View File

@ -143,7 +143,7 @@ struct voctrl_playback_state {
};
// VOCTRL_PERFORMANCE_DATA
#define VO_PERF_SAMPLE_COUNT 256u
#define VO_PERF_SAMPLE_COUNT 256
struct mp_pass_perf {
// times are all in nanoseconds