X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Frenderer.cpp;h=0ece7e18ab0ff30ccb7f6e9ee04c0e1d746b0233;hb=4f6ba75aba90feaeeb43f85df08e4e3aaf20a613;hp=4f6f95e28ccbd6d69645488a8db23e658b796c26;hpb=d599ee70b5ab4dfdf107bafc570c11194345e20c;p=kdenlive diff --git a/src/renderer.cpp b/src/renderer.cpp index 4f6f95e2..0ece7e18 100644 --- a/src/renderer.cpp +++ b/src/renderer.cpp @@ -174,6 +174,7 @@ void Render::buildConsumer(const QString profileName) } setenv("SDL_VIDEO_ALLOW_SCREENSAVER", "1", 1); + //m_mltConsumer->set("fullscreen", 1); #ifdef Q_WS_MAC m_mltConsumer = new Mlt::Consumer(*m_mltProfile , "sdl_audio"); m_mltConsumer->set("preview_off", 1); @@ -909,7 +910,7 @@ int Render::setSceneList(QString playlist, int position) m_isBlocked = true; int error; - //kWarning() << "////// RENDER, SET SCENE LIST: " << playlist; + kDebug() << "////// RENDER, SET SCENE LIST: " << playlist; if (m_mltConsumer == NULL) { kWarning() << "/////// ERROR, TRYING TO USE NULL MLT CONSUMER"; @@ -1533,7 +1534,7 @@ void Render::mltCheckLength(Mlt::Tractor *tractor) } } -int Render::mltInsertClip(ItemInfo info, QDomElement element, Mlt::Producer *prod) +int Render::mltInsertClip(ItemInfo info, QDomElement element, Mlt::Producer *prod, bool overwrite, bool push) { if (m_mltProducer == NULL) { kDebug() << "PLAYLIST NOT INITIALISED //////"; @@ -1561,6 +1562,7 @@ int Render::mltInsertClip(ItemInfo info, QDomElement element, Mlt::Producer *pro } mlt_service_lock(service.get_service()); Mlt::Producer trackProducer(tractor.track(info.track)); + int trackDuration = trackProducer.get_playtime() - 1; Mlt::Playlist trackPlaylist((mlt_playlist) trackProducer.get_service()); //kDebug()<<"/// INSERT cLIP: "<cut((int) info.cropStart.frames(m_fps), (int)(info.endPos - info.startPos + info.cropStart).frames(m_fps) - 1); - int newIndex = trackPlaylist.insert_at((int) info.startPos.frames(m_fps), clip, 1); + int cutPos = (int) info.cropStart.frames(m_fps); + int insertPos = (int) info.startPos.frames(m_fps); + int cutDuration = (int)(info.endPos - info.startPos).frames(m_fps) - 1; + Mlt::Producer *clip = prod->cut(cutPos, cutDuration + cutPos); + if (overwrite && (insertPos < trackDuration)) { + // Replace zone with blanks + //trackPlaylist.split_at(insertPos, true); + trackPlaylist.remove_region(insertPos, cutDuration + 1); + int clipIndex = trackPlaylist.get_clip_index_at(insertPos); + trackPlaylist.insert_blank(clipIndex, cutDuration); + } else if (push) { + trackPlaylist.split_at(insertPos, true); + int clipIndex = trackPlaylist.get_clip_index_at(insertPos); + trackPlaylist.insert_blank(clipIndex, cutDuration); + } + int newIndex = trackPlaylist.insert_at(insertPos, clip, 1); delete clip; /*if (QString(prod->get("transparency")).toInt() == 1) mltAddClipTransparency(info, info.track - 1, QString(prod->get("id")).toInt());*/ @@ -2733,9 +2748,9 @@ bool Render::mltResizeClipStart(ItemInfo info, GenTime diff) return true; } -bool Render::mltMoveClip(int startTrack, int endTrack, GenTime moveStart, GenTime moveEnd, Mlt::Producer *prod) +bool Render::mltMoveClip(int startTrack, int endTrack, GenTime moveStart, GenTime moveEnd, Mlt::Producer *prod, bool overwrite, bool insert) { - return mltMoveClip(startTrack, endTrack, (int) moveStart.frames(m_fps), (int) moveEnd.frames(m_fps), prod); + return mltMoveClip(startTrack, endTrack, (int) moveStart.frames(m_fps), (int) moveEnd.frames(m_fps), prod, overwrite, insert); } @@ -2779,7 +2794,7 @@ bool Render::mltUpdateClipProducer(int track, int pos, Mlt::Producer *prod) return true; } -bool Render::mltMoveClip(int startTrack, int endTrack, int moveStart, int moveEnd, Mlt::Producer *prod) +bool Render::mltMoveClip(int startTrack, int endTrack, int moveStart, int moveEnd, Mlt::Producer *prod, bool overwrite, bool insert) { m_isBlocked++; @@ -2798,7 +2813,7 @@ 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 (!trackPlaylist.is_blank_at(moveEnd) || !clipProducer || clipProducer->is_blank()) { + if (!overwrite && (!trackPlaylist.is_blank_at(moveEnd) || !clipProducer || clipProducer->is_blank())) { // error, destination is not empty if (!trackPlaylist.is_blank_at(moveEnd)) trackPlaylist.insert_at(moveStart, clipProducer, 1); if (clipProducer) delete clipProducer; @@ -2809,7 +2824,13 @@ bool Render::mltMoveClip(int startTrack, int endTrack, int moveStart, int moveEn return false; } else { trackPlaylist.consolidate_blanks(0); + if (overwrite) { + trackPlaylist.remove_region(moveEnd, clipProducer->get_playtime()); + int clipIndex = trackPlaylist.get_clip_index_at(moveEnd); + trackPlaylist.insert_blank(clipIndex, clipProducer->get_playtime() - 1); + } int newIndex = trackPlaylist.insert_at(moveEnd, clipProducer, 1); + trackPlaylist.consolidate_blanks(1); delete clipProducer; /*if (QString(clipProducer.parent().get("transparency")).toInt() == 1) { mltMoveTransparency(moveStart, moveEnd, startTrack, endTrack, QString(clipProducer.parent().get("id")).toInt()); @@ -2820,7 +2841,7 @@ bool Render::mltMoveClip(int startTrack, int endTrack, int moveStart, int moveEn } else { Mlt::Producer destTrackProducer(tractor.track(endTrack)); Mlt::Playlist destTrackPlaylist((mlt_playlist) destTrackProducer.get_service()); - if (!destTrackPlaylist.is_blank_at(moveEnd)) { + if (!overwrite && !destTrackPlaylist.is_blank_at(moveEnd)) { // error, destination is not empty mlt_service_unlock(service.get_service()); m_isBlocked--; @@ -2836,7 +2857,7 @@ bool Render::mltMoveClip(int startTrack, int endTrack, int moveStart, int moveEn m_isBlocked--; return false; } - trackPlaylist.consolidate_blanks(0); + trackPlaylist.consolidate_blanks(1); destTrackPlaylist.consolidate_blanks(1); Mlt::Producer *clip; // check if we are moving a slowmotion producer @@ -2857,6 +2878,12 @@ bool Render::mltMoveClip(int startTrack, int endTrack, int moveStart, int moveEn // move all effects to the correct producer mltPasteEffects(clipProducer, clip); + if (overwrite) { + destTrackPlaylist.remove_region(moveEnd, clip->get_playtime()); + int clipIndex = trackPlaylist.get_clip_index_at(moveEnd); + trackPlaylist.insert_blank(clipIndex, clip->get_playtime() - 1); + } + int newIndex = destTrackPlaylist.insert_at(moveEnd, clip, 1); if (clip == clipProducer) { @@ -2883,6 +2910,32 @@ bool Render::mltMoveClip(int startTrack, int endTrack, int moveStart, int moveEn return true; } + +QList Render::checkTrackSequence(int track) +{ + QList list; + Mlt::Service service(m_mltProducer->parent().get_service()); + if (service.type() != tractor_type) { + kWarning() << "// TRACTOR PROBLEM"; + return list; + } + Mlt::Tractor tractor(service); + mlt_service_lock(service.get_service()); + Mlt::Producer trackProducer(tractor.track(track)); + Mlt::Playlist trackPlaylist((mlt_playlist) trackProducer.get_service()); + int clipNb = trackPlaylist.count(); + //kDebug() << "// PARSING SCENE TRACK: " << t << ", CLIPS: " << clipNb; + for (int i = 0; i < clipNb; i++) { + Mlt::Producer *c = trackPlaylist.get_clip(i); + int pos = trackPlaylist.clip_start(i); + if (!list.contains(pos)) list.append(pos); + pos += c->get_playtime(); + if (!list.contains(pos)) list.append(pos); + delete c; + } + return list; +} + bool Render::mltMoveTransition(QString type, int startTrack, int newTrack, int newTransitionTrack, GenTime oldIn, GenTime oldOut, GenTime newIn, GenTime newOut) { int new_in = (int)newIn.frames(m_fps); @@ -2908,7 +2961,7 @@ bool Render::mltMoveTransition(QString type, int startTrack, int newTrack, int n int currentTrack = transition.get_b_track(); int currentIn = (int) transition.get_in(); int currentOut = (int) transition.get_out(); - + if (resource == type && startTrack == currentTrack && currentIn <= old_pos && currentOut >= old_pos) { found = true; if (newTrack - startTrack != 0) {