diff --git a/app/widget/viewer/viewer.cpp b/app/widget/viewer/viewer.cpp index 8e105ccdd..e75405a75 100644 --- a/app/widget/viewer/viewer.cpp +++ b/app/widget/viewer/viewer.cpp @@ -451,7 +451,7 @@ void ViewerWidget::UpdateTextureFromNode() { rational time = GetTime(); bool frame_exists_at_time = FrameExistsAtTime(time); - bool frame_might_be_still = GetConnectedNode() && GetConnectedNode()->GetConnectedTextureOutput().IsValid() && GetConnectedNode()->GetVideoLength().isNull(); + bool frame_might_be_still = ViewerMightBeAStill(); // Check playback queue for a frame if (IsPlaying()) { @@ -669,6 +669,11 @@ bool ViewerWidget::FrameExistsAtTime(const rational &time) return GetConnectedNode() && time >= 0 && time < GetConnectedNode()->GetVideoLength(); } +bool ViewerWidget::ViewerMightBeAStill() +{ + return GetConnectedNode() && GetConnectedNode()->GetConnectedTextureOutput().IsValid() && GetConnectedNode()->GetVideoLength().isNull(); +} + void ViewerWidget::SetDisplayImage(FramePtr frame, bool main_only) { display_widget_->SetImage(frame); @@ -689,11 +694,13 @@ void ViewerWidget::RequestNextFrameForQueue() rational next_time = Timecode::timestamp_to_time(playback_queue_next_frame_, timebase()); - playback_queue_next_frame_ += playback_speed_; + if (FrameExistsAtTime(next_time) || ViewerMightBeAStill()) { + playback_queue_next_frame_ += playback_speed_; - RenderTicketWatcher* watcher = new RenderTicketWatcher(); - connect(watcher, &RenderTicketWatcher::Finished, this, &ViewerWidget::RendererGeneratedFrameForQueue); - watcher->SetTicket(GetFrame(next_time, false)); + RenderTicketWatcher* watcher = new RenderTicketWatcher(); + connect(watcher, &RenderTicketWatcher::Finished, this, &ViewerWidget::RendererGeneratedFrameForQueue); + watcher->SetTicket(GetFrame(next_time, false)); + } } RenderTicketPtr ViewerWidget::GetFrame(const rational &t, bool clear_render_queue) diff --git a/app/widget/viewer/viewer.h b/app/widget/viewer/viewer.h index 5b8ce36fa..3dbd81691 100644 --- a/app/widget/viewer/viewer.h +++ b/app/widget/viewer/viewer.h @@ -183,6 +183,8 @@ private: bool FrameExistsAtTime(const rational& time); + bool ViewerMightBeAStill(); + void SetDisplayImage(FramePtr frame, bool main_only); void RequestNextFrameForQueue();