]> git.sesse.net Git - kdenlive/blobdiff - src/renderer.cpp
Fix editing clip crop start and fade effects lost when resizing clip:
[kdenlive] / src / renderer.cpp
index a0b2c61073bff31abc62a4098b9eb47fc08add6f..f4075c16c0a966a8311ee5b7a770828bcb82869e 100644 (file)
@@ -174,7 +174,7 @@ void Render::closeMlt()
         service.unlock();
     }*/
 
-    kDebug() << "// // // CLOSE RENDERER " << m_name;
+    //kDebug() << "// // // CLOSE RENDERER " << m_name;
     if (m_blackClip) delete m_blackClip;
     //delete m_osdInfo;
 }
@@ -1691,14 +1691,25 @@ void Render::showFrame(Mlt::Frame& frame)
     }
 }
 
+void Render::disablePreview(bool disable)
+{
+    if (m_mltConsumer) {
+       m_mltConsumer->stop();
+       m_mltConsumer->set("preview_off", (int) disable);
+       m_mltConsumer->set("refresh", 0);
+       m_mltConsumer->start();
+    }
+}
+
 void Render::showAudio(Mlt::Frame& frame)
 {
     if (!frame.is_valid() || frame.get_int("test_audio") != 0) {
         return;
     }
     mlt_audio_format audio_format = mlt_audio_s16;
-    int freq = 0;
-    int num_channels = 0;
+    //FIXME: should not be hardcoded..
+    int freq = 48000;
+    int num_channels = 2;
     int samples = 0;
     int16_t* data = (int16_t*)frame.get_audio(audio_format, freq, num_channels, samples);
 
@@ -2768,7 +2779,6 @@ bool Render::mltEditTrackEffect(int track, EffectsParameterList params)
 
     refresh();
     return true;
-
 }
 
 bool Render::mltEditEffect(int track, GenTime position, EffectsParameterList params)
@@ -2861,7 +2871,7 @@ bool Render::mltEditEffect(int track, GenTime position, EffectsParameterList par
     }
 
     for (int j = 0; j < params.count(); j++) {
-        filter->set((params.at(j).name()).toUtf8().constData(), params.at(j).value().toUtf8().constData());
+        filter->set(params.at(j).name().toUtf8().constData(), params.at(j).value().toUtf8().constData());
     }
     
     for (int j = 0; j < filtersList.count(); j++) {
@@ -2875,6 +2885,71 @@ bool Render::mltEditEffect(int track, GenTime position, EffectsParameterList par
     return true;
 }
 
+bool Render::mltEnableEffects(int track, GenTime position, QList <int> effectIndexes, bool disable)
+{
+    if (position < GenTime()) {
+        return mltEnableTrackEffects(track, effectIndexes, disable);
+    }
+    // find filter
+    Mlt::Service service(m_mltProducer->parent().get_service());
+    Mlt::Tractor tractor(service);
+    Mlt::Producer trackProducer(tractor.track(track));
+    Mlt::Playlist trackPlaylist((mlt_playlist) trackProducer.get_service());
+
+    int clipIndex = trackPlaylist.get_clip_index_at((int) position.frames(m_fps));
+    Mlt::Producer *clip = trackPlaylist.get_clip(clipIndex);
+    if (!clip) {
+        kDebug() << "WARINIG, CANNOT FIND CLIP ON track: " << track << ", AT POS: " << position.frames(m_fps);
+        return false;
+    }
+
+    int duration = clip->get_playtime();
+    bool doRefresh = true;
+    // Check if clip is visible in monitor
+    int diff = trackPlaylist.clip_start(clipIndex) + duration - m_mltProducer->position();
+    if (diff < 0 || diff > duration)
+        doRefresh = false;
+    int ct = 0;
+
+    Mlt::Filter *filter = clip->filter(ct);
+    while (filter) {
+        if (effectIndexes.contains(filter->get_int("kdenlive_ix"))) {
+            filter->set("disable", (int) disable);
+        }
+        ct++;
+        filter = clip->filter(ct);
+    }
+
+    delete clip;
+    service.unlock();
+
+    if (doRefresh) refresh();
+    return true;
+}
+
+bool Render::mltEnableTrackEffects(int track, QList <int> effectIndexes, bool disable)
+{
+    Mlt::Service service(m_mltProducer->parent().get_service());
+    Mlt::Tractor tractor(service);
+    Mlt::Producer trackProducer(tractor.track(track));
+    Mlt::Playlist trackPlaylist((mlt_playlist) trackProducer.get_service());
+    Mlt::Service clipService(trackPlaylist.get_service());
+    int ct = 0;
+
+    Mlt::Filter *filter = clipService.filter(ct);
+    while (filter) {
+        if (effectIndexes.contains(filter->get_int("kdenlive_ix"))) {
+            filter->set("disable", (int) disable);
+        }
+        ct++;
+        filter = clipService.filter(ct);
+    }
+    service.unlock();
+
+    refresh();
+    return true;
+}
+
 void Render::mltUpdateEffectPosition(int track, GenTime position, int oldPos, int newPos)
 {
     Mlt::Service service(m_mltProducer->parent().get_service());
@@ -3214,10 +3289,10 @@ void Render::fixAudioMixing(Mlt::Tractor tractor)
     mlt_service_unlock(serv);
 }
 
-bool Render::mltResizeClipCrop(ItemInfo info, GenTime diff)
+bool Render::mltResizeClipCrop(ItemInfo info, GenTime newCropStart)
 {
     Mlt::Service service(m_mltProducer->parent().get_service());
-    int frameOffset = (int) diff.frames(m_fps);
+    int newCropFrame = (int) newCropStart.frames(m_fps);
     Mlt::Tractor tractor(service);
     Mlt::Producer trackProducer(tractor.track(info.track));
     Mlt::Playlist trackPlaylist((mlt_playlist) trackProducer.get_service());
@@ -3236,7 +3311,13 @@ bool Render::mltResizeClipCrop(ItemInfo info, GenTime diff)
     int previousStart = clip->get_in();
     int previousOut = clip->get_out();
     delete clip;
-    trackPlaylist.resize_clip(clipIndex, previousStart + frameOffset, previousOut + frameOffset);
+    if (previousStart == newCropFrame) {
+       kDebug() << "////////  No ReSIZING Required";
+        service.unlock();
+        return true;
+    }
+    int frameOffset = newCropFrame - previousStart;
+    trackPlaylist.resize_clip(clipIndex, newCropFrame, previousOut + frameOffset);
     service.unlock();
     m_mltConsumer->set("refresh", 1);
     return true;
@@ -3363,41 +3444,59 @@ bool Render::mltMoveClip(int startTrack, int endTrack, int moveStart, int moveEn
     Mlt::Producer trackProducer(tractor.track(startTrack));
     Mlt::Playlist trackPlaylist((mlt_playlist) trackProducer.get_service());
     int clipIndex = trackPlaylist.get_clip_index_at(moveStart);
-    //kDebug() << "//////  LOOKING FOR CLIP TO MOVE, INDEX: " << clipIndex;
+    int clipDuration = trackPlaylist.clip_length(clipIndex);
     bool checkLength = false;
     if (endTrack == startTrack) {
         Mlt::Producer *clipProducer = trackPlaylist.replace_with_blank(clipIndex);
-        if ((!overwrite && !trackPlaylist.is_blank_at(moveEnd)) || !clipProducer || !clipProducer->is_valid() || clipProducer->is_blank()) {
-            // error, destination is not empty
-            if (clipProducer) {
-                if (!trackPlaylist.is_blank_at(moveEnd) && clipProducer->is_valid()) trackPlaylist.insert_at(moveStart, clipProducer, 1);
-                delete clipProducer;
+        if (!overwrite) {
+            bool success = true;
+            if (!trackPlaylist.is_blank_at(moveEnd) || !clipProducer || !clipProducer->is_valid() || clipProducer->is_blank()) {
+               success = false;
+           }
+            else {
+                // Check that the destination region is empty
+                trackPlaylist.consolidate_blanks(0);
+                int destinationIndex = trackPlaylist.get_clip_index_at(moveEnd);
+                if (destinationIndex < trackPlaylist.count() - 1) {
+                    // We are not at the end of the track
+                    int blankSize = trackPlaylist.blanks_from(destinationIndex, 1);
+                    // Make sure we have enough place to insert clip
+                    if (blankSize - clipDuration - (moveEnd - trackPlaylist.clip_start(destinationIndex)) < 0) success = false;
+                }
             }
-            //int ix = trackPlaylist.get_clip_index_at(moveEnd);
-            kDebug() << "// ERROR MOVING CLIP TO : " << moveEnd;
-            service.unlock();
-            return false;
-        } else {
-            trackPlaylist.consolidate_blanks(0);
-            if (overwrite) {
-                trackPlaylist.remove_region(moveEnd, clipProducer->get_playtime());
-                int clipIndex = trackPlaylist.get_clip_index_at(moveEnd);
-                trackPlaylist.insert_blank(clipIndex, clipProducer->get_playtime() - 1);
+            if (!success) {
+                if (clipProducer) {
+                    trackPlaylist.insert_at(moveStart, clipProducer, 1);
+                    delete clipProducer;
+                }
+                kDebug() << "// ERROR MOVING CLIP TO : " << moveEnd;
+                service.unlock();
+                return false;
             }
-            int newIndex = trackPlaylist.insert_at(moveEnd, clipProducer, 1);
-            trackPlaylist.consolidate_blanks(1);
+        }
+        
+        if (overwrite) {
+            trackPlaylist.remove_region(moveEnd, clipProducer->get_playtime());
+            int clipIndex = trackPlaylist.get_clip_index_at(moveEnd);
+            trackPlaylist.insert_blank(clipIndex, clipProducer->get_playtime() - 1);
+        }
+        int newIndex = trackPlaylist.insert_at(moveEnd, clipProducer, 1);
+        if (newIndex == -1) {
+            kDebug()<<"// CANNOT MOVE CLIP TO: "<<moveEnd;
+            trackPlaylist.insert_at(moveStart, clipProducer, 1);
             delete clipProducer;
-            /*if (QString(clipProducer.parent().get("transparency")).toInt() == 1) {
-            mltMoveTransparency(moveStart, moveEnd, startTrack, endTrack, QString(clipProducer.parent().get("id")).toInt());
-            }*/
-            if (newIndex + 1 == trackPlaylist.count()) checkLength = true;
+            service.unlock();
+            return false;
         }
-        //service.unlock();
+        trackPlaylist.consolidate_blanks(1);
+        delete clipProducer;
+        if (newIndex + 1 == trackPlaylist.count()) checkLength = true;
     } else {
         Mlt::Producer destTrackProducer(tractor.track(endTrack));
         Mlt::Playlist destTrackPlaylist((mlt_playlist) destTrackProducer.get_service());
         if (!overwrite && !destTrackPlaylist.is_blank_at(moveEnd)) {
             // error, destination is not empty
+            kDebug() << "Cannot move: Destination is not empty";
             service.unlock();
             return false;
         } else {