From d49c6a059cdc06e9c5c4eac45e002fd485c9c91c Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Wed, 6 May 2020 15:56:39 +1000 Subject: [PATCH] nodes: optimize blocks so they don't unnecessarily change the hash --- app/node/block/block.cpp | 5 +++++ app/node/block/block.h | 2 ++ app/node/block/clip/clip.cpp | 9 +++++++++ app/node/block/clip/clip.h | 2 ++ app/node/block/transition/transition.cpp | 10 ++++++++-- app/node/output/track/track.cpp | 4 ++-- 6 files changed, 28 insertions(+), 4 deletions(-) diff --git a/app/node/block/block.cpp b/app/node/block/block.cpp index 98c716678..1597d737d 100644 --- a/app/node/block/block.cpp +++ b/app/node/block/block.cpp @@ -365,4 +365,9 @@ void Block::InvalidateCache(const TimeRange &range, NodeInput *from, NodeInput * Node::InvalidateCache(range, from, source); } +void Block::Hash(QCryptographicHash &, const rational &) const +{ + // A block does nothing by default +} + OLIVE_NAMESPACE_EXIT diff --git a/app/node/block/block.h b/app/node/block/block.h index ca3c6b613..f69b568b8 100644 --- a/app/node/block/block.h +++ b/app/node/block/block.h @@ -99,6 +99,8 @@ public: virtual void InvalidateCache(const TimeRange& range, NodeInput* from, NodeInput* source) override; + virtual void Hash(QCryptographicHash &hash, const rational &time) const override; + public slots: signals: diff --git a/app/node/block/clip/clip.cpp b/app/node/block/clip/clip.cpp index 8db5efdd5..413050d98 100644 --- a/app/node/block/clip/clip.cpp +++ b/app/node/block/clip/clip.cpp @@ -119,4 +119,13 @@ void ClipBlock::Retranslate() texture_input_->set_name(tr("Buffer")); } +void ClipBlock::Hash(QCryptographicHash &hash, const rational &time) const +{ + if (texture_input_->IsConnected()) { + rational t = InputTimeAdjustment(texture_input_, TimeRange(time, time)).in(); + + texture_input_->get_connected_node()->Hash(hash, t); + } +} + OLIVE_NAMESPACE_EXIT diff --git a/app/node/block/clip/clip.h b/app/node/block/clip/clip.h index 56f81c927..375f319ce 100644 --- a/app/node/block/clip/clip.h +++ b/app/node/block/clip/clip.h @@ -54,6 +54,8 @@ public: virtual void Retranslate() override; + virtual void Hash(QCryptographicHash &hash, const rational &time) const override; + signals: void PreviewUpdated(); diff --git a/app/node/block/transition/transition.cpp b/app/node/block/transition/transition.cpp index cdb0b8489..e0d66e69e 100644 --- a/app/node/block/transition/transition.cpp +++ b/app/node/block/transition/transition.cpp @@ -131,8 +131,6 @@ double TransitionBlock::GetInProgress(const rational &time) const void TransitionBlock::Hash(QCryptographicHash &hash, const rational &time) const { - Block::Hash(hash, time); - double all_prog = GetTotalProgress(time); double in_prog = GetInProgress(time); double out_prog = GetOutProgress(time); @@ -140,6 +138,14 @@ void TransitionBlock::Hash(QCryptographicHash &hash, const rational &time) const hash.addData(reinterpret_cast(&all_prog), sizeof(double)); hash.addData(reinterpret_cast(&in_prog), sizeof(double)); hash.addData(reinterpret_cast(&out_prog), sizeof(double)); + + if (out_block_input_->IsConnected()) { + out_block_input_->get_connected_node()->Hash(hash, time); + } + + if (in_block_input_->IsConnected()) { + in_block_input_->get_connected_node()->Hash(hash, time); + } } double TransitionBlock::GetInternalTransitionTime(const rational &time) const diff --git a/app/node/output/track/track.cpp b/app/node/output/track/track.cpp index 9d6f75b53..240dc514e 100644 --- a/app/node/output/track/track.cpp +++ b/app/node/output/track/track.cpp @@ -420,11 +420,11 @@ NodeInputArray *TrackOutput::block_input() const void TrackOutput::Hash(QCryptographicHash &hash, const rational &time) const { - // Resolve block list Block* b = BlockAtTime(time); + // Defer to block at this time, don't add any of our own information to the hash if (b) { - return b->Hash(hash, time); + b->Hash(hash, time); } }