mirror of
https://github.com/mpv-player/mpv
synced 2025-01-03 05:22:23 +00:00
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)
|
||||
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;
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user