]> git.sesse.net Git - kdenlive/blobdiff - src/renderer.cpp
- Allow to set volume for monitors
[kdenlive] / src / renderer.cpp
index 69bec29bdab0058797a9a104d65213b57ca1365f..3e7e53f113e958cf0d715afeb38d607bbc59cbf0 100644 (file)
@@ -137,12 +137,10 @@ void Render::closeMlt()
                 resource = mlt_properties_get(properties, "mlt_service");
             }
 
-            int trackNb = tractor.count();
-            while (trackNb > 0) {
-                Mlt::Producer trackProducer(tractor.track(trackNb - 1));
+            for (int trackNb = tractor.count() - 1; trackNb >= 0; --trackNb) {
+                Mlt::Producer trackProducer(tractor.track(trackNb));
                 Mlt::Playlist trackPlaylist((mlt_playlist) trackProducer.get_service());
                 if (trackPlaylist.type() == playlist_type) trackPlaylist.clear();
-                trackNb--;
             }
         }
         mlt_service_unlock(service.get_service());
@@ -232,6 +230,8 @@ void Render::buildConsumer(const QString profileName)
         delete[] tmp;
     }
 
+    int volume = KdenliveSettings::volume();
+    m_mltConsumer->set("volume", (float)volume / 100);
 
     m_mltConsumer->set("progressive", 1);
     m_mltConsumer->set("audio_buffer", 1024);
@@ -259,7 +259,11 @@ int Render::resetProfile(const QString profileName)
         QString videoDriver = KdenliveSettings::videodrivername();
         QString currentDriver = m_mltConsumer->get("video_driver");
         if (getenv("SDL_VIDEO_YUV_HWACCEL") != NULL && currentDriver == "x11") currentDriver = "x11_noaccel";
-        if (m_activeProfile == profileName && currentDriver == videoDriver) {
+        QString background = KdenliveSettings::window_background().name();
+        QString currentBackground = m_mltConsumer->get("window_background");
+        int volume = KdenliveSettings::volume();
+        int currentVolume = (int)(QString(m_mltConsumer->get("volume")).toDouble() * 100.0);
+        if (m_activeProfile == profileName && currentDriver == videoDriver && volume == currentVolume && background == currentBackground) {
             kDebug() << "reset to same profile, nothing to do";
             return 1;
         }
@@ -282,12 +286,10 @@ int Render::resetProfile(const QString profileName)
         Mlt::Service service(m_mltProducer->get_service());
         if (service.type() == tractor_type) {
             Mlt::Tractor tractor(service);
-            int trackNb = tractor.count();
-            while (trackNb > 0) {
-                Mlt::Producer trackProducer(tractor.track(trackNb - 1));
+            for (int trackNb = tractor.count() - 1; trackNb >= 0; --trackNb) {
+                Mlt::Producer trackProducer(tractor.track(trackNb));
                 Mlt::Playlist trackPlaylist((mlt_playlist) trackProducer.get_service());
                 trackPlaylist.clear();
-                trackNb--;
             }
         }
 
@@ -542,8 +544,7 @@ void Render::slotSplitView(bool doit)
     if (service.type() != tractor_type || tractor.count() < 2) return;
     Mlt::Field *field = tractor.field();
     if (doit) {
-        int screen = 0;
-        for (int i = 1; i < tractor.count() && screen < 4; i++) {
+        for (int i = 1, screen = 0; i < tractor.count() && screen < 4; i++) {
             Mlt::Producer trackProducer(tractor.track(i));
             kDebug() << "// TRACK: " << i << ", HIDE: " << trackProducer.get("hide");
             if (QString(trackProducer.get("hide")).toInt() != 1) {
@@ -922,7 +923,7 @@ int Render::setProducer(Mlt::Producer *producer, int position)
     if (position != -1) {
         m_mltProducer->seek(position);
         emit rendererPosition(position);
-    }
+    } else emit rendererPosition((int) m_mltProducer->position());
     m_isBlocked = false;
     return error;
 }
@@ -977,12 +978,10 @@ int Render::setSceneList(QString playlist, int position)
                 resource = mlt_properties_get(properties, "mlt_service");
             }
 
-            int trackNb = tractor.count();
-            while (trackNb > 0) {
-                Mlt::Producer trackProducer(tractor.track(trackNb - 1));
+            for (int trackNb = tractor.count() - 1; trackNb >= 0; --trackNb) {
+                Mlt::Producer trackProducer(tractor.track(trackNb));
                 Mlt::Playlist trackPlaylist((mlt_playlist) trackProducer.get_service());
                 if (trackPlaylist.type() == playlist_type) trackPlaylist.clear();
-                trackNb--;
             }
             delete field;
         }
@@ -1437,9 +1436,12 @@ const QString & Render::rendererName() const
 
 void Render::emitFrameNumber(double position)
 {
+    if (position == m_framePosition) {
+        emit frameUpdated((int) position);
+        return;
+    }
     m_framePosition = position;
     emit rendererPosition((int) position);
-    //if (qApp->activeWindow()) QApplication::postEvent(qApp->activeWindow(), new PositionChangeEvent( GenTime((int) position, m_fps), m_monitorId));
 }
 
 void Render::emitConsumerStopped()
@@ -1652,7 +1654,6 @@ int Render::mltInsertClip(ItemInfo info, QDomElement element, Mlt::Producer *pro
 
 void Render::mltCutClip(int track, GenTime position)
 {
-
     m_isBlocked = true;
 
     Mlt::Service service(m_mltProducer->parent().get_service());
@@ -1965,14 +1966,12 @@ void Render::mltInsertSpace(QMap <int, int> trackClipStartList, QMap <int, int>
             resource = mlt_properties_get(properties, "mlt_service");
         }
     } else {
-        int trackNb = tractor.count();
-        while (trackNb > 1) {
-            Mlt::Producer trackProducer(tractor.track(trackNb - 1));
+        for (int trackNb = tractor.count() - 1; trackNb >= 1; --trackNb) {
+            Mlt::Producer trackProducer(tractor.track(trackNb));
             Mlt::Playlist trackPlaylist((mlt_playlist) trackProducer.get_service());
 
-
             //int clipNb = trackPlaylist.count();
-            insertPos = trackClipStartList.value(trackNb - 1);
+            insertPos = trackClipStartList.value(trackNb);
             if (insertPos != -1) {
                 insertPos += offset;
 
@@ -2004,7 +2003,6 @@ void Render::mltInsertSpace(QMap <int, int> trackClipStartList, QMap <int, int>
                 }
                 trackPlaylist.consolidate_blanks(0);
             }
-            trackNb--;
         }
         // now move transitions
         mlt_service serv = m_mltProducer->parent().get_service();
@@ -2091,6 +2089,7 @@ int Render::mltChangeClipSpeed(ItemInfo info, ItemInfo speedIndependantInfo, dou
 
     QString serv = clipparent.get("mlt_service");
     QString id = clipparent.get("id");
+    if (speed <= 0 && speed > -1) speed = 1.0;
     //kDebug() << "CLIP SERVICE: " << serv;
     if (serv == "avformat" && (speed != 1.0 || strobe > 1)) {
         mlt_service_lock(service.get_service());
@@ -2238,14 +2237,23 @@ bool Render::mltRemoveEffect(int track, GenTime position, QString index, bool up
     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(position.frames(m_fps));
-    Mlt::Producer *clip = trackPlaylist.get_clip_at((int) position.frames(m_fps));
+
+    int clipIndex = trackPlaylist.get_clip_index_at((int) position.frames(m_fps));
+    Mlt::Producer *clip = trackPlaylist.get_clip(clipIndex);
     if (!clip) {
         kDebug() << " / / / CANNOT FIND CLIP TO REMOVE EFFECT";
-        return success;
+        return false;
     }
+
     Mlt::Service clipService(clip->get_service());
+    int duration = clip->get_playtime();
+    if (doRefresh) {
+        // Check if clip is visible in monitor
+        int diff = trackPlaylist.clip_start(clipIndex) + duration - m_mltProducer->position();
+        if (diff < 0 || diff > duration) doRefresh = false;
+    }
     delete clip;
+
 //    if (tag.startsWith("ladspa")) tag = "ladspa";
     m_isBlocked = true;
     int ct = 0;
@@ -2276,17 +2284,25 @@ bool Render::mltAddEffect(int track, GenTime position, EffectsParameterList para
     Mlt::Producer trackProducer(tractor.track(track));
     Mlt::Playlist trackPlaylist((mlt_playlist) trackProducer.get_service());
 
-    Mlt::Producer *clip = trackPlaylist.get_clip_at((int) position.frames(m_fps));
+    int clipIndex = trackPlaylist.get_clip_index_at((int) position.frames(m_fps));
+    Mlt::Producer *clip = trackPlaylist.get_clip(clipIndex);
     if (!clip) {
         return false;
     }
+
     Mlt::Service clipService(clip->get_service());
     m_isBlocked = true;
     int duration = clip->get_playtime();
     bool updateIndex = false;
+    if (doRefresh) {
+        // Check if clip is visible in monitor
+        int diff = trackPlaylist.clip_start(clipIndex) + duration - m_mltProducer->position();
+        if (diff < 0 || diff > duration) doRefresh = false;
+    }
     delete clip;
 
     const int filter_ix = params.paramValue("kdenlive_ix").toInt();
+    const QString region =  params.paramValue("region");
     int ct = 0;
     Mlt::Filter *filter = clipService.filter(ct);
     while (filter) {
@@ -2330,7 +2346,7 @@ bool Render::mltAddEffect(int track, GenTime position, EffectsParameterList para
 
     // create filter
     QString tag =  params.paramValue("tag");
-    kDebug() << " / / INSERTING EFFECT: " << tag;
+    kDebug() << " / / INSERTING EFFECT: " << tag << ", REGI: " << region;
     if (tag.startsWith("ladspa")) tag = "ladspa";
     char *filterTag = decodedString(tag);
     char *filterId = decodedString(params.paramValue("id"));
@@ -2383,19 +2399,34 @@ bool Render::mltAddEffect(int track, GenTime position, EffectsParameterList para
         delete[] starttag;
         delete[] endtag;
     } else {
-        Mlt::Filter *filter = new Mlt::Filter(*m_mltProfile, filterTag);
-        if (filter && filter->is_valid())
+        Mlt::Filter *filter;
+        QString prefix;
+        if (!region.isEmpty()) {
+            filter = new Mlt::Filter(*m_mltProfile, "region");
+        } else filter = new Mlt::Filter(*m_mltProfile, filterTag);
+        if (filter && filter->is_valid()) {
             filter->set("kdenlive_id", filterId);
-        else {
+            if (!region.isEmpty()) {
+                char *tmp = decodedString(region);
+                filter->set("resource", tmp);
+                tmp = decodedString(params.paramValue("kdenlive_ix"));
+                filter->set("kdenlive_ix", tmp);
+                filter->set("filter0", filterTag);
+                prefix = "filter0.";
+                delete[] tmp;
+                params.removeParam("id");
+                params.removeParam("region");
+                params.removeParam("kdenlive_ix");
+            }
+        } else {
             kDebug() << "filter is NULL";
             m_isBlocked = false;
             return false;
         }
-
         params.removeParam("kdenlive_id");
 
         for (int j = 0; j < params.count(); j++) {
-            char *name = decodedString(params.at(j).name());
+            char *name = decodedString(prefix + params.at(j).name());
             char *value = decodedString(params.at(j).value());
             filter->set(name, value);
             delete[] name;
@@ -2409,6 +2440,7 @@ bool Render::mltAddEffect(int track, GenTime position, EffectsParameterList para
             params.removeParam("kdenlive_ix");
             params.removeParam("tag");
             params.removeParam("disable");
+            params.removeParam("region");
 
             for (int j = 0; j < params.count(); j++) {
                 effectArgs.append(' ' + params.at(j).value());
@@ -2443,7 +2475,7 @@ bool Render::mltEditEffect(int track, GenTime position, EffectsParameterList par
     QString index = params.paramValue("kdenlive_ix");
     QString tag =  params.paramValue("tag");
 
-    if (!params.paramValue("keyframes").isEmpty() || /*it.key().startsWith("#") || */tag.startsWith("ladspa") || tag == "sox" || tag == "autotrack_rectangle") {
+    if (!params.paramValue("keyframes").isEmpty() || /*it.key().startsWith("#") || */tag.startsWith("ladspa") || tag == "sox" || tag == "autotrack_rectangle" || params.hasParam("region")) {
         // This is a keyframe effect, to edit it, we remove it and re-add it.
         mltRemoveEffect(track, position, index, false);
         bool success = mltAddEffect(track, position, params);
@@ -2452,24 +2484,27 @@ bool Render::mltEditEffect(int track, GenTime position, EffectsParameterList par
 
     // 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(position.frames(m_fps));
-    Mlt::Producer *clip = trackPlaylist.get_clip_at((int) position.frames(m_fps));
+
+    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;
     }
+
     Mlt::Service clipService(clip->get_service());
+    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;
     delete clip;
     m_isBlocked = true;
     int ct = 0;
-    Mlt::Filter *filter = clipService.filter(ct);
-
-    /*
-    kDebug() << "EDITING FILTER: "<<index <<", "<<tag;
+    /* kDebug() << "EDITING FILTER: "<<index <<", "<<tag;
     kDebug() << "EFFect stack: ++++++++++++++++++++++++++";
     while (filter) {
         kDebug() << "Filter: "<< filter->get("kdenlive_id") <<", IX: "<<filter->get("kdenlive_ix");
@@ -2477,9 +2512,10 @@ bool Render::mltEditEffect(int track, GenTime position, EffectsParameterList par
         filter = clipService.filter(ct);
     }
     kDebug() << "++++++++++++++++++++++++++";
-    */
     ct = 0;
-    filter = clipService.filter(ct);
+    filter = clipService.filter(ct); */
+
+    Mlt::Filter *filter = clipService.filter(ct);
     while (filter) {
         if (filter->get("kdenlive_ix") == index) {
             break;
@@ -2496,9 +2532,12 @@ bool Render::mltEditEffect(int track, GenTime position, EffectsParameterList par
         m_isBlocked = false;
         return success;
     }
+    QString prefix;
+    QString ser = filter->get("mlt_service");
+    if (ser == "region") prefix = "filter0.";
     mlt_service_lock(service.get_service());
     for (int j = 0; j < params.count(); j++) {
-        char *name = decodedString(params.at(j).name());
+        char *name = decodedString(prefix + params.at(j).name());
         char *value = decodedString(params.at(j).value());
         filter->set(name, value);
         delete[] name;
@@ -2507,7 +2546,7 @@ bool Render::mltEditEffect(int track, GenTime position, EffectsParameterList par
     mlt_service_unlock(service.get_service());
 
     m_isBlocked = false;
-    refresh();
+    if (doRefresh) refresh();
     return true;
 }
 
@@ -2520,14 +2559,22 @@ void Render::mltUpdateEffectPosition(int track, GenTime position, int oldPos, in
     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(position.frames(m_fps));
-    Mlt::Producer *clip = trackPlaylist.get_clip_at((int) position.frames(m_fps));
+
+    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;
     }
+
     Mlt::Service clipService(clip->get_service());
+    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;
     delete clip;
+
     m_isBlocked = true;
     int ct = 0;
     Mlt::Filter *filter = clipService.filter(ct);
@@ -2540,7 +2587,7 @@ void Render::mltUpdateEffectPosition(int track, GenTime position, int oldPos, in
     }
 
     m_isBlocked = false;
-    refresh();
+    if (doRefresh) refresh();
 }
 
 void Render::mltMoveEffect(int track, GenTime position, int oldPos, int newPos)
@@ -2552,14 +2599,22 @@ void Render::mltMoveEffect(int track, GenTime position, int oldPos, int newPos)
     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(position.frames(m_fps));
-    Mlt::Producer *clip = trackPlaylist.get_clip_at((int) position.frames(m_fps));
+
+    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;
     }
+
     Mlt::Service clipService(clip->get_service());
+    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;
     delete clip;
+
     m_isBlocked = true;
     int ct = 0;
     QList <Mlt::Filter *> filtersList;
@@ -2613,7 +2668,7 @@ void Render::mltMoveEffect(int track, GenTime position, int oldPos, int newPos)
     }
 
     m_isBlocked = false;
-    refresh();
+    if (doRefresh) refresh();
 }
 
 bool Render::mltResizeClipEnd(ItemInfo info, GenTime clipDuration)
@@ -2737,10 +2792,10 @@ bool Render::mltResizeClipCrop(ItemInfo info, GenTime diff)
         return false;
     }
     int previousStart = clip->get_in();
+    int previousOut = clip->get_out();
     delete clip;
-    int previousDuration = trackPlaylist.clip_length(clipIndex) - 1;
     m_isBlocked = true;
-    trackPlaylist.resize_clip(clipIndex, previousStart + frameOffset, previousStart + previousDuration + frameOffset);
+    trackPlaylist.resize_clip(clipIndex, previousStart + frameOffset, previousOut + frameOffset);
     m_isBlocked = false;
     mlt_service_unlock(service.get_service());
     m_mltConsumer->set("refresh", 1);
@@ -2761,22 +2816,30 @@ bool Render::mltResizeClipStart(ItemInfo info, GenTime diff)
     }
     mlt_service_lock(service.get_service());
     int clipIndex = trackPlaylist.get_clip_index_at(info.startPos.frames(m_fps));
-    if (trackPlaylist.is_blank(clipIndex)) {
+    Mlt::Producer *clip = trackPlaylist.get_clip(clipIndex);
+    if (clip == NULL || clip->is_blank()) {
         kDebug() << "////////  ERROR RSIZING NULL CLIP!!!!!!!!!!!";
         mlt_service_unlock(service.get_service());
         return false;
     }
-    int previousStart = trackPlaylist.clip_start(clipIndex);
-    int previousDuration = trackPlaylist.clip_length(clipIndex) - 1;
+    int previousStart = clip->get_in();
+    int previousOut = clip->get_out();
+    delete clip;
     m_isBlocked = true;
-    kDebug() << "RESIZE, old start: " << previousStart + moveFrame << ", " << previousStart + previousDuration;
-    trackPlaylist.resize_clip(clipIndex, previousStart + moveFrame, previousStart + previousDuration);
+    previousStart += moveFrame;
+    if (previousStart < 0) {
+        // special case, in point becoming negative (resizing images)
+        previousOut -= previousStart;
+        previousStart = 0;
+    }
+    // kDebug() << "RESIZE, new start: " << previousStart << ", " << previousOut;
+    trackPlaylist.resize_clip(clipIndex, previousStart, previousOut);
     if (moveFrame > 0) trackPlaylist.insert_blank(clipIndex, moveFrame - 1);
     else {
         //int midpos = info.startPos.frames(m_fps) + moveFrame - 1;
         int blankIndex = clipIndex - 1;
         int blankLength = trackPlaylist.clip_length(blankIndex);
-        kDebug() << " + resizing blank length " <<  blankLength << ", SIZE DIFF: " << moveFrame;
+        // kDebug() << " + resizing blank length " <<  blankLength << ", SIZE DIFF: " << moveFrame;
         if (! trackPlaylist.is_blank(blankIndex)) {
             kDebug() << "WARNING, CLIP TO RESIZE IS NOT BLANK";
         }
@@ -3000,11 +3063,22 @@ bool Render::mltMoveTransition(QString type, int startTrack, int newTrack, int n
     int new_in = (int)newIn.frames(m_fps);
     int new_out = (int)newOut.frames(m_fps) - 1;
     if (new_in >= new_out) return false;
+    int old_in = (int)oldIn.frames(m_fps);
+    int old_out = (int)oldOut.frames(m_fps) - 1;
 
     Mlt::Service service(m_mltProducer->parent().get_service());
     Mlt::Tractor tractor(service);
     Mlt::Field *field = tractor.field();
 
+    bool doRefresh = true;
+    // Check if clip is visible in monitor
+    int diff = old_out - m_mltProducer->position();
+    if (diff < 0 || diff > old_out - old_in) doRefresh = false;
+    if (doRefresh) {
+        diff = new_out - m_mltProducer->position();
+        if (diff < 0 || diff > new_out - new_in) doRefresh = false;
+    }
+
     m_isBlocked++;
     mlt_service_lock(service.get_service());
 
@@ -3012,7 +3086,7 @@ bool Render::mltMoveTransition(QString type, int startTrack, int newTrack, int n
     mlt_properties properties = MLT_SERVICE_PROPERTIES(nextservice);
     QString mlt_type = mlt_properties_get(properties, "mlt_type");
     QString resource = mlt_properties_get(properties, "mlt_service");
-    int old_pos = (int)(oldIn.frames(m_fps) + oldOut.frames(m_fps)) / 2;
+    int old_pos = (int)(old_in + old_out) / 2;
     bool found = false;
 
     while (mlt_type == "transition") {
@@ -3045,7 +3119,7 @@ bool Render::mltMoveTransition(QString type, int startTrack, int newTrack, int n
     }
     mlt_service_unlock(service.get_service());
     m_isBlocked--;
-    refresh();
+    if (doRefresh) refresh();
     //if (m_isBlocked == 0) m_mltConsumer->set("refresh", 1);
     return found;
 }
@@ -3098,8 +3172,8 @@ void Render::mltUpdateTransition(QString oldTag, QString tag, int a_track, int b
         mltDeleteTransition(oldTag, a_track, b_track, in, out, xml, false);
         mltAddTransition(tag, a_track, b_track, in, out, xml, false);
     }
-    refresh();
-    //mltSavePlaylist();
+
+    if (m_mltProducer->position() > in.frames(m_fps) && m_mltProducer->position() < out.frames(m_fps)) refresh();
 }
 
 void Render::mltUpdateTransitionParams(QString type, int a_track, int b_track, GenTime in, GenTime out, QDomElement xml)
@@ -3394,6 +3468,8 @@ bool Render::mltAddTransition(QString tag, int a_track, int b_track, GenTime in,
     Mlt::Transition *transition = new Mlt::Transition(*m_mltProfile, transId);
     if (out != GenTime())
         transition->set_in_and_out((int) in.frames(m_fps), (int) out.frames(m_fps) - 1);
+
+    if (do_refresh && (m_mltProducer->position() < in.frames(m_fps) || m_mltProducer->position() > out.frames(m_fps))) do_refresh = false;
     QMap<QString, QString>::Iterator it;
     QString key;
     if (xml.attribute("automatic") == "1") transition->set("automatic", 1);