+void ClipManager::requestThumbs(const QString id, QList <int> frames)
+{
+ kDebug()<<"// Request thbs: "<<id<<": "<<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>::const_iterator i = m_requestedThumbs.constBegin();
+ while (i != m_requestedThumbs.constEnd() && !m_abortThumb) {
+ const QString producerId = i.key();
+ m_thumbsMutex.lock();
+ QList<int> values = m_requestedThumbs.values(producerId);
+ m_requestedThumbs.remove(producerId);
+ 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();
+ }
+ i = m_requestedThumbs.constBegin();
+ }
+}
+