- int in = cropStart().frames(fps());
- int out = in + cropDuration().frames(fps());
- int dur = out - in - 1;
-
- effect.setAttribute("in", in);
- effect.setAttribute("out", out);
-
- Mlt::Geometry geometry(param.attribute("value").toUtf8().data(), dur, width, height);
- Mlt::GeometryItem item;
- bool endFrameAdded = false;
- if (cut == 0) {
- while (!geometry.next_key(&item, dur)) {
- if (!endFrameAdded) {
- // add keyframe at the end with interpolated value
-
- // but only once ;)
- endFrameAdded = true;
-
- Mlt::GeometryItem endItem;
- Mlt::GeometryItem interp;
- geometry.fetch(&interp, dur - 1);
- endItem.frame(dur - 1);
- endItem.x(interp.x());
- endItem.y(interp.y());
- endItem.w(interp.w());
- endItem.h(interp.h());
- endItem.mix(interp.mix());
- geometry.insert(&endItem);
- }
- geometry.remove(item.frame());
- }
- } else {
- Mlt::Geometry origGeometry(param.attribute("value").toUtf8().data(), dur, width, height);
- // remove keyframes before cut point
- while (!geometry.prev_key(&item, cut - 1) && item.frame() < cut)
- geometry.remove(item.frame());
-
- // add a keyframe at new pos 0
- origGeometry.fetch(&item, cut);
- item.frame(0);
- geometry.insert(&item);
-
- // move exisiting keyframes by -cut
- while (!origGeometry.next_key(&item, cut)) {
- geometry.remove(item.frame());
- origGeometry.remove(item.frame());
- item.frame(item.frame() - cut);
- geometry.insert(&item);
- }
- }