renderer/decoder: clean up decoders after some time

This commit is contained in:
itsmattkc
2021-04-30 11:13:57 +10:00
parent 6ca8dbb70a
commit 9d2ddbf727
8 changed files with 159 additions and 82 deletions
+23
View File
@@ -36,6 +36,7 @@
namespace olive {
RenderManager* RenderManager::instance_ = nullptr;
const int RenderManager::kDecoderMaximumInactivity = 10000;
RenderManager::RenderManager(QObject *parent) :
ThreadPool(QThread::IdlePriority, 0, parent),
@@ -56,6 +57,10 @@ RenderManager::RenderManager(QObject *parent) :
decoder_cache_ = new DecoderCache();
shader_cache_ = new ShaderCache();
default_shader_ = context_->CreateNativeShader(ShaderCode(QString(), QString()));
decoder_clear_timer_.setInterval(kDecoderMaximumInactivity);
connect(&decoder_clear_timer_, &QTimer::timeout, this, &RenderManager::ClearOldDecoders);
decoder_clear_timer_.start();
} else {
qCritical() << "Tried to initialize unknown graphics backend";
context_ = nullptr;
@@ -79,6 +84,24 @@ RenderManager::~RenderManager()
}
}
void RenderManager::ClearOldDecoders()
{
QMutexLocker locker(decoder_cache_->mutex());
qint64 min_age = QDateTime::currentMSecsSinceEpoch() - kDecoderMaximumInactivity;
for (auto it=decoder_cache_->begin(); it!=decoder_cache_->end(); ) {
DecoderPtr decoder = it.value();
if (decoder->GetLastAccessedTime() < min_age) {
decoder->Close();
it = decoder_cache_->erase(it);
} else {
it++;
}
}
}
QByteArray RenderManager::Hash(const Node *n, const QString& output, const VideoParams &params, const rational &time)
{
QCryptographicHash hasher(QCryptographicHash::Sha1);