viewer: improved frame queue and linked window

Improves minor issues with frame queue implemented in earlier commit. Also links
ViewerWindow with the queue and a separate timer to make it much smoother.
This commit is contained in:
itsmattkc
2020-05-09 16:02:18 +10:00
parent 8c4c6ba2a5
commit 00248de49c
13 changed files with 370 additions and 130 deletions
+46 -5
View File
@@ -23,6 +23,8 @@
#include <QKeyEvent>
#include <QVBoxLayout>
#include "common/timecodefunctions.h"
OLIVE_NAMESPACE_ENTER
ViewerWindow::ViewerWindow(QWidget *parent) :
@@ -32,13 +34,13 @@ ViewerWindow::ViewerWindow(QWidget *parent) :
layout->setMargin(0);
layout->setSpacing(0);
gl_widget_ = new ViewerDisplayWidget();
layout->addWidget(gl_widget_);
display_widget_ = new ViewerDisplayWidget();
layout->addWidget(display_widget_);
}
ViewerDisplayWidget *ViewerWindow::gl_widget() const
ViewerDisplayWidget *ViewerWindow::display_widget() const
{
return gl_widget_;
return display_widget_;
}
void ViewerWindow::SetResolution(int width, int height)
@@ -57,7 +59,26 @@ void ViewerWindow::SetResolution(int width, int height)
mat.scale(1.0f, window_ar / image_ar, 1.0f);
}
gl_widget_->SetMatrix(mat);
display_widget_->SetMatrix(mat);
}
void ViewerWindow::Play(const int64_t& start_timestamp, const int& playback_speed, const rational &timebase)
{
timer_.Start(start_timestamp, playback_speed, timebase.toDouble());
playback_timebase_ = timebase;
connect(display_widget_, &ViewerDisplayWidget::frameSwapped, this, &ViewerWindow::UpdateFromQueue);
display_widget_->update();
}
void ViewerWindow::Pause()
{
disconnect(display_widget_, &ViewerDisplayWidget::frameSwapped, this, &ViewerWindow::UpdateFromQueue);
QMutexLocker locker(queue_.lock());
queue_.clear();
}
void ViewerWindow::keyPressEvent(QKeyEvent *e)
@@ -76,4 +97,24 @@ void ViewerWindow::closeEvent(QCloseEvent *e)
deleteLater();
}
void ViewerWindow::UpdateFromQueue()
{
int64_t t = timer_.GetTimestampNow();
rational time = Timecode::timestamp_to_time(t, playback_timebase_);
QMutexLocker locker(queue_.lock());
while (!queue_.isEmpty()) {
const ViewerPlaybackFrame& pf = queue_.first();
if (pf.timestamp == time) {
// Frame was in queue, no need to decode anything
display_widget_->SetImage(pf.frame);
return;
} else {
queue_.removeFirst();
}
}
}
OLIVE_NAMESPACE_EXIT