From 0b205ece9c97dd87b863497a9d50dca5f8049f95 Mon Sep 17 00:00:00 2001 From: itsmattkc <34096995+itsmattkc@users.noreply.github.com> Date: Thu, 23 Sep 2021 00:16:05 -0700 Subject: [PATCH] cache: improved code flow --- app/dialog/sequence/sequence.cpp | 8 ++-- .../sequence/sequencedialogparametertab.cpp | 4 +- app/node/output/viewer/viewer.cpp | 18 ++++----- app/node/output/viewer/viewer.h | 16 ++++---- app/render/previewautocacher.cpp | 37 ++++++++++------- app/render/previewautocacher.h | 21 +--------- app/widget/viewer/viewer.cpp | 40 +++---------------- app/widget/viewer/viewer.h | 6 +-- 8 files changed, 55 insertions(+), 95 deletions(-) diff --git a/app/dialog/sequence/sequence.cpp b/app/dialog/sequence/sequence.cpp index e7f89ce80..e7daa93e5 100644 --- a/app/dialog/sequence/sequence.cpp +++ b/app/dialog/sequence/sequence.cpp @@ -136,7 +136,7 @@ void SequenceDialog::accept() sequence_->SetVideoParams(video_params); sequence_->SetAudioParams(audio_params); sequence_->SetLabel(name_field_->text()); - sequence_->SetAutoCacheEnabled(parameter_tab_->GetSelectedPreviewAutoCache()); + sequence_->SetVideoAutoCacheEnabled(parameter_tab_->GetSelectedPreviewAutoCache()); } QDialog::accept(); @@ -171,7 +171,7 @@ SequenceDialog::SequenceParamCommand::SequenceParamCommand(Sequence* s, old_video_params_(s->GetVideoParams()), old_audio_params_(s->GetAudioParams()), old_name_(s->GetLabel()), - old_autocache_(s->GetAutoCacheEnabled()) + old_autocache_(s->GetVideoAutoCacheEnabled()) { } @@ -189,7 +189,7 @@ void SequenceDialog::SequenceParamCommand::redo() sequence_->SetAudioParams(new_audio_params_); } sequence_->SetLabel(new_name_); - sequence_->SetAutoCacheEnabled(new_autocache_); + sequence_->SetVideoAutoCacheEnabled(new_autocache_); } void SequenceDialog::SequenceParamCommand::undo() @@ -201,7 +201,7 @@ void SequenceDialog::SequenceParamCommand::undo() sequence_->SetAudioParams(old_audio_params_); } sequence_->SetLabel(old_name_); - sequence_->SetAutoCacheEnabled(old_autocache_); + sequence_->SetVideoAutoCacheEnabled(old_autocache_); } } diff --git a/app/dialog/sequence/sequencedialogparametertab.cpp b/app/dialog/sequence/sequencedialogparametertab.cpp index 674467f7f..9d77d8bc7 100644 --- a/app/dialog/sequence/sequencedialogparametertab.cpp +++ b/app/dialog/sequence/sequencedialogparametertab.cpp @@ -54,7 +54,7 @@ SequenceDialogParameterTab::SequenceDialogParameterTab(Sequence* sequence, QWidg preview_layout->addWidget(preview_resolution_label_, row, 2); row++; preview_layout->addWidget(new QLabel(tr("Quality:")), row, 0); - preview_format_field_ = new PixelFormatComboBox(false); + preview_format_field_ = new PixelFormatComboBox(true); preview_layout->addWidget(preview_format_field_, row, 1, 1, 2); row++; preview_layout->addWidget(new QLabel(tr("Auto-Cache:")), row, 0); @@ -68,7 +68,7 @@ SequenceDialogParameterTab::SequenceDialogParameterTab(Sequence* sequence, QWidg video_section_->SetVideoParams(vp); preview_resolution_field_->SetDivider(vp.divider()); preview_format_field_->SetPixelFormat(vp.format()); - preview_autocache_field_->setChecked(sequence->GetAutoCacheEnabled()); + preview_autocache_field_->setChecked(sequence->GetVideoAutoCacheEnabled()); audio_sample_rate_field_->SetSampleRate(ap.sample_rate()); audio_channels_field_->SetChannelLayout(ap.channel_layout()); diff --git a/app/node/output/viewer/viewer.cpp b/app/node/output/viewer/viewer.cpp index 334654f2e..f121028bc 100644 --- a/app/node/output/viewer/viewer.cpp +++ b/app/node/output/viewer/viewer.cpp @@ -31,7 +31,7 @@ const QString ViewerOutput::kVideoParamsInput = QStringLiteral("video_param_in") const QString ViewerOutput::kAudioParamsInput = QStringLiteral("audio_param_in"); const QString ViewerOutput::kTextureInput = QStringLiteral("tex_in"); const QString ViewerOutput::kSamplesInput = QStringLiteral("samples_in"); -const QString ViewerOutput::kAutoCacheInput = QStringLiteral("autocache_in"); +const QString ViewerOutput::kVideoAutoCacheInput = QStringLiteral("autocache_in"); const uint64_t ViewerOutput::kVideoParamEditMask = VideoParamEdit::kWidthHeight | VideoParamEdit::kInterlacing | VideoParamEdit::kFrameRate | VideoParamEdit::kPixelAspect; @@ -55,9 +55,9 @@ ViewerOutput::ViewerOutput(bool create_buffer_inputs, bool create_default_stream AddInput(kTextureInput, NodeValue::kTexture, InputFlags(kInputFlagNotKeyframable)); AddInput(kSamplesInput, NodeValue::kSamples, InputFlags(kInputFlagNotKeyframable)); - AddInput(kAutoCacheInput, NodeValue::kBoolean, true, InputFlags(kInputFlagNotKeyframable | kInputFlagNotConnectable)); - IgnoreHashingFrom(kAutoCacheInput); - IgnoreInvalidationsFrom(kAutoCacheInput); + AddInput(kVideoAutoCacheInput, NodeValue::kBoolean, true, InputFlags(kInputFlagNotKeyframable | kInputFlagNotConnectable)); + IgnoreHashingFrom(kVideoAutoCacheInput); + IgnoreInvalidationsFrom(kVideoAutoCacheInput); } if (create_default_streams) { @@ -202,7 +202,7 @@ void ViewerOutput::set_default_parameters() AudioParams::kInternalFormat )); - SetAutoCacheEnabled(Config::Current()["DefaultSequenceAutoCache"].toBool()); + SetVideoAutoCacheEnabled(Config::Current()["DefaultSequenceAutoCache"].toBool()); } void ViewerOutput::ShiftVideoCache(const rational &from, const rational &to) @@ -294,8 +294,8 @@ void ViewerOutput::Retranslate() SetInputName(kSamplesInput, tr("Samples")); } - if (HasInputWithID(kAutoCacheInput)) { - SetInputName(kAutoCacheInput, tr("Auto-Cache")); + if (HasInputWithID(kVideoAutoCacheInput)) { + SetInputName(kVideoAutoCacheInput, tr("Auto-Cache Video")); } } @@ -387,8 +387,8 @@ Node::ValueHint ViewerOutput::GetConnectedSampleValueHint() void ViewerOutput::InputValueChangedEvent(const QString &input, int element) { - if (input == kAutoCacheInput) { - emit AutoCacheChanged(GetAutoCacheEnabled()); + if (input == kVideoAutoCacheInput) { + emit VideoAutoCacheChanged(GetVideoAutoCacheEnabled()); } else if (element == 0) { if (input == kVideoParamsInput) { diff --git a/app/node/output/viewer/viewer.h b/app/node/output/viewer/viewer.h index 9c79d1952..af6f0a350 100644 --- a/app/node/output/viewer/viewer.h +++ b/app/node/output/viewer/viewer.h @@ -159,19 +159,19 @@ public: void SetViewerVideoCacheEnabled(bool e) { video_cache_enabled_ = e; } void SetViewerAudioCacheEnabled(bool e) { audio_cache_enabled_ = e; } - bool GetAutoCacheEnabled() const + bool GetVideoAutoCacheEnabled() const { - if (HasInputWithID(kAutoCacheInput)) { - return GetStandardValue(kAutoCacheInput).toBool(); + if (HasInputWithID(kVideoAutoCacheInput)) { + return GetStandardValue(kVideoAutoCacheInput).toBool(); } else { return false; } } - void SetAutoCacheEnabled(bool e) + void SetVideoAutoCacheEnabled(bool e) { - if (HasInputWithID(kAutoCacheInput)) { - return SetStandardValue(kAutoCacheInput, e); + if (HasInputWithID(kVideoAutoCacheInput)) { + return SetStandardValue(kVideoAutoCacheInput, e); } } @@ -181,7 +181,7 @@ public: static const QString kTextureInput; static const QString kSamplesInput; - static const QString kAutoCacheInput; + static const QString kVideoAutoCacheInput; static const uint64_t kVideoParamEditMask; @@ -196,7 +196,7 @@ signals: void InterlacingChanged(VideoParams::Interlacing mode); - void AutoCacheChanged(bool e); + void VideoAutoCacheChanged(bool e); void VideoParamsChanged(); void AudioParamsChanged(); diff --git a/app/render/previewautocacher.cpp b/app/render/previewautocacher.cpp index 6934a6c2a..d4ac8c55a 100644 --- a/app/render/previewautocacher.cpp +++ b/app/render/previewautocacher.cpp @@ -14,7 +14,6 @@ namespace olive { PreviewAutoCacher::PreviewAutoCacher() : viewer_node_(nullptr), - paused_(false), use_custom_range_(false), single_frame_render_(nullptr) { @@ -44,7 +43,7 @@ RenderTicketPtr PreviewAutoCacher::GetSingleFrame(const rational &t, bool priori // See if we have a hash, we may or may not retrieve one depending on the state of the video // frame cache QByteArray hash; - if (!paused_) { + if (viewer_node_->GetVideoAutoCacheEnabled()) { hash = viewer_node_->video_frame_cache()->GetHash(t); } @@ -62,11 +61,6 @@ RenderTicketPtr PreviewAutoCacher::GetSingleFrame(const rational &t, bool priori return sfr; } -void PreviewAutoCacher::SetPaused(bool paused) -{ - paused_ = paused; -} - QVector PreviewAutoCacher::GenerateHashes(ViewerOutput *viewer, FrameHashCache* cache, const QVector ×) { QVector hash_data(times.size()); @@ -150,9 +144,8 @@ void PreviewAutoCacher::HashesProcessed() } } - // HACK: When viewer is first set, there's nothing to requeue the range unless the user - // manually moves the playhead, so we ensure a requeue is done here. - if (!hash_iterator_.HasNext()) { + // RequeueFrames won't run if hash tasks isn't empty, so if it is, trigger it now + if (hash_tasks_.isEmpty()) { delayed_requeue_timer_.stop(); delayed_requeue_timer_.start(); } @@ -254,7 +247,7 @@ void PreviewAutoCacher::VideoRendered() if (watcher->HasResult()) { // Download frame in another thread - if (!hash.isEmpty() && VideoParams::FormatIsFloat(viewer_node_->GetVideoParams().format())) { + if (!hash.isEmpty()) { FramePtr frame = watcher->Get().value(); RenderTicketWatcher* w = new RenderTicketWatcher(); w->setProperty("job", QVariant::fromValue(last_update_time_)); @@ -576,7 +569,7 @@ void PreviewAutoCacher::TryRender() watcher = RenderFrame(hash, single_frame_render_->property("time").value(), single_frame_render_->property("prioritize").toBool(), - paused_); + !viewer_node_->GetVideoAutoCacheEnabled()); video_immediate_passthroughs_[watcher].append(single_frame_render_); } @@ -670,8 +663,7 @@ void PreviewAutoCacher::RequeueFrames() if (viewer_node_ && viewer_node_->video_frame_cache()->HasInvalidatedRanges(viewer_node_->GetVideoLength()) && hash_tasks_.isEmpty() - && VideoParams::FormatIsFloat(viewer_node_->GetVideoParams().format()) - && (!paused_ || use_custom_range_)) { + && (viewer_node_->GetVideoAutoCacheEnabled() || use_custom_range_)) { TimeRange using_range; if (use_custom_range_) { @@ -702,6 +694,13 @@ void PreviewAutoCacher::ConformFinished() } } +void PreviewAutoCacher::VideoAutoCacheEnableChanged(bool e) +{ + if (e) { + RequeueFrames(); + } +} + void PreviewAutoCacher::ForceCacheRange(const TimeRange &range) { use_custom_range_ = true; @@ -787,6 +786,11 @@ void PreviewAutoCacher::SetViewerNode(ViewerOutput *viewer_node) disconnect(graph, &NodeGraph::InputValueHintChanged, this, &PreviewAutoCacher::ValueHintChanged); // Disconnect signal (will be a no-op if the signal was never connected) + disconnect(viewer_node_, + &ViewerOutput::VideoAutoCacheChanged, + this, + &PreviewAutoCacher::VideoAutoCacheEnableChanged); + disconnect(viewer_node_->video_frame_cache(), &PlaybackCache::Invalidated, this, @@ -837,6 +841,11 @@ void PreviewAutoCacher::SetViewerNode(ViewerOutput *viewer_node) connect(graph, &NodeGraph::ValueChanged, this, &PreviewAutoCacher::ValueChanged); connect(graph, &NodeGraph::InputValueHintChanged, this, &PreviewAutoCacher::ValueHintChanged); + connect(viewer_node_, + &ViewerOutput::VideoAutoCacheChanged, + this, + &PreviewAutoCacher::VideoAutoCacheEnableChanged); + connect(viewer_node_->video_frame_cache(), &PlaybackCache::Invalidated, this, diff --git a/app/render/previewautocacher.h b/app/render/previewautocacher.h index 1ff5083aa..f8e55d8d8 100644 --- a/app/render/previewautocacher.h +++ b/app/render/previewautocacher.h @@ -34,23 +34,6 @@ public: */ void SetViewerNode(ViewerOutput *viewer_node); - /** - * @brief Returns whether the auto-cache is currently paused or not - */ - bool IsPaused() const - { - return paused_; - } - - /** - * @brief Sets whether the auto-cache is currently paused or not - * @param paused - * - * If TRUE, the cache queue is cleared (any frames currently being rendered will be processed as - * normal however). If FALSE, any uncached frames in the range will automatically be queued. - */ - void SetPaused(bool paused); - /** * @brief Force a certain range to be cached * @@ -153,8 +136,6 @@ private: ColorManager* copied_color_manager_; QVector created_nodes_; - bool paused_; - TimeRange cache_range_; bool use_custom_range_; @@ -237,6 +218,8 @@ private slots: void ConformFinished(); + void VideoAutoCacheEnableChanged(bool e); + }; } diff --git a/app/widget/viewer/viewer.cpp b/app/widget/viewer/viewer.cpp index 908a0fd97..253443795 100644 --- a/app/widget/viewer/viewer.cpp +++ b/app/widget/viewer/viewer.cpp @@ -55,8 +55,7 @@ ViewerWidget::ViewerWidget(QWidget *parent) : color_menu_enabled_(true), time_changed_from_timer_(false), prequeuing_(false), - active_queue_jobs_(0), - cache_time_(rational::NaN) + active_queue_jobs_(0) { // Set up main layout QVBoxLayout* layout = new QVBoxLayout(this); @@ -168,7 +167,7 @@ void ViewerWidget::TimeChangedEvent(const rational &time) } // Send time to auto-cacher - UpdateAutoCacher(); + auto_cacher_.SetPlayhead(time); last_time_ = time; } @@ -179,7 +178,6 @@ void ViewerWidget::ConnectNodeEvent(ViewerOutput *n) connect(n, &ViewerOutput::PixelAspectChanged, this, &ViewerWidget::SetViewerPixelAspect); connect(n, &ViewerOutput::LengthChanged, this, &ViewerWidget::LengthChangedSlot); connect(n, &ViewerOutput::InterlacingChanged, this, &ViewerWidget::InterlacingChangedSlot); - connect(n, &ViewerOutput::AutoCacheChanged, this, &ViewerWidget::SetAutoCacheEnabled); connect(n, &ViewerOutput::VideoParamsChanged, this, &ViewerWidget::UpdateRendererVideoParameters); connect(n, &ViewerOutput::AudioParamsChanged, this, &ViewerWidget::UpdateRendererAudioParameters); connect(n->video_frame_cache(), &FrameHashCache::Invalidated, this, &ViewerWidget::ViewerInvalidatedVideoRange); @@ -190,8 +188,6 @@ void ViewerWidget::ConnectNodeEvent(ViewerOutput *n) VideoParams vp = n->GetVideoParams(); - SetAutoCacheEnabled(n->GetAutoCacheEnabled()); - InterlacingChangedSlot(vp.interlacing()); ruler()->SetPlaybackCache(n->video_frame_cache()); @@ -228,7 +224,6 @@ void ViewerWidget::DisconnectNodeEvent(ViewerOutput *n) disconnect(n, &ViewerOutput::PixelAspectChanged, this, &ViewerWidget::SetViewerPixelAspect); disconnect(n, &ViewerOutput::LengthChanged, this, &ViewerWidget::LengthChangedSlot); disconnect(n, &ViewerOutput::InterlacingChanged, this, &ViewerWidget::InterlacingChangedSlot); - disconnect(n, &ViewerOutput::AutoCacheChanged, this, &ViewerWidget::SetAutoCacheEnabled); disconnect(n, &ViewerOutput::VideoParamsChanged, this, &ViewerWidget::UpdateRendererVideoParameters); disconnect(n, &ViewerOutput::AudioParamsChanged, this, &ViewerWidget::UpdateRendererAudioParameters); disconnect(n->video_frame_cache(), &FrameHashCache::Invalidated, this, &ViewerWidget::ViewerInvalidatedVideoRange); @@ -259,7 +254,6 @@ void ViewerWidget::DisconnectNodeEvent(ViewerOutput *n) void ViewerWidget::ConnectedNodeChangeEvent(ViewerOutput *n) { auto_cacher_.SetViewerNode(n); - cache_time_ = rational::NaN; } void ViewerWidget::ScaleChangedEvent(const double &s) @@ -344,19 +338,6 @@ void ViewerWidget::SetFullScreen(QScreen *screen) windows_.insert(screen, vw); } -void ViewerWidget::SetAutoCacheEnabled(bool e) -{ - auto_cacher_.SetPaused(!e); - - if (e) { - // Enable auto-cache - UpdateAutoCacher(); - } else { - // Disable auto-cache - ClearAutoCacherQueue(); - } -} - void ViewerWidget::CacheEntireSequence() { auto_cacher_.ForceCacheRange(TimeRange(0, GetConnectedNode()->GetVideoLength())); @@ -417,19 +398,12 @@ void ViewerWidget::SetEmptyImage() void ViewerWidget::UpdateAutoCacher() { - rational time = GetTime(); - - if (GetConnectedNode() // Ensure valid node - && cache_time_ != time) { // Ensure cache hasn't already been to this time - auto_cacher_.SetPlayhead(time); - cache_time_ = time; - } + auto_cacher_.SetPlayhead(GetTime()); } -void ViewerWidget::ClearAutoCacherQueue() +void ViewerWidget::ClearVideoAutoCacherQueue() { auto_cacher_.CancelVideoTasks(); - cache_time_ = rational::NaN; } void ViewerWidget::StartAudioOutput() @@ -521,7 +495,7 @@ void ViewerWidget::UpdateTextureFromNode() nonqueue_watchers_.append(watcher); // Clear queue because we want this frame more than any others - ClearAutoCacherQueue(); + ClearVideoAutoCacherQueue(); watcher->SetTicket(GetFrame(time, true)); } @@ -551,7 +525,7 @@ void ViewerWidget::PlayInternal(int speed, bool in_to_out_only) foreach (ViewerWidget* viewer, instances_) { if (viewer != this) { viewer->PauseInternal(); - viewer->ClearAutoCacherQueue(); + viewer->ClearVideoAutoCacherQueue(); } } @@ -1089,8 +1063,6 @@ void ViewerWidget::Play() void ViewerWidget::Pause() { PauseInternal(); - - UpdateAutoCacher(); } void ViewerWidget::ShuttleLeft() diff --git a/app/widget/viewer/viewer.h b/app/widget/viewer/viewer.h index a7d7154ae..e5f6edc82 100644 --- a/app/widget/viewer/viewer.h +++ b/app/widget/viewer/viewer.h @@ -107,8 +107,6 @@ public slots: */ void SetSignalCursorColorEnabled(bool e); - void SetAutoCacheEnabled(bool e); - void CacheEntireSequence(); void CacheSequenceInOut(); @@ -212,7 +210,7 @@ private: void UpdateAutoCacher(); - void ClearAutoCacherQueue(); + void ClearVideoAutoCacherQueue(); QStackedWidget* stack_; @@ -256,8 +254,6 @@ private: int active_queue_jobs_; - rational cache_time_; - static QVector instances_; private slots: