]> git.sesse.net Git - kdenlive/commitdiff
Fix loading of project cached thumbs, when loading a document, reuse all cached prope...
authorJean-Baptiste Mardelle <jb@kdenlive.org>
Wed, 24 Jun 2009 00:22:09 +0000 (00:22 +0000)
committerJean-Baptiste Mardelle <jb@kdenlive.org>
Wed, 24 Jun 2009 00:22:09 +0000 (00:22 +0000)
svn path=/trunk/kdenlive/; revision=3634

src/customtrackview.cpp
src/docclipbase.cpp
src/docclipbase.h
src/kdenlivedoc.cpp
src/mainwindow.cpp
src/mainwindow.h
src/projectlist.cpp
src/projectlist.h
src/renderer.cpp

index 397eb4bddf9c6cefd1bc5c0edec36cb3509ebdac..da5ee2db184a47427f333565b3c3aabaf17c755f 100644 (file)
@@ -764,7 +764,7 @@ void CustomTrackView::mousePressEvent(QMouseEvent * event)
         RazorClipCommand* command = new RazorClipCommand(this, clip->info(), GenTime((int)(mapToScene(event->pos()).x()), m_document->fps()));
         m_document->renderer()->pause();
         m_commandStack->push(command);
-        m_document->setModified(true);
+        setDocumentModified();
         m_dragItem = NULL;
         event->accept();
         return;
@@ -1309,7 +1309,7 @@ void CustomTrackView::slotAddGroupEffect(QDomElement effect, AbstractGroupItem *
     }
     if (count > 0) {
         m_commandStack->push(effectCommand);
-        m_document->setModified(true);
+        setDocumentModified();
     } else delete effectCommand;
 }
 
@@ -1365,7 +1365,7 @@ void CustomTrackView::slotAddEffect(QDomElement effect, GenTime pos, int track)
     }
     if (count > 0) {
         m_commandStack->push(effectCommand);
-        m_document->setModified(true);
+        setDocumentModified();
     } else delete effectCommand;
 }
 
@@ -1373,7 +1373,7 @@ void CustomTrackView::slotDeleteEffect(ClipItem *clip, QDomElement effect)
 {
     AddEffectCommand *command = new AddEffectCommand(this, m_document->tracksCount() - clip->track(), clip->startPos(), effect, false);
     m_commandStack->push(command);
-    m_document->setModified(true);
+    setDocumentModified();
 }
 
 void CustomTrackView::updateEffect(int track, GenTime pos, QDomElement effect, int ix, bool triggeredByUser)
@@ -1415,7 +1415,7 @@ void CustomTrackView::updateEffect(int track, GenTime pos, QDomElement effect, i
             }
         }
     }
-    m_document->setModified(true);
+    setDocumentModified();
 }
 
 void CustomTrackView::moveEffect(int track, GenTime pos, int oldPos, int newPos)
@@ -1429,7 +1429,7 @@ void CustomTrackView::moveEffect(int track, GenTime pos, int oldPos, int newPos)
         clip->setEffectAt(newPos - 1, before);
         emit clipItemSelected(clip, newPos - 1);
     }
-    m_document->setModified(true);
+    setDocumentModified();
 }
 
 void CustomTrackView::slotChangeEffectState(ClipItem *clip, int effectPos, bool disable)
@@ -1439,14 +1439,14 @@ void CustomTrackView::slotChangeEffectState(ClipItem *clip, int effectPos, bool
     effect.setAttribute("disabled", disable);
     EditEffectCommand *command = new EditEffectCommand(this, m_document->tracksCount() - clip->track(), clip->startPos(), oldEffect, effect, effectPos, true);
     m_commandStack->push(command);
-    m_document->setModified(true);
+    setDocumentModified();;
 }
 
 void CustomTrackView::slotChangeEffectPosition(ClipItem *clip, int currentPos, int newPos)
 {
     MoveEffectCommand *command = new MoveEffectCommand(this, m_document->tracksCount() - clip->track(), clip->startPos(), currentPos, newPos);
     m_commandStack->push(command);
-    m_document->setModified(true);
+    setDocumentModified();
 }
 
 void CustomTrackView::slotUpdateClipEffect(ClipItem *clip, QDomElement oldeffect, QDomElement effect, int ix)
@@ -1499,7 +1499,7 @@ void CustomTrackView::cutClip(ItemInfo info, GenTime cutTime, bool cut)
         if (dup->checkKeyFrames()) slotRefreshEffects(dup);
         item->baseClip()->addReference();
         m_document->updateClip(item->baseClip()->getId());
-        m_document->setModified(true);
+        setDocumentModified();
         kDebug() << "/////////  CUTTING CLIP RESULT: (" << item->startPos().frames(25) << "-" << item->endPos().frames(25) << "), DUP: (" << dup->startPos().frames(25) << "-" << dup->endPos().frames(25) << ")" << ", CUT: " << cutTime.frames(25);
         kDebug() << "//  CUTTING CLIP dONE";
     } else {
@@ -1534,7 +1534,7 @@ void CustomTrackView::cutClip(ItemInfo info, GenTime cutTime, bool cut)
         bool success = m_document->renderer()->mltResizeClipEnd(clipinfo, info.endPos - info.startPos);
         if (success) {
             item->resizeEnd((int) info.endPos.frames(m_document->fps()));
-            m_document->setModified(true);
+            setDocumentModified();
         } else
             emit displayMessage(i18n("Error when resizing clip"), ErrorMessage);
 
@@ -1644,7 +1644,7 @@ void CustomTrackView::slotAddTransition(ClipItem* /*clip*/, ItemInfo transitionI
     }
     AddTransitionCommand* command = new AddTransitionCommand(this, transitionInfo, endTrack, transition, false, true);
     m_commandStack->push(command);
-    m_document->setModified(true);
+    setDocumentModified();
 }
 
 void CustomTrackView::addTransition(ItemInfo transitionInfo, int endTrack, QDomElement params)
@@ -1653,7 +1653,7 @@ void CustomTrackView::addTransition(ItemInfo transitionInfo, int endTrack, QDomE
     //kDebug() << "---- ADDING transition " << params.attribute("value");
     if (m_document->renderer()->mltAddTransition(tr->transitionTag(), endTrack, m_document->tracksCount() - transitionInfo.track, transitionInfo.startPos, transitionInfo.endPos, tr->toXML())) {
         scene()->addItem(tr);
-        m_document->setModified(true);
+        setDocumentModified();
     } else {
         emit displayMessage(i18n("Cannot add transition"), ErrorMessage);
         delete tr;
@@ -1671,7 +1671,7 @@ void CustomTrackView::deleteTransition(ItemInfo transitionInfo, int endTrack, QD
     if (m_dragItem == item) m_dragItem = NULL;
     delete item;
     emit transitionItemSelected(NULL);
-    m_document->setModified(true);
+    setDocumentModified();
 }
 
 void CustomTrackView::slotTransitionUpdated(Transition *tr, QDomElement old)
@@ -1679,7 +1679,7 @@ void CustomTrackView::slotTransitionUpdated(Transition *tr, QDomElement old)
     kDebug() << "TRANS UPDATE, TRACKS: " << old.attribute("transition_btrack") << ", NEW: " << tr->toXML().attribute("transition_btrack");
     EditTransitionCommand *command = new EditTransitionCommand(this, tr->track(), tr->startPos(), old, tr->toXML(), false);
     m_commandStack->push(command);
-    m_document->setModified(true);
+    setDocumentModified();
 }
 
 void CustomTrackView::updateTransition(int track, GenTime pos, QDomElement oldTransition, QDomElement transition, bool updateTransitionWidget)
@@ -1703,7 +1703,7 @@ void CustomTrackView::updateTransition(int track, GenTime pos, QDomElement oldTr
         }
         emit transitionItemSelected(item, getPreviousVideoTrack(info.track), p, true);
     }
-    m_document->setModified(true);
+    setDocumentModified();
 }
 
 void CustomTrackView::dragMoveEvent(QDragMoveEvent * event)
@@ -1769,7 +1769,7 @@ void CustomTrackView::dropEvent(QDropEvent * event)
             item->setSelected(true);
         }
         m_commandStack->push(addCommand);
-        m_document->setModified(true);
+        setDocumentModified();
         m_changeSpeedAction->setEnabled(hasVideoClip);
         m_pasteEffectsAction->setEnabled(m_copiedItems.count() == 1);
         if (items.count() > 1) groupSelectedItems(true);
@@ -1957,7 +1957,7 @@ void CustomTrackView::slotSwitchTrackAudio(int ix)
     m_document->switchTrackAudio(tracknumber, !m_document->trackInfoAt(tracknumber).isMute);
     kDebug() << "NEXT TRK STATE: " << m_document->trackInfoAt(tracknumber).isMute << m_document->trackInfoAt(tracknumber).isBlind;
     m_document->renderer()->mltChangeTrackState(tracknumber + 1, m_document->trackInfoAt(tracknumber).isMute, m_document->trackInfoAt(tracknumber).isBlind);
-    m_document->setModified(true);
+    setDocumentModified();
 }
 
 void CustomTrackView::slotSwitchTrackLock(int ix)
@@ -1985,7 +1985,7 @@ void CustomTrackView::lockTrack(int ix, bool lock)
     }
     kDebug() << "NEXT TRK STATE: " << m_document->trackInfoAt(tracknumber).isLocked;
     viewport()->update();
-    m_document->setModified(true);
+    setDocumentModified();
 }
 
 void CustomTrackView::slotSwitchTrackVideo(int ix)
@@ -1993,7 +1993,7 @@ void CustomTrackView::slotSwitchTrackVideo(int ix)
     int tracknumber = m_document->tracksCount() - ix;
     m_document->switchTrackVideo(tracknumber - 1, !m_document->trackInfoAt(tracknumber - 1).isBlind);
     m_document->renderer()->mltChangeTrackState(tracknumber, m_document->trackInfoAt(tracknumber - 1).isMute, m_document->trackInfoAt(tracknumber - 1).isBlind);
-    m_document->setModified(true);
+    setDocumentModified();
 }
 
 void CustomTrackView::slotRemoveSpace()
@@ -2403,7 +2403,7 @@ void CustomTrackView::mouseReleaseEvent(QMouseEvent * event)
                     KdenliveSettings::setSnaptopoints(snap);
                     emit displayMessage(i18n("Cannot move clip to position %1", m_document->timecode().getTimecodeFromFrames(m_dragItemInfo.startPos.frames(m_document->fps()))), ErrorMessage);
                 }
-                m_document->setModified(true);
+                setDocumentModified();
             }
             if (m_dragItem->type() == TRANSITIONWIDGET && (m_dragItemInfo.startPos != info.startPos || m_dragItemInfo.track != info.track)) {
                 Transition *transition = static_cast <Transition *>(m_dragItem);
@@ -2505,7 +2505,7 @@ void CustomTrackView::mouseReleaseEvent(QMouseEvent * event)
                     m_selectionGroupInfo.startPos = GenTime(m_selectionGroup->scenePos().x(), m_document->fps());
                     m_selectionGroupInfo.track = m_selectionGroup->track();
                 }
-                m_document->setModified(true);
+                setDocumentModified();
             }
         }
         m_document->renderer()->doRefresh();
@@ -2734,7 +2734,7 @@ void CustomTrackView::mouseReleaseEvent(QMouseEvent * event)
         }
         emit transitionItemSelected(static_cast <Transition *>(m_dragItem), getPreviousVideoTrack(m_dragItem->track()), p);
     } else emit transitionItemSelected(NULL);
-    if (m_operationMode != NONE && m_operationMode != MOVE) m_document->setModified(true);
+    if (m_operationMode != NONE && m_operationMode != MOVE) setDocumentModified();
     m_operationMode = NONE;
 }
 
@@ -2764,7 +2764,7 @@ void CustomTrackView::deleteClip(ItemInfo info)
     if (m_dragItem == item) m_dragItem = NULL;
     delete item;
     item = NULL;
-    m_document->setModified(true);
+    setDocumentModified();
     m_document->renderer()->doRefresh();
 }
 
@@ -2866,7 +2866,7 @@ void CustomTrackView::doChangeClipSpeed(ItemInfo info, const double speed, const
         item->updateRectGeometry();
         if (item->cropDuration().frames(m_document->fps()) > endPos)
             item->AbstractClipItem::resizeEnd(info.startPos.frames(m_document->fps()) + endPos, speed);
-        m_document->setModified(true);
+        setDocumentModified();
     } else emit displayMessage(i18n("Invalid clip"), ErrorMessage);
 }
 
@@ -2942,7 +2942,7 @@ void CustomTrackView::doGroupClips(QList <ItemInfo> clipInfos, QList <ItemInfo>
             }
             tr->setFlags(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable);
         }
-        m_document->setModified(true);
+        setDocumentModified();
         return;
     }
 
@@ -2961,7 +2961,7 @@ void CustomTrackView::doGroupClips(QList <ItemInfo> clipInfos, QList <ItemInfo>
     }
 
     groupSelectedItems(false, true);
-    m_document->setModified(true);
+    setDocumentModified();
 }
 
 void CustomTrackView::addClip(QDomElement xml, const QString &clipId, ItemInfo info, EffectsList effects)
@@ -2992,7 +2992,7 @@ void CustomTrackView::addClip(QDomElement xml, const QString &clipId, ItemInfo i
     for (int i = 0; i < item->effectsCount(); i++) {
         m_document->renderer()->mltAddEffect(info.track, info.startPos, item->getEffectArgs(item->effectAt(i)), false);
     }
-    m_document->setModified(true);
+    setDocumentModified();
     m_document->renderer()->doRefresh();
     m_waitingThumbs.append(item);
     m_thumbsTimer.start();
@@ -3149,7 +3149,7 @@ void CustomTrackView::moveClip(const ItemInfo start, const ItemInfo end)
             }
         }
         KdenliveSettings::setSnaptopoints(snap);
-        m_document->setModified(true);
+        setDocumentModified();
     } else {
         // undo last move and emit error message
         emit displayMessage(i18n("Cannot move clip to position %1", m_document->timecode().getTimecodeFromFrames(end.startPos.frames(m_document->fps()))), ErrorMessage);
@@ -3574,7 +3574,7 @@ void CustomTrackView::addMarker(const QString &id, const GenTime &pos, const QSt
     DocClipBase *base = m_document->clipManager()->getClipById(id);
     if (!comment.isEmpty()) base->addSnapMarker(pos, comment);
     else base->deleteSnapMarker(pos);
-    m_document->setModified(true);
+    setDocumentModified();
     viewport()->update();
 }
 
@@ -4206,7 +4206,7 @@ void CustomTrackView::slotInsertTrack(int ix)
         }
         AddTrackCommand *addTrack = new AddTrackCommand(this, ix, info, true);
         m_commandStack->push(addTrack);
-        m_document->setModified(true);
+        setDocumentModified();
     }
 }
 
@@ -4217,7 +4217,7 @@ void CustomTrackView::slotDeleteTrack(int ix)
     if (ok) {
         TrackInfo info = m_document->trackInfoAt(m_document->tracksCount() - ix - 1);
         deleteTimelineTrack(ix, info);
-        m_document->setModified(true);
+        setDocumentModified();
         /*AddTrackCommand* command = new AddTrackCommand(this, ix, info, false);
         m_commandStack->push(command);*/
     }
@@ -4253,7 +4253,7 @@ void CustomTrackView::slotChangeTrack(int ix)
             info.isBlind = true;
         }
         changeTimelineTrack(ix, info);
-        m_document->setModified(true);
+        setDocumentModified();
     }
 }
 
@@ -4591,7 +4591,7 @@ void CustomTrackView::doChangeClipType(const GenTime &pos, int track, bool video
         m_document->renderer()->mltUpdateClipProducer(m_document->tracksCount() - track, start, clip->baseClip()->producer(track));
     }
     clip->update();
-    m_document->setModified(true);
+    setDocumentModified();
 }
 
 void CustomTrackView::updateClipTypeActions(ClipItem *clip)
index 0df8adb20c70ae6b6f155d7352e94f9b062f9847..10d5df4a609e39f229be3db00cd158f436c863b3 100644 (file)
@@ -700,7 +700,6 @@ void DocClipBase::getFileHash(const QString url)
         file.close();
         fileHash = QCryptographicHash::hash(fileData, QCryptographicHash::Md5);
         m_properties.insert("file_hash", QString(fileHash.toHex()));
-        //kDebug() << file.fileName() << file.size() << fileHash.toHex();
     }
 }
 
@@ -713,6 +712,29 @@ QString DocClipBase::getClipHash() const
     return hash;
 }
 
+// static
+QString DocClipBase::getHash(const QString &path)
+{
+    QFile file(path);
+    if (file.open(QIODevice::ReadOnly)) { // write size and hash only if resource points to a file
+        QByteArray fileData;
+        QByteArray fileHash;
+        /*
+               * 1 MB = 1 second per 450 files (or faster)
+               * 10 MB = 9 seconds per 450 files (or faster)
+               */
+        if (file.size() > 1000000*2) {
+            fileData = file.read(1000000);
+            if (file.seek(file.size() - 1000000))
+                fileData.append(file.readAll());
+        } else
+            fileData = file.readAll();
+        file.close();
+        return QCryptographicHash::hash(fileData, QCryptographicHash::Md5).toHex();
+    }
+    return QString();
+}
+
 void DocClipBase::refreshThumbUrl()
 {
     if (m_thumbProd) m_thumbProd->updateThumbUrl(m_properties.value("file_hash"));
index 01af13b6cb06bc56dcea9133e2a5bf60faf352ac..5c52c1bc653bea3242f8f05d7dcd22c168fe344c 100644 (file)
@@ -182,6 +182,7 @@ Q_OBJECT public:
 
     /** Returns true is clip is missing but user wants to keep it as placeholder */
     bool isPlaceHolder() const;
+    static QString getHash(const QString &path);
 
 private:   // Private attributes
 
index fd557ee17a829c0f9d1d516fc4f2353c1bfabc28..3288e5e7a08d3c64b17d76cd9ca68d9b63aa229b 100644 (file)
@@ -45,7 +45,7 @@
 
 #include <mlt++/Mlt.h>
 
-const double DOCUMENTVERSION = 0.83;
+const double DOCUMENTVERSION = 0.84;
 
 KdenliveDoc::KdenliveDoc(const KUrl &url, const KUrl &projectFolder, QUndoGroup *undoGroup, QString profileName, const QPoint tracks, Render *render, MainWindow *parent) :
         QObject(parent),
@@ -95,7 +95,6 @@ KdenliveDoc::KdenliveDoc(const KUrl &url, const KUrl &projectFolder, QUndoGroup
                     // TODO: backup the document or alert the user?
                     success = validator.validate(DOCUMENTVERSION);
                     if (success) { // Let the validator handle error messages
-                        setModified(validator.isModified());
                         QDomElement mlt = m_document.firstChildElement("mlt");
                         QDomElement infoXml = mlt.firstChildElement("kdenlivedoc");
 
@@ -192,6 +191,7 @@ KdenliveDoc::KdenliveDoc(const KUrl &url, const KUrl &projectFolder, QUndoGroup
                                 infoXml.removeChild(markers);
                             }
                             setProfilePath(profileName);
+                            setModified(validator.isModified());
                             kDebug() << "Reading file: " << url.path() << ", found clips: " << producers.count();
                         }
                     }
@@ -915,7 +915,7 @@ void KdenliveDoc::addClip(QDomElement elem, QString clipId, bool createClipItem)
     if (createClipItem) {
         emit addProjectClip(clip);
         qApp->processEvents();
-        m_render->getFileProperties(clip->toXML(), clip->getId(), false);
+        m_render->getFileProperties(clip->toXML(), clip->getId(), true);
     }
 }
 
@@ -1170,18 +1170,18 @@ QPoint KdenliveDoc::getTracksCount() const
 
 void KdenliveDoc::cachePixmap(const QString &fileId, const QPixmap &pix) const
 {
-    pix.save(m_projectFolder.path() + "/thumbs/" + fileId + ".png");
+    pix.save(m_projectFolder.path(KUrl::AddTrailingSlash) + "thumbs/" + fileId + ".png");
 }
 
 QString KdenliveDoc::getLadspaFile() const
 {
     int ct = 0;
     QString counter = QString::number(ct).rightJustified(5, '0', false);
-    while (QFile::exists(m_projectFolder.path() + "/ladspa/" + counter + ".ladspa")) {
+    while (QFile::exists(m_projectFolder.path(KUrl::AddTrailingSlash) + "ladspa/" + counter + ".ladspa")) {
         ct++;
         counter = QString::number(ct).rightJustified(5, '0', false);
     }
-    return m_projectFolder.path() + "/ladspa/" + counter + ".ladspa";
+    return m_projectFolder.path(KUrl::AddTrailingSlash) + "ladspa/" + counter + ".ladspa";
 }
 
 bool KdenliveDoc::checkDocumentClips(QDomNodeList infoproducers)
@@ -1194,13 +1194,23 @@ bool KdenliveDoc::checkDocumentClips(QDomNodeList infoproducers)
     for (int i = 0; i < infoproducers.count(); i++) {
         e = infoproducers.item(i).toElement();
         clipType = e.attribute("type").toInt();
-        if (clipType == TEXT || clipType == COLOR) continue;
+        if (clipType == COLOR) continue;
+        if (clipType == TEXT) {
+            //TODO: Check is clip template is missing (xmltemplate) or hash changed
+            continue;
+        }
         id = e.attribute("id");
         resource = e.attribute("resource");
         if (clipType == SLIDESHOW) resource = KUrl(resource).directory();
         if (!KIO::NetAccess::exists(KUrl(resource), KIO::NetAccess::SourceSide, 0)) {
             // Missing clip found
             missingClips.append(e);
+        } else {
+            // Check if the clip has changed
+            if (clipType != SLIDESHOW && e.hasAttribute("file_hash")) {
+                if (e.attribute("file_hash") != DocClipBase::getHash(e.attribute("resource")))
+                    e.removeAttribute("file_hash");
+            }
         }
     }
     if (missingClips.isEmpty()) return true;
index 9d6b0e7483b4521395a40efb8eab9be4b370d01b..1125799a3d89b626cd9f7b8796d4fab755cb6316 100644 (file)
@@ -1629,112 +1629,6 @@ void MainWindow::slotRenderProject()
     m_renderWidget->showNormal();
 }
 
-void MainWindow::slotDoRender(const QStringList render_args, const QStringList overlay_args)
-{
-    //TODO: remove this function if no problem is detected with the new renderwidget rendering
-    QString dest = render_args.at(0);
-    QString render = render_args.at(1);
-    QStringList avformat_args = render_args.at(2).split(' ');
-    bool zoneOnly = render_args.at(3).toInt();
-    bool playAfter = render_args.at(4).toInt();
-    double guideStart = render_args.at(5).toDouble();
-    double guideEnd = render_args.at(6).toDouble();
-    bool resizeProfile = render_args.at(7).toInt();
-    QString scriptExport = render_args.at(8);
-    bool createChapterFile = render_args.at(9).toInt();
-
-    if (dest.isEmpty()) return;
-    int in = 0;
-    int out = 0;
-
-    if (m_activeTimeline && zoneOnly) {
-        in = m_activeTimeline->inPoint();
-        out = m_activeTimeline->outPoint();
-    }
-
-    KTemporaryFile temp;
-    temp.setAutoRemove(false);
-    temp.setSuffix(".mlt");
-    if (!scriptExport.isEmpty() || temp.open()) {
-        if (KdenliveSettings::dropbframes()) {
-            KdenliveSettings::setDropbframes(false);
-            m_activeDocument->clipManager()->updatePreviewSettings();
-            if (!scriptExport.isEmpty()) m_projectMonitor->saveSceneList(scriptExport + ".mlt");
-            else m_projectMonitor->saveSceneList(temp.fileName());
-            KdenliveSettings::setDropbframes(true);
-            m_activeDocument->clipManager()->updatePreviewSettings();
-        } else {
-            if (!scriptExport.isEmpty()) m_projectMonitor->saveSceneList(scriptExport + ".mlt");
-            else m_projectMonitor->saveSceneList(temp.fileName());
-        }
-
-        QStringList args;
-        if (scriptExport.isEmpty()) args << "-erase";
-        if (KdenliveSettings::usekuiserver()) args << "-kuiserver";
-        if (zoneOnly) args << "in=" + QString::number(in) << "out=" + QString::number(out);
-        else if (guideStart != -1) {
-            args << "in=" + QString::number(GenTime(guideStart).frames(m_activeDocument->fps())) << "out=" + QString::number(GenTime(guideEnd).frames(m_activeDocument->fps()));
-        }
-        if (!overlay_args.isEmpty()) args << "preargs=" + overlay_args.join(" ");
-        QString videoPlayer = "-";
-        if (playAfter) {
-            videoPlayer = KdenliveSettings::defaultplayerapp();
-            if (videoPlayer.isEmpty()) KMessageBox::sorry(this, i18n("Cannot play video after rendering because the default video player application is not set.\nPlease define it in Kdenlive settings dialog."));
-        }
-        if (!QFile::exists(KdenliveSettings::rendererpath())) {
-            KMessageBox::sorry(this, i18n("Cannot find the melt program required for rendering (part of Mlt)"));
-            setRenderingProgress(dest, -3);
-            return;
-        }
-        args << KdenliveSettings::rendererpath() << m_activeDocument->profilePath() << render << videoPlayer;
-
-        for (int i = 0; i < avformat_args.count(); i++) {
-            if (avformat_args.at(i).startsWith("profile=")) {
-                if (avformat_args.at(i).section('=', 1) != m_activeDocument->profilePath()) resizeProfile = true;
-                break;
-            }
-        }
-
-        if (resizeProfile) {
-            // The rendering profile is different from project profile, so use MLT's special producer_consumer
-            if (scriptExport.isEmpty()) args << "consumer:" + temp.fileName();
-            else args << "consumer:$SOURCE";
-        } else {
-            if (scriptExport.isEmpty()) args << temp.fileName();
-            else args << "$SOURCE";
-        }
-        if (scriptExport.isEmpty()) args << dest;
-        else args << "$TARGET";
-        args << avformat_args;
-        QString renderer = QCoreApplication::applicationDirPath() + QString("/kdenlive_render");
-        if (!QFile::exists(renderer)) renderer = "kdenlive_render";
-        if (scriptExport.isEmpty()) {
-            QProcess::startDetached(renderer, args);
-            KNotification::event("RenderStarted", i18n("Rendering <i>%1</i> started", dest), QPixmap(), this);
-        } else {
-            // Generate script file
-            QFile file(scriptExport);
-            if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) {
-                KMessageBox::error(this, i18n("Cannot write to file %1", scriptExport));
-                return;
-            }
-
-            QTextStream outStream(&file);
-            outStream << "#! /bin/sh" << "\n" << "\n";
-            outStream << "SOURCE=" << "\"" + scriptExport + ".mlt\"" << "\n";
-            outStream << "TARGET=" << "\"" + dest + "\"" << "\n";
-            outStream << renderer << " " << args.join(" ") << "\n" << "\n";
-            if (file.error() != QFile::NoError) {
-                KMessageBox::error(this, i18n("Cannot write to file %1", scriptExport));
-                file.close();
-                return;
-            }
-            file.close();
-            QFile::setPermissions(scriptExport, file.permissions() | QFile::ExeUser);
-        }
-    }
-}
-
 void MainWindow::setRenderingProgress(const QString &url, int progress)
 {
     if (m_renderWidget) m_renderWidget->setRenderJob(url, progress);
index d97d87dcc2c353b47bac1d7e30cb27c5aa2eda7b..4114e1f6662630bec5810b1a913ce812d8778ea9 100644 (file)
@@ -227,7 +227,6 @@ private slots:
     void slotSwitchMarkersComments();
     void slotSwitchSnap();
     void slotRenderProject();
-    void slotDoRender(const QStringList render_args, const QStringList overlay_args);
     void slotFullScreen();
     void slotUpdateDocumentState(bool modified);
     void slotZoomIn();
index 98fb648ca748d89e715eaf5d86ca25229c9176b2..18ac99783e53578fe060e809441480538134e34d 100644 (file)
@@ -87,6 +87,10 @@ ProjectList::ProjectList(QWidget *parent) :
     layout->addWidget(m_listView);
     setLayout(layout);
 
+    m_queueTimer.setInterval(100);
+    connect(&m_queueTimer, SIGNAL(timeout()), this, SLOT(slotProcessNextClipInQueue()));
+    m_queueTimer.setSingleShot(true);
+
 
 
     connect(m_listView, SIGNAL(itemSelectionChanged()), this, SLOT(slotClipSelected()));
@@ -216,6 +220,7 @@ void ProjectList::slotReloadClip()
                 if (!item->referencedClip()->getProperty("xmltemplate").isEmpty()) regenerateTemplate(item);
             }
             //requestClipInfo(item->toXml(), item->clipId(), true);
+            // Clear the file_hash value, which will cause a complete reload of the clip
             emit getFileProperties(item->toXml(), item->clipId(), true);
         }
     }
@@ -520,10 +525,10 @@ void ProjectList::slotResetProjectList()
 
 void ProjectList::requestClipInfo(const QDomElement xml, const QString id)
 {
-    kDebug() << " PRG LIST REQUEST CLP INFO: " << id;
     m_infoQueue.insert(id, xml);
     m_listView->setEnabled(false);
-    if (m_infoQueue.count() == 1) QTimer::singleShot(300, this, SLOT(slotProcessNextClipInQueue()));
+    if (!m_queueTimer.isActive()) m_queueTimer.start();
+    //if (m_infoQueue.count() == 1 || ) QTimer::singleShot(300, this, SLOT(slotProcessNextClipInQueue()));
 }
 
 void ProjectList::slotProcessNextClipInQueue()
@@ -532,14 +537,15 @@ void ProjectList::slotProcessNextClipInQueue()
         m_listView->setEnabled(true);
         return;
     }
-    QMap<QString, QDomElement>::const_iterator i = m_infoQueue.constBegin();
-    if (i != m_infoQueue.constEnd()) {
-        const QDomElement dom = i.value();
-        const QString id = i.key();
-        m_infoQueue.remove(i.key());
+    QMap<QString, QDomElement>::const_iterator j = m_infoQueue.constBegin();
+    if (j != m_infoQueue.constEnd()) {
+        const QDomElement dom = j.value();
+        const QString id = j.key();
+        m_infoQueue.remove(j.key());
         emit getFileProperties(dom, id, false);
     }
     if (m_infoQueue.isEmpty()) m_listView->setEnabled(true);
+    else m_queueTimer.start();
 }
 
 void ProjectList::slotUpdateClip(const QString &id)
@@ -556,35 +562,38 @@ void ProjectList::updateAllClips()
     while (*it) {
         ProjectItem *item = static_cast <ProjectItem *>(*it);
         if (!item->isGroup()) {
-            if (item->referencedClip()->producer() == NULL) {
-                DocClipBase *clip = item->referencedClip();
-                if (clip->clipType() == TEXT && !QFile::exists(clip->fileURL().path())) {
-                    // regenerate text clip image if required
-                    TitleWidget *dia_ui = new TitleWidget(KUrl(), QString(), m_render, this);
-                    QDomDocument doc;
-                    doc.setContent(clip->getProperty("xmldata"));
-                    dia_ui->setXml(doc);
-                    QImage pix = dia_ui->renderedPixmap();
-                    pix.save(clip->fileURL().path());
-                    delete dia_ui;
-                }
-                if (clip->isPlaceHolder() == false) requestClipInfo(clip->toXML(), clip->getId());
-                else item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
-            } else {
-                QString cachedPixmap = m_doc->projectFolder().path() + "/thumbs/" + item->getClipHash() + ".png";
+            DocClipBase *clip = item->referencedClip();
+            if (clip->clipType() == TEXT && !QFile::exists(clip->fileURL().path())) {
+                // regenerate text clip image if required
+                TitleWidget *dia_ui = new TitleWidget(KUrl(), QString(), m_render, this);
+                QDomDocument doc;
+                doc.setContent(clip->getProperty("xmldata"));
+                dia_ui->setXml(doc);
+                QImage pix = dia_ui->renderedPixmap();
+                pix.save(clip->fileURL().path());
+                delete dia_ui;
+            }
+            QString cachedPixmap;
+            if (!item->getClipHash().isEmpty()) {
+                cachedPixmap = m_doc->projectFolder().path(KUrl::AddTrailingSlash) + "thumbs/" + item->getClipHash() + ".png";
                 if (QFile::exists(cachedPixmap)) {
-                    //kDebug()<<"// USING CACHED PIX: "<<cachedPixmap;
                     m_listView->blockSignals(true);
                     item->setIcon(0, QPixmap(cachedPixmap));
                     m_listView->blockSignals(false);
-                } else requestClipThumbnail(item->clipId());
-
-                if (item->data(1, DurationRole).toString().isEmpty()) {
-                    m_listView->blockSignals(true);
-                    item->changeDuration(item->referencedClip()->producer()->get_playtime());
-                    m_listView->blockSignals(false);
+                } else {
+                    cachedPixmap.clear();
                 }
             }
+            if (cachedPixmap.isEmpty() && item->referencedClip()->producer() != NULL) requestClipThumbnail(item->clipId());
+
+            if (item->referencedClip()->producer() == NULL) {
+                if (clip->isPlaceHolder() == false) requestClipInfo(clip->toXML(), clip->getId());
+                else item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
+            } else if (item->data(1, DurationRole).toString().isEmpty()) {
+                m_listView->blockSignals(true);
+                item->changeDuration(item->referencedClip()->producer()->get_playtime());
+                m_listView->blockSignals(false);
+            }
             m_listView->blockSignals(true);
             item->setData(1, UsageRole, QString::number(item->numReferences()));
             m_listView->blockSignals(false);
@@ -831,11 +840,14 @@ void ProjectList::slotRefreshClipThumbnail(ProjectItem *item, bool update)
         if (!clip) slotProcessNextThumbnail();
         QPixmap pix;
         if (clip->clipType() == AUDIO) pix = KIcon("audio-x-generic").pixmap(QSize(width, height));
+        else if (clip->clipType() == TEXT || clip->clipType() == IMAGE) pix = KThumb::getFrame(item->referencedClip()->producer(), 0, width, height);
         else pix = item->referencedClip()->thumbProducer()->extractImage(item->referencedClip()->getClipThumbFrame(), width, height);
-        m_listView->blockSignals(true);
-        item->setIcon(0, pix);
-        m_listView->blockSignals(false);
-        m_doc->cachePixmap(item->getClipHash(), pix);
+        if (!pix.isNull()) {
+            m_listView->blockSignals(true);
+            item->setIcon(0, pix);
+            m_listView->blockSignals(false);
+            m_doc->cachePixmap(item->getClipHash(), pix);
+        }
         if (update) emit projectModified();
         if (!m_thumbnailQueue.isEmpty()) QTimer::singleShot(300, this, SLOT(slotProcessNextThumbnail()));
     }
@@ -862,8 +874,8 @@ void ProjectList::slotReplyGetFileProperties(const QString &clipId, Mlt::Produce
         }*/
         m_listView->blockSignals(false);
     } else kDebug() << "////////  COULD NOT FIND CLIP TO UPDATE PRPS...";
-    if (!m_infoQueue.isEmpty()) QTimer::singleShot(300, this, SLOT(slotProcessNextClipInQueue()));
-    else m_listView->setEnabled(true);
+    if (m_infoQueue.isEmpty()) /*slotProcessNextClipInQueue();
+    else*/ m_listView->setEnabled(true);
 }
 
 void ProjectList::slotReplyGetImage(const QString &clipId, const QPixmap &pix)
index 081385a1de206ce9942986c68cdec7063499fb9a..3027ddf3e2c40ae03ec7ef91851526b14e74f371 100644 (file)
@@ -28,7 +28,7 @@
 #include <QPainter>
 #include <QItemDelegate>
 #include <QUndoStack>
-
+#include <QTimer>
 
 #include <KTreeWidgetSearchLine>
 #include <KUrl>
@@ -159,6 +159,7 @@ private:
     Timecode m_timecode;
     double m_fps;
     QToolBar *m_toolbar;
+    QTimer m_queueTimer;
     QMenu *m_menu;
     QUndoStack *m_commandStack;
     void selectItemById(const QString &clipId);
@@ -173,6 +174,7 @@ private:
     bool m_refreshed;
     QToolButton *m_addButton;
     QMap <QString, QDomElement> m_infoQueue;
+    QMap <QString, QDomElement> m_producerQueue;
     void requestClipInfo(const QDomElement xml, const QString id);
     QList <QString> m_thumbnailQueue;
     void requestClipThumbnail(const QString &id);
index e3e9b428dcecfbe1d60000e99dedd8080698fbf1..614fee446cf5a9e06853a214547c115a30ed332e 100644 (file)
@@ -549,6 +549,12 @@ void Render::getFileProperties(const QDomElement &xml, const QString &clipId, bo
     char *tmp = decodedString(clipId);
     producer->set("id", tmp);
     delete[] tmp;
+    
+    if (!replaceProducer && xml.hasAttribute("file_hash")) {
+        // Clip  already has all properties
+        emit replyGetFileProperties(clipId, producer, QMap < QString, QString >(), QMap < QString, QString >(), replaceProducer);
+        return;
+    }
 
     int height = 50;
     int width = (int)(height  * m_mltProfile->dar());