From 96594ef9487893d28c26c6723db9a180dff5af99 Mon Sep 17 00:00:00 2001 From: itsmattkc <34096995+itsmattkc@users.noreply.github.com> Date: Mon, 16 May 2022 14:14:53 -0700 Subject: [PATCH 1/2] keyframeview: adjust sequence time to node's time --- app/widget/keyframeview/keyframeview.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/app/widget/keyframeview/keyframeview.cpp b/app/widget/keyframeview/keyframeview.cpp index 51ec2e724..df0349475 100644 --- a/app/widget/keyframeview/keyframeview.cpp +++ b/app/widget/keyframeview/keyframeview.cpp @@ -226,7 +226,10 @@ bool KeyframeView::Paste(std::function find_node_functi if (node_with_id) { for (NodeKeyframe *key : it.value()) { - key->set_time(key->time() - min); + // Adjust sequence time to node's time + rational t = key->time() - min; + t = GetAdjustedTime(GetTimeTarget(), node_with_id, t, true); + key->set_time(t); if (NodeKeyframe *existing = node_with_id->GetKeyframeAtTimeOnTrack(key->input(), key->time(), key->track(), key->element())) { command->add_child(new NodeParamRemoveKeyframeCommand(existing)); From a48513a8a151d7d69149531d531a598da83bee9c Mon Sep 17 00:00:00 2001 From: itsmattkc <34096995+itsmattkc@users.noreply.github.com> Date: Mon, 16 May 2022 15:44:25 -0700 Subject: [PATCH 2/2] viewer: fixed issue with reverse playback --- app/widget/viewer/viewerdisplay.cpp | 4 +++- app/widget/viewer/viewerdisplay.h | 2 ++ app/widget/viewer/viewerqueue.h | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/app/widget/viewer/viewerdisplay.cpp b/app/widget/viewer/viewerdisplay.cpp index 9fc4eeac4..cdbe6fdc6 100644 --- a/app/widget/viewer/viewerdisplay.cpp +++ b/app/widget/viewer/viewerdisplay.cpp @@ -66,6 +66,7 @@ ViewerDisplayWidget::ViewerDisplayWidget(QWidget *parent) : show_fps_(false), frames_skipped_(0), show_widget_background_(false), + playback_speed_(0), push_mode_(kPushNull), add_band_(nullptr), queue_starved_(false) @@ -882,6 +883,7 @@ void ViewerDisplayWidget::RequestStartEditingText() void ViewerDisplayWidget::Play(const int64_t &start_timestamp, const int &playback_speed, const rational &timebase) { playback_timebase_ = timebase; + playback_speed_ = playback_speed; timer_.Start(start_timestamp, playback_speed, timebase.toDouble()); @@ -924,7 +926,7 @@ void ViewerDisplayWidget::UpdateFromQueue() } return; - } else if (pf.timestamp > time) { + } else if ((pf.timestamp > time) == (playback_speed_ > 0)) { // The next frame in the queue is too new, so just do a regular update. Either the // frame we want will arrive in time, or we'll just have to skip it. diff --git a/app/widget/viewer/viewerdisplay.h b/app/widget/viewer/viewerdisplay.h index adb51e682..7359087f6 100644 --- a/app/widget/viewer/viewerdisplay.h +++ b/app/widget/viewer/viewerdisplay.h @@ -360,6 +360,8 @@ private: QVariant load_frame_; + int playback_speed_; + enum PushMode { /// New frame to push to internal texture kPushFrame, diff --git a/app/widget/viewer/viewerqueue.h b/app/widget/viewer/viewerqueue.h index 3ad2c0b36..f8117eac9 100644 --- a/app/widget/viewer/viewerqueue.h +++ b/app/widget/viewer/viewerqueue.h @@ -41,7 +41,7 @@ public: if (this->empty() || (this->back().timestamp < f.timestamp) == (playback_speed > 0)) { this->push_back(f); } else { - for (iterator i=this->begin(); i!=this->end(); i++) { + for (auto i=this->begin(); i!=this->end(); i++) { if ((i->timestamp > f.timestamp) == (playback_speed > 0)) { this->insert(i, f); break;