Skip to content

Commit

Permalink
Fix crashes after undo addition of a transition.
Browse files Browse the repository at this point in the history
After undoing a transition, if you lifted or moved either clip involved
in the former transition, it would often crash.
  • Loading branch information
ddennedy committed Jun 7, 2016
1 parent c28756a commit 000e988
Show file tree
Hide file tree
Showing 3 changed files with 50 additions and 15 deletions.
12 changes: 2 additions & 10 deletions src/commands/timelinecommands.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -592,11 +592,7 @@ void AddTransitionByTrimInCommand::undo()
{
if (m_clipIndex > 0) {
LOG_DEBUG() << "trackIndex" << m_trackIndex << "clipIndex" << m_clipIndex << "delta" << m_delta;
QModelIndex modelIndex = m_model.index(m_clipIndex, 0, m_model.index(m_trackIndex));
m_delta = -m_model.data(modelIndex, MultitrackModel::DurationRole).toInt();
m_model.liftClip(m_trackIndex, m_clipIndex);
m_model.trimClipOut(m_trackIndex, m_clipIndex - 1, m_delta, false);
m_model.notifyClipOut(m_trackIndex, m_clipIndex - 1);
m_model.removeTransitionByTrimIn(m_trackIndex, m_clipIndex, m_delta);
m_notify = true;
}
else LOG_WARNING() << "invalid clip index" << m_clipIndex;
Expand Down Expand Up @@ -633,11 +629,7 @@ void AddTransitionByTrimOutCommand::undo()
{
if (m_clipIndex + 2 < m_model.rowCount(m_model.index(m_trackIndex))) {
LOG_DEBUG() << "trackIndex" << m_trackIndex << "clipIndex" << m_clipIndex << "delta" << m_delta;
QModelIndex modelIndex = m_model.index(m_clipIndex + 1, 0, m_model.index(m_trackIndex));
m_delta = -m_model.data(modelIndex, MultitrackModel::DurationRole).toInt();
m_model.liftClip(m_trackIndex, m_clipIndex + 1);
m_model.trimClipIn(m_trackIndex, m_clipIndex + 2, m_delta, false);
m_model.notifyClipIn(m_trackIndex, m_clipIndex + 1);
m_model.removeTransitionByTrimOut(m_trackIndex, m_clipIndex, m_delta);
m_notify = true;
}
else LOG_WARNING() << "invalid clip index" << m_clipIndex;
Expand Down
50 changes: 45 additions & 5 deletions src/models/multitrackmodel.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1072,9 +1072,10 @@ void MultitrackModel::removeClip(int trackIndex, int clipIndex)
if (clipIndex < playlist.count()) {
// Shotcut does not like the behavior of remove() on a
// transition (MLT mix clip). So, we null mlt_mix to prevent it.
clearMixReferences(trackIndex, clipIndex);

QScopedPointer<Mlt::Producer> producer(playlist.get_clip(clipIndex));
if (producer) {
producer->parent().set("mlt_mix", NULL, 0);
clipPlaytime = producer->get_playtime();
clipStart = playlist.clip_start(clipIndex);
}
Expand Down Expand Up @@ -1140,9 +1141,7 @@ void MultitrackModel::liftClip(int trackIndex, int clipIndex)
if (clipIndex < playlist.count()) {
// Shotcut does not like the behavior of replace_with_blank() on a
// transition (MLT mix clip). So, we null mlt_mix to prevent it.
QScopedPointer<Mlt::Producer> producer(playlist.get_clip(clipIndex));
if (producer)
producer->parent().set("mlt_mix", NULL, 0);
clearMixReferences(trackIndex, clipIndex);

playlist.replace_with_blank(clipIndex);

Expand Down Expand Up @@ -1561,13 +1560,34 @@ int MultitrackModel::addTransition(int trackIndex, int clipIndex, int position)
return -1;
}

void MultitrackModel::removeTransition(int trackIndex, int clipIndex)
void MultitrackModel::clearMixReferences(int trackIndex, int clipIndex)
{
int i = m_trackList.at(trackIndex).mlt_index;
QScopedPointer<Mlt::Producer> track(m_tractor->track(i));
if (track) {
Mlt::Playlist playlist(*track);
QScopedPointer<Mlt::Producer> producer(playlist.get_clip(clipIndex - 1));

// Clear these since they are no longer valid.
producer->set("mix_in", NULL, 0);
producer->set("mix_out", NULL, 0);
producer.reset(playlist.get_clip(clipIndex));
producer->parent().set("mlt_mix", NULL, 0);
producer->set("mix_in", NULL, 0);
producer->set("mix_out", NULL, 0);
producer.reset(playlist.get_clip(clipIndex + 1));
producer->set("mix_in", NULL, 0);
producer->set("mix_out", NULL, 0);
}
}

void MultitrackModel::removeTransition(int trackIndex, int clipIndex)
{
int i = m_trackList.at(trackIndex).mlt_index;
QScopedPointer<Mlt::Producer> track(m_tractor->track(i));
if (track) {
Mlt::Playlist playlist(*track);
clearMixReferences(trackIndex, clipIndex);
beginRemoveRows(index(trackIndex), clipIndex, clipIndex);
playlist.remove(clipIndex);
endRemoveRows();
Expand All @@ -1586,6 +1606,26 @@ void MultitrackModel::removeTransition(int trackIndex, int clipIndex)
}
}

void MultitrackModel::removeTransitionByTrimIn(int trackIndex, int clipIndex, int delta)
{
QModelIndex modelIndex = index(clipIndex, 0, index(trackIndex));
clearMixReferences(trackIndex, clipIndex);
delta = -data(modelIndex, MultitrackModel::DurationRole).toInt();
liftClip(trackIndex, clipIndex);
trimClipOut(trackIndex, clipIndex - 1, delta, false);
notifyClipOut(trackIndex, clipIndex - 1);
}

void MultitrackModel::removeTransitionByTrimOut(int trackIndex, int clipIndex, int delta)
{
QModelIndex modelIndex = index(clipIndex + 1, 0, index(trackIndex));
clearMixReferences(trackIndex, clipIndex);
delta = -data(modelIndex, MultitrackModel::DurationRole).toInt();
liftClip(trackIndex, clipIndex + 1);
trimClipIn(trackIndex, clipIndex + 2, delta, false);
notifyClipIn(trackIndex, clipIndex + 1);
}

bool MultitrackModel::trimTransitionInValid(int trackIndex, int clipIndex, int delta)
{
bool result = false;
Expand Down
3 changes: 3 additions & 0 deletions src/models/multitrackmodel.h
Original file line number Diff line number Diff line change
Expand Up @@ -144,6 +144,8 @@ public slots:
bool addTransitionValid(int fromTrack, int toTrack, int clipIndex, int position);
int addTransition(int trackIndex, int clipIndex, int position);
void removeTransition(int trackIndex, int clipIndex);
void removeTransitionByTrimIn(int trackIndex, int clipIndex, int delta);
void removeTransitionByTrimOut(int trackIndex, int clipIndex, int delta);
bool trimTransitionInValid(int trackIndex, int clipIndex, int delta);
void trimTransitionIn(int trackIndex, int clipIndex, int delta);
bool trimTransitionOutValid(int trackIndex, int clipIndex, int delta);
Expand Down Expand Up @@ -174,6 +176,7 @@ public slots:
void retainPlaylist();
void loadPlaylist();
void removeRegion(int trackIndex, int position, int length);
void clearMixReferences(int trackIndex, int clipIndex);

friend class UndoHelper;

Expand Down

0 comments on commit 000e988

Please sign in to comment.