From 81956d8869f6715a60c8ffdf6edfcc72c979f701 Mon Sep 17 00:00:00 2001 From: itsmattkc <34096995+itsmattkc@users.noreply.github.com> Date: Sun, 15 May 2022 21:13:24 -0700 Subject: [PATCH] viewer: allow queue some time to catch up --- app/widget/viewer/viewer.cpp | 23 ++++++++++++++++++++++- app/widget/viewer/viewer.h | 5 +++++ app/widget/viewer/viewerdisplay.cpp | 11 ++++++++++- app/widget/viewer/viewerdisplay.h | 4 ++++ 4 files changed, 41 insertions(+), 2 deletions(-) diff --git a/app/widget/viewer/viewer.cpp b/app/widget/viewer/viewer.cpp index 7a48a4e53..087bb90df 100644 --- a/app/widget/viewer/viewer.cpp +++ b/app/widget/viewer/viewer.cpp @@ -95,7 +95,8 @@ ViewerWidget::ViewerWidget(QWidget *parent) : connect(display_widget_, &ViewerDisplayWidget::DragEntered, this, &ViewerWidget::DragEntered); connect(display_widget_, &ViewerDisplayWidget::Dropped, this, &ViewerWidget::Dropped); connect(display_widget_, &ViewerDisplayWidget::TextureChanged, this, &ViewerWidget::TextureChanged); - connect(display_widget_, &ViewerDisplayWidget::QueueStarved, this, &ViewerWidget::ForceRequeueFromCurrentTime); + connect(display_widget_, &ViewerDisplayWidget::QueueStarved, this, &ViewerWidget::QueueStarved); + connect(display_widget_, &ViewerDisplayWidget::QueueNoLongerStarved, this, &ViewerWidget::QueueNoLongerStarved); connect(display_widget_, &ViewerDisplayWidget::CreateAddableAt, this, &ViewerWidget::CreateAddableAt); connect(sizer_, &ViewerSizer::RequestScale, display_widget_, &ViewerDisplayWidget::SetMatrixZoom); connect(sizer_, &ViewerSizer::RequestTranslate, display_widget_, &ViewerDisplayWidget::SetMatrixTranslate); @@ -636,6 +637,24 @@ void ViewerWidget::ReceivedAudioBufferForScrubbing() delete watcher; } +void ViewerWidget::QueueStarved() +{ + static const int kMaximumWaitTime = 250; + qint64 now = QDateTime::currentMSecsSinceEpoch(); + + if (!queue_starved_start_) { + queue_starved_start_ = now; + } else if (now > queue_starved_start_ + kMaximumWaitTime) { + ForceRequeueFromCurrentTime(); + queue_starved_start_ = 0; + } +} + +void ViewerWidget::QueueNoLongerStarved() +{ + queue_starved_start_ = 0; +} + void ViewerWidget::ForceRequeueFromCurrentTime() { ClearVideoAutoCacherQueue(); @@ -732,6 +751,8 @@ void ViewerWidget::PlayInternal(int speed, bool in_to_out_only) controls_->ShowPauseButton(); + queue_starved_start_ = 0; + // Attempt to fill playback queue if (display_widget_->isVisible() || !windows_.isEmpty()) { prequeue_length_ = DeterminePlaybackQueueSize(); diff --git a/app/widget/viewer/viewer.h b/app/widget/viewer/viewer.h index 4e574f179..f99202cb7 100644 --- a/app/widget/viewer/viewer.h +++ b/app/widget/viewer/viewer.h @@ -274,6 +274,8 @@ private: Track::Reference recording_track_; QString recording_filename_; + qint64 queue_starved_start_; + private slots: void PlaybackTimerUpdate(); @@ -321,6 +323,9 @@ private slots: void ReceivedAudioBufferForScrubbing(); + void QueueStarved(); + void QueueNoLongerStarved(); + void ForceRequeueFromCurrentTime(); void UpdateAudioProcessor(); diff --git a/app/widget/viewer/viewerdisplay.cpp b/app/widget/viewer/viewerdisplay.cpp index 4074cce4a..9fc4eeac4 100644 --- a/app/widget/viewer/viewerdisplay.cpp +++ b/app/widget/viewer/viewerdisplay.cpp @@ -67,7 +67,8 @@ ViewerDisplayWidget::ViewerDisplayWidget(QWidget *parent) : frames_skipped_(0), show_widget_background_(false), push_mode_(kPushNull), - add_band_(nullptr) + add_band_(nullptr), + queue_starved_(false) { connect(Core::instance(), &Core::ToolChanged, this, &ViewerDisplayWidget::ToolChanged); @@ -894,6 +895,7 @@ void ViewerDisplayWidget::Pause() disconnect(this, &ViewerDisplayWidget::frameSwapped, this, &ViewerDisplayWidget::UpdateFromQueue); queue_.clear(); + queue_starved_ = false; } void ViewerDisplayWidget::UpdateFromQueue() @@ -905,6 +907,7 @@ void ViewerDisplayWidget::UpdateFromQueue() bool popped = false; if (queue_.empty()) { + queue_starved_ = true; emit QueueStarved(); } else { while (!queue_.empty()) { @@ -914,6 +917,11 @@ void ViewerDisplayWidget::UpdateFromQueue() // Frame was in queue, no need to decode anything SetImage(pf.frame); + + if (queue_starved_) { + queue_starved_ = false; + emit QueueNoLongerStarved(); + } return; } else if (pf.timestamp > time) { @@ -936,6 +944,7 @@ void ViewerDisplayWidget::UpdateFromQueue() } if (queue_.empty()) { + queue_starved_ = true; emit QueueStarved(); break; } diff --git a/app/widget/viewer/viewerdisplay.h b/app/widget/viewer/viewerdisplay.h index cc2a4b0e9..adb51e682 100644 --- a/app/widget/viewer/viewerdisplay.h +++ b/app/widget/viewer/viewerdisplay.h @@ -212,6 +212,8 @@ signals: void QueueStarved(); + void QueueNoLongerStarved(); + void CreateAddableAt(const QRectF &rect); protected: @@ -384,6 +386,8 @@ private: QRubberBand *add_band_; QPoint add_band_start_; + bool queue_starved_; + private slots: void EmitColorAtCursor(QMouseEvent* e);