From d1bad9ddfee4e43e1dfbca2fd3fa0e897f127549 Mon Sep 17 00:00:00 2001 From: Richard Antalik Date: Fri, 10 May 2024 20:14:10 +0200 Subject: [PATCH] Fix #120709: VSE retiming depends on Strip start frame Caused by using timeline frame instead of frame index as argument for `seq_retiming_evaluate()` in `claculate_speed_table_from_seq()`. This bug only affected speed transitions in sound strips. `RetimingRangeData` also incorrectly interpreted segment type after transition end, which would not cause issues, but was incorrect. --- source/blender/sequencer/intern/strip_retiming.cc | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/source/blender/sequencer/intern/strip_retiming.cc b/source/blender/sequencer/intern/strip_retiming.cc index 3a6575d82c2..0ffe0b35000 100644 --- a/source/blender/sequencer/intern/strip_retiming.cc +++ b/source/blender/sequencer/intern/strip_retiming.cc @@ -682,13 +682,14 @@ class RetimingRange { void claculate_speed_table_from_seq(const Sequence *seq) { - for (int frame = start; frame <= end; frame++) { + for (int timeline_frame = start; timeline_frame <= end; timeline_frame++) { /* We need number actual number of frames here. */ const double normal_step = 1 / double(seq->len); + const int frame_index = timeline_frame - SEQ_time_start_frame_get(seq); /* Who needs calculus, when you can have slow code? */ - const double val_prev = seq_retiming_evaluate(seq, frame - 1); - const double val = seq_retiming_evaluate(seq, frame); + const double val_prev = seq_retiming_evaluate(seq, frame_index - 1); + const double val = seq_retiming_evaluate(seq, frame_index); const double speed_at_frame = (val - val_prev) / normal_step; speed_table.append(speed_at_frame); } @@ -726,7 +727,7 @@ class RetimingRangeData { int frame_start = SEQ_time_start_frame_get(seq) + key_prev->strip_frame_index; int frame_end = SEQ_time_start_frame_get(seq) + key.strip_frame_index; - eRangeType type = SEQ_retiming_key_is_transition_type(key_prev) ? TRANSITION : LINEAR; + eRangeType type = SEQ_retiming_key_is_transition_start(key_prev) ? TRANSITION : LINEAR; RetimingRange range = RetimingRange(seq, frame_start, frame_end, speed, type); ranges.append(range); }