]> git.sesse.net Git - kdenlive/blobdiff - src/renderer.cpp
Enter 2012.
[kdenlive] / src / renderer.cpp
index 9f8dc19815eb3a5a9470530f397cfc4cb71b90b3..3f423aea0abea9df85844024a25e224c353cf9d1 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);
 
@@ -2860,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++) {
@@ -3278,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());
@@ -3300,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;
@@ -3427,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 {
@@ -4369,6 +4404,7 @@ const QString Render::activeClipId()
 //static 
 bool Render::getBlackMagicDeviceList(KComboBox *devicelist)
 {
+    if (!KdenliveSettings::decklink_device_found()) return false;
     Mlt::Profile profile;
     Mlt::Producer bm(profile, "decklink");
     int found_devices = 0;
@@ -4376,6 +4412,7 @@ bool Render::getBlackMagicDeviceList(KComboBox *devicelist)
        bm.set("list_devices", 1);
        found_devices = bm.get_int("devices");
     }
+    else KdenliveSettings::setDecklink_device_found(false);
     if (found_devices <= 0) {
        devicelist->setEnabled(false);
        return false;
@@ -4390,6 +4427,7 @@ bool Render::getBlackMagicDeviceList(KComboBox *devicelist)
 
 bool Render::getBlackMagicOutputDeviceList(KComboBox *devicelist)
 {
+    if (!KdenliveSettings::decklink_device_found()) return false;
     Mlt::Profile profile;
     Mlt::Consumer bm(profile, "decklink");
     int found_devices = 0;
@@ -4397,6 +4435,7 @@ bool Render::getBlackMagicOutputDeviceList(KComboBox *devicelist)
        bm.set("list_devices", 1);
        found_devices = bm.get_int("devices");
     }
+    else KdenliveSettings::setDecklink_device_found(false);
     if (found_devices <= 0) {
        devicelist->setEnabled(false);
        return false;