From: Jean-Baptiste Mardelle Date: Sun, 31 Mar 2013 09:48:01 +0000 (+0200) Subject: Fix playlist corruption & crash when moving clip: http://kdenlive.org/mantis/view... X-Git-Url: https://git.sesse.net/?a=commitdiff_plain;h=fc2d48a0aa41b940efbd8da08fcd7a2822c38025;p=kdenlive Fix playlist corruption & crash when moving clip: http://kdenlive.org/mantis/view.php?id=3046 --- diff --git a/src/renderer.cpp b/src/renderer.cpp index 7a4b95e8..35212083 100644 --- a/src/renderer.cpp +++ b/src/renderer.cpp @@ -2095,6 +2095,7 @@ int Render::mltInsertClip(ItemInfo info, QDomElement element, Mlt::Producer *pro int clipIndex = trackPlaylist.get_clip_index_at(insertPos); trackPlaylist.insert_blank(clipIndex, cutDuration); } + trackPlaylist.consolidate_blanks(0); int newIndex = trackPlaylist.insert_at(insertPos, clip, 1); delete clip; /*if (QString(prod->get("transparency")).toInt() == 1) @@ -3685,6 +3686,12 @@ bool Render::mltMoveClip(int startTrack, int endTrack, int moveStart, int moveEn bool checkLength = false; if (endTrack == startTrack) { Mlt::Producer *clipProducer = trackPlaylist.replace_with_blank(clipIndex); + if (!clipProducer) { + kDebug() << "// Cannot get clip at index: "<is_valid() || clipProducer->is_blank()) { @@ -3710,12 +3717,12 @@ bool Render::mltMoveClip(int startTrack, int endTrack, int moveStart, int moveEn service.unlock(); return false; } - } - - if (overwrite) { + } else { + // Overwrite mode trackPlaylist.remove_region(moveEnd, clipProducer->get_playtime()); - int clipIndex = trackPlaylist.get_clip_index_at(moveEnd); - trackPlaylist.insert_blank(clipIndex, clipProducer->get_playtime() - 1); + int ix = trackPlaylist.get_clip_index_at(moveEnd); + trackPlaylist.insert_blank(ix, clipProducer->get_playtime() - 1); + trackPlaylist.consolidate_blanks(0); } int newIndex = trackPlaylist.insert_at(moveEnd, clipProducer, 1); if (newIndex == -1) { @@ -3725,9 +3732,9 @@ bool Render::mltMoveClip(int startTrack, int endTrack, int moveStart, int moveEn service.unlock(); return false; } - trackPlaylist.consolidate_blanks(1); + trackPlaylist.consolidate_blanks(0); delete clipProducer; - if (newIndex + 1 == trackPlaylist.count()) checkLength = true; + if (newIndex + 1 >= trackPlaylist.count()) checkLength = true; } else { Mlt::Producer destTrackProducer(tractor.track(endTrack)); Mlt::Playlist destTrackPlaylist((mlt_playlist) destTrackProducer.get_service()); @@ -3771,6 +3778,7 @@ bool Render::mltMoveClip(int startTrack, int endTrack, int moveStart, int moveEn destTrackPlaylist.remove_region(moveEnd, clip->get_playtime()); int clipIndex = destTrackPlaylist.get_clip_index_at(moveEnd); destTrackPlaylist.insert_blank(clipIndex, clip->get_playtime() - 1); + destTrackPlaylist.consolidate_blanks(0); } int newIndex = destTrackPlaylist.insert_at(moveEnd, clip, 1);