diff --git a/app/render/backend/videorenderbackend.cpp b/app/render/backend/videorenderbackend.cpp index a1f6485be..7b97ea1f5 100644 --- a/app/render/backend/videorenderbackend.cpp +++ b/app/render/backend/videorenderbackend.cpp @@ -40,7 +40,8 @@ VideoRenderBackend::VideoRenderBackend(QObject *parent) : RenderBackend(parent), operating_mode_(VideoRenderWorker::kHashRenderCache), only_signal_last_frame_requested_(true), - limit_caching_(true) + limit_caching_(true), + pop_toggle_(false) { connect(DiskManager::instance(), &DiskManager::DeletedFrame, this, &VideoRenderBackend::FrameRemovedFromDiskCache); } @@ -208,44 +209,35 @@ bool VideoRenderBackend::CanRender() TimeRange VideoRenderBackend::PopNextFrameFromQueue() { // Try to find the frame that's closest to the last time requested (the playhead) + rational earliest_allowed_time = (pop_toggle_) ? 0 : last_time_requested_; + pop_toggle_ = !pop_toggle_; // Set up playhead frame range to see if the queue contains this frame precisely - TimeRange test_range(last_time_requested_, last_time_requested_ + params_.time_base()); + TimeRange test_range(earliest_allowed_time, earliest_allowed_time + params_.time_base()); // Use this variable to find the closest frame in the range - rational closest_time = -1; + rational closest_time = RATIONAL_MAX; foreach (const TimeRange& range_here, cache_queue_) { if (range_here.OverlapsWith(test_range, false, false)) { - closest_time = -1; + closest_time = RATIONAL_MAX; break; } - for (int j=0;j<2;j++) { - rational compare; + if (range_here.in() >= earliest_allowed_time) { + rational frame_here = Timecode::snap_time_to_timebase(range_here.in(), params_.time_base()); - if (j == 0) { - compare = Timecode::snap_time_to_timebase(range_here.in(), params_.time_base()); - if (compare > 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 (frame_here > range_here.in()) { + frame_here = qMax(rational(), frame_here - params_.time_base()); } - if (closest_time < 0 - || qAbs(compare - last_time_requested_) < qAbs(closest_time - last_time_requested_)) { - closest_time = compare; - } + closest_time = qMin(closest_time, frame_here); } } TimeRange frame_range; - if (closest_time == -1) { + if (closest_time == RATIONAL_MAX) { frame_range = test_range; } else { frame_range = TimeRange(closest_time, closest_time + params_.time_base()); diff --git a/app/render/backend/videorenderbackend.h b/app/render/backend/videorenderbackend.h index 522e61ced..885860537 100644 --- a/app/render/backend/videorenderbackend.h +++ b/app/render/backend/videorenderbackend.h @@ -129,6 +129,8 @@ private: bool limit_caching_; + bool pop_toggle_; + private slots: void ThreadCompletedDownload(NodeDependency dep, qint64 job_time, QByteArray hash, bool texture_existed); void ThreadSkippedFrame(NodeDependency dep, qint64 job_time, QByteArray hash);