#include "clipmanager.h"
-#include "addclipcommand.h"
+#include "commands/addclipcommand.h"
#include "kdenlivesettings.h"
#include "docclipbase.h"
#include "kdenlivedoc.h"
m_audioThumbsQueue(),
m_doc(doc),
m_generatingAudioId(),
- m_abortThumb(false)
+ m_abortThumb(false),
+ m_closing(false)
{
m_clipIdCounter = 1;
m_folderIdCounter = 1;
ClipManager::~ClipManager()
{
+ m_closing = true;
+ m_abortThumb = true;
+ m_thumbsThread.waitForFinished();
m_thumbsMutex.lock();
m_requestedThumbs.clear();
m_thumbsMutex.unlock();
- m_abortThumb = true;
- m_thumbsThread.waitForFinished();
m_audioThumbsQueue.clear();
m_generatingAudioId.clear();
m_thumbsMutex.lock();
void ClipManager::clear()
{
+ m_abortThumb = true;
+ m_thumbsThread.waitForFinished();
m_thumbsMutex.lock();
m_requestedThumbs.clear();
m_thumbsMutex.unlock();
- m_abortThumb = true;
- m_thumbsThread.waitForFinished();
m_abortThumb = false;
m_folderList.clear();
m_audioThumbsQueue.clear();
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);
void ClipManager::stopThumbs(const QString &id)
{
+ if (m_requestedThumbs.isEmpty() || m_closing) return;
m_abortThumb = true;
m_thumbsThread.waitForFinished();
m_thumbsMutex.lock();
void ClipManager::slotGetThumbs()
{
- QMap<QString, int>::const_iterator i = m_requestedThumbs.constBegin();
- while (i != m_requestedThumbs.constEnd() && !m_abortThumb) {
- const QString producerId = i.key();
+ 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);
- m_requestedThumbs.remove(producerId);
+ i = m_requestedThumbs.erase(i);
m_thumbsMutex.unlock();
qSort(values);
DocClipBase *clip = getClipById(producerId);
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();
}
}
}
}
QString id;
+ Mlt::Producer *prod;
+ QStringList brokenClips;
for (int i = 0; i < prods.count(); i++) {
- id = prods.at(i)->get("id");
+ prod = prods.at(i);
+ id = prod->get("id");
if (id.contains('_')) id = id.section('_', 0, 0);
DocClipBase *clip = getClipById(id);
- if (clip) {
- clip->setProducer(prods.at(i), false, true);
+ QString markup = prod->get("markup");
+ if (prod->is_blank() || !prod->is_valid() || !markup.isEmpty()) {
+ // The clip is broken (missing proxy or source clip)
+ kDebug()<<"// WARNING, CLIP "<<id<<" Cannot be loaded";
+ brokenClips << id;
+ }
+ else if (clip) {
+ clip->setProducer(prod, false, true);
}
}
- emit checkAllClips(displayRatioChanged, fpsChanged);
+ emit checkAllClips(displayRatioChanged, fpsChanged, brokenClips);
}
void ClipManager::slotAddClipList(const KUrl::List urls, const QString &group, const QString &groupId)