cache: attempt to automatically re-match hashes on invalidate

This code is slow and unoptimized. Will require some more work.
This commit is contained in:
itsmattkc
2020-05-21 16:49:02 +10:00
parent cb72736f52
commit 34fade9d81
7 changed files with 73 additions and 21 deletions
+26
View File
@@ -732,6 +732,24 @@ void ViewerWidget::RendererGeneratedFrameForQueue()
}
}
void ViewerWidget::HashGenerated()
{
QFutureWatcher<QByteArray>* watcher = static_cast<QFutureWatcher<QByteArray>*>(sender());
if (hash_watchers_.contains(watcher)) {
QString cache_fn = GetConnectedNode()->video_frame_cache()->CachePathName(watcher->result(), GetCurrentPixelFormat());
if (QFileInfo::exists(cache_fn)) {
GetConnectedNode()->video_frame_cache()->SetHash(hash_watchers_.value(watcher),
watcher->result());
}
hash_watchers_.remove(watcher);
}
watcher->deleteLater();
}
void ViewerWidget::UpdateRendererParameters()
{
renderer_->SetVideoParams(VideoRenderingParams(GetConnectedNode()->video_params(),
@@ -1071,6 +1089,14 @@ void ViewerWidget::ViewerInvalidatedRange(const TimeRange &range)
if (GetTime() >= range.in() && (GetTime() < range.out() || range.in() == range.out())) {
ForceUpdate();
}
QList<rational> invalidated_frames = GetConnectedNode()->video_frame_cache()->GetFrameListFromTimeRange({range});
foreach (const rational& r, invalidated_frames) {
QFutureWatcher<QByteArray>* watcher = new QFutureWatcher<QByteArray>();
connect(watcher, &QFutureWatcher<QByteArray>::finished, this, &ViewerWidget::HashGenerated);
hash_watchers_.insert(watcher, r);
watcher->setFuture(renderer_->Hash(r, true));
}
}
OLIVE_NAMESPACE_EXIT