+void Render::mltUpdateClipProducer(int track, int pos, Mlt::Producer *prod) {
+ kDebug() << "NEW PROD ID: " << prod->get("id");
+ m_mltConsumer->set("refresh", 0);
+ kDebug() << "// TRYING TO UPDATE CLIP at: " << pos << ", TK: " << track;
+ mlt_service_lock(m_mltConsumer->get_service());
+ Mlt::Service service(m_mltProducer->parent().get_service());
+ if (service.type() != tractor_type) kWarning() << "// TRACTOR PROBLEM";
+
+ 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(pos + 1);
+ Mlt::Producer clipProducer(trackPlaylist.replace_with_blank(clipIndex));
+ if (clipProducer.is_blank()) {
+ kDebug() << "// ERROR UPDATING CLIP PROD";
+ mlt_service_unlock(m_mltConsumer->get_service());
+ m_isBlocked = false;
+ return;
+ }
+ Mlt::Producer *clip = prod->cut(clipProducer.get_in(), clipProducer.get_out());
+
+ // move all effects to the correct producer
+ Mlt::Service clipService(clipProducer.get_service());
+ Mlt::Service newClipService(clip->get_service());
+
+ int ct = 0;
+ Mlt::Filter *filter = clipService.filter(ct);
+ while (filter) {
+ if (filter->get("kdenlive_ix") != 0) {
+ clipService.detach(*filter);
+ newClipService.attach(*filter);
+ } else ct++;
+ filter = clipService.filter(ct);
+ }
+
+ trackPlaylist.insert_at(pos, clip, 1);
+ mlt_service_unlock(m_mltConsumer->get_service());
+ m_isBlocked = false;
+}
+
+bool Render::mltMoveClip(int startTrack, int endTrack, int moveStart, int moveEnd, Mlt::Producer *prod) {