From f9a54ebdb637a3150e8c8902de9cef66c9f18d1a Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Thu, 27 Feb 2020 17:46:49 +1100 Subject: [PATCH] renderer: remove frames from hash map as well when the diskmanager deletes them --- app/render/backend/videorenderbackend.cpp | 2 +- app/render/backend/videorenderframecache.cpp | 21 +++++++++++++++++++- app/render/backend/videorenderframecache.h | 10 +++++++++- 3 files changed, 30 insertions(+), 3 deletions(-) diff --git a/app/render/backend/videorenderbackend.cpp b/app/render/backend/videorenderbackend.cpp index 263069c78..6a7fe2e7a 100644 --- a/app/render/backend/videorenderbackend.cpp +++ b/app/render/backend/videorenderbackend.cpp @@ -343,7 +343,7 @@ void VideoRenderBackend::TruncateFrameCacheLength(const rational &length) void VideoRenderBackend::FrameRemovedFromDiskCache(const QByteArray &hash) { - QList deleted_frames = frame_cache()->FramesWithHash(hash); + QList deleted_frames = frame_cache()->TakeFramesWithHash(hash); foreach (const rational& frame, deleted_frames) { TimeRange invalidated(frame, frame+params_.time_base()); diff --git a/app/render/backend/videorenderframecache.cpp b/app/render/backend/videorenderframecache.cpp index a45591414..3df6aa615 100644 --- a/app/render/backend/videorenderframecache.cpp +++ b/app/render/backend/videorenderframecache.cpp @@ -83,7 +83,7 @@ void VideoRenderFrameCache::RemoveHashFromCurrentlyCaching(const QByteArray &has currently_caching_list_.removeOne(hash); } -QList VideoRenderFrameCache::FramesWithHash(const QByteArray &hash) +QList VideoRenderFrameCache::FramesWithHash(const QByteArray &hash) const { QList times; @@ -98,6 +98,25 @@ QList VideoRenderFrameCache::FramesWithHash(const QByteArray &hash) return times; } +QList VideoRenderFrameCache::TakeFramesWithHash(const QByteArray &hash) +{ + QList times; + + QMap::iterator iterator = time_hash_map_.begin(); + + while (iterator != time_hash_map_.end()) { + if (iterator.value() == hash) { + times.append(iterator.key()); + + iterator = time_hash_map_.erase(iterator); + } else { + iterator++; + } + } + + return times; +} + const QMap &VideoRenderFrameCache::time_hash_map() const { return time_hash_map_; diff --git a/app/render/backend/videorenderframecache.h b/app/render/backend/videorenderframecache.h index 6c5af9447..cd9902e40 100644 --- a/app/render/backend/videorenderframecache.h +++ b/app/render/backend/videorenderframecache.h @@ -43,7 +43,15 @@ public: void RemoveHashFromCurrentlyCaching(const QByteArray& hash); - QList FramesWithHash(const QByteArray& hash); + /** + * @brief Returns a list of frames that use a particular hash + */ + QList FramesWithHash(const QByteArray& hash) const; + + /** + * @brief Same as FramesWithHash() but also removes these frames from the map + */ + QList TakeFramesWithHash(const QByteArray& hash); const QMap& time_hash_map() const;