renderer: copy cache path before render to avoid race conditions

This commit is contained in:
itsmattkc
2020-09-05 18:48:54 +10:00
parent 1334c04235
commit cabcd49b25
7 changed files with 28 additions and 15 deletions
+1 -1
View File
@@ -430,7 +430,7 @@ void RenderBackend::RunNextJob()
worker->SetRenderMode(render_mode_);
worker->SetPreviewGenerationEnabled(generate_audio_previews_);
worker->SetCopyMap(&copy_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();
+2 -1
View File
@@ -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
+7 -7
View File
@@ -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<rational>& times);
/**
@@ -186,14 +186,14 @@ private:
bool generate_audio_previews_;
ViewerOutput* viewer_;
QHash<Node*, Node*>* copy_map_;
RenderMode::Mode render_mode_;
QTimer* cleanup_timer_;
QString cache_path_;
static const int kMaxDecoderLife;
private slots:
+13 -3
View File
@@ -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);
+3 -1
View File
@@ -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();
+2 -2
View File
@@ -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;