summaryrefslogtreecommitdiffstats
path: root/audio/filter
diff options
context:
space:
mode:
authorferreum <code@ferreum.de>2023-08-17 17:11:25 +0200
committerNiklas Haas <github-daiK1o@haasn.dev>2023-09-20 14:36:23 +0200
commitcf8b7ff0d666a4c13b32d8d9e973435df419b5ef (patch)
treed4685cb8588913559fa082d216a86021a0e2d9aa /audio/filter
parentc0728249a18f5e7ec40332e002f4cd9fedc8e91c (diff)
downloadmpv-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')
-rw-r--r--audio/filter/af_scaletempo2_internals.c9
-rw-r--r--audio/filter/af_scaletempo2_internals.h3
2 files changed, 6 insertions, 6 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.
diff --git a/audio/filter/af_scaletempo2_internals.h b/audio/filter/af_scaletempo2_internals.h
index f1b74ec64f..622d6e20da 100644
--- a/audio/filter/af_scaletempo2_internals.h
+++ b/audio/filter/af_scaletempo2_internals.h
@@ -64,7 +64,8 @@ struct mp_scaletempo2 {
double output_time;
// The offset of the center frame of |search_block| w.r.t. its first frame.
int search_block_center_offset;
- // Index of the beginning of the |search_block|, in frames.
+ // Index of the beginning of the |search_block|, in frames. This may be
+ // negative, which is handled by |peek_audio_with_zero_prepend|.
int search_block_index;
// Number of Blocks to search to find the most similar one to the target
// frame.