if (m_mltProfile) delete m_mltProfile;
m_mltProfile = NULL;
- m_mltProfile = new Mlt::Profile((char*) profile.toUtf8().data());
+ char *tmp = decodedString(profile);
+ m_mltProfile = new Mlt::Profile(tmp);
+ delete[] tmp;
m_mltConsumer = new Mlt::Consumer(*m_mltProfile , "sdl_preview"); //consumer;
m_mltConsumer->set("resize", 1);
m_mltConsumer->set("window_id", m_winid);
m_mltConsumer->set("audio_buffer", 1024);
m_mltConsumer->set("frequency", 48000);
- Mlt::Producer *producer = new Mlt::Producer(*m_mltProfile , "westley-xml", (char *) scene.toUtf8().data());
+ tmp = decodedString(scene);
+ Mlt::Producer *producer = new Mlt::Producer(*m_mltProfile , "westley-xml", tmp);
+ delete[] tmp;
m_mltProducer = producer;
m_mltConsumer->connect(*m_mltProducer);
m_mltProducer->set_speed(0.0);
if (m_mltProducer->get_speed() == 0.0) m_mltProducer->set_speed(1.0);
else {
m_isBlocked = true;
- m_mltProducer->set_speed(0.0);
- m_mltConsumer->set("refresh", 0);
+ m_mltProducer->set_speed(0.0);
+ //m_mltConsumer->set("refresh", 0);
m_mltProducer->seek((int) m_framePosition);
m_isBlocked = false;
}
-
/*if (speed == 0.0) {
m_mltProducer->seek((int) m_framePosition + 1);
m_mltConsumer->purge();
if (!kfr.isEmpty()) {
QStringList keyFrames = kfr.split(";", QString::SkipEmptyParts);
kDebug() << "// ADDING KEYFRAME EFFECT: " << args.value("keyframes");
- char *starttag = decodedString(args.value("starttag"));
+ char *starttag = decodedString(args.value("starttag", "start"));
char *endtag = decodedString(args.value("endtag", "end"));
kDebug() << "// ADDING KEYFRAME TAGS: " << starttag << ", " << endtag;
int duration = clip->get_playtime();
- int max = args.value("max").toInt();
- int min = args.value("min").toInt();
+ double max = args.value("max").toDouble();
+ double min = args.value("min").toDouble();
double factor = args.value("factor", "1").toDouble();
args.remove("starttag");
args.remove("endtag");
args.remove("keyframes");
- int offset = 0;
+ args.remove("min");
+ args.remove("max");
+ args.remove("factor");
+ int offset = 0;
for (int i = 0; i < keyFrames.size() - 1; ++i) {
Mlt::Filter *filter = new Mlt::Filter(*m_mltProfile, filterTag);
filter->set("kdenlive_id", filterId);
filter->set("in", x1);
filter->set("out", x2);
//kDebug() << "// ADDING KEYFRAME vals: " << min<<" / "<<max<<", "<<y1<<", factor: "<<factor;
- filter->set(starttag, QString::number((min + y1 * (max - min) / 100.0) / factor).toUtf8().data());
- filter->set(endtag, QString::number((min + y2 * (max - min) / 100.0) / factor).toUtf8().data());
+ filter->set(starttag, QString::number((min + y1) / factor).toUtf8().data());
+ filter->set(endtag, QString::number((min + y2) / factor).toUtf8().data());
clipService.attach(*filter);
- offset = 1;
+ offset = 1;
}
delete[] starttag;
delete[] endtag;
m_isBlocked = false;
}
-void Render::mltMoveClip(int startTrack, int endTrack, GenTime moveStart, GenTime moveEnd) {
- mltMoveClip(startTrack, endTrack, (int) moveStart.frames(m_fps), (int) moveEnd.frames(m_fps));
+bool Render::mltMoveClip(int startTrack, int endTrack, GenTime moveStart, GenTime moveEnd) {
+ return mltMoveClip(startTrack, endTrack, (int) moveStart.frames(m_fps), (int) moveEnd.frames(m_fps));
}
-void Render::mltMoveClip(int startTrack, int endTrack, int moveStart, int moveEnd) {
+bool Render::mltMoveClip(int startTrack, int endTrack, int moveStart, int moveEnd) {
m_isBlocked = true;
m_mltConsumer->set("refresh", 0);
Mlt::Producer clipProducer(trackPlaylist.replace_with_blank(clipIndex));
trackPlaylist.consolidate_blanks(0);
if (!trackPlaylist.is_blank_at(moveEnd)) {
- kWarning() << "// ERROR, CLIP COLLISION----------";
- int ix = trackPlaylist.get_clip_index_at(moveEnd);
- kDebug() << "BAD CLIP STARTS AT: " << trackPlaylist.clip_start(ix) << ", LENGT: " << trackPlaylist.clip_length(ix);
+ // error, destination is not empty
+ //int ix = trackPlaylist.get_clip_index_at(moveEnd);
+ mlt_service_unlock(m_mltConsumer->get_service());
+ m_isBlocked = false;
+ return false;
}
- trackPlaylist.insert_at(moveEnd, clipProducer, 1);
- trackPlaylist.consolidate_blanks(0);
+ else {
+ trackPlaylist.insert_at(moveEnd, clipProducer, 1);
+ trackPlaylist.consolidate_blanks(0);
+ }
//mlt_service_unlock(service.get_service());
} else {
- Mlt::Producer clipProducer(trackPlaylist.replace_with_blank(clipIndex));
- trackPlaylist.consolidate_blanks(0);
-
Mlt::Producer destTrackProducer(tractor.track(endTrack));
Mlt::Playlist destTrackPlaylist((mlt_playlist) destTrackProducer.get_service());
- destTrackPlaylist.consolidate_blanks(1);
- destTrackPlaylist.insert_at(moveEnd, clipProducer, 1);
- destTrackPlaylist.consolidate_blanks(0);
+ if (!destTrackPlaylist.is_blank_at(moveEnd)) {
+ // error, destination is not empty
+ mlt_service_unlock(m_mltConsumer->get_service());
+ m_isBlocked = false;
+ return false;
+ }
+ else {
+ Mlt::Producer clipProducer(trackPlaylist.replace_with_blank(clipIndex));
+ trackPlaylist.consolidate_blanks(0);
+ destTrackPlaylist.consolidate_blanks(1);
+ destTrackPlaylist.insert_at(moveEnd, clipProducer, 1);
+ destTrackPlaylist.consolidate_blanks(0);
+ }
}
mltCheckLength();
mlt_service_unlock(m_mltConsumer->get_service());
m_isBlocked = false;
m_mltConsumer->set("refresh", 1);
+ return true;
}
void Render::mltMoveTransition(QString type, int startTrack, int newTrack, int newTransitionTrack, GenTime oldIn, GenTime oldOut, GenTime newIn, GenTime newOut) {
}
void Render::mltUpdateTransition(QString oldTag, QString tag, int a_track, int b_track, GenTime in, GenTime out, QDomElement xml) {
- //kDebug() << "update transition" << tag;
+ // kDebug() << "update transition" << tag << " at pos " << in.frames(25);
if (oldTag == tag) mltUpdateTransitionParams(tag, a_track, b_track, in, out, xml);
else {
mltDeleteTransition(oldTag, a_track, b_track, in, out, xml, false);
}
void Render::mltDeleteTransition(QString tag, int a_track, int b_track, GenTime in, GenTime out, QDomElement xml, bool do_refresh) {
-
Mlt::Service service(m_mltProducer->parent().get_service());
Mlt::Tractor tractor(service);
Mlt::Field *field = tractor.field();
kDebug() << "// FOUND EXISTING TRANS, IN: " << currentIn << ", OUT: " << currentOut << ", TRACK: " << currentTrack;
if (resource == tag && b_track == currentTrack && currentIn <= old_pos && currentOut >= old_pos) {
+ //kDebug() << " / / / / /DELETE TRANS DOOOMNE";
mlt_field_disconnect_service(field->get_field(), nextservice);
+ mlt_service_close(nextservice);
break;
}
nextservice = mlt_service_producer(nextservice);
}
void Render::mltAddTransition(QString tag, int a_track, int b_track, GenTime in, GenTime out, QDomElement xml, bool do_refresh) {
- //kDebug() << "-- ADDING TRANSITION: " << tag << ", ON TRACKS: " << a_track << ", " << b_track;
QMap<QString, QString> args = mltGetTransitionParamsFromXml(xml);