return result;
}
-void Render::saveSceneList(QString path, QDomElement addedXml) {
+void Render::saveSceneList(QString path, QDomElement kdenliveData) {
char *tmppath = decodedString("westley:" + path);
Mlt::Consumer westleyConsumer(*m_mltProfile , tmppath);
westleyConsumer.set("terminate_on_pause", 1);
Mlt::Producer prod(m_mltProducer->get_producer());
westleyConsumer.connect(prod);
+ //prod.set("title", "kdenlive document");
+ //westleyConsumer.listen("consumer-frame-show", this, (mlt_listener) consumer_frame_show);
westleyConsumer.start();
- if (!addedXml.isNull()) {
+ while (!westleyConsumer.is_stopped()) {}
+ if (!kdenliveData.isNull()) {
// add Kdenlive specific tags
QFile file(path);
QDomDocument doc;
- //doc.setContent(&file, false);
- doc.appendChild(doc.importNode(addedXml, true));
+ doc.setContent(&file, false);
+ QDomNode wes = doc.elementsByTagName("westley").at(0);
+ wes.appendChild(doc.importNode(kdenliveData, true));
file.close();
if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) {
kWarning() << "////// ERROR writing to file: " << path;
void Render::mltCheckLength(bool reload) {
//kDebug()<<"checking track length: "<<track<<"..........";
- if (reload) {
- //reinsert main tractorin playlist so that the producer can take the new length ( not automatic done)
- Mlt::Service service(m_mltProducer->get_service());
- Mlt::Playlist prod(service);
- Mlt::Service service_playlist(prod.get_clip(0)->get_service());
- Mlt::Producer producer_playlist(service_playlist);
-
- Mlt::Tractor tr(producer_playlist.parent());
- prod.remove(0);
- prod.insert(tr, 0);
- }
- Mlt::Tractor *tractor = getTractor();
+ Mlt::Service service(m_mltProducer->get_service());
+ Mlt::Tractor tractor(service);
- int trackNb = tractor->count();
+ int trackNb = tractor.count();
double duration = 0;
- double trackDuration = 0;
+ double trackDuration;
if (trackNb == 1) {
- Mlt::Producer trackProducer(tractor->track(0));
+ Mlt::Producer trackProducer(tractor.track(0));
Mlt::Playlist trackPlaylist((mlt_playlist) trackProducer.get_service());
duration = Mlt::Producer(trackPlaylist.get_producer()).get_playtime() - 1;
- kDebug() << trackNb << " " << duration;
m_mltProducer->set("out", duration);
- emit durationChanged((int)duration);
+ emit durationChanged((int) duration);
return;
}
while (trackNb > 1) {
- Mlt::Producer trackProducer(tractor->track(trackNb - 1));
+ Mlt::Producer trackProducer(tractor.track(trackNb - 1));
Mlt::Playlist trackPlaylist((mlt_playlist) trackProducer.get_service());
trackDuration = Mlt::Producer(trackPlaylist.get_producer()).get_playtime() - 1;
trackNb--;
}
- Mlt::Producer blackTrackProducer(tractor->track(0));
+ Mlt::Producer blackTrackProducer(tractor.track(0));
Mlt::Playlist blackTrackPlaylist((mlt_playlist) blackTrackProducer.get_service());
double blackDuration = Mlt::Producer(blackTrackPlaylist.get_producer()).get_playtime() - 1;
kDebug() << " / / /DURATON FOR TRACK 0 = " << blackDuration;
m_mltProducer->set("out", duration);
emit durationChanged((int)duration);
}
- if (tractor)
- delete tractor;
-}
-
-Mlt::Tractor* Render::getTractor() {
- Mlt::Service s1(m_mltProducer->get_service());
- Mlt::Playlist pl(s1);
- Mlt::Producer srv(pl.get_clip(0)->parent());
- Mlt::Tractor *tractor = new Mlt::Tractor(srv);
- return tractor;
}
-Mlt::Playlist* Render::getPlaylist(int track) {
- Mlt::Tractor *tractor = getTractor();
-
- if (tractor) {
-
- Mlt::Producer trackProducer(tractor->track(track));
- Mlt::Service playlistservice(trackProducer.get_service());
- delete tractor;
- return new Mlt::Playlist(playlistservice);
-
- }
- return NULL;
-
-}
void Render::mltInsertClip(int track, GenTime position, QDomElement element) {
if (!m_mltProducer) {
kDebug() << "PLAYLIST NOT INITIALISED //////";
kDebug() << "PLAYLIST BROKEN, CANNOT INSERT CLIP //////";
return;
}
- m_isBlocked = true;
- // Mlt::Service service(parentProd.get_service());
- //Mlt::Tractor tractor(service);
+ Mlt::Service service(parentProd.get_service());
+ Mlt::Tractor tractor(service);
+
+ Mlt::Producer trackProducer(tractor.track(track));
+ Mlt::Playlist trackPlaylist((mlt_playlist) trackProducer.get_service());
QDomDocument doc;
doc.appendChild(doc.importNode(element, true));
QString resource = doc.toString();
+ char *tmp = decodedString(resource);
+ Mlt::Producer clip(*m_mltProfile, "westley-xml", tmp);
+ //clip.set_in_and_out(in.frames(m_fps), out.frames(m_fps));
+ delete[] tmp;
- kDebug() << "/////// ADDING CLIP TMLNE: " << resource << " ON TRACK: " << track;
- //Mlt::Tractor *tractor = getTractor();
- //if (tractor) {
- Mlt::Playlist *trackPlaylist = getPlaylist(track);
- if (trackPlaylist) {
- char *tmp = decodedString(resource);
- Mlt::Producer clip(*m_mltProfile, "westley-xml", tmp);
- //clip.set_in_and_out(in.frames(m_fps), out.frames(m_fps));
- delete[] tmp;
-
- trackPlaylist->insert_at((int)position.frames(m_fps), clip, 1);
- //tractor->multitrack()->refresh();
- //tractor->refresh();
- if (track != 0) mltCheckLength();
-
-
-
- delete trackPlaylist;
- mltSavePlaylist();
- }
- //delete tractor;
- //}
- m_isBlocked = false;
+ trackPlaylist.insert_at((int) position.frames(m_fps), clip, 1);
+ if (track != 0) mltCheckLength();
+ tractor.multitrack()->refresh();
+ tractor.refresh();
}
void Render::mltCutClip(int track, GenTime position) {
m_isBlocked = true;
- Mlt::Playlist *trackPlaylist = getPlaylist(track);
- if (trackPlaylist) {
- trackPlaylist->split_at((int)position.frames(m_fps));
- trackPlaylist->consolidate_blanks(0);
- kDebug() << "/ / / /CUTTING CLIP AT: " << position.frames(m_fps);
- delete trackPlaylist;
- }
+
+ 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());
+ trackPlaylist.split_at((int) position.frames(m_fps));
+ trackPlaylist.consolidate_blanks(0);
m_isBlocked = false;
}
void Render::mltRemoveClip(int track, GenTime position) {
m_isBlocked = true;
- Mlt::Playlist *trackPlaylist = getPlaylist(track);
- if (trackPlaylist) {
- int clipIndex = trackPlaylist->get_clip_index_at((int)position.frames(m_fps));
- //trackPlaylist.remove(clipIndex);
- trackPlaylist->replace_with_blank(clipIndex);
- trackPlaylist->consolidate_blanks(0);
- if (track != 0) mltCheckLength();
- delete trackPlaylist;
- }
+
+ 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((int) position.frames(m_fps));
+ trackPlaylist.replace_with_blank(clipIndex);
+ trackPlaylist.consolidate_blanks(0);
+ if (track != 0) mltCheckLength();
//emit durationChanged();
m_isBlocked = false;
}
void Render::mltRemoveEffect(int track, GenTime position, QString index, bool doRefresh) {
- Mlt::Playlist *trackPlaylist = getPlaylist(track);
- if (trackPlaylist) {
- //int clipIndex = trackPlaylist.get_clip_index_at(position.frames(m_fps));
- Mlt::Producer *clip = trackPlaylist->get_clip_at((int)position.frames(m_fps));
- if (!clip) {
- kDebug() << " / / / CANNOT FIND CLIP TO REMOVE EFFECT";
- return;
- }
- m_isBlocked = true;
- Mlt::Service clipService(clip->get_service());
-// if (tag.startsWith("ladspa")) tag = "ladspa";
+ Mlt::Service service(m_mltProducer->parent().get_service());
- int ct = 0;
- Mlt::Filter *filter = clipService.filter(ct);
- while (filter) {
- if (index == "-1" || filter->get("kdenlive_ix") == index) {// && filter->get("kdenlive_id") == id) {
- clipService.detach(*filter);
- kDebug() << " / / / DLEETED EFFECT: " << ct;
- } else ct++;
- filter = clipService.filter(ct);
- }
- m_isBlocked = false;
- if (doRefresh) refresh();
- delete trackPlaylist;
+ 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));
+ if (!clip) {
+ kDebug() << " / / / CANNOT FIND CLIP TO REMOVE EFFECT";
+ return;
+ }
+ Mlt::Service clipService(clip->get_service());
+// if (tag.startsWith("ladspa")) tag = "ladspa";
+ m_isBlocked = true;
+ int ct = 0;
+ Mlt::Filter *filter = clipService.filter(ct);
+ while (filter) {
+ if (index == "-1" || filter->get("kdenlive_ix") == index) {// && filter->get("kdenlive_id") == id) {
+ clipService.detach(*filter);
+ kDebug() << " / / / DLEETED EFFECT: " << ct;
+ } else ct++;
+ filter = clipService.filter(ct);
}
+ m_isBlocked = false;
+ if (doRefresh) refresh();
}
void Render::mltAddEffect(int track, GenTime position, QMap <QString, QString> args, bool doRefresh) {
- Mlt::Playlist *trackPlaylist = getPlaylist(track);
- if (trackPlaylist) {
- Mlt::Producer *clip = trackPlaylist->get_clip_at((int)position.frames(m_fps));
+ Mlt::Service service(m_mltProducer->parent().get_service());
- if (!clip) {
- kDebug() << "********** CANNOT FIND CLIP TO APPLY EFFECT-----------";
- return;
- }
- Mlt::Service clipService(clip->get_service());
- m_isBlocked = true;
- // create filter
- QString tag = args.value("tag");
- //kDebug()<<" / / INSERTING EFFECT: "<<id;
- if (tag.startsWith("ladspa")) tag = "ladspa";
- char *filterId = decodedString(tag);
- Mlt::Filter *filter = new Mlt::Filter(*m_mltProfile, filterId);
- if (filter && filter->is_valid())
- filter->set("kdenlive_id", filterId);
- else {
- kDebug() << "filter is NULL";
- return;
- }
+ Mlt::Tractor tractor(service);
+ Mlt::Producer trackProducer(tractor.track(track));
+ Mlt::Playlist trackPlaylist((mlt_playlist) trackProducer.get_service());
- QMap<QString, QString>::Iterator it;
- QString keyFrameNumber = "#0";
+ Mlt::Producer *clip = trackPlaylist.get_clip_at((int) position.frames(m_fps));
- for (it = args.begin(); it != args.end(); ++it) {
- //kDebug()<<" / / INSERTING EFFECT ARGS: "<<it.key()<<": "<<it.data();
- QString key;
- QString currentKeyFrameNumber;
- if (it.key().startsWith("#")) {
- currentKeyFrameNumber = it.key().section(":", 0, 0);
- if (currentKeyFrameNumber != keyFrameNumber) {
- // attach filter to the clip
- clipService.attach(*filter);
- filter = new Mlt::Filter(*m_mltProfile, filterId);
- filter->set("kdenlive_id", filterId);
- keyFrameNumber = currentKeyFrameNumber;
- }
- key = it.key().section(":", 1);
- } else key = it.key();
- char *name = decodedString(key);
- char *value = decodedString(it.value());
- filter->set(name, value);
- delete[] name;
- delete[] value;
- }
- // attach filter to the clip
- clipService.attach(*filter);
- delete[] filterId;
+ if (!clip) {
+ kDebug() << "********** CANNOT FIND CLIP TO APPLY EFFECT-----------";
+ return;
+ }
+ Mlt::Service clipService(clip->get_service());
+ m_isBlocked = true;
+ // create filter
+ QString tag = args.value("tag");
+ //kDebug()<<" / / INSERTING EFFECT: "<<id;
+ if (tag.startsWith("ladspa")) tag = "ladspa";
+ char *filterId = decodedString(tag);
+ Mlt::Filter *filter = new Mlt::Filter(*m_mltProfile, filterId);
+ if (filter && filter->is_valid())
+ filter->set("kdenlive_id", filterId);
+ else {
+ kDebug() << "filter is NULL";
m_isBlocked = false;
- if (doRefresh) refresh();
- delete trackPlaylist;
+ return;
}
+ QMap<QString, QString>::Iterator it;
+ QString keyFrameNumber = "#0";
+
+ for (it = args.begin(); it != args.end(); ++it) {
+ //kDebug()<<" / / INSERTING EFFECT ARGS: "<<it.key()<<": "<<it.data();
+ QString key;
+ QString currentKeyFrameNumber;
+ if (it.key().startsWith("#")) {
+ currentKeyFrameNumber = it.key().section(":", 0, 0);
+ if (currentKeyFrameNumber != keyFrameNumber) {
+ // attach filter to the clip
+ clipService.attach(*filter);
+ filter = new Mlt::Filter(*m_mltProfile, filterId);
+ filter->set("kdenlive_id", filterId);
+ keyFrameNumber = currentKeyFrameNumber;
+ }
+ key = it.key().section(":", 1);
+ } else key = it.key();
+ char *name = decodedString(key);
+ char *value = decodedString(it.value());
+ filter->set(name, value);
+ delete[] name;
+ delete[] value;
+ }
+ // attach filter to the clip
+ clipService.attach(*filter);
+ delete[] filterId;
+ m_isBlocked = false;
+ if (doRefresh) refresh();
}
void Render::mltEditEffect(int track, GenTime position, QMap <QString, QString> args) {
mltAddEffect(track, position, args);
return;
}
- m_isBlocked = true;
+
// create filter
+ Mlt::Service service(m_mltProducer->parent().get_service());
- Mlt::Playlist *trackPlaylist = getPlaylist(track);
+ 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));
- if (trackPlaylist) {
- Mlt::Producer *clip = trackPlaylist->get_clip_at((int)position.frames(m_fps));
- if (!clip) {
- kDebug() << "WARINIG, CANNOT FIND CLIP ON track: " << track << ", AT POS: " << position.frames(m_fps);
- m_isBlocked = false;
- return;
- }
-
- Mlt::Service clipService(clip->get_service());
-
-// if (tag.startsWith("ladspa")) tag = "ladspa";
-
- int ct = 0;
- Mlt::Filter *filter = clipService.filter(ct);
- while (filter) {
- if (filter->get("kdenlive_ix") == index) {
- break;
- }
- ct++;
- filter = clipService.filter(ct);
+ Mlt::Producer *clip = trackPlaylist.get_clip_at((int) position.frames(m_fps));
+ if (!clip) {
+ kDebug() << "WARINIG, CANNOT FIND CLIP ON track: " << track << ", AT POS: " << position.frames(m_fps);
+ return;
+ }
+ Mlt::Service clipService(clip->get_service());
+ m_isBlocked = true;
+ int ct = 0;
+ Mlt::Filter *filter = clipService.filter(ct);
+ while (filter) {
+ if (filter->get("kdenlive_ix") == index) {
+ break;
}
+ ct++;
+ filter = clipService.filter(ct);
+ }
- if (!filter) {
- kDebug() << "WARINIG, FILTER FOR EDITING NOT FOUND, ADDING IT!!!!!";
- mltAddEffect(track, position, args);
- m_isBlocked = false;
- return;
- }
-
- for (it = args.begin(); it != args.end(); ++it) {
- kDebug() << " / / EDITING EFFECT ARGS: " << it.key() << ": " << it.value();
- char *name = decodedString(it.key());
- char *value = decodedString(it.value());
- filter->set(name, value);
- delete[] name;
- delete[] value;
- }
+ if (!filter) {
+ kDebug() << "WARINIG, FILTER FOR EDITING NOT FOUND, ADDING IT!!!!!";
+ mltAddEffect(track, position, args);
m_isBlocked = false;
- refresh();
- delete trackPlaylist;
+ return;
+ }
+
+ for (it = args.begin(); it != args.end(); ++it) {
+ kDebug() << " / / EDITING EFFECT ARGS: " << it.key() << ": " << it.value();
+ char *name = decodedString(it.key());
+ char *value = decodedString(it.value());
+ filter->set(name, value);
+ delete[] name;
+ delete[] value;
}
+ m_isBlocked = false;
+ refresh();
}
void Render::mltResizeClipEnd(int track, GenTime pos, GenTime in, GenTime out) {
m_isBlocked = true;
- Mlt::Playlist *trackPlaylist = getPlaylist(track);
- if (trackPlaylist) {
- //Mlt::Tractor *tractor = getTractor();
- if (trackPlaylist->is_blank_at((int)pos.frames(m_fps) + 1))
- kDebug() << "//////// ERROR RSIZING BLANK CLIP!!!!!!!!!!!";
- int clipIndex = trackPlaylist->get_clip_index_at((int)pos.frames(m_fps) + 1);
-
- int previousDuration = trackPlaylist->clip_length(clipIndex) - 1;
- int newDuration = (int)(out.frames(m_fps) - 1);
-
- kDebug() << " ** RESIZING CLIP END:" << clipIndex << " on track:" << track << ", mid pos: " << pos.frames(25) << ", in: " << in.frames(25) << ", out: " << out.frames(25) << ", PREVIOUS duration: " << previousDuration;
- trackPlaylist->resize_clip(clipIndex, (int)in.frames(m_fps), newDuration);
- trackPlaylist->consolidate_blanks(0);
- if (previousDuration < newDuration) {
- // clip was made longer, trim next blank if there is one.
- if (trackPlaylist->is_blank(clipIndex + 1)) {
- trackPlaylist->split(clipIndex + 1, newDuration - previousDuration);
- trackPlaylist->remove(clipIndex + 1);
- }
- } else trackPlaylist->insert_blank(clipIndex + 1, previousDuration - newDuration - 1);
-
- trackPlaylist->consolidate_blanks(0);
- //tractor->multitrack()->refresh();
- //tractor->refresh();
- if (track != 0) mltCheckLength();
- //if (tractor)
- // delete tractor;
- m_isBlocked = false;
- delete trackPlaylist;
- }
+ 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());
+ if (trackPlaylist.is_blank_at((int) pos.frames(m_fps) + 1))
+ kDebug() << "//////// ERROR RSIZING BLANK CLIP!!!!!!!!!!!";
+ int clipIndex = trackPlaylist.get_clip_index_at((int) pos.frames(m_fps) + 1);
+
+ int previousDuration = trackPlaylist.clip_length(clipIndex) - 1;
+ int newDuration = (int) out.frames(m_fps) - 1;
+
+ kDebug() << " ** RESIZING CLIP END:" << clipIndex << " on track:" << track << ", mid pos: " << pos.frames(25) << ", in: " << in.frames(25) << ", out: " << out.frames(25) << ", PREVIOUS duration: " << previousDuration;
+ trackPlaylist.resize_clip(clipIndex, (int) in.frames(m_fps), newDuration);
+ trackPlaylist.consolidate_blanks(0);
+ if (previousDuration < newDuration) {
+ // clip was made longer, trim next blank if there is one.
+ if (trackPlaylist.is_blank(clipIndex + 1)) {
+ trackPlaylist.split(clipIndex + 1, newDuration - previousDuration);
+ trackPlaylist.remove(clipIndex + 1);
+ }
+ } else trackPlaylist.insert_blank(clipIndex + 1, previousDuration - newDuration - 1);
+
+ trackPlaylist.consolidate_blanks(0);
+ tractor.multitrack()->refresh();
+ tractor.refresh();
+ if (track != 0) mltCheckLength();
+ m_isBlocked = false;
}
void Render::mltChangeTrackState(int track, bool mute, bool blind) {
-
- Mlt::Tractor *tractor = getTractor();
- if (tractor) {
- Mlt::Producer trackProducer(tractor->track(track));
- if (mute) {
- if (blind) trackProducer.set("hide", 3);
- else trackProducer.set("hide", 2);
- } else if (blind) {
- trackProducer.set("hide", 1);
- } else {
- trackProducer.set("hide", 0);
- }
- //tractor->multitrack()->refresh();
- //tractor->refresh();
- //delete tractor;
- refresh();
- delete tractor;
-
+ 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());
+ if (mute) {
+ if (blind) trackProducer.set("hide", 3);
+ else trackProducer.set("hide", 2);
+ } else if (blind) {
+ trackProducer.set("hide", 1);
+ } else {
+ trackProducer.set("hide", 0);
}
+ tractor.multitrack()->refresh();
+ tractor.refresh();
+ refresh();
}
void Render::mltResizeClipStart(int track, GenTime pos, GenTime moveEnd, GenTime moveStart, GenTime in, GenTime out) {
m_isBlocked = true;
- int moveFrame = (int)((moveEnd - moveStart).frames(m_fps));
+ Mlt::Service service(m_mltProducer->parent().get_service());
- Mlt::Playlist *trackPlaylist = getPlaylist(track);
- if (trackPlaylist) {
- if (trackPlaylist->is_blank_at((int)pos.frames(m_fps) - 1))
- kDebug() << "//////// ERROR RSIZING BLANK CLIP!!!!!!!!!!!";
- int clipIndex = trackPlaylist->get_clip_index_at((int)pos.frames(m_fps) - 1);
- kDebug() << " ** RESIZING CLIP START:" << clipIndex << " on track:" << track << ", mid pos: " << pos.frames(25) << ", moving: " << moveFrame << ", in: " << in.frames(25) << ", out: " << out.frames(25);
+ int moveFrame = (int)(moveEnd - moveStart).frames(m_fps);
- trackPlaylist->resize_clip(clipIndex, (int) in.frames(m_fps), (int)out.frames(m_fps));
- if (moveFrame > 0) trackPlaylist->insert_blank(clipIndex, moveFrame - 1);
- else {
- int midpos = (int)moveStart.frames(m_fps) - 1; //+ (moveFrame / 2)
- int blankIndex = trackPlaylist->get_clip_index_at(midpos);
- int blankLength = trackPlaylist->clip_length(blankIndex);
+ Mlt::Tractor tractor(service);
+ Mlt::Producer trackProducer(tractor.track(track));
+ Mlt::Playlist trackPlaylist((mlt_playlist) trackProducer.get_service());
+ if (trackPlaylist.is_blank_at((int) pos.frames(m_fps) - 1))
+ kDebug() << "//////// ERROR RSIZING BLANK CLIP!!!!!!!!!!!";
+ int clipIndex = trackPlaylist.get_clip_index_at((int) pos.frames(m_fps) - 1);
+ kDebug() << " ** RESIZING CLIP START:" << clipIndex << " on track:" << track << ", mid pos: " << pos.frames(25) << ", moving: " << moveFrame << ", in: " << in.frames(25) << ", out: " << out.frames(25);
- kDebug() << " + resizing blank: " << blankIndex << ", Mid: " << midpos << ", Length: " << blankLength << ", SIZE DIFF: " << moveFrame;
+ trackPlaylist.resize_clip(clipIndex, (int) in.frames(m_fps), (int) out.frames(m_fps));
+ if (moveFrame > 0) trackPlaylist.insert_blank(clipIndex, moveFrame - 1);
+ else {
+ int midpos = (int)moveStart.frames(m_fps) - 1; //+ (moveFrame / 2)
+ int blankIndex = trackPlaylist.get_clip_index_at(midpos);
+ int blankLength = trackPlaylist.clip_length(blankIndex);
+ kDebug() << " + resizing blank: " << blankIndex << ", Mid: " << midpos << ", Length: " << blankLength << ", SIZE DIFF: " << moveFrame;
- if (blankLength + moveFrame == 0) trackPlaylist->remove(blankIndex);
- 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);
- kDebug() << "CLIP 3: " << trackPlaylist->clip_start(3) << ", LENGT: " << trackPlaylist->clip_length(3);
- kDebug() << "CLIP 4: " << trackPlaylist->clip_start(4) << ", LENGT: " << trackPlaylist->clip_length(4);
-
- delete trackPlaylist;
+ if (blankLength + moveFrame == 0) trackPlaylist.remove(blankIndex);
+ else trackPlaylist.resize_clip(blankIndex, 0, blankLength + moveFrame - 1);
}
+ trackPlaylist.consolidate_blanks(0);
+ m_isBlocked = false;
}
void Render::mltMoveClip(int startTrack, int endTrack, GenTime moveStart, GenTime moveEnd) {
void Render::mltMoveClip(int startTrack, int endTrack, int moveStart, int moveEnd) {
m_isBlocked = true;
- //m_mltConsumer->set("refresh", 0);
- Mlt::Tractor *tractor = getTractor();
- if (tractor) {
- Mlt::Producer trackProducer(tractor->track(startTrack));
- Mlt::Playlist trackPlaylist((mlt_playlist) trackProducer.get_service());
- int clipIndex = trackPlaylist.get_clip_index_at(moveStart + 1);
- mlt_field field = mlt_tractor_field(tractor->get_tractor());
- mlt_multitrack multitrack = mlt_field_multitrack(field); //mlt_tractor_multitrack(tractor.get_tractor());
- kDebug() << " -- CURRENT MULTIOTRACK HAS: " << mlt_multitrack_count(multitrack) << " tracks";;
- mlt_service multiprod = mlt_multitrack_service(multitrack);
-
- Mlt::Producer clipProducer(trackPlaylist.replace_with_blank(clipIndex));
- trackPlaylist.consolidate_blanks(1);
- mlt_events_block(MLT_PRODUCER_PROPERTIES(trackProducer.get_producer()), NULL);
-
- if (endTrack == startTrack) {
- if (!trackPlaylist.is_blank_at(moveEnd)) {
- kWarning() << "// ERROR, CLIP COLLISION----------";
- int ix = trackPlaylist.get_clip_index_at(moveEnd);
- kDebug() << "BAD CLIP STARTS AT: " << trackPlaylist.clip_start(ix) << ", LENGT: " << trackPlaylist.clip_length(ix);
- }
- trackPlaylist.insert_at(moveEnd, clipProducer, 1);
- trackPlaylist.consolidate_blanks(0);
- } else {
- trackPlaylist.consolidate_blanks(0);
- Mlt::Producer destTrackProducer(tractor->track(endTrack));
- Mlt::Playlist destTrackPlaylist((mlt_playlist) destTrackProducer.get_service());
- destTrackPlaylist.consolidate_blanks(1);
- destTrackPlaylist.insert_at(moveEnd, clipProducer, 1);
- destTrackPlaylist.consolidate_blanks(0);
- }
- mltCheckLength();
- mlt_events_unblock(MLT_PRODUCER_PROPERTIES(trackProducer.get_producer()), NULL);
- m_isBlocked = false;
- m_mltConsumer->set("refresh", 1);
- delete tractor;
+ m_mltConsumer->set("refresh", 0);
+
+ 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(startTrack));
+ Mlt::Playlist trackPlaylist((mlt_playlist) trackProducer.get_service());
+ int clipIndex = trackPlaylist.get_clip_index_at(moveStart + 1);
+
+ Mlt::Producer clipProducer(trackPlaylist.replace_with_blank(clipIndex));
+ trackPlaylist.consolidate_blanks(0);
+ //mlt_events_block( MLT_PRODUCER_PROPERTIES(clipProducer.get_producer()), NULL );
+
+ if (endTrack == startTrack) {
+ if (!trackPlaylist.is_blank_at(moveEnd)) {
+ kWarning() << "// ERROR, CLIP COLLISION----------";
+ int ix = trackPlaylist.get_clip_index_at(moveEnd);
+ kDebug() << "BAD CLIP STARTS AT: " << trackPlaylist.clip_start(ix) << ", LENGT: " << trackPlaylist.clip_length(ix);
+ }
+ trackPlaylist.insert_at(moveEnd, clipProducer, 1);
+ trackPlaylist.consolidate_blanks(0);
+ } else {
+ trackPlaylist.consolidate_blanks(0);
+ Mlt::Producer destTrackProducer(tractor.track(endTrack));
+ Mlt::Playlist destTrackPlaylist((mlt_playlist) destTrackProducer.get_service());
+ destTrackPlaylist.consolidate_blanks(1);
+ destTrackPlaylist.insert_at(moveEnd, clipProducer, 1);
+ destTrackPlaylist.consolidate_blanks(0);
}
+
+ mltCheckLength();
+ m_isBlocked = false;
+ m_mltConsumer->set("refresh", 1);
+ //mlt_events_unblock( MLT_PRODUCER_PROPERTIES(clipProducer.get_producer()), NULL );
}
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 service(m_mltProducer->parent().get_service());
+ Mlt::Tractor tractor(service);
+ Mlt::Field *field = tractor.field();
- Mlt::Tractor *tractor = getTractor();
- if (tractor) {
- Mlt::Tractor newTractor;
- mlt_service service = tractor->get_service();
- mlt_service nextservice = mlt_service_get_producer(service);
- 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 new_in = (int)newIn.frames(m_fps);
- int new_out = (int)newOut.frames(m_fps) - 1;
- while (mlt_type == "transition") {
- mlt_transition tr = (mlt_transition) nextservice;
- int currentTrack = mlt_transition_get_b_track(tr);
- int currentIn = (int) mlt_transition_get_in(tr);
- int currentOut = (int) mlt_transition_get_out(tr);
-
- //kDebug() << "// OLD IN: " << oldIn.frames(m_fps) << " // OLD OUT: " << oldOut.frames(m_fps) << ", TRACK: " << startTrack << ", CURR TRANS: " <<currentIn<<", MID:"<< old_pos<<currentOut;
- if (resource == type && startTrack == currentTrack && currentIn <= old_pos && currentOut >= old_pos) {
- //kDebug() << "// FOUND EXISTING TRANS, IN: " << type << resource << currentIn << ", OUT: " << currentOut << ", TRACK: " << currentTrack;
- mlt_transition_set_in_and_out(tr, new_in, new_out);
- if (trackOffset != 0) {
- mlt_properties properties = MLT_TRANSITION_PROPERTIES(tr);
- mlt_properties_set_int(properties, "a_track", mlt_transition_get_a_track(tr) + trackOffset);
- mlt_properties_set_int(properties, "b_track", mlt_transition_get_b_track(tr) + trackOffset);
- //kDebug() << "set new start & end :" << new_in << new_out<< "TR OFFSET: "<<trackOffset<<", TRACKS: "<<mlt_transition_get_a_track(tr)<<"x"<<mlt_transition_get_b_track(tr);
- }
- break;
+ m_mltConsumer->set("refresh", 0);
+ mlt_service serv = m_mltProducer->parent().get_service();
+
+ mlt_service nextservice = mlt_service_get_producer(serv);
+ 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 new_in = (int)newIn.frames(m_fps);
+ int new_out = (int)newOut.frames(m_fps) - 1;
+
+ while (mlt_type == "transition") {
+ mlt_transition tr = (mlt_transition) nextservice;
+ int currentTrack = mlt_transition_get_b_track(tr);
+ int currentIn = (int) mlt_transition_get_in(tr);
+ int currentOut = (int) mlt_transition_get_out(tr);
+
+ if (resource == type && startTrack == currentTrack && currentIn <= old_pos && currentOut >= old_pos) {
+ mlt_transition_set_in_and_out(tr, new_in, new_out);
+ if (trackOffset != 0) {
+ mlt_properties properties = MLT_TRANSITION_PROPERTIES(tr);
+ mlt_properties_set_int(properties, "a_track", mlt_transition_get_a_track(tr) + trackOffset);
+ mlt_properties_set_int(properties, "b_track", mlt_transition_get_b_track(tr) + trackOffset);
+ //kDebug() << "set new start & end :" << new_in << new_out<< "TR OFFSET: "<<trackOffset<<", TRACKS: "<<mlt_transition_get_a_track(tr)<<"x"<<mlt_transition_get_b_track(tr);
}
- nextservice = mlt_service_producer(nextservice);
- properties = MLT_SERVICE_PROPERTIES(nextservice);
- mlt_type = mlt_properties_get(properties, "mlt_type");
- resource = mlt_properties_get(properties, "mlt_service");
+
+ break;
}
- m_isBlocked = false;
- delete tractor;
+ nextservice = mlt_service_producer(nextservice);
+ properties = MLT_SERVICE_PROPERTIES(nextservice);
+ mlt_type = mlt_properties_get(properties, "mlt_type");
+ resource = mlt_properties_get(properties, "mlt_service");
}
- mltSavePlaylist();
+ m_isBlocked = false;
m_mltConsumer->set("refresh", 1);
}
void Render::mltUpdateTransitionParams(QString type, int a_track, int b_track, GenTime in, GenTime out, QDomElement xml) {
m_isBlocked = true;
- m_mltConsumer->set("refresh", 0);
- Mlt::Tractor *tractor = getTractor();
- if (tractor) {
- Mlt::Tractor newTractor;
- mlt_service service = tractor->get_service();
- mlt_service nextservice = mlt_service_get_producer(service);
- 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 in_pos = (int) in.frames(m_fps);
- int out_pos = (int) out.frames(m_fps);
-
- while (mlt_type == "transition") {
- mlt_transition tr = (mlt_transition) nextservice;
- int currentTrack = mlt_transition_get_b_track(tr);
- int currentIn = (int) mlt_transition_get_in(tr);
- int currentOut = (int) mlt_transition_get_out(tr);
- kDebug() << "TRACK: " << b_track << " / " << currentTrack << ", CURR TRANS: " << currentIn << "x" << currentOut << ", LOOKING OFR: " << in_pos << "x" << out_pos;
- if (resource == type && b_track == currentTrack && currentIn == in_pos && currentOut == out_pos) {
- QMap<QString, QString> map = mltGetTransitionParamsFromXml(xml);
- QMap<QString, QString>::Iterator it;
- QString key;
- mlt_properties transproperties = MLT_TRANSITION_PROPERTIES(tr);
-
- for (it = map.begin(); it != map.end(); ++it) {
- key = it.key();
- char *name = decodedString(key);
- char *value = decodedString(it.value());
- mlt_properties_set(transproperties, name, value);
- kDebug() << " ------ UPDATING TRANS PARAM: " << name << ": " << value;
- //filter->set("kdenlive_id", id);
- delete[] name;
- delete[] value;
- }
- break;
+ Mlt::Service service(m_mltProducer->parent().get_service());
+ Mlt::Tractor tractor(service);
+ Mlt::Field *field = tractor.field();
+
+ m_mltConsumer->set("refresh", 0);
+ mlt_service serv = m_mltProducer->parent().get_service();
+
+ mlt_service nextservice = mlt_service_get_producer(serv);
+ 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 in_pos = (int) in.frames(m_fps);
+ int out_pos = (int) out.frames(m_fps);
+
+ while (mlt_type == "transition") {
+ mlt_transition tr = (mlt_transition) nextservice;
+ int currentTrack = mlt_transition_get_b_track(tr);
+ int currentIn = (int) mlt_transition_get_in(tr);
+ int currentOut = (int) mlt_transition_get_out(tr);
+
+ if (resource == type && b_track == currentTrack && currentIn == in_pos && currentOut == out_pos) {
+ QMap<QString, QString> map = mltGetTransitionParamsFromXml(xml);
+ QMap<QString, QString>::Iterator it;
+ QString key;
+ mlt_properties transproperties = MLT_TRANSITION_PROPERTIES(tr);
+
+ for (it = map.begin(); it != map.end(); ++it) {
+ key = it.key();
+ char *name = decodedString(key);
+ char *value = decodedString(it.value());
+ mlt_properties_set(transproperties, name, value);
+ kDebug() << " ------ UPDATING TRANS PARAM: " << name << ": " << value;
+ //filter->set("kdenlive_id", id);
+ delete[] name;
+ delete[] value;
}
- nextservice = mlt_service_producer(nextservice);
- properties = MLT_SERVICE_PROPERTIES(nextservice);
- mlt_type = mlt_properties_get(properties, "mlt_type");
- resource = mlt_properties_get(properties, "mlt_service");
+ break;
}
- m_isBlocked = false;
- delete tractor;
+ nextservice = mlt_service_producer(nextservice);
+ properties = MLT_SERVICE_PROPERTIES(nextservice);
+ mlt_type = mlt_properties_get(properties, "mlt_type");
+ resource = mlt_properties_get(properties, "mlt_service");
}
+ m_isBlocked = false;
m_mltConsumer->set("refresh", 1);
}
-void Render::replaceTimelineTractor(Mlt::Tractor t) {
- Mlt::Service service(m_mltProducer->get_service());
- Mlt::Playlist prod(service);
- Mlt::Service service_playlist(prod.get_clip(0)->get_service());
- prod.remove(0);
- prod.insert(t, 0);
- kDebug() << "newTractor inserted";
-}
-
void Render::mltDeleteTransition(QString tag, int a_track, int b_track, GenTime in, GenTime out, QDomElement xml, bool do_refresh) {
- Mlt::Tractor *tractor = getTractor();
- if (tractor) {
- Mlt::Tractor newTractor;
- mlt_service service = tractor->get_service();
- mlt_service nextservice = mlt_service_get_producer(service);
- int old_position = m_mltProducer->position();
- for (int track = 0;track < 10;track++) {
- Mlt::Producer *trackprod = tractor->track(track);
- if (!trackprod)
- continue;
- newTractor.multitrack()->connect(*trackprod, track);
- }
- for (int i = 2;i <= 5;i++) {
- Mlt::Transition tr(*m_mltProfile, "mix");
- tr.set("combine", 1);
- tr.set("internal_added", 237);
- tr.set_in_and_out(0, 15000);
- newTractor.plant_transition(tr, 1, i);
- }
- while (nextservice != NULL) {
- mlt_properties prop = MLT_SERVICE_PROPERTIES(nextservice);
- //kDebug() << mlt_properties_get(prop, "mlt_type") << mlt_properties_get(prop, "id");
- if (QString(mlt_properties_get(prop, "mlt_type")) == "transition" && QString(mlt_properties_get(prop, "internal_added")) != "237") {
-
- mlt_transition tr = (mlt_transition) nextservice;
- Mlt::Transition transition(tr);
- int current_a_track = mlt_transition_get_a_track(tr);
- int current_b_track = mlt_transition_get_b_track(tr);
- int currentIn = (int) mlt_transition_get_in(tr);
- int currentOut = (int) mlt_transition_get_out(tr);
- int old_pos = (int)((in.frames(m_fps) + out.frames(m_fps)) / 2);
- kDebug() << current_a_track << current_b_track << a_track << b_track << currentIn << currentOut << old_pos << mlt_properties_get(prop, "mlt_service");
- if (current_a_track == a_track && b_track == current_b_track && currentIn <= old_pos && currentOut >= old_pos) {
- kDebug() << "removing " << mlt_properties_get(prop, "mlt_service");
- } else
- newTractor.plant_transition(transition, current_a_track, current_b_track);
- }
- nextservice = mlt_service_producer(nextservice);
- }
+ Mlt::Service service(m_mltProducer->parent().get_service());
+ Mlt::Tractor tractor(service);
+ Mlt::Field *field = tractor.field();
- replaceTimelineTractor(newTractor);
- m_mltProducer->seek(old_position);
- delete tractor;
- if (do_refresh) refresh();
+ m_mltConsumer->set("refresh", 0);
+ mlt_service serv = m_mltProducer->parent().get_service();
+
+ mlt_service nextservice = mlt_service_get_producer(serv);
+ 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)((in + out).frames(m_fps) / 2);
+
+ while (mlt_type == "transition") {
+ mlt_transition tr = (mlt_transition) nextservice;
+ int currentTrack = mlt_transition_get_b_track(tr);
+ int currentIn = (int) mlt_transition_get_in(tr);
+ int currentOut = (int) mlt_transition_get_out(tr);
+ kDebug() << "// FOUND EXISTING TRANS, IN: " << currentIn << ", OUT: " << currentOut << ", TRACK: " << currentTrack;
+
+ if (resource == tag && b_track == currentTrack && currentIn <= old_pos && currentOut >= old_pos) {
+ mlt_field_disconnect_service(field->get_field(), nextservice);
+ break;
+ }
+ nextservice = mlt_service_producer(nextservice);
+ properties = MLT_SERVICE_PROPERTIES(nextservice);
+ mlt_type = mlt_properties_get(properties, "mlt_type");
+ resource = mlt_properties_get(properties, "mlt_service");
}
-
+ m_mltConsumer->set("refresh", 1);
}
QMap<QString, QString> Render::mltGetTransitionParamsFromXml(QDomElement xml) {
void Render::mltAddTransition(QString tag, int a_track, int b_track, GenTime in, GenTime out, QDomElement xml, bool do_refresh) {
//kDebug() << "-- ADDING TRANSITION: " << tag << ", ON TRACKS: " << a_track << ", " << b_track;
- QMap<QString, QString> map = mltGetTransitionParamsFromXml(xml);
-
- Mlt::Tractor *tractor = getTractor();
- if (tractor) {
- Mlt::Field *field = tractor->field();
- char *transId = decodedString(tag);
- Mlt::Transition transition(*m_mltProfile, transId);
- if (!transition.get_transition()) {
- kDebug() << "NO transition is " << transition.get_transition() << "requested was " << tag << a_track << b_track << in.frames(m_fps) << out.frames(m_fps);
- return;
- }
- transition.set_in_and_out((int) in.frames(m_fps), (int) out.frames(m_fps));
- QMap<QString, QString>::Iterator it;
- QString key;
+ QMap<QString, QString> args = mltGetTransitionParamsFromXml(xml);
- kDebug() << " ------ ADDING TRANSITION PARAMs: " << map.count();
-
- for (it = map.begin(); it != map.end(); ++it) {
- key = it.key();
- char *name = decodedString(key);
- char *value = decodedString(it.value());
- transition.set(name, value);
- kDebug() << " ------ ADDING TRANS PARAM: " << name << ": " << value;
- //filter->set("kdenlive_id", id);
- delete[] name;
- delete[] value;
- }
- // attach filter to the clip
- field->plant_transition(transition, a_track, b_track);
- delete[] transId;
- mltSavePlaylist();
- if (do_refresh) refresh();
- delete tractor;
+
+ 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(*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;
+
+ kDebug() << " ------ ADDING TRANSITION PARAMs: " << args.count();
+
+ for (it = args.begin(); it != args.end(); ++it) {
+ key = it.key();
+ char *name = decodedString(key);
+ char *value = decodedString(it.value());
+ transition->set(name, value);
+ kDebug() << " ------ ADDING TRANS PARAM: " << name << ": " << value;
+ //filter->set("kdenlive_id", id);
+ delete[] name;
+ delete[] value;
}
+ // attach filter to the clip
+ field->plant_transition(*transition, a_track, b_track);
+ delete[] transId;
+ refresh();
}
void Render::mltSavePlaylist() {