- mlt_transition tr = (mlt_transition) nextservice;
- int currentTrack = mlt_transition_get_b_track(tr);
- int currentaTrack = mlt_transition_get_a_track(tr);
- mlt_properties properties = MLT_TRANSITION_PROPERTIES(tr);
-
- if (currentTrack >= ix) {
- mlt_properties_set_int(properties, "b_track", currentTrack + 1);
- mlt_properties_set_int(properties, "a_track", currentaTrack + 1);
- }
+ Mlt::Transition transition((mlt_transition) nextservice);
+ nextservice = mlt_service_producer(nextservice);
+ int currentbTrack = transition.get_b_track();
+ int currentaTrack = transition.get_a_track();
+ bool trackChanged = false;
+ bool forceTransitionTrack = false;
+ if (currentbTrack >= ix) {
+ if (currentbTrack == ix && currentaTrack < ix) forceTransitionTrack = true;
+ currentbTrack++;
+ trackChanged = true;
+ }
+ if (currentaTrack >= ix) {
+ currentaTrack++;
+ trackChanged = true;
+ }
+ kDebug()<<"// Newtrans: "<<currentaTrack<<"/"<<currentbTrack;
+
+ // disconnect all transitions
+ Mlt::Properties trans_props(transition.get_properties());
+ Mlt::Transition *cp = new Mlt::Transition(*m_mltProfile, transition.get("mlt_service"));
+ Mlt::Properties new_trans_props(cp->get_properties());
+ new_trans_props.inherit(trans_props);
+
+ if (trackChanged) {
+ // Transition track needs to be adjusted
+ cp->set("a_track", currentaTrack);
+ cp->set("b_track", currentbTrack);
+ // Check if transition track was changed and needs to be forced
+ if (forceTransitionTrack) cp->set("force_track", 1);
+ TransitionInfo trInfo;
+ trInfo.startPos = GenTime(transition.get_in(), m_fps);
+ trInfo.a_track = currentaTrack;
+ trInfo.b_track = currentbTrack;
+ trInfo.forceTrack = cp->get_int("force_track");
+ transitionInfos.append(trInfo);
+ }
+ trList.append(cp);
+ field->disconnect_service(transition);