+ Mlt::Tractor tractor(service);
+ Mlt::Producer trackProducer(tractor.track(track));
+ Mlt::Playlist trackPlaylist((mlt_playlist) trackProducer.get_service());
+
+ Mlt::Producer *clip = trackPlaylist.get_clip_at((int) position.frames(m_fps));
+ if (!clip) {
+ return false;
+ }
+ Mlt::Service clipService(clip->get_service());
+ m_isBlocked = true;
+ // create filter
+ QString tag = args.value("tag");
+ kDebug() << " / / INSERTING EFFECT: " << tag;
+ if (tag.startsWith("ladspa")) tag = "ladspa";
+ char *filterTag = decodedString(tag);
+ char *filterId = decodedString(args.value("id"));
+ QMap<QString, QString>::Iterator it;
+ QString kfr = args.value("keyframes");
+
+ if (!kfr.isEmpty()) {
+ QStringList keyFrames = kfr.split(";", QString::SkipEmptyParts);
+ kDebug() << "// ADDING KEYFRAME EFFECT: " << args.value("keyframes");
+ 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();
+ 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");
+ 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);
+ int x1 = keyFrames.at(i).section(":", 0, 0).toInt() + offset;
+ double y1 = keyFrames.at(i).section(":", 1, 1).toDouble();
+ int x2 = keyFrames.at(i + 1).section(":", 0, 0).toInt();
+ double y2 = keyFrames.at(i + 1).section(":", 1, 1).toDouble();
+ if (x2 == -1) x2 = duration;
+ for (it = args.begin(); it != args.end(); ++it) {
+ char *name = decodedString(it.key());
+ char *value = decodedString(it.value());
+ filter->set(name, value);
+ delete[] name;
+ delete[] value;
+ }
+
+ filter->set("in", x1);
+ filter->set("out", x2);
+ //kDebug() << "// ADDING KEYFRAME vals: " << min<<" / "<<max<<", "<<y1<<", factor: "<<factor;
+ 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;