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
+20
View File
@@ -46,12 +46,15 @@ const rational Decoder::kAnyTimecode = RATIONAL_MIN;
Decoder::Decoder()
{
UpdateLastAccessed();
}
bool Decoder::Open(const CodecStream &stream)
{
QMutexLocker locker(&mutex_);
UpdateLastAccessed();
if (stream_.IsValid()) {
// Decoder is already open. Return TRUE if the stream is the stream we have, or FALSE if not.
if (stream_ == stream) {
@@ -94,6 +97,8 @@ FramePtr Decoder::RetrieveVideo(const rational &timecode, const int &divider)
{
QMutexLocker locker(&mutex_);
UpdateLastAccessed();
if (!stream_.IsValid()) {
qCritical() << "Can't retrieve video on a closed decoder";
return nullptr;
@@ -111,6 +116,8 @@ SampleBufferPtr Decoder::RetrieveAudio(const TimeRange &range, const AudioParams
{
QMutexLocker locker(&mutex_);
UpdateLastAccessed();
if (!stream_.IsValid()) {
qCritical() << "Can't retrieve audio on a closed decoder";
return nullptr;
@@ -167,10 +174,18 @@ SampleBufferPtr Decoder::RetrieveAudio(const TimeRange &range, const AudioParams
return buffer;
}
qint64 Decoder::GetLastAccessedTime()
{
QMutexLocker locker(&mutex_);
return last_accessed_;
}
void Decoder::Close()
{
QMutexLocker locker(&mutex_);
UpdateLastAccessed();
if (stream_.IsValid()) {
CloseInternal();
stream_.Reset();
@@ -355,6 +370,11 @@ SampleBufferPtr Decoder::RetrieveAudioFromConform(const QString &conform_filenam
return nullptr;
}
void Decoder::UpdateLastAccessed()
{
last_accessed_ = QDateTime::currentMSecsSinceEpoch();
}
uint qHash(Decoder::CodecStream stream, uint seed)
{
return qHash(stream.filename(), seed) ^ qHash(stream.stream(), seed);
+9
View File
@@ -165,6 +165,11 @@ public:
*/
SampleBufferPtr RetrieveAudio(const TimeRange& range, const AudioParams& params, const QString &cache_path, Footage::LoopMode loop_mode, const QAtomicInt *cancelled);
/**
* @brief Determine the last time this decoder instance was used in any way
*/
qint64 GetLastAccessedTime();
/**
* @brief Generate a Footage object from a file
*
@@ -276,12 +281,16 @@ signals:
void IndexProgress(double);
private:
void UpdateLastAccessed();
SampleBufferPtr RetrieveAudioFromConform(const QString& conform_filename, const TimeRange &range, Footage::LoopMode loop_mode);
CodecStream stream_;
QMutex mutex_;
qint64 last_accessed_;
};
uint qHash(Decoder::CodecStream stream, uint seed = 0);
+2 -1
View File
@@ -26,8 +26,9 @@
namespace olive {
class FFmpegFramePool : public MemoryPool<uint8_t>
class FFmpegFramePool : public MemoryPool
{
Q_OBJECT
public:
FFmpegFramePool(int element_count);