diff --git a/app/common/timerange.cpp b/app/common/timerange.cpp index 9ea543e88..8ab8c65e2 100644 --- a/app/common/timerange.cpp +++ b/app/common/timerange.cpp @@ -48,9 +48,13 @@ bool TimeRange::operator==(const TimeRange &r) const return in() == r.in() && out() == r.out(); } -bool TimeRange::OverlapsWith(const TimeRange &a) const +bool TimeRange::OverlapsWith(const TimeRange &a, bool in_inclusive, bool out_inclusive) const { - return Overlap(a, *this); + bool overlaps_in = (in_inclusive) ? (a.out() < in()) : (a.out() <= in()); + + bool overlaps_out = (out_inclusive) ? (a.in() > out()) : (a.in() >= out()); + + return !(overlaps_in || overlaps_out); } TimeRange TimeRange::CombineWith(const TimeRange &a) const @@ -58,18 +62,13 @@ TimeRange TimeRange::CombineWith(const TimeRange &a) const return Combine(a, *this); } -bool TimeRange::Contains(const TimeRange &compare, bool inout_inclusive) const +bool TimeRange::Contains(const TimeRange &compare, bool in_inclusive, bool out_inclusive) const { - if (inout_inclusive) { - return (compare.in() >= in() && compare.out() <= out()); - } else { - return (compare.in() > in() && compare.out() < out()); - } -} + bool contains_in = (in_inclusive) ? (compare.in() >= in()) : (compare.in() > in()); -bool TimeRange::Overlap(const TimeRange &a, const TimeRange &b) -{ - return !(a.out() < b.in() || a.in() > b.out()); + bool contains_out = (out_inclusive) ? (compare.out() <= out()) : (compare.out() < out()); + + return contains_in && contains_out; } TimeRange TimeRange::Combine(const TimeRange &a, const TimeRange &b) @@ -100,7 +99,7 @@ void TimeRangeList::InsertTimeRange(const TimeRange &range) for (int i=0;i range_here.in()) { + compare -= params_.time_base(); + } + } else { + compare = Timecode::snap_time_to_timebase(range_here.out(), params_.time_base()); + if (compare >= range_here.out()) { + compare -= params_.time_base(); + } + } - if (closest_time < 0 || qAbs(compare_out - last_time_requested_) < qAbs(closest_time - last_time_requested_)) { - closest_time = compare_out; + if (closest_time < 0 + || qAbs(compare - last_time_requested_) < qAbs(closest_time - last_time_requested_)) { + closest_time = compare; + } } } @@ -259,15 +269,7 @@ TimeRange VideoRenderBackend::PopNextFrameFromQueue() if (closest_time == -1) { frame_range = test_range; } else { - // Snap the range to a single discrete frame - rational snapped_in = Timecode::snap_time_to_timebase(closest_time, params_.time_base()); - - // Check if the range starts earlier, in which case we should render that frame instead - if (closest_time < snapped_in) { - frame_range = TimeRange(snapped_in - params_.time_base(), snapped_in); - } else { - frame_range = TimeRange(snapped_in, snapped_in + params_.time_base()); - } + frame_range = TimeRange(closest_time, closest_time + params_.time_base()); } // Remove this particular frame from the queue @@ -372,7 +374,7 @@ void VideoRenderBackend::FrameRemovedFromDiskCache(const QByteArray &hash) bool VideoRenderBackend::TimeIsQueued(const TimeRange &time) const { - return cache_queue_.ContainsTimeRange(time); + return cache_queue_.ContainsTimeRange(time, true, false); } bool VideoRenderBackend::JobIsCurrent(const NodeDependency &dep, const qint64& job_time) const diff --git a/app/widget/viewer/viewer.cpp b/app/widget/viewer/viewer.cpp index 14c1883a9..7e9483f25 100644 --- a/app/widget/viewer/viewer.cpp +++ b/app/widget/viewer/viewer.cpp @@ -415,15 +415,17 @@ void ViewerWidget::PlaybackTimerUpdate() void ViewerWidget::RendererCachedFrame(const rational &time, QVariant value, qint64 job_time) { if (GetTime() == time) { - SetTexture(value.value()); - frame_cache_job_time_ = job_time; + + SetTexture(value.value()); } } void ViewerWidget::RendererCachedTime(const rational &time, qint64 job_time) { if (GetTime() == time && job_time > frame_cache_job_time_) { + frame_cache_job_time_ = job_time; + UpdateTextureFromNode(GetTime()); } }