diff --git a/app/render/backend/renderbackend.cpp b/app/render/backend/renderbackend.cpp index c6fb6e814..6e2dc29da 100644 --- a/app/render/backend/renderbackend.cpp +++ b/app/render/backend/renderbackend.cpp @@ -430,7 +430,7 @@ void RenderBackend::RunNextJob() worker->SetRenderMode(render_mode_); worker->SetPreviewGenerationEnabled(generate_audio_previews_); worker->SetCopyMap(©_map_); - worker->SetViewerNode(viewer_node_); + worker->SetCachePath(viewer_node_->video_frame_cache()->GetCacheDirectory()); // Move ticket from queue to running list RenderTicketPtr ticket = render_queue_.front(); diff --git a/app/render/backend/renderworker.cpp b/app/render/backend/renderworker.cpp index d1af07535..28e8a50f5 100644 --- a/app/render/backend/renderworker.cpp +++ b/app/render/backend/renderworker.cpp @@ -318,10 +318,11 @@ QVariant RenderWorker::ProcessFrameGeneration(const Node* node, const GenerateJo QVariant RenderWorker::GetCachedFrame(const Node* node, const rational& time) { if (render_mode_ == RenderMode::kOffline + && !cache_path_.isEmpty() && node->id() == QStringLiteral("org.olivevideoeditor.Olive.videoinput")) { QByteArray hash = HashNode(node, video_params(), time); - FramePtr f = viewer_->video_frame_cache()->LoadCacheFrame(hash); + FramePtr f = FrameHashCache::LoadCacheFrame(cache_path_, hash); if (f) { // The cached frame won't load with the correct divider by default, so we enforce it here diff --git a/app/render/backend/renderworker.h b/app/render/backend/renderworker.h index 4cfb4d729..067a9d9ef 100644 --- a/app/render/backend/renderworker.h +++ b/app/render/backend/renderworker.h @@ -50,11 +50,6 @@ public: available_ = a; } - void SetViewerNode(ViewerOutput* viewer) - { - viewer_ = viewer; - } - void SetVideoParams(const VideoParams& params) { video_params_ = params; @@ -90,6 +85,11 @@ public: generate_audio_previews_ = e; } + void SetCachePath(const QString& s) + { + cache_path_ = s; + } + void Hash(RenderTicketPtr ticket, ViewerOutput* viewer, const QVector& times); /** @@ -186,14 +186,14 @@ private: bool generate_audio_previews_; - ViewerOutput* viewer_; - QHash* copy_map_; RenderMode::Mode render_mode_; QTimer* cleanup_timer_; + QString cache_path_; + static const int kMaxDecoderLife; private slots: diff --git a/app/render/framehashcache.cpp b/app/render/framehashcache.cpp index c02d94e91..b65234dc5 100644 --- a/app/render/framehashcache.cpp +++ b/app/render/framehashcache.cpp @@ -220,12 +220,17 @@ bool FrameHashCache::SaveCacheFrame(const QByteArray &hash, FramePtr frame) cons } } +FramePtr FrameHashCache::LoadCacheFrame(const QString &cache_path, const QByteArray &hash) +{ + return LoadCacheFrame(CachePathName(cache_path, hash)); +} + FramePtr FrameHashCache::LoadCacheFrame(const QByteArray &hash) const { return LoadCacheFrame(CachePathName(hash)); } -FramePtr FrameHashCache::LoadCacheFrame(const QString &fn) const +FramePtr FrameHashCache::LoadCacheFrame(const QString &fn) { FramePtr frame = nullptr; @@ -371,10 +376,15 @@ void FrameHashCache::ProjectInvalidated(Project *p) } QString FrameHashCache::CachePathName(const QByteArray& hash) const +{ + return CachePathName(GetCacheDirectory(), hash); +} + +QString FrameHashCache::CachePathName(const QString &cache_path, const QByteArray &hash) { QString ext = GetFormatExtension(); - QDir cache_dir(QDir(GetCacheDirectory()).filePath(QString(hash.left(1).toHex()))); + QDir cache_dir(QDir(cache_path).filePath(QString(hash.left(1).toHex()))); cache_dir.mkpath("."); QString filename = QStringLiteral("%1%2").arg(QString(hash.mid(1).toHex()), ext); @@ -383,7 +393,7 @@ QString FrameHashCache::CachePathName(const QByteArray& hash) const QMetaObject::invokeMethod(DiskManager::instance(), "Accessed", Qt::QueuedConnection, - Q_ARG(QString, GetCacheDirectory()), + Q_ARG(QString, cache_path), Q_ARG(QByteArray, hash)); return cache_dir.filePath(filename); diff --git a/app/render/framehashcache.h b/app/render/framehashcache.h index bdf5d81bb..1d8360043 100644 --- a/app/render/framehashcache.h +++ b/app/render/framehashcache.h @@ -59,12 +59,14 @@ public: * @brief Return the path of the cached image at this time */ QString CachePathName(const QByteArray &hash) const; + static QString CachePathName(const QString& cache_path, const QByteArray &hash); bool SaveCacheFrame(const QString& filename, char *data, const VideoParams &vparam, int linesize_bytes) const; bool SaveCacheFrame(const QByteArray& hash, char *data, const VideoParams &vparam, int linesize_bytes) const; bool SaveCacheFrame(const QByteArray& hash, FramePtr frame) const; + static FramePtr LoadCacheFrame(const QString& cache_path, const QByteArray& hash); FramePtr LoadCacheFrame(const QByteArray& hash) const; - FramePtr LoadCacheFrame(const QString& fn) const; + static FramePtr LoadCacheFrame(const QString& fn); static QString GetFormatExtension(); diff --git a/app/render/playbackcache.h b/app/render/playbackcache.h index 2f857d4c1..b36ceef4e 100644 --- a/app/render/playbackcache.h +++ b/app/render/playbackcache.h @@ -67,6 +67,8 @@ public: return !invalidated_.isEmpty(); } + QString GetCacheDirectory() const; + signals: void Invalidated(const OLIVE_NAMESPACE::TimeRange& r); @@ -87,8 +89,6 @@ protected: Project* GetProject() const; - QString GetCacheDirectory() const; - struct JobIdentifier { TimeRange range; qint64 job_time; diff --git a/cmake/FindOpenTimelineIO.cmake b/cmake/FindOpenTimelineIO.cmake new file mode 100644 index 000000000..e69de29bb