diff --git a/app/codec/decoder.h b/app/codec/decoder.h index 7b61c2b35..5a7382444 100644 --- a/app/codec/decoder.h +++ b/app/codec/decoder.h @@ -44,6 +44,8 @@ namespace olive { class Decoder; using DecoderPtr = std::shared_ptr; +#define DECODER_DEFAULT_DESTRUCTOR(x) virtual ~x() override {CloseInternal();} + /** * @brief A decoder's is the main class for bringing external media into Olive * diff --git a/app/codec/ffmpeg/ffmpegdecoder.cpp b/app/codec/ffmpeg/ffmpegdecoder.cpp index b78c643f6..cb1152992 100644 --- a/app/codec/ffmpeg/ffmpegdecoder.cpp +++ b/app/codec/ffmpeg/ffmpegdecoder.cpp @@ -60,11 +60,6 @@ FFmpegDecoder::FFmpegDecoder() : { } -FFmpegDecoder::~FFmpegDecoder() -{ - CloseInternal(); -} - bool FFmpegDecoder::OpenInternal() { if (instance_.Open(stream().filename().toUtf8(), stream().stream())) { diff --git a/app/codec/ffmpeg/ffmpegdecoder.h b/app/codec/ffmpeg/ffmpegdecoder.h index fc87043fb..ca7fd6215 100644 --- a/app/codec/ffmpeg/ffmpegdecoder.h +++ b/app/codec/ffmpeg/ffmpegdecoder.h @@ -53,7 +53,7 @@ public: FFmpegDecoder(); // Destructor - virtual ~FFmpegDecoder() override; + DECODER_DEFAULT_DESTRUCTOR(FFmpegDecoder) virtual QString id() const override; diff --git a/app/codec/oiio/oiiodecoder.cpp b/app/codec/oiio/oiiodecoder.cpp index e47ca9cde..b82a4fae4 100644 --- a/app/codec/oiio/oiiodecoder.cpp +++ b/app/codec/oiio/oiiodecoder.cpp @@ -41,11 +41,6 @@ OIIODecoder::OIIODecoder() : { } -OIIODecoder::~OIIODecoder() -{ - CloseInternal(); -} - QString OIIODecoder::id() const { return QStringLiteral("oiio"); diff --git a/app/codec/oiio/oiiodecoder.h b/app/codec/oiio/oiiodecoder.h index 30abd7b9e..f1b798adf 100644 --- a/app/codec/oiio/oiiodecoder.h +++ b/app/codec/oiio/oiiodecoder.h @@ -34,7 +34,7 @@ class OIIODecoder : public Decoder public: OIIODecoder(); - virtual ~OIIODecoder() override; + DECODER_DEFAULT_DESTRUCTOR(OIIODecoder) virtual QString id() const override; diff --git a/app/node/project/footage/footage.cpp b/app/node/project/footage/footage.cpp index 46ee75b83..d826476e3 100644 --- a/app/node/project/footage/footage.cpp +++ b/app/node/project/footage/footage.cpp @@ -20,7 +20,7 @@ #include "footage.h" -#include +#include #include #include @@ -56,6 +56,11 @@ Footage::Footage(const QString &filename) : Clear(); set_filename(filename); + + QTimer *check_timer = new QTimer(this); + check_timer->setInterval(5000); + connect(check_timer, &QTimer::timeout, this, &Footage::CheckFootage); + check_timer->start(); } void Footage::Retranslate() @@ -511,17 +516,20 @@ void Footage::UpdateTooltip() void Footage::CheckFootage() { - QString fn = filename(); + // Don't check files if not the active window + if (qApp->activeWindow()) { + QString fn = filename(); - if (!fn.isEmpty()) { - QFileInfo info(fn); + if (!fn.isEmpty()) { + QFileInfo info(fn); - qint64 current_file_timestamp = info.lastModified().toMSecsSinceEpoch(); + qint64 current_file_timestamp = info.lastModified().toMSecsSinceEpoch(); - if (current_file_timestamp != timestamp()) { - // File has changed! - set_timestamp(current_file_timestamp); - InvalidateAll(kFilenameInput); + if (current_file_timestamp != timestamp()) { + // File has changed! + set_timestamp(current_file_timestamp); + InvalidateAll(kFilenameInput); + } } } } diff --git a/app/render/rendercache.h b/app/render/rendercache.h index 7efc0e039..09436a9b6 100644 --- a/app/render/rendercache.h +++ b/app/render/rendercache.h @@ -39,7 +39,18 @@ private: }; -using DecoderCache = RenderCache; +struct DecoderPair { + DecoderPair() + { + decoder = nullptr; + last_modified = 0; + } + + DecoderPtr decoder; + qint64 last_modified; +}; + +using DecoderCache = RenderCache; using ShaderCache = RenderCache; } diff --git a/app/render/rendermanager.cpp b/app/render/rendermanager.cpp index 8cd3ae7c4..c72212a27 100644 --- a/app/render/rendermanager.cpp +++ b/app/render/rendermanager.cpp @@ -91,10 +91,10 @@ void RenderManager::ClearOldDecoders() qint64 min_age = QDateTime::currentMSecsSinceEpoch() - kDecoderMaximumInactivity; for (auto it=decoder_cache_->begin(); it!=decoder_cache_->end(); ) { - DecoderPtr decoder = it.value(); + DecoderPair decoder = it.value(); - if (decoder->GetLastAccessedTime() < min_age) { - decoder->Close(); + if (decoder.decoder->GetLastAccessedTime() < min_age) { + decoder.decoder->Close(); it = decoder_cache_->erase(it); } else { it++; diff --git a/app/render/renderprocessor.cpp b/app/render/renderprocessor.cpp index db49bff6a..e66833713 100644 --- a/app/render/renderprocessor.cpp +++ b/app/render/renderprocessor.cpp @@ -187,13 +187,16 @@ DecoderPtr RenderProcessor::ResolveDecoderFromInput(const QString& decoder_id, c QMutexLocker locker(decoder_cache_->mutex()); - DecoderPtr decoder = decoder_cache_->value(stream); + DecoderPair decoder = decoder_cache_->value(stream); - if (!decoder) { + qint64 file_last_modified = QFileInfo(stream.filename()).lastModified().toMSecsSinceEpoch(); + + if (!decoder.decoder || decoder.last_modified != file_last_modified) { // No decoder - decoder = Decoder::CreateFromID(decoder_id); + decoder.decoder = Decoder::CreateFromID(decoder_id); + decoder.last_modified = file_last_modified; - if (decoder->Open(stream)) { + if (decoder.decoder->Open(stream)) { decoder_cache_->insert(stream, decoder); } else { qWarning() << "Failed to open decoder for" << stream.filename() @@ -202,7 +205,7 @@ DecoderPtr RenderProcessor::ResolveDecoderFromInput(const QString& decoder_id, c } } - return decoder; + return decoder.decoder; } void RenderProcessor::Process(RenderTicketPtr ticket, Renderer *render_ctx, StillImageCache *still_image_cache, DecoderCache *decoder_cache, ShaderCache *shader_cache, QVariant default_shader)