<description>Flip your image in any direction</description>
<author>Charles Yates</author>
<parameter type="list" name="mirror" default="horizontal" paramlist="horizontal;vertical;diagonal;xdiagonal;flip;flop">
+ <paramlistdisplay>Horizontal,Vertical,Diagonal,X Diagonal,Flip,Flop</paramlistdisplay>
<name>Mirroring direction</name>
</parameter>
<parameter type="bool" name="reverse" default="0">
void CustomTrackView::addTrack(TrackInfo type, int ix)
{
+ QList <TransitionInfo> transitionInfos;
if (ix == -1 || ix == m_document->tracksCount()) {
m_document->insertTrack(0, type);
- m_document->renderer()->mltInsertTrack(1, type.type == VIDEOTRACK);
+ transitionInfos = m_document->renderer()->mltInsertTrack(1, type.type == VIDEOTRACK);
} else {
m_document->insertTrack(m_document->tracksCount() - ix, type);
// insert track in MLT playlist
- m_document->renderer()->mltInsertTrack(m_document->tracksCount() - ix, type.type == VIDEOTRACK);
+ transitionInfos = m_document->renderer()->mltInsertTrack(m_document->tracksCount() - ix, type.type == VIDEOTRACK);
double startY = ix * m_tracksHeight + 1 + m_tracksHeight / 2;
QRectF r(0, startY, sceneRect().width(), sceneRect().height() - startY);
emit displayMessage(i18n("Cannot update clip (time: %1, track: %2)", clipinfo.startPos.frames(m_document->fps()), clipinfo.track), ErrorMessage);
}
}
- } else if (item->type() == TRANSITIONWIDGET) {
+ } /*else if (item->type() == TRANSITIONWIDGET) {
Transition *tr = static_cast <Transition *>(item);
int track = tr->transitionEndTrack();
if (track >= ix) {
tr->updateTransitionEndTrack(getPreviousVideoTrack(clipinfo.track));
}
- }
+ }*/
}
+ // Sync transition tracks with MLT playlist
+
+ Transition *tr;
+ TransitionInfo info;
+ for (int i = 0; i < transitionInfos.count(); i++) {
+ info = transitionInfos.at(i);
+ tr = getTransitionItem(info);
+ if (tr) tr->setForcedTrack(info.forceTrack, info.a_track);
+ else kDebug()<<"// Cannot update TRANSITION AT: "<<info.b_track<<" / "<<info.startPos.frames(m_document->fps());
+ }
+
resetSelectionGroup(false);
m_document->renderer()->unlockService(tractor);
}
return getClipItemAt((int) pos.frames(m_document->fps()), track);
}
+
+Transition *CustomTrackView::getTransitionItem(TransitionInfo info)
+{
+ int pos = info.startPos.frames(m_document->fps());
+ int track = m_document->tracksCount() - info.b_track;
+ return getTransitionItemAt(pos, track);
+}
+
Transition *CustomTrackView::getTransitionItemAt(int pos, int track)
{
const QPointF p(pos, track * m_tracksHeight + Transition::itemOffset() + 1);
ClipItem *getClipItemAt(GenTime pos, int track);
ClipItem *getClipItemAtEnd(GenTime pos, int track);
ClipItem *getClipItemAtStart(GenTime pos, int track);
+ Transition *getTransitionItem(TransitionInfo info);
Transition *getTransitionItemAt(int pos, int track);
Transition *getTransitionItemAt(GenTime pos, int track);
Transition *getTransitionItemAtEnd(GenTime pos, int track);
int track;
};
+struct TransitionInfo {
+/** startPos is the position where the clip starts on the track */
+ GenTime startPos;
+ /** endPos is the duration where the clip ends on the track */
+ GenTime endPos;
+ /** the track on which the transition is (b_track)*/
+ int b_track;
+ /** the track on which the transition is applied (a_track)*/
+ int a_track;
+ /** Does the user request for a special a_track */
+ bool forceTrack;
+};
+
struct MltVideoProfile {
QString path;
QString description;
}
}
-void Render::mltInsertTrack(int ix, bool videoTrack)
+QList <TransitionInfo> Render::mltInsertTrack(int ix, bool videoTrack)
{
- blockSignals(true);
-
Mlt::Service service(m_mltProducer->parent().get_service());
- service.lock();
if (service.type() != tractor_type) {
kWarning() << "// TRACTOR PROBLEM";
- return;
+ return QList <TransitionInfo> ();
}
-
+ blockSignals(true);
+ service.lock();
Mlt::Tractor tractor(service);
-
+ QList <TransitionInfo> transitionInfos;
Mlt::Playlist playlist;
int ct = tractor.count();
if (ix > ct) {
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;
}
currentaTrack++;
trackChanged = true;
}
+ kDebug()<<"// Newtrans: "<<currentaTrack<<"/"<<currentbTrack;
// disconnect all transitions
Mlt::Properties trans_props(transition.get_properties());
new_trans_props.inherit(trans_props);
if (trackChanged) {
- // Transition track needs to be adjusted
+ // 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);
service.unlock();
blockSignals(false);
+ return transitionInfos;
}
void mltMoveTransparency(int startTime, int endTime, int startTrack, int endTrack, int id);
void mltDeleteTransparency(int pos, int track, int id);
void mltResizeTransparency(int oldStart, int newStart, int newEnd, int track, int id);
- void mltInsertTrack(int ix, bool videoTrack);
+ QList <TransitionInfo> mltInsertTrack(int ix, bool videoTrack);
void mltDeleteTrack(int ix);
bool mltUpdateClipProducer(Mlt::Tractor *tractor, int track, int pos, Mlt::Producer *prod);
void mltPlantTransition(Mlt::Field *field, Mlt::Transition &tr, int a_track, int b_track);
update();
}
-
-bool Transition::invertedTransition() const
-{
- return false; //m_parameters.attribute("reverse").toInt();
-}
-
-void Transition::setTransitionDirection(bool /*inv*/)
-{
- //m_parameters.setAttribute("reverse", inv);
-}
-
int Transition::transitionEndTrack() const
{
return m_transitionTrack;
return new Transition::Transition(rect(), m_referenceClip, toXML() , m_fps);
}*/
-/*
-Transition *Transition::reparent(ClipItem * clip) {
- return new Transition::Transition(rect(), clip, toXML(), m_fps, m_referenceClip->startPos());
-}*/
-
-bool Transition::isValid() const
-{
- return true; //(m_transitionDuration != GenTime());
-}
-
const ClipItem *Transition::referencedClip() const
{
return m_referenceClip;
int transitionEndTrack() const;
bool hasClip(const ClipItem * clip) const;
bool belongsToClip(const ClipItem * clip) const;
- bool invertedTransition() const;
QString transitionTag() const;
QStringList transitionInfo() const;
OPERATIONTYPE operationMode(QPointF pos);
static int itemOffset();
//const QMap < QString, QString > transitionParameters() const;
void setTransitionParameters(const QDomElement params);
- void setTransitionDirection(bool inv);
void setTransitionTrack(int track);
- //Transition *reparent(ClipItem * clip);
- bool isValid() const;
/** @brief Links the transition to another track.
*