}
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);
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";
}
}
-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 //////";
}
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: "<<info.cropStart.frames(m_fps)<<", "<<info.startPos.frames(m_fps)<<"-"<<info.endPos.frames(m_fps);
return -1;
}
}
-
- Mlt::Producer *clip = prod->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());*/
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);
}
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++;
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;
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());
} 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--;
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
// 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) {
return true;
}
+
+QList <int> Render::checkTrackSequence(int track)
+{
+ QList <int> 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);
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) {