]> git.sesse.net Git - kdenlive/blobdiff - src/renderer.cpp
new icons, snapping can now be en/disabled
[kdenlive] / src / renderer.cpp
index b2d00f2920b78bf20e46622623ce4bdf76800d39..58749d3740d39d74ca51db7b2727bb37d8128caa 100644 (file)
@@ -143,7 +143,9 @@ int Render::resetProfile(QString profile) {
     if (m_mltProfile) delete m_mltProfile;
     m_mltProfile = NULL;
 
-    m_mltProfile = new Mlt::Profile((char*) profile.toUtf8().data());
+    char *tmp = decodedString(profile);
+    m_mltProfile = new Mlt::Profile(tmp);
+    delete[] tmp;
     m_mltConsumer = new Mlt::Consumer(*m_mltProfile , "sdl_preview"); //consumer;
     m_mltConsumer->set("resize", 1);
     m_mltConsumer->set("window_id", m_winid);
@@ -154,7 +156,9 @@ int Render::resetProfile(QString profile) {
     m_mltConsumer->set("audio_buffer", 1024);
     m_mltConsumer->set("frequency", 48000);
 
-    Mlt::Producer *producer = new Mlt::Producer(*m_mltProfile , "westley-xml", (char *) scene.toUtf8().data());
+    tmp = decodedString(scene);
+    Mlt::Producer *producer = new Mlt::Producer(*m_mltProfile , "westley-xml", tmp);
+    delete[] tmp;
     m_mltProducer = producer;
     m_mltConsumer->connect(*m_mltProducer);
     m_mltProducer->set_speed(0.0);
@@ -804,12 +808,11 @@ void Render::switchPlay() {
     if (m_mltProducer->get_speed() == 0.0) m_mltProducer->set_speed(1.0);
     else {
         m_isBlocked = true;
-        m_mltProducer->set_speed(0.0);
-        m_mltConsumer->set("refresh", 0);
+               m_mltProducer->set_speed(0.0);
+        //m_mltConsumer->set("refresh", 0);
         m_mltProducer->seek((int) m_framePosition);
         m_isBlocked = false;
     }
-
     /*if (speed == 0.0) {
     m_mltProducer->seek((int) m_framePosition + 1);
         m_mltConsumer->purge();
@@ -1150,17 +1153,20 @@ void Render::mltAddEffect(int track, GenTime position, QMap <QString, QString> a
     if (!kfr.isEmpty()) {
         QStringList keyFrames = kfr.split(";", QString::SkipEmptyParts);
         kDebug() << "// ADDING KEYFRAME EFFECT: " << args.value("keyframes");
-        char *starttag = decodedString(args.value("starttag"));
+        char *starttag = decodedString(args.value("starttag", "start"));
         char *endtag = decodedString(args.value("endtag", "end"));
         kDebug() << "// ADDING KEYFRAME TAGS: " << starttag << ", " << endtag;
         int duration = clip->get_playtime();
-        int max = args.value("max").toInt();
-        int min = args.value("min").toInt();
+        double max = args.value("max").toDouble();
+        double min = args.value("min").toDouble();
         double factor = args.value("factor", "1").toDouble();
         args.remove("starttag");
         args.remove("endtag");
         args.remove("keyframes");
-               int offset = 0;
+        args.remove("min");
+        args.remove("max");
+        args.remove("factor");
+        int offset = 0;
         for (int i = 0; i < keyFrames.size() - 1; ++i) {
             Mlt::Filter *filter = new Mlt::Filter(*m_mltProfile, filterTag);
             filter->set("kdenlive_id", filterId);
@@ -1180,10 +1186,10 @@ void Render::mltAddEffect(int track, GenTime position, QMap <QString, QString> a
             filter->set("in", x1);
             filter->set("out", x2);
             //kDebug() << "// ADDING KEYFRAME vals: " << min<<" / "<<max<<", "<<y1<<", factor: "<<factor;
-            filter->set(starttag, QString::number((min + y1 * (max - min) / 100.0) / factor).toUtf8().data());
-            filter->set(endtag, QString::number((min + y2 * (max - min) / 100.0) / factor).toUtf8().data());
+            filter->set(starttag, QString::number((min + y1) / factor).toUtf8().data());
+            filter->set(endtag, QString::number((min + y2) / factor).toUtf8().data());
             clipService.attach(*filter);
-                       offset = 1;
+            offset = 1;
         }
         delete[] starttag;
         delete[] endtag;
@@ -1437,12 +1443,12 @@ void Render::mltResizeClipStart(int track, GenTime pos, GenTime moveEnd, GenTime
     m_isBlocked = false;
 }
 
-void Render::mltMoveClip(int startTrack, int endTrack, GenTime moveStart, GenTime moveEnd) {
-    mltMoveClip(startTrack, endTrack, (int) moveStart.frames(m_fps), (int) moveEnd.frames(m_fps));
+bool Render::mltMoveClip(int startTrack, int endTrack, GenTime moveStart, GenTime moveEnd) {
+    return mltMoveClip(startTrack, endTrack, (int) moveStart.frames(m_fps), (int) moveEnd.frames(m_fps));
 }
 
 
-void Render::mltMoveClip(int startTrack, int endTrack, int moveStart, int moveEnd) {
+bool Render::mltMoveClip(int startTrack, int endTrack, int moveStart, int moveEnd) {
     m_isBlocked = true;
 
     m_mltConsumer->set("refresh", 0);
@@ -1460,27 +1466,39 @@ void Render::mltMoveClip(int startTrack, int endTrack, int moveStart, int moveEn
         Mlt::Producer clipProducer(trackPlaylist.replace_with_blank(clipIndex));
         trackPlaylist.consolidate_blanks(0);
         if (!trackPlaylist.is_blank_at(moveEnd)) {
-            kWarning() << "// ERROR, CLIP COLLISION----------";
-            int ix = trackPlaylist.get_clip_index_at(moveEnd);
-            kDebug() << "BAD CLIP STARTS AT: " << trackPlaylist.clip_start(ix) << ", LENGT: " << trackPlaylist.clip_length(ix);
+                       // error, destination is not empty
+            //int ix = trackPlaylist.get_clip_index_at(moveEnd);
+                       mlt_service_unlock(m_mltConsumer->get_service());
+                       m_isBlocked = false;
+                       return false;
         }
-        trackPlaylist.insert_at(moveEnd, clipProducer, 1);
-        trackPlaylist.consolidate_blanks(0);
+               else {
+                       trackPlaylist.insert_at(moveEnd, clipProducer, 1);
+                       trackPlaylist.consolidate_blanks(0);
+               }
         //mlt_service_unlock(service.get_service());
     } else {
-        Mlt::Producer clipProducer(trackPlaylist.replace_with_blank(clipIndex));
-        trackPlaylist.consolidate_blanks(0);
-
         Mlt::Producer destTrackProducer(tractor.track(endTrack));
         Mlt::Playlist destTrackPlaylist((mlt_playlist) destTrackProducer.get_service());
-        destTrackPlaylist.consolidate_blanks(1);
-        destTrackPlaylist.insert_at(moveEnd, clipProducer, 1);
-        destTrackPlaylist.consolidate_blanks(0);
+               if (!destTrackPlaylist.is_blank_at(moveEnd)) {
+                       // error, destination is not empty
+                       mlt_service_unlock(m_mltConsumer->get_service());
+                       m_isBlocked = false;
+                       return false;
+               }
+               else {
+                       Mlt::Producer clipProducer(trackPlaylist.replace_with_blank(clipIndex));
+                       trackPlaylist.consolidate_blanks(0);
+                       destTrackPlaylist.consolidate_blanks(1);
+                       destTrackPlaylist.insert_at(moveEnd, clipProducer, 1);
+                       destTrackPlaylist.consolidate_blanks(0);
+               }
     }
     mltCheckLength();
     mlt_service_unlock(m_mltConsumer->get_service());
     m_isBlocked = false;
     m_mltConsumer->set("refresh", 1);
+       return true;
 }
 
 void Render::mltMoveTransition(QString type, int startTrack, int newTrack, int newTransitionTrack, GenTime oldIn, GenTime oldOut, GenTime newIn, GenTime newOut) {
@@ -1533,7 +1551,7 @@ void Render::mltMoveTransition(QString type, int startTrack, int newTrack, int n
 }
 
 void Render::mltUpdateTransition(QString oldTag, QString tag, int a_track, int b_track, GenTime in, GenTime out, QDomElement xml) {
-    //kDebug() << "update transition"  << tag;
+    // kDebug() << "update transition"  << tag << " at pos " << in.frames(25);
     if (oldTag == tag) mltUpdateTransitionParams(tag, a_track, b_track, in, out, xml);
     else {
         mltDeleteTransition(oldTag, a_track, b_track, in, out, xml, false);
@@ -1596,7 +1614,6 @@ void Render::mltUpdateTransitionParams(QString type, int a_track, int b_track, G
 }
 
 void Render::mltDeleteTransition(QString tag, int a_track, int b_track, GenTime in, GenTime out, QDomElement xml, bool do_refresh) {
-
     Mlt::Service service(m_mltProducer->parent().get_service());
     Mlt::Tractor tractor(service);
     Mlt::Field *field = tractor.field();
@@ -1618,7 +1635,9 @@ void Render::mltDeleteTransition(QString tag, int a_track, int b_track, GenTime
         kDebug() << "// FOUND EXISTING TRANS, IN: " << currentIn << ", OUT: " << currentOut << ", TRACK: " << currentTrack;
 
         if (resource == tag && b_track == currentTrack && currentIn <= old_pos && currentOut >= old_pos) {
+            //kDebug() << " / / / / /DELETE TRANS DOOOMNE";
             mlt_field_disconnect_service(field->get_field(), nextservice);
+                       mlt_service_close(nextservice);
             break;
         }
         nextservice = mlt_service_producer(nextservice);
@@ -1669,7 +1688,6 @@ QMap<QString, QString> Render::mltGetTransitionParamsFromXml(QDomElement xml) {
 }
 
 void Render::mltAddTransition(QString tag, int a_track, int b_track, GenTime in, GenTime out, QDomElement xml, bool do_refresh) {
-    //kDebug() << "-- ADDING TRANSITION: " << tag << ", ON TRACKS: " << a_track << ", " << b_track;
     QMap<QString, QString> args = mltGetTransitionParamsFromXml(xml);