diff --git a/app/render/previewautocacher.cpp b/app/render/previewautocacher.cpp index b2cf4f4d2..b7ba2937d 100644 --- a/app/render/previewautocacher.cpp +++ b/app/render/previewautocacher.cpp @@ -26,6 +26,7 @@ #include "codec/conformmanager.h" #include "node/inputdragger.h" #include "node/project/project.h" +#include "render/diskmanager.h" #include "render/renderprocessor.h" #include "task/customcache/customcachetask.h" #include "task/taskmanager.h" @@ -201,7 +202,12 @@ void PreviewAutoCacher::VideoRendered() if (watcher->HasResult()) { if (watcher->GetTicket()->property("cached").toBool()) { if (FrameHashCache *cache = Node::ValueToPtr(watcher->property("cache"))) { - cache->ValidateTime(watcher->property("time").value()); + rational time = watcher->property("time").value(); + JobTime job = watcher->property("job").value(); + + if (video_cache_data_.value(cache).job_tracker.isCurrent(time, job)) { + cache->ValidateTime(time); + } } } } @@ -210,6 +216,13 @@ void PreviewAutoCacher::VideoRendered() TryRender(); } + const QStringList bad_cache_names = watcher->GetTicket()->property("badcache").toStringList(); + if (!bad_cache_names.empty()) { + for (const QString &fn : bad_cache_names) { + DiskManager::instance()->DeleteSpecificFile(fn); + } + } + // Process passthroughs no matter what, if the viewer was switched, the passthrough map would be // cleared anyway QVector tickets = video_immediate_passthroughs_.take(watcher); diff --git a/app/render/renderprocessor.cpp b/app/render/renderprocessor.cpp index 75ee420d2..2cdc10130 100644 --- a/app/render/renderprocessor.cpp +++ b/app/render/renderprocessor.cpp @@ -573,6 +573,10 @@ TexturePtr RenderProcessor::ProcessVideoCacheJob(const CacheJob &val) tex->Upload(frame->data(), frame->linesize_pixels()); return tex; } + } else { + QStringList s = ticket_->property("badcache").toStringList(); + s.append(val.GetFilename()); + ticket_->setProperty("badcache", s); } return nullptr;