summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2025-01-10 01:35:42 +0100
committerCarl Hetherington <cth@carlh.net>2025-01-10 02:05:41 +0100
commit3fa25e91b9ed746b9a65fc6ff0b5fc4388097459 (patch)
tree6aa7328119e26c59ddb2ba3a306a7ac581cf9888 /src
parentb7cd23cc92140a0f5246c804ce0f1eaa7b3f9d6c (diff)
Fix invalid return values from fade() causing various odd effects (#2932).
Diffstat (limited to 'src')
-rw-r--r--src/lib/video_content.cc15
1 files changed, 9 insertions, 6 deletions
diff --git a/src/lib/video_content.cc b/src/lib/video_content.cc
index 6177ba7fe..392dc4052 100644
--- a/src/lib/video_content.cc
+++ b/src/lib/video_content.cc
@@ -435,16 +435,19 @@ VideoContent::fade(shared_ptr<const Film> film, ContentTime time) const
double const vfr = _parent->active_video_frame_rate(film);
- auto const ts = _parent->trim_start();
+ auto const trim_start = _parent->trim_start();
auto const fade_in_time = ContentTime::from_frames(fade_in(), vfr);
- if ((time - ts) < fade_in_time) {
- return double(ContentTime(time - ts).get()) / fade_in_time.get();
+ /* time after the trimmed start of the content */
+ auto const time_after_start = time - trim_start;
+ if (fade_in_time.get() && time_after_start < fade_in_time) {
+ return std::max(0.0, static_cast<double>(time_after_start.get()) / fade_in_time.get());
}
auto const fade_out_time = ContentTime::from_frames(fade_out(), vfr);
- auto fade_out_start = ContentTime::from_frames(length(), vfr) - _parent->trim_end() - fade_out_time;
- if (time >= fade_out_start) {
- return 1 - double(ContentTime(time - fade_out_start).get()) / fade_out_time.get();
+ auto const end = ContentTime::from_frames(length(), vfr) - _parent->trim_end();
+ auto const time_after_end_fade_start = time - (end - fade_out_time);
+ if (time_after_end_fade_start > ContentTime()) {
+ return std::max(0.0, 1 - static_cast<double>(time_after_end_fade_start.get()) / fade_out_time.get());
}
return {};