diff --git a/app/widget/viewer/viewer.cpp b/app/widget/viewer/viewer.cpp index 6c93d064f..32d1a5bd9 100644 --- a/app/widget/viewer/viewer.cpp +++ b/app/widget/viewer/viewer.cpp @@ -388,7 +388,7 @@ void ViewerWidget::SetFullScreen(QScreen *screen) (*vw->display_widget()->queue()) = *playback_devices_.first()->queue(); if (IsPlaying()) { - vw->display_widget()->Play(GetTimestamp(), playback_speed_, timebase()); + vw->display_widget()->Play(GetTimestamp(), playback_speed_, timebase(), true); } windows_.insert(screen, vw); @@ -702,6 +702,12 @@ void ViewerWidget::DetectMulticamNode(const rational &time) } } +bool ViewerWidget::IsVideoVisible() const +{ + return GetConnectedNode()->GetVideoParams().video_type() != VideoParams::kVideoTypeStill + && (display_widget_->isVisible() || !windows_.isEmpty()); +} + void ViewerWidget::UpdateWaveformViewFromMode() { bool prefer_waveform = ShouldForceWaveform(); @@ -954,7 +960,7 @@ void ViewerWidget::PlayInternal(int speed, bool in_to_out_only) queue_starved_start_ = 0; // Attempt to fill playback queue - if (display_widget_->isVisible() || !windows_.isEmpty()) { + if (IsVideoVisible()) { prequeue_length_ = DeterminePlaybackQueueSize(); if (prequeue_length_ > 0) { @@ -1181,7 +1187,7 @@ void ViewerWidget::FinishPlayPreprocess() display_widget_->ResetFPSTimer(); foreach (ViewerDisplayWidget *dw, playback_devices_) { - dw->Play(playback_start_time, playback_speed_, timebase()); + dw->Play(playback_start_time, playback_speed_, timebase(), IsVideoVisible()); } // This is our timer for loading the queue and setting the time @@ -1731,7 +1737,7 @@ void ViewerWidget::PlaybackTimerUpdate() } } - if (IsPlaying()) { + if (IsPlaying() && IsVideoVisible()) { while ((int(display_widget_->queue()->size()) + queue_watchers_.size()) < DeterminePlaybackQueueSize()) { if (!RequestNextFrameForQueue()) { // Prevent infinite loop diff --git a/app/widget/viewer/viewer.h b/app/widget/viewer/viewer.h index de06b62e1..203a03801 100644 --- a/app/widget/viewer/viewer.h +++ b/app/widget/viewer/viewer.h @@ -282,6 +282,8 @@ private: void DetectMulticamNode(const rational &time); + bool IsVideoVisible() const; + ViewerSizer* sizer_; int playback_speed_; diff --git a/app/widget/viewer/viewerdisplay.cpp b/app/widget/viewer/viewerdisplay.cpp index a2f036cd8..832cf2a92 100644 --- a/app/widget/viewer/viewerdisplay.cpp +++ b/app/widget/viewer/viewerdisplay.cpp @@ -1241,16 +1241,18 @@ void ViewerDisplayWidget::RequestStartEditingText() } } -void ViewerDisplayWidget::Play(const int64_t &start_timestamp, const int &playback_speed, const rational &timebase) +void ViewerDisplayWidget::Play(const int64_t &start_timestamp, const int &playback_speed, const rational &timebase, bool start_updating) { playback_timebase_ = timebase; playback_speed_ = playback_speed; timer_.Start(start_timestamp, playback_speed, timebase.toDouble()); - connect(this, &ViewerDisplayWidget::frameSwapped, this, &ViewerDisplayWidget::UpdateFromQueue); + if (start_updating) { + connect(this, &ViewerDisplayWidget::frameSwapped, this, &ViewerDisplayWidget::UpdateFromQueue); - update(); + update(); + } } void ViewerDisplayWidget::Pause() diff --git a/app/widget/viewer/viewerdisplay.h b/app/widget/viewer/viewerdisplay.h index 913d5d93e..37567dabc 100644 --- a/app/widget/viewer/viewerdisplay.h +++ b/app/widget/viewer/viewerdisplay.h @@ -123,7 +123,7 @@ public: return texture_; } - void Play(const int64_t &start_timestamp, const int &playback_speed, const rational &timebase); + void Play(const int64_t &start_timestamp, const int &playback_speed, const rational &timebase, bool start_updating); void Pause();