viewer: allow queue some time to catch up
This commit is contained in:
@@ -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();
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user