]> git.sesse.net Git - kdenlive/commitdiff
Fix composite transition with black track broken
authorJean-Baptiste Mardelle <jb@kdenlive.org>
Sat, 1 Aug 2009 11:41:57 +0000 (11:41 +0000)
committerJean-Baptiste Mardelle <jb@kdenlive.org>
Sat, 1 Aug 2009 11:41:57 +0000 (11:41 +0000)
svn path=/trunk/kdenlive/; revision=3794

src/customtrackview.cpp
src/kdenlivedoc.cpp
src/renderer.cpp
src/renderer.h

index 2c96475f54842e1aebc48699fc3dd9deb305b1de..07d38cc1628f9f91cadff979af3e37258a90e7d4 100644 (file)
@@ -1866,14 +1866,17 @@ void CustomTrackView::dropEvent(QDropEvent * event)
             int tracknumber = m_document->tracksCount() - info.track - 1;
             bool isLocked = m_document->trackInfoAt(tracknumber).isLocked;
             if (isLocked) item->setItemLocked(true);
+            ItemInfo clipInfo = info;
+            clipInfo.track = m_document->tracksCount() - item->track();
+            if (m_document->renderer()->mltInsertClip(clipInfo, item->xml(), item->baseClip()->producer(item->track())) == -1) {
+                emit displayMessage(i18n("Cannot insert clip in timeline"), ErrorMessage);
+            }
 
             if (item->baseClip()->isTransparent() && getTransitionItemAtStart(info.startPos, info.track) == NULL) {
                 // add transparency transition
                 QDomElement trans = MainWindow::transitions.getEffectByTag("composite", "composite").cloneNode().toElement();
                 new AddTransitionCommand(this, info, getPreviousVideoTrack(info.track), trans, false, true, addCommand);
             }
-            info.track = m_document->tracksCount() - item->track();
-            m_document->renderer()->mltInsertClip(info, item->xml(), item->baseClip()->producer(item->track()));
             item->setSelected(true);
         }
         m_commandStack->push(addCommand);
index 0b56aa9494d3a5e90b993e25d7bcb4fbaf3baec0..ae4c236d394bb8ed9335094d8a9222c797118a69 100644 (file)
@@ -276,6 +276,53 @@ QDomDocument KdenliveDoc::createEmptyDocument(const int videotracks, const int a
     audioTrack.isBlind = true;
     audioTrack.isLocked = false;
 
+    // Create black producer
+    // For some unknown reason, we have to build the black producer here and not in renderer.cpp, otherwise
+    // the composite transitions with the black track are corrupted.
+    QDomElement blk = doc.createElement("producer");
+    blk.setAttribute("in", 0);
+    blk.setAttribute("out", 500);
+    blk.setAttribute("id", "black");
+
+    QDomElement property = doc.createElement("property");
+    property.setAttribute("name", "mlt_type");
+    QDomText value = doc.createTextNode("producer");
+    property.appendChild(value);
+    blk.appendChild(property);
+
+    property = doc.createElement("property");
+    property.setAttribute("name", "aspect_ratio");
+    value = doc.createTextNode(QString::number(0.0));
+    property.appendChild(value);
+    blk.appendChild(property);
+
+    property = doc.createElement("property");
+    property.setAttribute("name", "length");
+    value = doc.createTextNode(QString::number(15000));
+    property.appendChild(value);
+    blk.appendChild(property);
+
+    property = doc.createElement("property");
+    property.setAttribute("name", "eof");
+    value = doc.createTextNode("pause");
+    property.appendChild(value);
+    blk.appendChild(property);
+
+    property = doc.createElement("property");
+    property.setAttribute("name", "resource");
+    value = doc.createTextNode("black");
+    property.appendChild(value);
+    blk.appendChild(property);
+
+    property = doc.createElement("property");
+    property.setAttribute("name", "mlt_service");
+    value = doc.createTextNode("colour");
+    property.appendChild(value);
+    blk.appendChild(property);
+
+    mlt.appendChild(blk);
+
+
     QDomElement tractor = doc.createElement("tractor");
     tractor.setAttribute("id", "maintractor");
     QDomElement multitrack = doc.createElement("multitrack");
@@ -283,6 +330,11 @@ QDomDocument KdenliveDoc::createEmptyDocument(const int videotracks, const int a
     playlist.setAttribute("id", "black_track");
     mlt.appendChild(playlist);
 
+    QDomElement blank0 = doc.createElement("entry");
+    blank0.setAttribute("in", "0");
+    blank0.setAttribute("out", "0");
+    blank0.setAttribute("producer", "black");
+    playlist.appendChild(blank0);
 
     // create playlists
     int total = audiotracks + videotracks + 1;
index 607f0d027e7bdb09d26030fbe18171e779233970..acc2c3888a12c2f3f8aa795669ff8d37686460c3 100644 (file)
@@ -106,7 +106,7 @@ void Render::closeMlt()
             Mlt::Tractor tractor(service);
             int trackNb = tractor.count();
 
-            while (trackNb > 1) {
+            while (trackNb > 0) {
                 Mlt::Producer trackProducer(tractor.track(trackNb - 1));
                 Mlt::Playlist trackPlaylist((mlt_playlist) trackProducer.get_service());
                 trackPlaylist.clear();
@@ -211,15 +211,18 @@ int Render::resetProfile()
     m_mltConsumer = NULL;
     QString scene = sceneList();
     int pos = 0;
+
+    delete m_blackClip;
+    m_blackClip = NULL;
+
     if (m_mltProducer) {
         pos = m_mltProducer->position();
 
-
         Mlt::Service service(m_mltProducer->get_service());
         if (service.type() == tractor_type) {
             Mlt::Tractor tractor(service);
             int trackNb = tractor.count();
-            while (trackNb > 1) {
+            while (trackNb > 0) {
                 Mlt::Producer trackProducer(tractor.track(trackNb - 1));
                 Mlt::Playlist trackPlaylist((mlt_playlist) trackProducer.get_service());
                 trackPlaylist.clear();
@@ -227,12 +230,9 @@ int Render::resetProfile()
             }
         }
 
-
         delete m_mltProducer;
     }
     m_mltProducer = NULL;
-    delete m_blackClip;
-    m_blackClip = NULL;
 
     if (m_mltProfile) delete m_mltProfile;
     m_mltProfile = NULL;
@@ -886,7 +886,7 @@ int Render::setSceneList(QString playlist, int position)
         if (service.type() == tractor_type) {
             Mlt::Tractor tractor(service);
             int trackNb = tractor.count();
-            while (trackNb > 1) {
+            while (trackNb > 0) {
                 Mlt::Producer trackProducer(tractor.track(trackNb - 1));
                 Mlt::Playlist trackPlaylist((mlt_playlist) trackProducer.get_service());
                 trackPlaylist.clear();
@@ -1394,70 +1394,80 @@ void Render::exportCurrentFrame(KUrl url, bool /*notify*/)
 /** MLT PLAYLIST DIRECT MANIPULATON  **/
 
 
-void Render::mltCheckLength()
+void Render::mltCheckLength(Mlt::Tractor *tractor)
 {
     //kDebug()<<"checking track length: "<<track<<"..........";
 
-    Mlt::Service service(m_mltProducer->get_service());
-    Mlt::Tractor tractor(service);
-
-    int trackNb = tractor.count();
+    int trackNb = tractor->count();
     int duration = 0;
     int trackDuration;
     if (trackNb == 1) {
-        Mlt::Producer trackProducer(tractor.track(0));
+        Mlt::Producer trackProducer(tractor->track(0));
         duration = trackProducer.get_playtime() - 1;
         m_mltProducer->set("out", duration);
         emit durationChanged(duration);
         return;
     }
     while (trackNb > 1) {
-        Mlt::Producer trackProducer(tractor.track(trackNb - 1));
+        Mlt::Producer trackProducer(tractor->track(trackNb - 1));
         trackDuration = trackProducer.get_playtime() - 1;
         //kDebug() << " / / /DURATON FOR TRACK " << trackNb - 1 << " = " << trackDuration;
         if (trackDuration > duration) duration = trackDuration;
         trackNb--;
     }
 
-    Mlt::Producer blackTrackProducer(tractor.track(0));
+    Mlt::Producer blackTrackProducer(tractor->track(0));
 
     if (blackTrackProducer.get_playtime() - 1 != duration) {
         Mlt::Playlist blackTrackPlaylist((mlt_playlist) blackTrackProducer.get_service());
         Mlt::Producer *blackclip = blackTrackPlaylist.get_clip(0);
-        if (blackclip && duration > blackclip->parent().get_length()) {
-            blackclip->parent().set("length", duration);
-            blackclip->parent().set("out", duration - 1);
-            blackclip->set("length", duration);
+        if (blackclip && blackclip->is_blank()) {
+            delete blackclip;
+            blackclip = NULL;
         }
-        if (blackclip == NULL || blackclip->is_blank() || blackTrackPlaylist.count() != 1) {
+
+        if (blackclip == NULL || blackTrackPlaylist.count() != 1) {
             blackTrackPlaylist.clear();
             m_blackClip->set("length", duration);
             m_blackClip->set("out", duration - 1);
-            blackTrackPlaylist.append(*m_blackClip, 0, duration - 1);
-        } else blackTrackPlaylist.resize_clip(0, 0, duration - 1);
+            blackclip = m_blackClip->cut(0, duration - 1);
+            blackTrackPlaylist.insert_at(0, blackclip, 1);
+        } else {
+            if (duration > blackclip->parent().get_length()) {
+                blackclip->parent().set("length", duration);
+                blackclip->parent().set("out", duration - 1);
+                blackclip->set("length", duration);
+            }
+            blackTrackPlaylist.resize_clip(0, 0, duration - 1);
+        }
+
         delete blackclip;
         m_mltProducer->set("out", duration);
         emit durationChanged(duration);
     }
 }
 
-void Render::mltInsertClip(ItemInfo info, QDomElement element, Mlt::Producer *prod)
+int Render::mltInsertClip(ItemInfo info, QDomElement element, Mlt::Producer *prod)
 {
     if (m_mltProducer == NULL) {
         kDebug() << "PLAYLIST NOT INITIALISED //////";
-        return;
+        return -1;
     }
     Mlt::Producer parentProd(m_mltProducer->parent());
     if (parentProd.get_producer() == NULL) {
         kDebug() << "PLAYLIST BROKEN, CANNOT INSERT CLIP //////";
-        return;
+        return -1;
     }
 
     Mlt::Service service(parentProd.get_service());
+    if (service.type() != tractor_type) {
+        kWarning() << "// TRACTOR PROBLEM";
+        return -1;
+    }
     Mlt::Tractor tractor(service);
     if (info.track > tractor.count() - 1) {
         kDebug() << "ERROR TRYING TO INSERT CLIP ON TRACK " << info.track << ", at POS: " << info.startPos.frames(25);
-        return;
+        return -1;
     }
     mlt_service_lock(service.get_service());
     Mlt::Producer trackProducer(tractor.track(info.track));
@@ -1495,11 +1505,11 @@ void Render::mltInsertClip(ItemInfo info, QDomElement element, Mlt::Producer *pr
     /*if (QString(prod->get("transparency")).toInt() == 1)
         mltAddClipTransparency(info, info.track - 1, QString(prod->get("id")).toInt());*/
 
+    if (info.track != 0 && (newIndex + 1 == trackPlaylist.count())) mltCheckLength(&tractor);
     mlt_service_unlock(service.get_service());
-
-    if (info.track != 0 && (newIndex + 1 == trackPlaylist.count())) mltCheckLength();
-    //tractor.multitrack()->refresh();
-    //tractor.refresh();
+    /*tractor.multitrack()->refresh();
+    tractor.refresh();*/
+    return 0;
 }
 
 
@@ -1634,7 +1644,7 @@ bool Render::mltRemoveClip(int track, GenTime position)
     kDebug()<<"CLIP "<<i<<": ("<<blankStart<<'x'<<blankStart + blankDuration<<")"<<blk;
     }*/
     mlt_service_unlock(service.get_service());
-    if (track != 0 && trackPlaylist.count() <= clipIndex) mltCheckLength();
+    if (track != 0 && trackPlaylist.count() <= clipIndex) mltCheckLength(&tractor);
     m_isBlocked = false;
     return true;
 }
@@ -1813,7 +1823,7 @@ void Render::mltInsertSpace(QMap <int, int> trackClipStartList, QMap <int, int>
         }
     }
     mlt_service_unlock(service.get_service());
-    mltCheckLength();
+    mltCheckLength(&tractor);
     m_mltConsumer->set("refresh", 1);
 }
 
@@ -1981,7 +1991,7 @@ int Render::mltChangeClipSpeed(ItemInfo info, double speed, double oldspeed, int
     }
 
     delete clip;
-    if (clipIndex + 1 == trackPlaylist.count()) mltCheckLength();
+    if (clipIndex + 1 == trackPlaylist.count()) mltCheckLength(&tractor);
     m_isBlocked = false;
     return newLength;
 }
@@ -2371,7 +2381,7 @@ bool Render::mltResizeClipEnd(ItemInfo info, GenTime clipDuration)
     trackPlaylist.consolidate_blanks(0);
     mlt_service_unlock(service.get_service());
 
-    if (info.track != 0 && clipIndex == trackPlaylist.count()) mltCheckLength();
+    if (info.track != 0 && clipIndex == trackPlaylist.count()) mltCheckLength(&tractor);
     /*if (QString(clip->parent().get("transparency")).toInt() == 1) {
         //mltResizeTransparency(previousStart, previousStart, previousStart + newDuration, track, QString(clip->parent().get("id")).toInt());
         mltDeleteTransparency(info.startPos.frames(m_fps), info.track, QString(clip->parent().get("id")).toInt());
@@ -2626,7 +2636,7 @@ bool Render::mltMoveClip(int startTrack, int endTrack, int moveStart, int moveEn
         }
     }
     mlt_service_unlock(service.get_service());
-    if (checkLength) mltCheckLength();
+    if (checkLength) mltCheckLength(&tractor);
     m_isBlocked--;
     //askForRefresh();
     //m_mltConsumer->set("refresh", 1);
@@ -3202,7 +3212,17 @@ void Render::mltDeleteTrack(int ix)
     tractor.removeChild(track);
     //kDebug() << "/////////// RESULT SCENE: \n" << doc.toString();
     setSceneList(doc.toString(), m_framePosition);
-    mltCheckLength();
+
+    if (m_mltProducer != NULL) {
+        Mlt::Producer parentProd(m_mltProducer->parent());
+        if (parentProd.get_producer() != NULL) {
+            Mlt::Service service(parentProd.get_service());
+            if (service.type() == tractor_type) {
+                Mlt::Tractor tractor(service);
+                mltCheckLength(&tractor);
+            }
+        }
+    }
 }
 
 
index fd237706b28841872d0503a83958362cf3ecbb84..87e36d77a73410f08ba46f77ab7e7a02f508686c 100644 (file)
@@ -165,7 +165,7 @@ Q_OBJECT public:
     double dar() const;
 
     /** Playlist manipulation */
-    void mltInsertClip(ItemInfo info, QDomElement element, Mlt::Producer *prod);
+    int mltInsertClip(ItemInfo info, QDomElement element, Mlt::Producer *prod);
     void mltUpdateClip(ItemInfo info, QDomElement element, Mlt::Producer *prod);
     void mltCutClip(int track, GenTime position);
     void mltInsertSpace(QMap <int, int> trackClipStartList, QMap <int, int> trackTransitionStartList, int track, const GenTime duration, const GenTime timeOffset);
@@ -234,7 +234,7 @@ private:   // Private attributes & methods
 
     /** Sets the description of this renderer to desc. */
     void closeMlt();
-    void mltCheckLength();
+    void mltCheckLength(Mlt::Tractor *tractor);
     void mltPasteEffects(Mlt::Producer *source, Mlt::Producer *dest);
     QMap<QString, QString> mltGetTransitionParamsFromXml(QDomElement xml);
     QMap<QString, Mlt::Producer *> m_slowmotionProducers;