+int Render::mltChangeClipSpeed(ItemInfo info, double speed, Mlt::Producer *prod) {
+ m_isBlocked = true;
+ int newLength = 0;
+ Mlt::Service service(m_mltProducer->parent().get_service());
+ if (service.type() != tractor_type) kWarning() << "// TRACTOR PROBLEM";
+
+ Mlt::Tractor tractor(service);
+ Mlt::Producer trackProducer(tractor.track(info.track));
+ Mlt::Playlist trackPlaylist((mlt_playlist) trackProducer.get_service());
+ int clipIndex = trackPlaylist.get_clip_index_at((int) info.startPos.frames(m_fps));
+ Mlt::Producer clip(trackPlaylist.get_clip(clipIndex));
+ QString serv = clip.parent().get("mlt_service");
+ QString id = clip.parent().get("id");
+ kDebug() << "CLIP SERVICE: " << clip.parent().get("mlt_service");
+ if (serv == "avformat" && speed != 1.0) {
+ mlt_service_lock(service.get_service());
+ QString url = clip.parent().get("resource");
+ url.append(":" + QString::number(speed));
+ char *tmp = decodedString(url);
+ Mlt::Producer *slow = new Mlt::Producer(*m_mltProfile, "framebuffer", tmp);
+ delete[] tmp;
+ tmp = decodedString(id);
+ slow->set("id", tmp);
+ delete[] tmp;
+ slow->set_in_and_out(info.cropStart.frames(m_fps), (info.endPos - info.startPos).frames(m_fps));
+ newLength = slow->get_length();
+ trackPlaylist.replace_with_blank(clipIndex);
+ trackPlaylist.consolidate_blanks(0);
+ trackPlaylist.insert_at((int) info.startPos.frames(m_fps), *slow, 1);
+ mlt_service_unlock(service.get_service());
+ kDebug() << "AVFORMAT CLIP!!!:";
+ } else if (speed == 1.0) {
+ mlt_service_lock(service.get_service());
+ Mlt::Producer *cut = prod->cut(info.cropStart.frames(m_fps), (info.endPos - info.startPos).frames(m_fps) - 1);
+ trackPlaylist.replace_with_blank(clipIndex);
+ newLength = cut->get_length();
+ trackPlaylist.consolidate_blanks(0);
+ trackPlaylist.insert_at((int) info.startPos.frames(m_fps), *cut, 1);
+ mlt_service_unlock(service.get_service());
+ } else if (serv == "framebuffer") {
+ mlt_service_lock(service.get_service());
+ QString url = clip.parent().get("resource");
+ url = url.section(":", 0, -1);
+ url.append(":" + QString::number(speed));
+ char *tmp = decodedString(url);
+ Mlt::Producer *slow = new Mlt::Producer(*m_mltProfile, "framebuffer", tmp);
+ delete[] tmp;
+ tmp = decodedString(id);
+ slow->set("id", tmp);
+ delete[] tmp;
+ slow->set_in_and_out(info.cropStart.frames(m_fps), (info.endPos - info.startPos).frames(m_fps));
+ newLength = slow->get_length();
+ trackPlaylist.replace_with_blank(clipIndex);
+ trackPlaylist.consolidate_blanks(0);
+ trackPlaylist.insert_at((int) info.startPos.frames(m_fps), *slow, 1);
+ mlt_service_unlock(service.get_service());
+ kDebug() << "AVFORMAT CLIP!!!:";
+ }
+
+ m_isBlocked = false;
+ return newLength;
+}
+