viewer: allow queue some time to catch up

This commit is contained in:
itsmattkc
2022-05-15 21:13:24 -07:00
parent eaa105abf2
commit 81956d8869
4 changed files with 41 additions and 2 deletions
+22 -1
View File
@@ -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();
+5
View File
@@ -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();
+10 -1
View File
@@ -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;
}
+4
View File
@@ -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);