diff options
author | ferreum <code@ferreum.de> | 2023-08-17 17:11:25 +0200 |
---|---|---|
committer | Niklas Haas <github-daiK1o@haasn.dev> | 2023-09-20 14:36:23 +0200 |
commit | cf8b7ff0d666a4c13b32d8d9e973435df419b5ef (patch) | |
tree | d4685cb8588913559fa082d216a86021a0e2d9aa /audio/filter/af_scaletempo2_internals.c | |
parent | c0728249a18f5e7ec40332e002f4cd9fedc8e91c (diff) | |
download | mpv-cf8b7ff0d666a4c13b32d8d9e973435df419b5ef.tar.bz2 mpv-cf8b7ff0d666a4c13b32d8d9e973435df419b5ef.tar.xz |
af_scaletempo2: calculate latency by center of search block
This changes the emitted pts values from the start of the search block
to the center of the search block. Change initial `output_time`
accordingly. Initial `search_block_index` is irrelevant, because it's
overwritten before the first iteration.
Using the `output_time` removes the rounding of `search_block_index`,
which also fixes the <20 microsecond gaps in timestamps between output
packets.
Rationale:
The variance in audio position was in the range `0..search-interval`.
With this change, the range is
(- search-interval / 2)..(search-interval / 2)`
which ensures lower maximum offset.
Diffstat (limited to 'audio/filter/af_scaletempo2_internals.c')
-rw-r--r-- | audio/filter/af_scaletempo2_internals.c | 9 |
1 files changed, 4 insertions, 5 deletions
diff --git a/audio/filter/af_scaletempo2_internals.c b/audio/filter/af_scaletempo2_internals.c index eb2d4bb20b..a9d0fba136 100644 --- a/audio/filter/af_scaletempo2_internals.c +++ b/audio/filter/af_scaletempo2_internals.c @@ -707,7 +707,7 @@ int mp_scaletempo2_fill_buffer(struct mp_scaletempo2 *p, p->wsola_output_started = false; // sync audio precisely again - set_output_time(p, p->target_block_index + p->search_block_center_offset); + set_output_time(p, p->target_block_index); remove_old_input_frames(p); } @@ -725,7 +725,7 @@ int mp_scaletempo2_fill_buffer(struct mp_scaletempo2 *p, double mp_scaletempo2_get_latency(struct mp_scaletempo2 *p, double playback_rate) { - return p->input_buffer_frames - p->search_block_index + return p->input_buffer_frames - p->output_time + p->num_complete_frames * playback_rate; } @@ -749,7 +749,7 @@ void mp_scaletempo2_destroy(struct mp_scaletempo2 *p) void mp_scaletempo2_reset(struct mp_scaletempo2 *p) { p->input_buffer_frames = 0; - p->output_time = p->search_block_center_offset; + p->output_time = 0.0; p->search_block_index = 0; p->target_block_index = 0; // Clear the queue of decoded packets. @@ -771,6 +771,7 @@ static void get_symmetric_hanning_window(int window_length, float* window) void mp_scaletempo2_init(struct mp_scaletempo2 *p, int channels, int rate) { p->muted_partial_frame = 0; + p->output_time = 0; p->search_block_center_offset = 0; p->search_block_index = 0; p->num_complete_frames = 0; @@ -813,8 +814,6 @@ void mp_scaletempo2_init(struct mp_scaletempo2 *p, int channels, int rate) sizeof(float) * p->ola_window_size * 2); get_symmetric_hanning_window(2 * p->ola_window_size, p->transition_window); - p->output_time = p->search_block_center_offset; - p->wsola_output_size = p->ola_window_size + p->ola_hop_size; p->wsola_output = realloc_2d(p->wsola_output, p->channels, p->wsola_output_size); // Initialize for overlap-and-add of the first block. |