From: Marco Gittler Date: Fri, 21 Mar 2008 14:15:06 +0000 (+0000) Subject: all transitions can now added X-Git-Url: https://git.sesse.net/?a=commitdiff_plain;h=d3746f191372485b5748d48d92340eda1ddaeaa6;p=kdenlive all transitions can now added svn path=/branches/KDE4/; revision=2092 --- diff --git a/src/renderer.cpp b/src/renderer.cpp index 7d4693f5..aeec8a04 100644 --- a/src/renderer.cpp +++ b/src/renderer.cpp @@ -1351,206 +1351,75 @@ void Render::mltUpdateTransition(QString oldTag, QString tag, int a_track, int b 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 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_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 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::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::Iterator it; QString key; @@ -1572,8 +1441,6 @@ void Render::mltAddTransition(QString tag, int a_track, int b_track, GenTime in, delete[] transId; m_isBlocked = false; refresh(); - mltSavePlaylist(); -#endif } void Render::mltSavePlaylist() { @@ -1589,3 +1456,4 @@ void Render::mltSavePlaylist() { } #include "renderer.moc" + diff --git a/src/transitionsettings.cpp b/src/transitionsettings.cpp index 83aa0d60..7c9b3a56 100644 --- a/src/transitionsettings.cpp +++ b/src/transitionsettings.cpp @@ -31,7 +31,10 @@ TransitionSettings::TransitionSettings(EffectsList *transitions, QWidget* parent void TransitionSettings::slotTransitionChanged() { QDomElement e = m_usedTransition->toXML(); QDomElement newElement = e.cloneNode().toElement(); - newElement.setAttribute("type", ui.listWidget->currentItem()->text()); + + QDomElement desc = m_transitions->getEffectByName(ui.listWidget->currentItem()->text()); + + newElement.setAttribute("type", desc.attribute("tag")); emit transitionUpdated(e, newElement); }