]> git.sesse.net Git - kdenlive/commitdiff
Check for missing proxies on document opening
authorJean-Baptiste Mardelle <jb@kdenlive.org>
Sat, 25 Jun 2011 22:36:58 +0000 (22:36 +0000)
committerJean-Baptiste Mardelle <jb@kdenlive.org>
Sat, 25 Jun 2011 22:36:58 +0000 (22:36 +0000)
svn path=/trunk/kdenlive/; revision=5730

src/docclipbase.cpp
src/documentchecker.cpp
src/projectlist.cpp
src/projectlist.h

index 7faff15661a32cce1e9a6bc898d6e83441c40e95..1246683e044d4ed3838e60aba814b104a989b957 100644 (file)
@@ -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: "<<m_baseTrackProducers.count();
-    int max = m_baseTrackProducers.count();
-    for (int i = 0; i < max; i++) {
-        kDebug()<<"// CLIP KILL PROD "<<i;
-    Mlt::Producer *p = m_baseTrackProducers.takeAt(i);
-    if (p != NULL) {
-     delete p;
-     p = NULL;
-    }
-    m_baseTrackProducers.insert(i, NULL);
-    }*/
 
     delete m_videoOnlyProducer;
     m_videoOnlyProducer = NULL;
@@ -520,8 +509,6 @@ void DocClipBase::setProducer(Mlt::Producer *producer, bool reset, bool readProp
     }
     if (updated && readPropertiesFromProducer && (m_clipType != COLOR && m_clipType != IMAGE && m_clipType != TEXT))
         setDuration(GenTime(producer->get_length(), KdenliveSettings::project_fps()));
-    //m_clipProducer = producer;
-    //m_clipProducer->set("transparency", m_properties.value("transparency").toInt());
 }
 
 static double getPixelAspect(QMap<QString, QString>& 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());
index a43378e7c6f135bad001c87956e7f10dc5a7676c..7df155d009820b4489cb5ed1886da58e673b3c77 100644 (file)
@@ -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 <QDomElement> wrongDurationClips;
     QList <QDomElement> missingClips;
+    QList <QDomElement> 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()));
index 8617cd3947c763d408425a468833d843526e6937..102896c341dc18f28f965b6ba7741ee0367eb9f5 100644 (file)
@@ -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 <QString, QString> 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)) {
index 5c6ec30bb364830168cb96e04ff0fb84f68ecea8..1db7e2c84aa34538829e735b7bbe7305928a37ac 100644 (file)
@@ -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. */