[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    [kdenlive] src: Fix opening old kdenlive project files with audio/video only clips
From:       Jean-Baptiste Mardelle <jb () kdenlive ! org>
Date:       2015-09-30 18:36:49
Message-ID: E1ZhMFF-0004CW-BT () scm ! kde ! org
[Download RAW message or body]

Git commit 9c2d766b9d6b52ebf086d06af0803717edb50d1c by Jean-Baptiste Mardelle.
Committed on 30/09/2015 at 18:36.
Pushed by mardelle into branch 'master'.

Fix opening old kdenlive project files with audio/video only clips

M  +31   -11   src/doc/documentvalidator.cpp
M  +0    -1    src/timeline/clipitem.cpp
M  +2    -2    src/timeline/customtrackview.cpp
M  +1    -1    src/timeline/timeline.cpp

http://commits.kde.org/kdenlive/9c2d766b9d6b52ebf086d06af0803717edb50d1c

diff --git a/src/doc/documentvalidator.cpp b/src/doc/documentvalidator.cpp
index a0ecf58..bbfa254 100644
--- a/src/doc/documentvalidator.cpp
+++ b/src/doc/documentvalidator.cpp
@@ -1017,12 +1017,12 @@ bool DocumentValidator::upgrade(double version, const double \
                currentVersion)
             m_doc.firstChildElement("mlt").setAttribute("LC_NUMERIC", "C");
         }
     }
-    
+
     if (version <= 0.88) {
         // convert to new MLT-only format
         QDomNodeList producers = m_doc.elementsByTagName("producer");
         QDomDocumentFragment frag = m_doc.createDocumentFragment();
-        
+
         // Create Bin Playlist
         QDomElement main_playlist = m_doc.createElement("playlist");
         QDomElement prop = m_doc.createElement("property");
@@ -1070,9 +1070,9 @@ bool DocumentValidator::upgrade(double version, const double \
currentVersion)  QStringList ids;
         QStringList slowmotionIds;
         QDomNode firstProd = m_doc.firstChildElement("producer");
-        
+
         QDomNodeList kdenlive_producers = \
                m_doc.elementsByTagName("kdenlive_producer");
-        
+
         // Rename all track producers to correct name: "id_playlistName" instead of \
"id_trackNumber"  QMap <QString, QString> trackRenaming;
         // Create a list of which producers / track on which the producer is
@@ -1081,22 +1081,36 @@ bool DocumentValidator::upgrade(double version, const double \
currentVersion)  for (int i = 0; i < entries.count(); i++) {
             QDomElement entry = entries.at(i).toElement();
             QString entryId = entry.attribute("producer");
-            if (!entryId.contains("_")) {
-                // not a track producer
-                playlistForId.insert(entryId, \
                entry.parentNode().toElement().attribute("id"));
-                continue;
-            }
+            bool audioOnlyProducer = false;
             if (trackRenaming.contains(entryId)) {
                 // rename
                 entry.setAttribute("producer", trackRenaming.value(entryId));
                 continue;
             }
+            if (entryId.endsWith("_video")) {
+                // Video only producers are not track aware
+                continue;
+            }
+            if (entryId.endsWith("_audio")) {
+                // Video only producers are not track aware
+                audioOnlyProducer = true;
+                entryId = entryId.section("_", 0, -2);
+            }
+            if (!entryId.contains("_")) {
+                // not a track producer
+                playlistForId.insert(entryId, \
entry.parentNode().toElement().attribute("id")); +                continue;
+            }
             QString track = entryId.section("_", 1, 1);
             QString playlistId = entry.parentNode().toElement().attribute("id");
             if (track == playlistId) continue;
             QString newId = entryId.section("_", 0, 0) + "_" + playlistId;
+            if (audioOnlyProducer) {
+                newId.append("_audio");
+                trackRenaming.insert(entryId + "_audio", newId);
+            }
+            else trackRenaming.insert(entryId, newId);
             entry.setAttribute("producer", newId);
-            trackRenaming.insert(entryId, newId);
         }
 
         if (!trackRenaming.isEmpty()) {
@@ -1132,7 +1146,7 @@ bool DocumentValidator::upgrade(double version, const double \
currentVersion)  if (ids.contains(prodId)) {
                 // Make sure we didn't create a duplicate
                 if (ids.contains(id)) {
-                    // we have a duplicate, check if this needs to ba a track \
producer +                    // we have a duplicate, check if this needs to be a \
                track producer
                     QString service = EffectsList::property(prod, "mlt_service");
                     int a_ix = EffectsList::property(prod, "audio_index").toInt();
                     if (service == "xml" || service == "consumer" || \
(service.contains("avformat") && a_ix != -1)) { @@ -1185,6 +1199,12 @@ bool \
DocumentValidator::upgrade(double version, const double currentVersion)  else {
                 QDomElement originalProd = prod.cloneNode().toElement();
                 originalProd.setAttribute("id", prodId);
+                if (id.endsWith("_audio")) {
+                    EffectsList::removeProperty(originalProd, "video_index");
+                }
+                else if (id.endsWith("_video")) {
+                    EffectsList::removeProperty(originalProd, "audio_index");
+                }
                 frag.appendChild(originalProd);
                 QDomElement entry = m_doc.createElement("entry");
                 entry.setAttribute("in", prod.attribute("in"));
diff --git a/src/timeline/clipitem.cpp b/src/timeline/clipitem.cpp
index e39ba10..3489ba6 100644
--- a/src/timeline/clipitem.cpp
+++ b/src/timeline/clipitem.cpp
@@ -2045,6 +2045,5 @@ void ClipItem::updateState(const QString &id)
     else {
         m_clipState = PlaylistState::Original;
     }
-    
 }
 
diff --git a/src/timeline/customtrackview.cpp b/src/timeline/customtrackview.cpp
index c7b0d37..0e19ea6 100644
--- a/src/timeline/customtrackview.cpp
+++ b/src/timeline/customtrackview.cpp
@@ -6757,7 +6757,7 @@ void CustomTrackView::doChangeClipType(const GenTime &pos, int \
track, PlaylistSt  {
     ClipItem *clip = getClipItemAtStart(pos, track);
     if (clip == NULL) {
-        emit displayMessage(i18n("Cannot find clip to edit (time: %1, track: %2)", \
pos.frames(m_document->fps()), track), ErrorMessage); +        emit \
displayMessage(i18n("Cannot find clip to edit (time: %1, track: %2)", \
pos.frames(m_document->fps()), m_timeline->getTrackInfo(track).trackName), \
ErrorMessage);  return;
     }
     Mlt::Producer *prod;
@@ -6769,7 +6769,7 @@ void CustomTrackView::doChangeClipType(const GenTime &pos, int \
track, PlaylistSt  clip->setState(state); 
     } else {
         // Changing clip type failed
-        emit displayMessage(i18n("Cannot update clip (time: %1, track: %2)", \
pos.frames(m_document->fps()), track), ErrorMessage); +        emit \
displayMessage(i18n("Cannot update clip (time: %1, track: %2)", \
pos.frames(m_document->fps()), m_timeline->getTrackInfo(track).trackName), \
ErrorMessage);  return;
     }
     clip->update();
diff --git a/src/timeline/timeline.cpp b/src/timeline/timeline.cpp
index 6a6363c..8169f69 100644
--- a/src/timeline/timeline.cpp
+++ b/src/timeline/timeline.cpp
@@ -934,7 +934,7 @@ int Timeline::loadTrack(int ix, Mlt::Playlist &playlist) {
 	//qDebug()<<"// Loading clip: "<<idString<<" / SPEED: \
                "<<speed<<"\n++++++++++++++++++++++++";
         ClipItem *item = new ClipItem(binclip, clipinfo, fps, speed, strobe, \
                m_trackview->getFrameWidth(), true);
         item->setPos(clipinfo.startPos.frames(fps), KdenliveSettings::trackheight() \
                * (visibleTracksCount() - clipinfo.track) + 1 + item->itemOffset());
-        qDebug()<<" * * Loaded clip on tk: "<<clipinfo.track<< ", POS: \
"<<clipinfo.startPos.frames(fps); +        //qDebug()<<" * * Loaded clip on tk: \
"<<clipinfo.track<< ", POS: "<<clipinfo.startPos.frames(fps);  \
item->updateState(idString);  m_scene->addItem(item);
         if (locked) item->setItemLocked(true);


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic