#include "abstractclipitem.h"
#include "abstractgroupitem.h"
#include "titledocument.h"
+#include "kthumb.h"
#include <mlt++/Mlt.h>
#include <kio/netaccess.h>
#include <QGraphicsItemGroup>
+#include <QtConcurrentRun>
#include <KFileMetaInfo>
QObject(),
m_audioThumbsQueue(),
m_doc(doc),
- m_generatingAudioId()
+ m_generatingAudioId(),
+ m_abortThumb(false)
{
m_clipIdCounter = 1;
m_folderIdCounter = 1;
connect(&m_modifiedTimer, SIGNAL(timeout()), this, SLOT(slotProcessModifiedClips()));
#if KDE_IS_VERSION(4,5,0)
+ KImageCache::deleteCache("kdenlive-thumbs");
pixmapCache = new KImageCache("kdenlive-thumbs", 1000000);
+ pixmapCache->setEvictionPolicy(KSharedDataCache::EvictOldest);
#endif
}
ClipManager::~ClipManager()
{
+ m_abortThumb = true;
+ m_thumbsThread.waitForFinished();
+ m_thumbsMutex.lock();
+ m_requestedThumbs.clear();
+ m_thumbsMutex.unlock();
m_audioThumbsQueue.clear();
m_generatingAudioId.clear();
+ m_thumbsMutex.lock();
+ m_requestedThumbs.clear();
+ m_thumbsMutex.unlock();
qDeleteAll(m_clipList);
m_clipList.clear();
#if KDE_IS_VERSION(4,5,0)
void ClipManager::clear()
{
+ m_abortThumb = true;
+ m_thumbsThread.waitForFinished();
+ m_thumbsMutex.lock();
+ m_requestedThumbs.clear();
+ m_thumbsMutex.unlock();
+ m_abortThumb = false;
m_folderList.clear();
m_audioThumbsQueue.clear();
m_modifiedClips.clear();
#endif
}
+void ClipManager::clearCache()
+{
+#if KDE_IS_VERSION(4,5,0)
+ pixmapCache->clear();
+#endif
+}
+
+void ClipManager::requestThumbs(const QString id, QList <int> frames)
+{
+ m_thumbsMutex.lock();
+ foreach (int frame, frames) {
+ m_requestedThumbs.insertMulti(id, frame);
+ }
+ m_thumbsMutex.unlock();
+ if (!m_thumbsThread.isRunning() && !m_abortThumb) {
+ m_thumbsThread = QtConcurrent::run(this, &ClipManager::slotGetThumbs);
+ }
+}
+
+void ClipManager::stopThumbs(const QString &id)
+{
+ m_abortThumb = true;
+ m_thumbsThread.waitForFinished();
+ m_thumbsMutex.lock();
+ m_requestedThumbs.remove(id);
+ m_thumbsMutex.unlock();
+ m_abortThumb = false;
+ if (!m_thumbsThread.isRunning()) {
+ m_thumbsThread = QtConcurrent::run(this, &ClipManager::slotGetThumbs);
+ }
+}
+
+void ClipManager::slotGetThumbs()
+{
+ QMap<QString, int>::iterator i = m_requestedThumbs.begin();
+ while (i != m_requestedThumbs.end() && !m_abortThumb) {
+ QString producerId = i.key();
+ m_thumbsMutex.lock();
+ QList<int> values = m_requestedThumbs.values(producerId);
+ i = m_requestedThumbs.erase(i);
+ m_thumbsMutex.unlock();
+ qSort(values);
+ DocClipBase *clip = getClipById(producerId);
+ if (!clip) continue;
+ while (!values.isEmpty() && clip->thumbProducer() && !m_abortThumb) {
+ clip->thumbProducer()->getThumb(values.takeFirst());
+ }
+ if (m_abortThumb) {
+ // keep the requested frames that were not processed
+ m_thumbsMutex.lock();
+ foreach (int frame, values)
+ m_requestedThumbs.insertMulti(producerId, frame);
+ m_thumbsMutex.unlock();
+ }
+ }
+}
+
void ClipManager::checkAudioThumbs()
{
if (!KdenliveSettings::audiothumbnails()) {
{
for (int i = 0; i < m_clipList.count(); i++) {
if (m_clipList.at(i)->numReferences() > 0 || displayRatioChanged || fpsChanged) {
- m_clipList.at(i)->deleteProducers(true);
+ m_clipList.at(i)->deleteProducers();
}
}
QString id;