]> git.sesse.net Git - kdenlive/blobdiff - src/renderer.cpp
Start implementing effects
[kdenlive] / src / renderer.cpp
index 02f048ac75efb3cdeb40d80f94ddc427726b8a13..721a3b1d8f7e9180f204acaa64431497d8f68b81 100644 (file)
@@ -37,14 +37,26 @@ extern "C" {
 #include <KMessageBox>
 #include <KLocale>
 
-
-#include <mlt++/Mlt.h>
-
-
 #include "renderer.h"
+#include "kdenlivesettings.h"
+
+static void consumer_frame_show(mlt_consumer, Render * self, mlt_frame frame_ptr)
+{
+    // detect if the producer has finished playing. Is there a better way to do it ?
+    //if (self->isBlocked) return;
+    if (mlt_properties_get_double( MLT_FRAME_PROPERTIES( frame_ptr ), "_speed" ) == 0.0) {
+        self->emitConsumerStopped();
+    }
+    else 
+    {
+       self->emitFrameNumber(mlt_frame_get_position(frame_ptr));
+    }
+}
 
-Render::Render(const QString & rendererName, QWidget *parent):QObject(parent), m_name(rendererName), m_mltConsumer(NULL), m_mltProducer(NULL), m_mltTextProducer(NULL), m_sceneList(QDomDocument()), m_winid(-1), m_framePosition(0), m_generateScenelist(false), isBlocked(true)
+Render::Render(const QString & rendererName, int winid, int extid, QWidget *parent):QObject(parent), m_name(rendererName), m_mltConsumer(NULL), m_mltProducer(NULL), m_mltTextProducer(NULL), m_sceneList(QDomDocument()), m_winid(-1), m_framePosition(0), m_generateScenelist(false), m_isBlocked(true)
 {
+    kDebug()<<"//////////  USING PROFILE: "<<qstrdup(KdenliveSettings::current_profile().toUtf8());
+    m_mltProfile = new Mlt::Profile((char*) qstrdup(KdenliveSettings::current_profile().toUtf8()));
     refreshTimer = new QTimer( this );
     connect( refreshTimer, SIGNAL(timeout()), this, SLOT( refresh()) );
 
@@ -57,6 +69,24 @@ Render::Render(const QString & rendererName, QWidget *parent):QObject(parent), m
     connect( osdTimer, SIGNAL(timeout()), this, SLOT(slotOsdTimeout()) );
 
     m_osdProfile =   KStandardDirs::locate("data", "kdenlive/profiles/metadata.properties");
+    //if (rendererName == "clip")
+    {
+    //Mlt::Consumer *consumer = new Mlt::Consumer( profile , "sdl_preview");
+    m_mltConsumer = new Mlt::Consumer( *m_mltProfile , "sdl_preview");//consumer;
+    m_mltConsumer->set("resize", 1);
+    m_mltConsumer->set("window_id", winid);
+    m_mltConsumer->set("terminate_on_pause", 1);
+    m_externalwinid = extid;
+    m_winid = winid;
+    m_mltConsumer->listen("consumer-frame-show", this, (mlt_listener) consumer_frame_show);
+    Mlt::Producer *producer = new Mlt::Producer( *m_mltProfile , "westley-xml", "<westley><playlist><producer mlt_service=\"colour\" colour=\"blue\" /></playlist></westley>");
+    m_mltProducer = producer;
+    m_mltConsumer->connect(*m_mltProducer);
+    m_mltProducer->set_speed(0.0);
+    //m_mltConsumer->start();
+    //refresh();
+    //initSceneList();
+    }
     /*m_osdInfo = new Mlt::Filter("data_show");
     char *tmp = decodedString(m_osdProfile);
     m_osdInfo->set("resource", tmp);
@@ -88,70 +118,6 @@ void Render::closeMlt()
     //delete m_osdInfo;
 }
 
-
-static void consumer_frame_show(mlt_consumer, Render * self, mlt_frame frame_ptr)
-{
-    // detect if the producer has finished playing. Is there a better way to do it ?
-    //if (self->isBlocked) return;
-    if (mlt_properties_get_double( MLT_FRAME_PROPERTIES( frame_ptr ), "_speed" ) == 0.0) {
-        self->emitConsumerStopped();
-    }
-    else {
-       self->emitFrameNumber(mlt_frame_get_position(frame_ptr));
-    }
-}
-
-/** Wraps the VEML command of the same name; requests that the renderer
-should create a video window. If show is true, then the window should be
-displayed, otherwise it should be hidden. Render will emit the signal
-replyCreateVideoXWindow() once the renderer has replied. */
-
-void Render::createVideoXWindow(WId winid, WId externalMonitor)
-{
-    if (m_mltConsumer) {
-       delete m_mltConsumer;
-    }
-
-    m_mltConsumer = new Mlt::Consumer("sdl_preview");
-    if (!m_mltConsumer || !m_mltConsumer->is_valid()) {
-       KMessageBox::error(qApp->activeWindow(), i18n("Could not create the video preview window.\nThere is something wrong with your Kdenlive install.\n Exiting now..."));
-       kError()<<"Sorry, cannot create MLT consumer, check your MLT install you miss SDL libraries support in MLT";
-       exit(1);
-    }
-
-    //only as is saw, if we want to lock something with the sdl lock
-    /*if (!KdenliveSettings::videoprofile().isEmpty()) 
-       m_mltConsumer->set("profile", KdenliveSettings::videoprofile().ascii());*/
-
-    m_mltConsumer->set("profile", "hdv_1080_50i"); //KdenliveSettings::videoprofile().ascii());
-    /*m_mltConsumer->set("app_locked", 1);
-    m_mltConsumer->set("app_lock", (void *) &my_lock, 0);
-    m_mltConsumer->set("app_unlock", (void *) &my_unlock, 0);*/
-    m_externalwinid = (int) externalMonitor;
-    m_winid = (int) winid;
-    
-    m_mltConsumer->set("window_id", m_winid);
-    m_mltConsumer->set("resize", 1);
-    
-    m_mltConsumer->set("terminate_on_pause", 1);
-    /*QString aDevice = KdenliveSettings::audiodevice();
-    if (!KdenliveSettings::videodriver().isEmpty()) m_mltConsumer->set("video_driver", KdenliveSettings::videodriver().ascii());
-    if (!KdenliveSettings::audiodriver().isEmpty()) m_mltConsumer->set("audio_driver", KdenliveSettings::audiodriver().ascii());
-    m_mltConsumer->set("audio_device", aDevice.section(";", 1).ascii());*/
-    m_mltConsumer->set("progressive", 1);
-    m_mltConsumer->set("audio_buffer", 1024);
-    m_mltConsumer->set("frequency", 48000);
-
-    m_mltConsumer->listen("consumer-frame-show", this, (mlt_listener) consumer_frame_show);
-    //m_mltConsumer->start();
-    initSceneList();
-
-    //QTimer::singleShot(500, this, SLOT(initSceneList()));
-    //initSceneList();
-//  m_mltConsumer->listen("consumer-stopped", this, (mlt_listener) consumer_stopped);
-//  m_mltConsumer->set("buffer", 25);
-}
 
 
 int Render::resetRendererProfile(char * profile)
@@ -159,19 +125,12 @@ int Render::resetRendererProfile(char * profile)
     if (!m_mltConsumer) return 0;
     if (!m_mltConsumer->is_stopped()) m_mltConsumer->stop();
     m_mltConsumer->set("refresh", 0);
-    m_mltConsumer->set("profile", profile);
+    //m_mltConsumer->set("profile", profile);
     kDebug()<<" + + RESET CONSUMER WITH PROFILE: "<<profile;
-    m_fps = 25;
-    m_mltConsumer->set("fps", m_fps);
     mlt_properties properties = MLT_CONSUMER_PROPERTIES( m_mltConsumer->get_consumer() );
-    int result = mlt_consumer_profile( properties, profile );
+//    apply_profile_properties( m_profile, m_mltConsumer->get_consumer(), properties );
     refresh();
-    return result;
-}
-
-void Render::restartConsumer()
-{
-    if (m_winid != -1) createVideoXWindow( m_winid, m_externalwinid);
+    return 1;
 }
 
 /** Wraps the VEML command of the same name; Seeks the renderer clip to the given time. */
@@ -188,7 +147,7 @@ char *Render::decodedString(QString str)
     char *t = new char[fn.length() + 1];
     strcpy(t, (const char *)fn);*/
 
-  return qstrdup( str.toLatin1().data() );
+  return qstrdup( str.toUtf8().data() ); //toLatin1
 }
 
 //static
@@ -197,10 +156,6 @@ QPixmap Render::frameThumbnail(Mlt::Frame *frame, int width, int height, bool bo
     QPixmap pix(width, height);
 
     mlt_image_format format = mlt_image_rgb24a;
-    /*if (border) {
-       width = width -2;
-       height = height -2;
-    }*/
     uint8_t *thumb = frame->get_image(format, width, height);
     QImage image(thumb, width, height, QImage::Format_ARGB32);
   
@@ -210,12 +165,6 @@ QPixmap Render::frameThumbnail(Mlt::Frame *frame, int width, int height, bool bo
        QPainter painter(&pix);
        painter.drawRect(0, 0, width - 1, height - 1);
       }
-       /*if (!border) pix = pix.fromImage(image);
-       //bitBlt(&pix, 0, 0, &image, 0, 0, width, height);
-       else {
-               pix.fill(black);
-               bitBlt(&pix, 1, 1, &image, 0, 0, width, height);
-       }*/
     }
     else pix.fill(Qt::black);
     return pix;
@@ -230,7 +179,7 @@ QPixmap Render::extractFrame(int frame_position, int width, int height)
        return pix;
     }
     Mlt::Producer *mlt_producer = m_mltProducer->cut(frame_position, frame_position + 1);
-    Mlt::Filter m_convert("avcolour_space");
+    Mlt::Filter m_convert(*m_mltProfile, "avcolour_space");
     m_convert.set("forced", mlt_image_rgb24a);
     mlt_producer->attach(m_convert);
     Mlt::Frame *frame = mlt_producer->get_frame();
@@ -269,18 +218,19 @@ QPixmap Render::getImageThumbnail(KUrl url, int width, int height)
 }
 
 //static
-QPixmap Render::getVideoThumbnail(QString file, int frame_position, int width, int height)
+QPixmap Render::getVideoThumbnail(char *profile, QString file, int frame_position, int width, int height)
 {
     QPixmap pix(width, height);
     char *tmp = decodedString(file);
-    Mlt::Producer m_producer(tmp);
+    Mlt::Profile *prof = new Mlt::Profile(profile);
+    Mlt::Producer m_producer(*prof, tmp);
     delete[] tmp;
     if (m_producer.is_blank()) {
        pix.fill(Qt::black);
        return pix;
     }
 
-    Mlt::Filter m_convert("avcolour_space");
+    Mlt::Filter m_convert(*prof, "avcolour_space");
     m_convert.set("forced", mlt_image_rgb24a);
     m_producer.attach(m_convert);
     m_producer.seek(frame_position);
@@ -289,10 +239,11 @@ QPixmap Render::getVideoThumbnail(QString file, int frame_position, int width, i
        pix = frameThumbnail(frame, width, height, true);
        delete frame;
     }
+    if (prof) delete prof;
     return pix;
 }
 
-
+/*
 void Render::getImage(KUrl url, int frame_position, QPoint size)
 {
     char *tmp = decodedString(url.path());
@@ -313,10 +264,10 @@ void Render::getImage(KUrl url, int frame_position, QPoint size)
        delete frame;
        emit replyGetImage(url, frame_position, pix, size.x(), size.y());
     }
-}
+}*/
 
 /* Create thumbnail for color */
-void Render::getImage(int id, QString color, QPoint size)
+/*void Render::getImage(int id, QString color, QPoint size)
 {
     QPixmap pixmap(size.x() - 2, size.y() - 2);
     color = color.replace(0, 2, "#");
@@ -327,10 +278,10 @@ void Render::getImage(int id, QString color, QPoint size)
     //copyBlt(&result, 1, 1, &pixmap, 0, 0, size.x() - 2, size.y() - 2);
     emit replyGetImage(id, result, size.x(), size.y());
 
-}
+}*/
 
 /* Create thumbnail for image */
-void Render::getImage(KUrl url, QPoint size)
+/*void Render::getImage(KUrl url, QPoint size)
 {
     QImage im;
     QPixmap pixmap;
@@ -356,7 +307,7 @@ void Render::getImage(KUrl url, QPoint size)
     result.fill(Qt::black);
     //copyBlt(&result, 1, 1, &pixmap, 0, 0, size.x() - 2, size.y() - 2);
     emit replyGetImage(url, 1, result, size.x(), size.y());
-}
+}*/
 
 
 double Render::consumerRatio() const
@@ -380,7 +331,7 @@ int Render::getLength()
 bool Render::isValid(KUrl url)
 {
     char *tmp = decodedString(url.path());
-    Mlt::Producer producer(tmp);
+    Mlt::Producer producer(*m_mltProfile, tmp);
     delete[] tmp;
     if (producer.is_blank())
        return false;
@@ -388,30 +339,37 @@ bool Render::isValid(KUrl url)
     return true;
 }
 
-
-void Render::getFileProperties(const KUrl &url, uint framenb)
+void Render::getFileProperties(const QDomElement &xml, int clipId)
 {
         int height = 40;
         int width = height * 16/9.0; //KdenliveSettings::displayratio();
-       char *tmp = decodedString(url.path());
-       Mlt::Producer producer(tmp);
+       QDomDocument doc;
+       QDomElement westley = doc.createElement("westley");
+       doc.appendChild(westley);
+       westley.appendChild(doc.importNode(xml, true));
+       kDebug()<<"////////////\n"<<doc.toString()<<"////////////////\n";
+       char *tmp = decodedString(doc.toString());
+
+       Mlt::Producer producer(*m_mltProfile, "westley-xml", tmp);
        delete[] tmp;
+
        if (producer.is_blank()) {
            return;
        }
-       producer.seek( framenb );
+       int frameNumber = xml.attribute( "frame_thumbnail", 0).toInt();
+       if ( frameNumber != 0 ) producer.seek( frameNumber );
        mlt_properties properties = MLT_PRODUCER_PROPERTIES( producer.get_producer() );
 
        QMap < QString, QString > filePropertyMap;
         QMap < QString, QString > metadataPropertyMap;
 
+       KUrl url = xml.attribute("resource", QString::null);
        filePropertyMap["filename"] = url.path();
        filePropertyMap["duration"] = QString::number(producer.get_playtime());
-        
-        Mlt::Filter m_convert("avcolour_space");
+       kDebug()<<"///////  PRODUCER: "<<url.path()<<" IS: "<<producer.get_playtime();
+        Mlt::Filter m_convert(*m_mltProfile, "avcolour_space");
         m_convert.set("forced", mlt_image_rgb24a);
         producer.attach(m_convert);
-
        Mlt::Frame * frame = producer.get_frame();
 
        if (frame->is_valid()) {
@@ -470,15 +428,15 @@ void Render::getFileProperties(const KUrl &url, uint framenb)
                 // Generate thumbnail for this frame
                QPixmap pixmap = frameThumbnail(frame, width, height, true);
 
-                emit replyGetImage(url, 0, pixmap, width, height);
+                emit replyGetImage(clipId, 0, pixmap, width, height);
 
            } else if (frame->get_int("test_audio") == 0) {
                 QPixmap pixmap(KStandardDirs::locate("appdata", "graphics/music.png"));
-                emit replyGetImage(url, 0, pixmap, width, height);
+                emit replyGetImage(clipId, 0, pixmap, width, height);
                filePropertyMap["type"] = "audio";
             }
        }
-       emit replyGetFileProperties(filePropertyMap, metadataPropertyMap);
+       emit replyGetFileProperties(clipId, filePropertyMap, metadataPropertyMap);
        kDebug()<<"REquested fuile info for: "<<url.path();
        delete frame;
 }
@@ -533,19 +491,13 @@ void Render::setSceneList(QDomDocument list, int position)
 
     kWarning()<<"//////  RENDER, SET SCENE LIST";
 
-    Mlt::Playlist track;
-    char *tmp = decodedString(list.toString());
-   
-    Mlt::Producer clip("westley-xml", tmp);
-    delete[] tmp;
 
+/*
     if (!clip.is_valid()) {
        kWarning()<<" ++++ WARNING, UNABLE TO CREATE MLT PRODUCER";
        m_generateScenelist = false;
        return;
-    }
-
-    track.append(clip);
+    }*/
 
     if (m_mltConsumer) {
        m_mltConsumer->set("refresh", 0);
@@ -565,8 +517,12 @@ void Render::setSceneList(QDomDocument list, int position)
        emit stopped();
     }
 
-    m_mltProducer = new Mlt::Producer(clip); //track.current();
-    m_mltProducer->optimise();
+    char *tmp = decodedString(list.toString());
+    //Mlt::Producer clip(profile, "westley-xml", tmp);
+
+    m_mltProducer = new Mlt::Producer(*m_mltProfile, "westley-xml", tmp);
+    delete[] tmp;
+    //m_mltProducer->optimise();
     if (position != 0) m_mltProducer->seek(position);
 
     /*if (KdenliveSettings::osdtimecode()) {
@@ -593,11 +549,10 @@ void Render::setSceneList(QDomDocument list, int position)
        }*/
 
        m_fps = m_mltProducer->get_fps();
-        if (!m_mltConsumer) {
-           restartConsumer();
-        }
-       emit playListDuration( (int) m_mltProducer->get_playtime());
-       m_connectTimer->start( 500 );
+
+       emit playListDuration(m_mltProducer->get_playtime());
+       //m_connectTimer->start( 500 );
+       connectPlaylist();
        m_generateScenelist = false;
   
 }
@@ -608,17 +563,20 @@ const double Render::fps() const
 }
 
 void Render::connectPlaylist() {
-        kDebug()<<"**************  CONNECTING PLAYLIST";
+
         m_connectTimer->stop();
+       m_mltConsumer->connect(*m_mltProducer);
+       m_mltProducer->set_speed(0.0);
+       m_mltConsumer->start();
+       //refresh();
+/*
        if (m_mltConsumer->start() == -1) {
                KMessageBox::error(qApp->activeWindow(), i18n("Could not create the video preview window.\nThere is something wrong with your Kdenlive install or your driver settings, please fix it."));
                m_mltConsumer = NULL;
        }
        else {
-           m_mltConsumer->connect(*m_mltProducer);
-           m_mltProducer->set_speed(0.0);
            refresh();
-       }
+       }*/
 }
 
 void Render::refreshDisplay() {
@@ -671,22 +629,25 @@ void Render::slotOsdTimeout()
 
 void Render::start()
 {
-    if (!m_mltConsumer || m_winid == -1) {
-       restartConsumer();
+    kDebug()<<"-----  STARTING MONITOR: "<<m_name;
+    if (m_winid == -1) {
+    kDebug()<<"-----  BROKEN MONITOR: "<<m_name<<", RESTART";
        return;
     }
 
     if (m_mltConsumer->is_stopped()) {
+    kDebug()<<"-----  MONITOR: "<<m_name<<" WAS STOPPED";
        if (m_mltConsumer->start() == -1) {
            KMessageBox::error(qApp->activeWindow(), i18n("Could not create the video preview window.\nThere is something wrong with your Kdenlive install or your driver settings, please fix it."));
            m_mltConsumer = NULL;
            return;
        }
        else {
+         kDebug()<<"-----  MONITOR: "<<m_name<<" REFRESH";
                refresh();
        }
     }
-    isBlocked = false;
+    m_isBlocked = false;
 }
 
 void Render::clear()
@@ -707,13 +668,13 @@ void Render::clear()
 
 void Render::stop()
 {
-    kDebug()<<"/////////////   RENDER STOP-------";
     if (m_mltConsumer && !m_mltConsumer->is_stopped()) {
+       kDebug()<<"/////////////   RENDER STOPPED: "<<m_name;
        m_mltConsumer->set("refresh", 0);
-       // m_mltConsumer->stop();
+       m_mltConsumer->stop();
     }
     kDebug()<<"/////////////   RENDER STOP2-------";
-    isBlocked = true;
+    m_isBlocked = true;
 
     if (m_mltProducer) {
        m_mltProducer->set_speed(0.0);
@@ -821,9 +782,15 @@ void Render::askForRefresh()
     refreshTimer->start( 200 );
 }
 
+void Render::doRefresh()
+{
+    // Use a Timer so that we don't refresh too much
+    refresh();
+}
+
 void Render::refresh()
 {
-    if (!m_mltProducer)
+    if (!m_mltProducer || m_isBlocked)
        return;
     refreshTimer->stop();
     if (m_mltConsumer) {
@@ -901,8 +868,7 @@ void Render::exportCurrentFrame(KUrl url, bool notify) {
     int width = 1940; //KdenliveSettings::displaywidth();
 
     QPixmap pix(width, height);
-
-    Mlt::Filter m_convert("avcolour_space");
+    Mlt::Filter m_convert(*m_mltProfile, "avcolour_space");
     m_convert.set("forced", mlt_image_rgb24a);
     m_mltProducer->attach(m_convert);
     Mlt::Frame * frame = m_mltProducer->get_frame();
@@ -932,7 +898,7 @@ void Render::mltCheckLength()
         Mlt::Playlist trackPlaylist(( mlt_playlist ) trackProducer.get_service());
         duration = Mlt::Producer(trackPlaylist.get_producer()).get_playtime() - 1;
        m_mltProducer->set("out", duration);
-       emit durationChanged();
+       emit playListDuration(duration);
        return;
     }
     while (trackNb > 1) {
@@ -953,22 +919,27 @@ void Render::mltCheckLength()
        blackTrackPlaylist.remove_region( 0, blackDuration );
        int i = 0;
        int dur = duration;
-       
+       QDomDocument doc;
+       QDomElement black = doc.createElement("producer");
+       black.setAttribute("mlt_service", "colour");
+       black.setAttribute("colour", "black");
+       black.setAttribute("in", "0");
+       black.setAttribute("out", "13999");
         while (dur > 14000) { // <producer mlt_service=\"colour\" colour=\"black\" in=\"0\" out=\"13999\" />
-           mltInsertClip(0, GenTime(i * 14000, m_fps), QString("<westley><producer mlt_service=\"colour\" colour=\"black\" in=\"0\" out=\"13999\" /></westley>"));
+           mltInsertClip(0, GenTime(i * 14000, m_fps), black);
            dur = dur - 14000;
            i++;
         }
-
-       mltInsertClip(0, GenTime(), QString("<westley><producer mlt_service=\"colour\" colour=\"black\" in=\"0\" out=\"" + QString::number(dur) + "\" /></westley>"));
+       black.setAttribute("out", QString::number(dur));
+       mltInsertClip(0, GenTime(), black);
 
        m_mltProducer->set("out", duration);
-       emit durationChanged();
+       emit playListDuration(duration);
     }
 }
 
 
-void Render::mltInsertClip(int track, GenTime position, QString resource)
+void Render::mltInsertClip(int track, GenTime position, QDomElement element)
 {
     if (!m_mltProducer) {
        kDebug()<<"PLAYLIST NOT INITIALISED //////";
@@ -979,13 +950,18 @@ void Render::mltInsertClip(int track, GenTime position, QString resource)
        kDebug()<<"PLAYLIST BROKEN, CANNOT INSERT CLIP //////";
        return;
     }
+    m_isBlocked = true;
     Mlt::Service service(parentProd.get_service());
     Mlt::Tractor tractor(service);
 
+    QDomDocument doc;
+    doc.appendChild(doc.importNode(element, true));
+    QString resource = doc.toString();
+    kDebug()<<"///////  ADDING CLIP TMLNE: "<<resource<<" ON TRACK: "<<track;
     Mlt::Producer trackProducer(tractor.track(track));
     Mlt::Playlist trackPlaylist(( mlt_playlist ) trackProducer.get_service());
     char *tmp = decodedString(resource);
-    Mlt::Producer clip("westley-xml", tmp);
+    Mlt::Producer clip(*m_mltProfile, "westley-xml", tmp);
     //clip.set_in_and_out(in.frames(m_fps), out.frames(m_fps));
     delete[] tmp;
 
@@ -993,37 +969,27 @@ void Render::mltInsertClip(int track, GenTime position, QString resource)
     tractor.multitrack()->refresh();
     tractor.refresh();
     if (track != 0) mltCheckLength();
-    double duration = Mlt::Producer(trackPlaylist.get_producer()).get_playtime();
-    kDebug()<<"// +  +INSERTING CLIP: "<<resource<<" AT: "<<position.frames(m_fps)<<" on track: "<<track<<", DURATION: "<<duration;
-
-
+    m_isBlocked = false;
 }
 
 void Render::mltCutClip(int track, GenTime position)
 {
+    m_isBlocked = true;
     Mlt::Service service(m_mltProducer->parent().get_service());
-    if (service.type() == playlist_type) kDebug()<<"// PLAYLIST TYPE";
-    if (service.type() == tractor_type) kDebug()<<"// TRACOT TYPE";
-    if (service.type() == multitrack_type) kDebug()<<"// MULTITRACK TYPE";
-    if (service.type() == producer_type) kDebug()<<"// PROD TYPE";
-
     Mlt::Tractor tractor(service);
     Mlt::Producer trackProducer(tractor.track(track));
     Mlt::Playlist trackPlaylist(( mlt_playlist ) trackProducer.get_service());
     trackPlaylist.split_at(position.frames(m_fps));
     trackPlaylist.consolidate_blanks(0);
     kDebug()<<"/ / / /CUTTING CLIP AT: "<<position.frames(m_fps);
+    m_isBlocked = false;
 }
 
 
 void Render::mltRemoveClip(int track, GenTime position)
 {
+    m_isBlocked = true;
     Mlt::Service service(m_mltProducer->parent().get_service());
-    if (service.type() == playlist_type) kDebug()<<"// PLAYLIST TYPE";
-    if (service.type() == tractor_type) kDebug()<<"// TRACOT TYPE";
-    if (service.type() == multitrack_type) kDebug()<<"// MULTITRACK TYPE";
-    if (service.type() == producer_type) kDebug()<<"// PROD TYPE";
-
     Mlt::Tractor tractor(service);
     Mlt::Producer trackProducer(tractor.track(track));
     Mlt::Playlist trackPlaylist(( mlt_playlist ) trackProducer.get_service());
@@ -1033,10 +999,12 @@ void Render::mltRemoveClip(int track, GenTime position)
     trackPlaylist.consolidate_blanks(0);
     if (track != 0) mltCheckLength();
     //emit durationChanged();
+    m_isBlocked = false;
 }
 
-void Render::mltRemoveEffect(int track, GenTime position, QString id, QString tag, int index)
+void Render::mltRemoveEffect(int track, GenTime position, QString tag, int index)
 {
+
     Mlt::Service service(m_mltProducer->parent().get_service());
 
     Mlt::Tractor tractor(service);
@@ -1048,6 +1016,7 @@ void Render::mltRemoveEffect(int track, GenTime position, QString id, QString ta
        kDebug()<<" / / / CANNOT FIND CLIP TO REMOVE EFFECT";
        return;
     }
+    m_isBlocked = true;
     Mlt::Service clipService(clip->get_service());
 
     if (tag.startsWith("ladspa")) tag = "ladspa";
@@ -1056,7 +1025,7 @@ void Render::mltRemoveEffect(int track, GenTime position, QString id, QString ta
        int ct = 0;
        Mlt::Filter *filter = clipService.filter( ct );
        while (filter) {
-           if (filter->get("mlt_service") == tag && filter->get("kdenlive_id") == id) {
+           if (filter->get("mlt_service") == tag) {// && filter->get("kdenlive_id") == id) {
                clipService.detach(*filter);
                kDebug()<<" / / / DLEETED EFFECT: "<<ct;
            }
@@ -1066,19 +1035,19 @@ void Render::mltRemoveEffect(int track, GenTime position, QString id, QString ta
     }
     else {
         Mlt::Filter *filter = clipService.filter( index );
-        if (filter && filter->get("mlt_service") == tag && filter->get("kdenlive_id") == id) clipService.detach(*filter);
+        if (filter && filter->get("mlt_service") == tag /*&& filter->get("kdenlive_id") == id*/) clipService.detach(*filter);
         else {
-           kDebug()<<"WARINIG, FILTER "<<id<<" NOT FOUND!!!!!";
+           kDebug()<<"WARINIG, FILTER "<<tag<<" NOT FOUND!!!!!";
         }
     }
+    m_isBlocked = false;
     refresh();
 }
 
 
-void Render::mltAddEffect(int track, GenTime position, QString id, QString tag, QMap <QString, QString> args)
+void Render::mltAddEffect(int track, GenTime position, QString tag, QMap <QString, QString> args)
 {
     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());
@@ -1090,12 +1059,12 @@ void Render::mltAddEffect(int track, GenTime position, QString id, QString tag,
        return;
     }
     Mlt::Service clipService(clip->get_service());
-
+    m_isBlocked = true;
     // create filter
-    kDebug()<<" / / INSERTING EFFECT: "<<id;
+    //kDebug()<<" / / INSERTING EFFECT: "<<id;
     if (tag.startsWith("ladspa")) tag = "ladspa";
     char *filterId = decodedString(tag);
-    Mlt::Filter *filter = new Mlt::Filter(filterId);
+    Mlt::Filter *filter = new Mlt::Filter(*m_mltProfile, filterId);
     filter->set("kdenlive_id", filterId);
 
     QMap<QString, QString>::Iterator it;
@@ -1110,7 +1079,7 @@ void Render::mltAddEffect(int track, GenTime position, QString id, QString tag,
            if (currentKeyFrameNumber != keyFrameNumber) {
                // attach filter to the clip
                clipService.attach(*filter);
-               filter = new Mlt::Filter(filterId);
+               filter = new Mlt::Filter(*m_mltProfile, filterId);
                filter->set("kdenlive_id", filterId);
                keyFrameNumber = currentKeyFrameNumber;
            }
@@ -1126,6 +1095,7 @@ void Render::mltAddEffect(int track, GenTime position, QString id, QString tag,
     // attach filter to the clip
     clipService.attach(*filter);
     delete[] filterId;
+    m_isBlocked = false;
     refresh();
 
 }
@@ -1135,11 +1105,11 @@ void Render::mltEditEffect(int track, GenTime position, int index, QString id, Q
     QMap<QString, QString>::Iterator it = args.begin();
     if (it.key().startsWith("#") || tag.startsWith("ladspa") || tag == "sox" || tag == "autotrack_rectangle") {
        // This is a keyframe effect, to edit it, we remove it and re-add it.
-       mltRemoveEffect(track, position, id, tag, -1);
-       mltAddEffect(track, position, id, tag, args);
+       mltRemoveEffect(track, position, tag, -1);
+       mltAddEffect(track, position, tag, args);
        return;
     }
-
+    m_isBlocked = true;
     // create filter
     Mlt::Service service(m_mltProducer->parent().get_service());
 
@@ -1164,6 +1134,7 @@ void Render::mltEditEffect(int track, GenTime position, int index, QString id, Q
     }
     if (!filter) {
        kDebug()<<"WARINIG, FILTER "<<id<<" NOT FOUND!!!!!";
+       m_isBlocked = false;
        return;
     }
 
@@ -1175,11 +1146,13 @@ void Render::mltEditEffect(int track, GenTime position, int index, QString id, Q
        delete[] name;
        delete[] value;
     }
+    m_isBlocked = false;
     refresh();
 }
 
 void Render::mltResizeClipEnd(int track, GenTime pos, GenTime in, GenTime out)
 {
+    m_isBlocked = true;
     Mlt::Service service(m_mltProducer->parent().get_service());
 
     Mlt::Tractor tractor(service);
@@ -1208,7 +1181,7 @@ void Render::mltResizeClipEnd(int track, GenTime pos, GenTime in, GenTime out)
     tractor.multitrack()->refresh();
     tractor.refresh();
     if (track != 0) mltCheckLength();
-
+    m_isBlocked = false;
 }
 
 void Render::mltChangeTrackState(int track, bool mute, bool blind)
@@ -1235,12 +1208,8 @@ void Render::mltChangeTrackState(int track, bool mute, bool blind)
 
 void Render::mltResizeClipStart(int track, GenTime pos, GenTime moveEnd, GenTime moveStart, GenTime in, GenTime out)
 {
+    m_isBlocked = true;
     Mlt::Service service(m_mltProducer->parent().get_service());
-    if (service.type() == playlist_type) kDebug()<<"// PLAYLIST TYPE";
-    if (service.type() == tractor_type) kDebug()<<"// TRACOT TYPE";
-    if (service.type() == multitrack_type) kDebug()<<"// MULTITRACK TYPE";
-    if (service.type() == producer_type) kDebug()<<"// PROD TYPE";
-
     int moveFrame = (moveEnd - moveStart).frames(m_fps);
 
     Mlt::Tractor tractor(service);
@@ -1265,7 +1234,7 @@ void Render::mltResizeClipStart(int track, GenTime pos, GenTime moveEnd, GenTime
        else trackPlaylist.resize_clip(blankIndex, 0, blankLength + moveFrame -1);
     }
     trackPlaylist.consolidate_blanks(0);
-
+    m_isBlocked = false;
     kDebug()<<"-----------------\n"<<"CLIP 0: "<<trackPlaylist.clip_start(0)<<", LENGT: "<<trackPlaylist.clip_length(0);
     kDebug()<<"CLIP 1: "<<trackPlaylist.clip_start(1)<<", LENGT: "<<trackPlaylist.clip_length(1);
     kDebug()<<"CLIP 2: "<<trackPlaylist.clip_start(2)<<", LENGT: "<<trackPlaylist.clip_length(2);
@@ -1281,7 +1250,8 @@ void Render::mltMoveClip(int startTrack, int endTrack, GenTime moveStart, GenTim
 
 void Render::mltMoveClip(int startTrack, int endTrack, int moveStart, int moveEnd)
 {
-    m_mltConsumer->set("refresh", 0);
+    m_isBlocked = true;
+    //m_mltConsumer->set("refresh", 0);
     Mlt::Service service(m_mltProducer->parent().get_service());
 
     Mlt::Tractor tractor(service);
@@ -1298,7 +1268,7 @@ void Render::mltMoveClip(int startTrack, int endTrack, int moveStart, int moveEn
 
     Mlt::Producer clipProducer(trackPlaylist.replace_with_blank(clipIndex));
     trackPlaylist.consolidate_blanks(0);
-    mlt_events_block( MLT_PRODUCER_PROPERTIES(clipProducer.get_producer()), NULL );
+    mlt_events_block( MLT_PRODUCER_PROPERTIES(trackProducer.get_producer()), NULL );
 
     if (endTrack == startTrack) {
        if (!trackPlaylist.is_blank_at(moveEnd)) {
@@ -1319,11 +1289,14 @@ void Render::mltMoveClip(int startTrack, int endTrack, int moveStart, int moveEn
     }
 
     mltCheckLength();
-    mlt_events_unblock( MLT_PRODUCER_PROPERTIES(clipProducer.get_producer()), NULL );
+    mlt_events_unblock( MLT_PRODUCER_PROPERTIES(trackProducer.get_producer()), NULL );
+    m_isBlocked = false;
+    m_mltConsumer->set("refresh", 1);
 }
 
 void Render::mltMoveTransition(QString type, int startTrack, int trackOffset, GenTime oldIn, GenTime oldOut, GenTime newIn, GenTime newOut)
 {
+    m_isBlocked = true;
     m_mltConsumer->set("refresh", 0);
     mlt_service serv = m_mltProducer->parent().get_service();
 
@@ -1357,17 +1330,18 @@ void Render::mltMoveTransition(QString type, int startTrack, int trackOffset, Ge
        mlt_type = mlt_properties_get( properties, "mlt_type" );
        resource = mlt_properties_get( properties, "mlt_service" );
     }
+    m_isBlocked = false;
 }
 
 void Render::mltAddTransition(QString tag, int a_track, int b_track, GenTime in, GenTime out, QMap <QString, QString> args)
 {
+    m_isBlocked = true;
     Mlt::Service service(m_mltProducer->parent().get_service());
 
     Mlt::Tractor tractor(service);
     Mlt::Field *field = tractor.field();
-
     char *transId = decodedString(tag);
-    Mlt::Transition *transition = new Mlt::Transition(transId);
+    Mlt::Transition *transition = new Mlt::Transition(*m_mltProfile, transId);
     transition->set_in_and_out((int) in.frames(m_fps), (int) out.frames(m_fps));
     QMap<QString, QString>::Iterator it;
     QString key;
@@ -1387,6 +1361,7 @@ void Render::mltAddTransition(QString tag, int a_track, int b_track, GenTime in,
     // attach filter to the clip
     field->plant_transition(*transition, a_track, b_track);
     delete[] transId;
+    m_isBlocked = false;
     refresh();
 
 }
@@ -1394,7 +1369,7 @@ void Render::mltAddTransition(QString tag, int a_track, int b_track, GenTime in,
 void Render::mltSavePlaylist()
 {
     kWarning()<<"// UPDATING PLAYLIST TO DISK++++++++++++++++";
-    Mlt::Consumer *fileConsumer = new Mlt::Consumer("westley");
+    Mlt::Consumer *fileConsumer = new Mlt::Consumer(*m_mltProfile, "westley");
     fileConsumer->set("resource", "/home/one/playlist.xml");
 
     Mlt::Service service(m_mltProducer->get_service());