]> git.sesse.net Git - kdenlive/commitdiff
Rewrite handling of missing and placeholder clips, fixes:
authorJean-Baptiste Mardelle <jb@kdenlive.org>
Sat, 25 Jun 2011 20:19:11 +0000 (20:19 +0000)
committerJean-Baptiste Mardelle <jb@kdenlive.org>
Sat, 25 Jun 2011 20:19:11 +0000 (20:19 +0000)
http://kdenlive.org/mantis/view.php?id=2189

svn path=/trunk/kdenlive/; revision=5729

src/docclipbase.cpp
src/docclipbase.h
src/projectlist.cpp
src/renderer.cpp

index 38cb277c399dea60f481017ba547ec78eab2946f..7faff15661a32cce1e9a6bc898d6e83441c40e95 100644 (file)
@@ -460,7 +460,14 @@ void DocClipBase::setValid()
 
 void DocClipBase::setProducer(Mlt::Producer *producer, bool reset, bool readPropertiesFromProducer)
 {
-    if (producer == NULL || (m_placeHolder && !reset)) return;
+    if (m_placeHolder && producer) {
+        char *tmp = qstrdup(i18n("Missing clip").toUtf8().constData());
+        producer->set("markup", tmp);
+        producer->set("bgcolour", "0xff0000ff");
+        producer->set("pad", "10");
+        delete[] tmp;
+    }
+    if (producer == NULL /*|| (m_placeHolder && !reset)*/) return;
     if (m_thumbProd && (reset || !m_thumbProd->hasProducer())) m_thumbProd->setProducer(producer);
     if (reset) {
         // Clear all previous producers
@@ -545,7 +552,7 @@ Mlt::Producer *DocClipBase::audioProducer(int track)
         }
             
         Mlt::Producer *base = producer();
-        m_audioTrackProducers[track] = new Mlt::Producer(*(base->profile()), base->get("resource"));
+        m_audioTrackProducers[track] = cloneProducer(base);
         adjustProducerProperties(m_audioTrackProducers.at(track), QString(getId() + '_' + QString::number(track) + "_audio"), false, true);
     }
     return m_audioTrackProducers.at(track);
@@ -582,7 +589,7 @@ Mlt::Producer *DocClipBase::videoProducer()
         for (i = 0; i < m_baseTrackProducers.count(); i++)
             if (m_baseTrackProducers.at(i) != NULL) break;
         if (i >= m_baseTrackProducers.count()) return NULL;
-        m_videoOnlyProducer = new Mlt::Producer(*m_baseTrackProducers.at(i)->profile(), m_baseTrackProducers.at(i)->get("resource"));
+        m_videoOnlyProducer = cloneProducer(m_baseTrackProducers.at(i));
         adjustProducerProperties(m_videoOnlyProducer, QString(getId() + "_video"), true, false);
     }
     return m_videoOnlyProducer;
@@ -615,18 +622,39 @@ Mlt::Producer *DocClipBase::producer(int track)
             // Could not find a valid producer for that clip, check in 
             return NULL;
         }
-
-        if (KIO::NetAccess::exists(KUrl(m_baseTrackProducers.at(i)->get("resource")), KIO::NetAccess::SourceSide, 0))
-            m_baseTrackProducers[track] = new Mlt::Producer(*m_baseTrackProducers.at(i)->profile(), m_baseTrackProducers.at(i)->get("resource"));
-        else { // special case for placeholder clips
-            m_baseTrackProducers[track] = NULL;
-            return NULL;
-        }
+        
+        m_baseTrackProducers[track] = cloneProducer(m_baseTrackProducers.at(i));
         adjustProducerProperties(m_baseTrackProducers.at(track), QString(getId() + '_' + QString::number(track)), false, false);
     }
     return m_baseTrackProducers.at(track);
 }
 
+
+Mlt::Producer *DocClipBase::cloneProducer(Mlt::Producer *source)
+{
+    Mlt::Producer *result;
+    if (KIO::NetAccess::exists(KUrl(source->get("resource")), KIO::NetAccess::SourceSide, 0)) {
+        result = new Mlt::Producer(*source->profile(), source->get("resource"));
+    }
+    else {
+        // placeholder clip
+        QString txt = "+" + i18n("Missing clip") + ".txt";
+        char *tmp = qstrdup(txt.toUtf8().constData());
+        result = new Mlt::Producer(*source->profile(), tmp);
+        delete[] tmp;
+        if (result == NULL)
+            result = new Mlt::Producer(*source->profile(), "colour:red");
+        else {
+            result->set("bgcolour", "0xff0000ff");
+            result->set("pad", "10");
+        }
+    }
+    Mlt::Properties props(result->get_properties());
+    Mlt::Properties src_props(source->get_properties());
+    props.inherit(src_props);
+    return result;
+}
+
 void DocClipBase::setProducerProperty(const char *name, int data)
 {
     for (int i = 0; i < m_baseTrackProducers.count(); i++) {
index 948b71da092e8e0ea224cf0e643c2a015aa10997..b559ded7c14ba5688460b55945f233c0b2dc3a99 100644 (file)
@@ -247,6 +247,8 @@ private:   // Private attributes
     void getFileHash(const QString url);
     /** @brief When duplicating a producer, make sure all manually set properties are passed to it. */
     void adjustProducerProperties(Mlt::Producer *prod, const QString &id, bool mute, bool blind);
+    /** @brief Create another instance of a producer. */
+    Mlt::Producer *cloneProducer(Mlt::Producer *source);
 
 public slots:
     void updateAudioThumbnail(QMap<int, QMap<int, QByteArray> > data);
index 5267348a3dafca4ee715754b50425b2b96a30dde..8617cd3947c763d408425a468833d843526e6937 100644 (file)
@@ -502,8 +502,11 @@ void ProjectList::slotMissingClip(const QString &id)
         item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsDropEnabled);
         int height = m_listView->iconSize().height();
         int width = (int)(height  * m_render->dar());
-        QPixmap pixmap = QPixmap(width, height);
-        pixmap.fill(Qt::transparent);
+        QPixmap pixmap = qVariantValue<QPixmap>(item->data(0, Qt::DecorationRole));
+        if (pixmap.isNull()) {
+            pixmap = QPixmap(width, height);
+            pixmap.fill(Qt::transparent);
+        }
         KIcon icon("dialog-close");
         QPainter p(&pixmap);
         p.drawPixmap(3, 3, icon.pixmap(width - 6, height - 6));
@@ -511,8 +514,17 @@ void ProjectList::slotMissingClip(const QString &id)
         item->setData(0, Qt::DecorationRole, pixmap);
         if (item->referencedClip()) {
             item->referencedClip()->setPlaceHolder(true);
-            if (m_render == NULL) kDebug() << "*********  ERROR, NULL RENDR";
-            item->referencedClip()->setProducer(m_render->invalidProducer(id), true);
+            if (m_render == NULL) {
+                kDebug() << "*********  ERROR, NULL RENDR";
+                return;
+            }
+            Mlt::Producer *newProd = m_render->invalidProducer(id);
+            if (item->referencedClip()->producer()) {
+                Mlt::Properties props(newProd->get_properties());
+                Mlt::Properties src_props(item->referencedClip()->producer()->get_properties());
+                props.inherit(src_props);
+            }
+            item->referencedClip()->setProducer(newProd, true);
             item->slotSetToolTip();
             emit clipNeedsReload(id, true);
         }
@@ -1180,6 +1192,13 @@ void ProjectList::updateAllClips(bool displayRatioChanged, bool fpsChanged)
                     if (item->data(0, Qt::DecorationRole).isNull()) {
                         item->setData(0, Qt::DecorationRole, missingPixmap);
                     }
+                    else {
+                        QPixmap pixmap = qVariantValue<QPixmap>(item->data(0, Qt::DecorationRole));
+                        QPainter p(&pixmap);
+                        p.drawPixmap(3, 3, KIcon("dialog-close").pixmap(pixmap.width() - 6, pixmap.height() - 6));
+                        p.end();
+                        item->setData(0, Qt::DecorationRole, pixmap);
+                    }
                 }
             } else {
                 if (displayRatioChanged || item->data(0, Qt::DecorationRole).isNull())
@@ -1187,6 +1206,17 @@ void ProjectList::updateAllClips(bool displayRatioChanged, bool fpsChanged)
                 if (item->data(0, DurationRole).toString().isEmpty()) {
                     item->changeDuration(item->referencedClip()->producer()->get_playtime());
                 }
+                if (clip->isPlaceHolder()) {
+                    QPixmap pixmap = qVariantValue<QPixmap>(item->data(0, Qt::DecorationRole));
+                    if (pixmap.isNull()) {
+                        pixmap = QPixmap(width, height);
+                        pixmap.fill(Qt::transparent);
+                    }
+                    QPainter p(&pixmap);
+                    p.drawPixmap(3, 3, KIcon("dialog-close").pixmap(pixmap.width() - 6, pixmap.height() - 6));
+                    p.end();
+                    item->setData(0, Qt::DecorationRole, pixmap);
+                }
             }
             item->setData(0, UsageRole, QString::number(item->numReferences()));
         }
index f157c5ddcea02576a1cf509016bca01c082eb171..310a4ed1f8c81de62c918c4e328a744012452a91 100644 (file)
@@ -281,7 +281,16 @@ void Render::buildConsumer(const QString profileName)
 
 Mlt::Producer *Render::invalidProducer(const QString &id)
 {
-    Mlt::Producer *clip = new Mlt::Producer(*m_mltProfile, "colour", "red");
+    Mlt::Producer *clip;
+    QString txt = "+" + i18n("Missing clip") + ".txt";
+    char *tmp = qstrdup(txt.toUtf8().constData());
+    clip = new Mlt::Producer(*m_mltProfile, tmp);
+    delete[] tmp;
+    if (clip == NULL) clip = new Mlt::Producer(*m_mltProfile, "colour", "red");
+    else {
+        clip->set("bgcolour", "0xff0000ff");
+        clip->set("pad", "10");
+    }
     clip->set("id", id.toUtf8().constData());
     clip->set("mlt_type", "producer");
     return clip;