mltDeleteTransition(oldTag, a_track, b_track, in, out, args);
mltAddTransition(tag, a_track, b_track, in, out, args);
- m_isBlocked = false;
+ mltSavePlaylist();
}
-typedef struct {
- int size;
- int count;
- mlt_service *in;
- mlt_service out;
- int filter_count;
- int filter_size;
- mlt_filter *filters;
- pthread_mutex_t mutex;
+
+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";
}
-mlt_service_base;
void Render::mltDeleteTransition(QString tag, int a_track, int b_track, GenTime in, GenTime out, QMap <QString, QString> args) {
Mlt::Tractor tractor(getTractor());
+
+ Mlt::Tractor newTractor;
+ mlt_service service = tractor.get_service();
+ mlt_service nextservice = mlt_service_get_producer(service);
+
for (int track = 0;track < 10;track++) {
Mlt::Producer *trackprod = tractor.track(track);
if (!trackprod)
continue;
- Mlt::Producer trackProducer(trackprod);
- Mlt::Playlist trackPlaylist((mlt_playlist) trackProducer.get_service());
- Mlt::Producer *prod = NULL;
- int g = 0;
- do {
- prod = trackPlaylist.get_clip(g++);
- if (prod) {
-
- for (int j = 0;j < prod->count();j++) {
-
- kDebug() << prod->get_name(j) << " " << prod->get(j);
- }
- Mlt::Producer parprod = prod->parent();
- for (int j = 0;j < parprod.count();j++) {
-
- kDebug() << " " << parprod.get_name(j) << " " << parprod.get(j);
- }
- Mlt::Tractor tractor(parprod);
- if (tractor.is_valid()) {
- kDebug() << "---------ja";
- }
- }
- kDebug() << "track=" << track << " " << g << " " << prod;
-
- /*Mlt::Tractor parent(prod->parent());
- if (!parent.get_tractor())
- continue;
- Mlt::Producer *prod1=parent.track(1);
- if (!prod1)
- continue;*/
- } while (g < 10);
+ newTractor.multitrack()->connect(*trackprod, track);
}
-
-#if 0
- return;
- m_isBlocked = true;
- m_mltConsumer->set("refresh", 0);
- mlt_service serv = m_mltProducer->parent().get_service();
- Mlt::Service service(m_mltProducer->parent().get_service());
-
- Mlt::Tractor tractor(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 = (in.frames(m_fps) + out.frames(m_fps)) / 2;
- int trackOffset = 0;
- int new_in = in.frames(m_fps);
- int new_out = out.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() << "// FOUND EXISTING TRANS, IN: " << currentIn << ", OUT: " << currentOut << ", TRACK: " << currentTrack;
- //kDebug()<<"// LOOKING FOR IN: "<<old_in<<", OUT: "<<old_out;
- kDebug() << "// OLD IN: " << in.frames(m_fps) << " // OLD OUT: " << out.frames(m_fps) << ", TRACK: " << a_track << ", MID POS: " << old_pos;
- if (/*resource == type &&*/ b_track == currentTrack && currentIn <= old_pos && currentOut >= old_pos) {
- kDebug() << "found transition that matches" << resource;
- //mlt_transition_set_in_and_out(tr, new_in, new_out);
- Mlt::Field *field = tractor.field();
- Mlt::Transition tt(*m_mltProfile, "mix");
- field->plant_transition(tt, a_track, b_track);
-#if 0
- mlt_service service = MLT_TRANSITION_SERVICE(tr);
- mlt_service_base *base = (mlt_service_base*)service->local;
- for (int i = 0;i < base->count;i++) {
- kDebug() << base->in[i] << " " << tr << " " << service << nextservice;
- }
- mlt_service service1 = MLT_TRACTOR_SERVICE(tractor.get_tractor());
- mlt_service_base *base1 = (mlt_service_base*)service1->local;
- for (int i = 0;i < base1->count;i++) {
- kDebug() << base1->in[i] << " " << tr << " " << service << nextservice;
- if (base1->in[i] == (mlt_service_s*)tr) {
- mlt_service_lock(MLT_SERVICE_PROPERTIES(tr));
- //mlt_properties_dec_ref( MLT_SERVICE_PROPERTIES( tr ) );
- /*mlt_service_unlock(MLT_SERVICE_PROPERTIES(tr));
-
-
- mlt_events_disconnect(properties, nextservice);
- mlt_transition_close(tr);
- //base1->in[i]=NULL;
- base1->out = NULL;*/
- base1->in[i] = NULL;
-
- base1->count--;
- mlt_service_base *basetr = (mlt_service_base*)service1->local;
- basetr->out = NULL;
- return;
- }
- }
-
- //service->child=NULL;
- ///mlt_properties properties = MLT_TRANSITION_PROPERTIES(tr);
- ///mlt_properties_set ( properties , "active" , 0 );
- ///7mlt_events_disconnect(properties, nextservice);
- //mlt_events_fire(MLT_SERVICE_PROPERTIES(nextservice), "service-changed", NULL);
- //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);
- //}
-#endif
- break;
+ 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_in(tr);
+ int old_pos = (int)((in.frames(m_fps) + out.frames(m_fps)) / 2);
+
+ if (current_a_track == a_track && b_track == current_b_track && currentIn <= old_pos && currentOut >= old_pos) {
+
+ } else
+ newTractor.plant_transition(transition, current_a_track, current_b_track);
}
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;
-#endif
+
+ replaceTimelineTractor(newTractor);
+
}
void Render::mltAddTransition(QString tag, int a_track, int b_track, GenTime in, GenTime out, QMap <QString, QString> args) {
-#if 0
- Mlt::Tractor tractor(getTractor());
- for (int track = 0;track < 10;track++) {
- Mlt::Producer *trackprod = tractor.track(track);
- if (!trackprod)
- continue;
- Mlt::Producer trackProducer(trackprod);
- Mlt::Playlist trackPlaylist((mlt_playlist) trackProducer.get_service());
-
- int clipindex = trackPlaylist.get_clip_index_at(in.frames(m_fps));
- if (clipindex != 0 && track == 5) {
- Mlt::Transition *transition = new Mlt::Transition(*m_mltProfile, decodedString(tag));
- if (!transition || !transition->get_transition())
- return;
- 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() << "on track " << track;
-
- 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;
- }
- Mlt::Producer *left = trackPlaylist.get_clip(clipindex - 1);
- Mlt::Producer *right = trackPlaylist.get_clip(clipindex);
- kDebug() << "left=" << left << " right=" << right;
- Mlt::Tractor mixer;
- Mlt::Playlist track0;
- mixer.set_track(track0, 0);
- /** read from track down */
- Mlt::Producer *trackprod2 = tractor.track(4);
- Mlt::Producer trackProducer2(trackprod2);
- Mlt::Playlist trackPlaylist2((mlt_playlist) trackProducer2.get_service());
-
- int clipindex2 = trackPlaylist2.get_clip_index_at(in.frames(m_fps));
- kDebug() << clipindex2;
- left = trackPlaylist2.get_clip(clipindex2);
- //left->cut(40,left->get_playtime() );
- Mlt::Producer *lastleft = left->cut(left->get_in() + left->get_playtime() - 20, left->get_in() + left->get_playtime());
- mixer.set_track(*lastleft, 0);
- //track0.repeat(0, 20);
- mixer.set_track(*right, 1);
- transition->set_in_and_out(0, 20 - 1);
- mixer.plant_transition(transition);
- trackPlaylist.insert(mixer, clipindex, 0, mixer.get_playtime());
- trackPlaylist.remove(clipindex + 1);
- }
- }
- mltSavePlaylist();
-#else
m_isBlocked = true;
Mlt::Tractor tractor(getTractor());
Mlt::Field *field = tractor.field();
char *transId = decodedString(tag);
Mlt::Transition *transition = new Mlt::Transition(*m_mltProfile, transId);
- if (!transition || !transition->get_transition())
+ if (!transition || !transition->get_transition()) {
+ kDebug() << "NO transition is " << 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;
delete[] transId;
m_isBlocked = false;
refresh();
- mltSavePlaylist();
-#endif
}
void Render::mltSavePlaylist() {
}
#include "renderer.moc"
+