diff --git a/app/widget/viewer/viewer.cpp b/app/widget/viewer/viewer.cpp index e4be02aee..4bd097972 100644 --- a/app/widget/viewer/viewer.cpp +++ b/app/widget/viewer/viewer.cpp @@ -89,6 +89,7 @@ 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(sizer_, &ViewerSizer::RequestScale, display_widget_, &ViewerDisplayWidget::SetMatrixZoom); connect(sizer_, &ViewerSizer::RequestTranslate, display_widget_, &ViewerDisplayWidget::SetMatrixTranslate); connect(display_widget_, &ViewerDisplayWidget::HandDragMoved, sizer_, &ViewerSizer::HandDragMove); @@ -537,7 +538,7 @@ void ViewerWidget::UpdateTextureFromNode() } if (IsPlaying()) { - qDebug() << "UpdateTextureFromNode called while playing"; + qWarning() << "UpdateTextureFromNode called while playing"; return; } @@ -827,6 +828,10 @@ void ViewerWidget::FinishPlayPreprocess() int ViewerWidget::DeterminePlaybackQueueSize() { + if (playback_speed_ == 0) { + return 0; + } + int64_t end_ts; if (playback_speed_ > 0) { @@ -1192,6 +1197,8 @@ void ViewerWidget::TimebaseChangedEvent(const rational &timebase) void ViewerWidget::PlaybackTimerUpdate() { + Q_ASSERT(playback_speed_ != 0); + rational current_time = Timecode::timestamp_to_time(display_widget_->timer()->GetTimestampNow(), timebase()); rational min_time, max_time; @@ -1274,12 +1281,13 @@ void ViewerWidget::PlaybackTimerUpdate() } } - // We still run the queue if windows are visible even if our own display widget isn't visible - /*while (!playback_queue_.empty() && playback_queue_.front().timestamp != GetTime()) { - PopOldestFrameFromPlaybackQueue(); - }*/ - // NOTE: There should be some calculation here to determine how many frames need to be queued - RequestNextFrameForQueue(); + if (IsPlaying()) { + int count = 0; + for (int i=display_widget_->queue()->size(); iqueue()->PurgeBefore(current_time, playback_speed_); diff --git a/app/widget/viewer/viewerdisplay.cpp b/app/widget/viewer/viewerdisplay.cpp index e8f8dfe36..0c79e7dd2 100644 --- a/app/widget/viewer/viewerdisplay.cpp +++ b/app/widget/viewer/viewerdisplay.cpp @@ -311,24 +311,6 @@ void ViewerDisplayWidget::dropEvent(QDropEvent *event) } } -void ViewerDisplayWidget::showEvent(QShowEvent *event) -{ - super::showEvent(event); - - if (isVisible()) { - emit VisibilityChanged(true); - } -} - -void ViewerDisplayWidget::hideEvent(QHideEvent *event) -{ - super::hideEvent(event); - - if (!isVisible()) { - emit VisibilityChanged(false); - } -} - void ViewerDisplayWidget::OnPaint() { // Clear background to empty @@ -633,7 +615,7 @@ void ViewerDisplayWidget::UpdateFromQueue() bool popped = false; if (queue_.empty()) { - //ForceRequeueFromCurrentTime(); + emit QueueStarved(); } else { while (!queue_.empty()) { const ViewerPlaybackFrame& pf = queue_.front(); @@ -664,7 +646,7 @@ void ViewerDisplayWidget::UpdateFromQueue() } if (queue_.empty()) { - //ForceRequeueFromCurrentTime(); + emit QueueStarved(); break; } diff --git a/app/widget/viewer/viewerdisplay.h b/app/widget/viewer/viewerdisplay.h index 71f1b1d8e..f8bd30278 100644 --- a/app/widget/viewer/viewerdisplay.h +++ b/app/widget/viewer/viewerdisplay.h @@ -196,10 +196,10 @@ signals: void Dropped(QDropEvent* event); - void VisibilityChanged(bool visible); - void TextureChanged(TexturePtr texture); + void QueueStarved(); + protected: /** * @brief Override the mouse press event for the DragStarted() signal and gizmos @@ -222,12 +222,6 @@ protected: virtual void dropEvent(QDropEvent* event) override; - virtual void showEvent(QShowEvent* event) override; - - virtual void hideEvent(QHideEvent* event) override; - - //virtual void closeEvent(QCloseEvent* event) override; - protected slots: /** * @brief Paint function to display the texture (received in SetTexture()) on screen. diff --git a/app/widget/viewer/viewerqueue.h b/app/widget/viewer/viewerqueue.h index 1d5c5df60..e97d213b7 100644 --- a/app/widget/viewer/viewerqueue.h +++ b/app/widget/viewer/viewerqueue.h @@ -52,12 +52,10 @@ public: void PurgeBefore(const rational &time, int playback_speed) { - int popped = 0; - while (!this->empty() && this->front().timestamp < time) { - popped++; + while (!this->empty() + && ((playback_speed > 0 && this->front().timestamp < time) || (playback_speed < 0 && this->front().timestamp > time))) { this->pop_front(); } - if (popped > 0) qDebug() << "Purged" << popped; } };