From a222871aa5a6599f36eae197c7cfa3406ae017ce Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Mardelle Date: Sat, 25 Jun 2011 22:36:58 +0000 Subject: [PATCH] Check for missing proxies on document opening svn path=/trunk/kdenlive/; revision=5730 --- src/docclipbase.cpp | 21 ++------------------- src/documentchecker.cpp | 31 ++++++++++++++++++++++++++++++- src/projectlist.cpp | 14 ++++---------- src/projectlist.h | 2 +- 4 files changed, 37 insertions(+), 31 deletions(-) diff --git a/src/docclipbase.cpp b/src/docclipbase.cpp index 7faff156..1246683e 100644 --- a/src/docclipbase.cpp +++ b/src/docclipbase.cpp @@ -432,17 +432,6 @@ QString DocClipBase::markerComment(GenTime t) void DocClipBase::deleteProducers(bool clearThumbCreator) { if (clearThumbCreator && m_thumbProd) m_thumbProd->clearProducer(); - /*kDebug()<<"// CLIP KILL PRODS ct: "<get_length(), KdenliveSettings::project_fps())); - //m_clipProducer = producer; - //m_clipProducer->set("transparency", m_properties.value("transparency").toInt()); } static double getPixelAspect(QMap& props) { @@ -597,9 +584,6 @@ Mlt::Producer *DocClipBase::videoProducer() Mlt::Producer *DocClipBase::producer(int track) { - /*for (int i = 0; i < m_baseTrackProducers.count(); i++) { - if (m_baseTrackProducers.at(i)) kDebug() << "// PROD: " << i << ", ID: " << m_baseTrackProducers.at(i)->get("id"); - }*/ if (track == -1 || (m_clipType != AUDIO && m_clipType != AV && m_clipType != PLAYLIST)) { if (m_baseTrackProducers.count() == 0) return NULL; for (int i = 0; i < m_baseTrackProducers.count(); i++) { @@ -622,7 +606,6 @@ Mlt::Producer *DocClipBase::producer(int track) // Could not find a valid producer for that clip, check in return NULL; } - m_baseTrackProducers[track] = cloneProducer(m_baseTrackProducers.at(i)); adjustProducerProperties(m_baseTrackProducers.at(track), QString(getId() + '_' + QString::number(track)), false, false); } @@ -632,11 +615,11 @@ Mlt::Producer *DocClipBase::producer(int track) Mlt::Producer *DocClipBase::cloneProducer(Mlt::Producer *source) { - Mlt::Producer *result; + Mlt::Producer *result = NULL; if (KIO::NetAccess::exists(KUrl(source->get("resource")), KIO::NetAccess::SourceSide, 0)) { result = new Mlt::Producer(*source->profile(), source->get("resource")); } - else { + if (result == NULL) { // placeholder clip QString txt = "+" + i18n("Missing clip") + ".txt"; char *tmp = qstrdup(txt.toUtf8().constData()); diff --git a/src/documentchecker.cpp b/src/documentchecker.cpp index a43378e7..7df155d0 100644 --- a/src/documentchecker.cpp +++ b/src/documentchecker.cpp @@ -53,6 +53,7 @@ const int CLIPMISSING = 0; const int CLIPOK = 1; const int CLIPPLACEHOLDER = 2; const int CLIPWRONGDURATION = 3; +const int PROXYMISSING = 4; const int LUMAMISSING = 10; const int LUMAOK = 11; @@ -75,6 +76,7 @@ bool DocumentChecker::hasErrorInClips() QDomNodeList documentProducers = m_doc.elementsByTagName("producer"); QList wrongDurationClips; QList missingClips; + QList missingProxies; for (int i = 0; i < m_info.count(); i++) { e = m_info.item(i).toElement(); clipType = e.attribute("type").toInt(); @@ -108,6 +110,13 @@ bool DocumentChecker::hasErrorInClips() continue; } resource = e.attribute("resource"); + if (e.hasAttribute("proxy")) { + QString proxyresource = e.attribute("proxy"); + if (!KIO::NetAccess::exists(KUrl(proxyresource), KIO::NetAccess::SourceSide, 0)) { + // Missing clip found + missingProxies.append(e); + } + } if (clipType == SLIDESHOW) resource = KUrl(resource).directory(); if (!KIO::NetAccess::exists(KUrl(resource), KIO::NetAccess::SourceSide, 0)) { // Missing clip found @@ -135,7 +144,7 @@ bool DocumentChecker::hasErrorInClips() } } - if (missingClips.isEmpty() && missingLumas.isEmpty() && wrongDurationClips.isEmpty()) + if (missingClips.isEmpty() && missingLumas.isEmpty() && wrongDurationClips.isEmpty() && missingProxies.isEmpty()) return false; m_dialog = new QDialog(); @@ -219,6 +228,11 @@ bool DocumentChecker::hasErrorInClips() else if (wrongDurationClips.count() > 0) { m_ui.infoLabel->setText(i18n("The project file contains clips with duration mismatch")); } + if (missingProxies.count() > 0) { + if (!m_ui.infoLabel->text().isEmpty()) m_ui.infoLabel->setText(m_ui.infoLabel->text() + ". "); + m_ui.infoLabel->setText(m_ui.infoLabel->text() + i18n("Missing proxies will be recreated after opening.")); + } + m_ui.removeSelected->setEnabled(!missingClips.isEmpty()); m_ui.recursiveSearch->setEnabled(!missingClips.isEmpty()); m_ui.usePlaceholders->setEnabled(!missingClips.isEmpty()); @@ -261,6 +275,21 @@ bool DocumentChecker::hasErrorInClips() item->setData(0, idRole, e.attribute("id")); item->setToolTip(0, i18n("Duration mismatch")); } + + + for (int i = 0; i < missingProxies.count(); i++) { + e = missingProxies.at(i).toElement(); + QString clipType; + int t = e.attribute("type").toInt(); + QTreeWidgetItem *item = new QTreeWidgetItem(m_ui.treeWidget, QStringList() << i18n("Proxy clip")); + item->setIcon(0, KIcon("dialog-close")); + item->setText(1, e.attribute("proxy")); + item->setData(0, hashRole, e.attribute("file_hash")); + item->setData(0, statusRole, PROXYMISSING); + item->setData(0, typeRole, t); + item->setData(0, idRole, e.attribute("id")); + item->setToolTip(0, i18n("Missing proxy")); + } connect(m_ui.recursiveSearch, SIGNAL(pressed()), this, SLOT(slotSearchClips())); connect(m_ui.usePlaceholders, SIGNAL(pressed()), this, SLOT(slotPlaceholders())); diff --git a/src/projectlist.cpp b/src/projectlist.cpp index 8617cd39..102896c3 100644 --- a/src/projectlist.cpp +++ b/src/projectlist.cpp @@ -1024,7 +1024,7 @@ void ProjectList::slotAddClip(DocClipBase *clip, bool getProperties) m_infoQueue.insert(clip->getId(), e); } else if (item->hasProxy() && !item->isProxyRunning()) { - slotCreateProxy(clip->getId(), false); + slotCreateProxy(clip->getId()); } clip->askForAudioThumbs(); @@ -2146,19 +2146,12 @@ QMap ProjectList::getProxies() return list; } -void ProjectList::slotCreateProxy(const QString id, bool createProducer) +void ProjectList::slotCreateProxy(const QString id) { ProjectItem *item = getItemById(id); - if (!item || item->isProxyRunning()) return; - - // If proxy producer already exists, skip creation - if (!createProducer) { - setProxyStatus(id, PROXYDONE); - return; - } + if (!item || item->isProxyRunning() || item->referencedClip()->isPlaceHolder()) return; setProxyStatus(id, PROXYWAITING); if (m_abortProxyId.contains(id)) m_abortProxyId.removeAll(id); - emit projectModified(); QtConcurrent::run(this, &ProjectList::slotGenerateProxy, id); } @@ -2191,6 +2184,7 @@ void ProjectList::slotGenerateProxy(const QString id) return; } else { + emit projectModified(); // Make sure proxy path is writable QFile file(path); if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) { diff --git a/src/projectlist.h b/src/projectlist.h index 5c6ec30b..1db7e2c8 100644 --- a/src/projectlist.h +++ b/src/projectlist.h @@ -333,7 +333,7 @@ private slots: /** @brief Enable / disable proxy for current clip. */ void slotProxyCurrentItem(bool doProxy); /** @brief Put clip in the proxy waiting list. */ - void slotCreateProxy(const QString id, bool createProducer = true); + void slotCreateProxy(const QString id); /** @brief Stop creation of this clip's proxy. */ void slotAbortProxy(const QString id); /** @brief Start creation of proxy clip. */ -- 2.39.2