}
}
-GenTime AbstractClipItem::duration() const
-{
- return m_cropDuration;
-}
-
GenTime AbstractClipItem::startPos() const
{
return m_startPos;
virtual GenTime cropDuration() const ;
virtual void resizeStart(int posx, double speed = 1.0);
virtual void resizeEnd(int posx, double speed = 1.0, bool updateKeyFrames = true);
- virtual GenTime duration() const;
virtual double fps() const;
virtual GenTime maxDuration() const;
virtual void setCropStart(GenTime pos);
m_view.clip_position->setText(tc.getTimecode(m_clip->startPos(), m_fps));
m_view.crop_position->setText(tc.getTimecode(m_clip->cropStart(), m_fps));
- m_view.clip_duration->setText(tc.getTimecode(m_clip->duration(), m_fps));
+ m_view.clip_duration->setText(tc.getTimecode(m_clip->cropDuration(), m_fps));
connect(m_view.position_up, SIGNAL(clicked()), this, SLOT(slotPosUp()));
connect(m_view.position_down, SIGNAL(clicked()), this, SLOT(slotPosDown()));
connect(m_view.crop_up, SIGNAL(clicked()), this, SLOT(slotCropUp()));
}
if (effect.attribute("tag") == "volume" || effect.attribute("tag") == "brightness") {
if (effect.attribute("id") == "fadeout" || effect.attribute("id") == "fade_to_black") {
- int end = (duration() + cropStart()).frames(m_fps);
+ int end = (cropDuration() + cropStart()).frames(m_fps);
int start = end;
if (effect.attribute("id") == "fadeout") {
if (m_effectList.hasEffect(QString(), "fade_to_black") == -1) {
pen.setStyle(Qt::DotLine);
painter->setPen(pen);
for (; it != markers.end(); ++it) {
- pos = (*it).time() - cropStart();
+ pos = (*it).time() / m_speed - cropStart();
if (pos > GenTime()) {
- if (pos > duration()) break;
+ if (pos > cropDuration()) break;
QLineF l(br.x() + pos.frames(m_fps), br.y(), br.x() + pos.frames(m_fps), br.bottom());
QLineF l2 = painter->matrix().map(l);
//framepos = scale * pos.frames(m_fps);
else setToolTip(i18n("Audio fade duration: %1s", GenTime(m_endFade, m_fps).seconds()));
return FADEOUT;
} else if ((rect.right() - pos.x() < maximumOffset) && (rect.bottom() - pos.y() > addtransitionOffset)) {
- setToolTip(i18n("Clip duration: %1s", duration().seconds()));
+ setToolTip(i18n("Clip duration: %1s", cropDuration().seconds()));
return RESIZEEND;
} else if ((pos.x() - rect.x() < 16 / scale) && (rect.bottom() - pos.y() <= addtransitionOffset)) {
setToolTip(i18n("Add transition"));
GenTime pos;
for (int i = 0; i < markers.size(); i++) {
- pos = markers.at(i) - cropStart();
+ pos = markers.at(i) / m_speed - cropStart();
if (pos > GenTime()) {
- if (pos > duration()) break;
+ if (pos > cropDuration()) break;
else snaps.append(pos + startPos());
}
}
GenTime pos;
for (int i = 0; i < markers.size(); i++) {
- pos = markers.at(i).time() - cropStart();
+ pos = markers.at(i).time() / m_speed - cropStart();
if (pos > GenTime()) {
- if (pos > duration()) break;
+ if (pos > cropDuration()) break;
else snaps.append(CommentedTime(pos + startPos(), markers.at(i).comment()));
}
}
if (posx > max && maxDuration() != GenTime()) posx = max;
if (posx == endPos().frames(m_fps)) return;
//kDebug() << "// NEW POS: " << posx << ", OLD END: " << endPos().frames(m_fps);
- const int previous = (cropStart() + duration()).frames(m_fps);
+ const int previous = (cropStart() + cropDuration()).frames(m_fps);
AbstractClipItem::resizeEnd(posx, m_speed);
- if ((int)(cropStart() + duration()).frames(m_fps) != previous) {
- if (updateKeyFrames) checkEffectsKeyframesPos(previous, (cropStart() + duration()).frames(m_fps), false);
+ if ((int)(cropStart() + cropDuration()).frames(m_fps) != previous) {
+ if (updateKeyFrames) checkEffectsKeyframesPos(previous, (cropStart() + cropDuration()).frames(m_fps), false);
if (m_hasThumbs && KdenliveSettings::videothumbnails()) {
/*connect(m_clip->thumbProducer(), SIGNAL(thumbReady(int, QPixmap)), this, SLOT(slotThumbReady(int, QPixmap)));*/
m_endThumbTimer->start(150);
QUndoCommand *moveCommand = new QUndoCommand();
moveCommand->setText(i18n("Edit clip"));
ItemInfo clipInfo = m_dragItem->info();
- if (d.duration() < m_dragItem->duration() || d.cropStart() != clipInfo.cropStart) {
+ if (d.duration() < m_dragItem->cropDuration() || d.cropStart() != clipInfo.cropStart) {
// duration was reduced, so process it first
ItemInfo startInfo = clipInfo;
clipInfo.endPos = clipInfo.startPos + d.duration();
clipInfo.endPos = m_dragItem->endPos() + (clipInfo.startPos - startInfo.startPos);
new MoveClipCommand(this, startInfo, clipInfo, true, moveCommand);
}
- if (d.duration() > m_dragItem->duration()) {
+ if (d.duration() > m_dragItem->cropDuration()) {
// duration was increased, so process it after move
ItemInfo startInfo = clipInfo;
clipInfo.endPos = clipInfo.startPos + d.duration();
ClipItem *clip = static_cast <ClipItem *>(children.at(i));
ItemInfo info = clip->info();
kDebug() << " / / INSERT : " << pos.x();
- QRectF shape = QRectF(clip->startPos().frames(m_document->fps()), clip->track() * m_tracksHeight + 1, clip->duration().frames(m_document->fps()) - 0.02, m_tracksHeight - 1);
+ QRectF shape = QRectF(clip->startPos().frames(m_document->fps()), clip->track() * m_tracksHeight + 1, clip->cropDuration().frames(m_document->fps()) - 0.02, m_tracksHeight - 1);
kDebug() << " / / INSERT RECT: " << shape;
path = path.united(QPolygonF(shape));
}
ClipItem *transitionClip = NULL;
const int transitiontrack = getPreviousVideoTrack(info.track);
GenTime pos = GenTime((int)(mapToScene(m_menuPosition).x()), m_document->fps());
- if (pos < item->startPos() + item->duration() / 2) {
+ if (pos < item->startPos() + item->cropDuration() / 2) {
// add transition to clip start
info.startPos = item->startPos();
if (transitiontrack != 0) transitionClip = getClipItemAt((int) info.startPos.frames(m_document->fps()), m_document->tracksCount() - transitiontrack);
int ix = item->hasEffect("volume", "fadeout");
if (ix != -1) {
QDomElement oldeffect = item->effectAt(ix);
- int end = (item->duration() + item->cropStart()).frames(m_document->fps());
+ int end = (item->cropDuration() + item->cropStart()).frames(m_document->fps());
int start = item->fadeOut();
if (start == 0) {
slotDeleteEffect(item, oldeffect);
ix = item->hasEffect("brightness", "fade_to_black");
if (ix != -1) {
QDomElement oldeffect = item->effectAt(ix);
- int end = (item->duration() + item->cropStart()).frames(m_document->fps());
+ int end = (item->cropDuration() + item->cropStart()).frames(m_document->fps());
int start = item->fadeOut();
if (start == 0) {
slotDeleteEffect(item, oldeffect);
void CustomTrackView::updateSnapPoints(AbstractClipItem *selected, QList <GenTime> offsetList, bool skipSelectedItems)
{
QList <GenTime> snaps;
- if (selected && offsetList.isEmpty()) offsetList.append(selected->duration());
+ if (selected && offsetList.isEmpty()) offsetList.append(selected->cropDuration());
QList<QGraphicsItem *> itemList = items();
for (int i = 0; i < itemList.count(); i++) {
if (itemList.at(i) == selected) continue;
kDebug() << "// CHK DOC TRK:" << freetrack << ", DUR:" << m_document->renderer()->mltTrackDuration(freetrack);
if (m_document->trackInfoAt(freetrack - 1).type == AUDIOTRACK) {
kDebug() << "// CHK DOC TRK:" << freetrack << ", DUR:" << m_document->renderer()->mltTrackDuration(freetrack);
- if (m_document->renderer()->mltTrackDuration(freetrack) < start || m_document->renderer()->mltGetSpaceLength(pos, freetrack, false) >= clip->duration().frames(m_document->fps())) {
+ if (m_document->renderer()->mltTrackDuration(freetrack) < start || m_document->renderer()->mltGetSpaceLength(pos, freetrack, false) >= clip->cropDuration().frames(m_document->fps())) {
kDebug() << "FOUND SPACE ON TRK: " << freetrack;
break;
}
if (m_activeTimeline) {
ClipItem *item = m_activeTimeline->projectView()->getActiveClipUnderCursor();
if (item) {
- pos = m_projectMonitor->position() - item->startPos() + item->cropStart();
+ pos = (m_projectMonitor->position() - item->startPos() + item->cropStart()) / item->speed();
clip = item->baseClip();
}
}
if (m_activeTimeline) {
ClipItem *item = m_activeTimeline->projectView()->getActiveClipUnderCursor();
if (item) {
- pos = m_projectMonitor->position() - item->startPos() + item->cropStart();
+ pos = (m_projectMonitor->position() - item->startPos() + item->cropStart()) / item->speed();
clip = item->baseClip();
}
}
if (m_activeTimeline) {
ClipItem *item = m_activeTimeline->projectView()->getActiveClipUnderCursor();
if (item) {
- pos = m_projectMonitor->position() - item->startPos() + item->cropStart();
+ pos = (m_projectMonitor->position() - item->startPos() + item->cropStart()) / item->speed();
clip = item->baseClip();
}
}
m_mltConsumer->set("refresh", 1);
}
+
+void Render::mltPasteEffects(Mlt::Producer *source, Mlt::Producer *dest)
+{
+ Mlt::Service sourceService(source->get_service());
+ Mlt::Service destService(dest->get_service());
+
+ // move all effects to the correct producer
+ int ct = 0;
+ Mlt::Filter *filter = sourceService.filter(ct);
+ while (filter) {
+ if (filter->get("kdenlive_ix") != 0) {
+ sourceService.detach(*filter);
+ destService.attach(*filter);
+ } else ct++;
+ filter = sourceService.filter(ct);
+ }
+}
+
int Render::mltChangeClipSpeed(ItemInfo info, double speed, double oldspeed, Mlt::Producer *prod)
{
m_isBlocked = true;
delete clip;
return -1;
}
- delete clip;
+
QString serv = clipparent.get("mlt_service");
QString id = clipparent.get("id");
//kDebug() << "CLIP SERVICE: " << serv;
GenTime maxLength = GenTime(blankEnd, m_fps) - info.startPos;
cut = slowprod->cut((int)(info.cropStart.frames(m_fps) / speed), (int)(info.cropStart.frames(m_fps) / speed + maxLength.frames(m_fps) - 1));
} else cut = slowprod->cut((int)(info.cropStart.frames(m_fps) / speed), (int)((info.cropStart.frames(m_fps) + clipLength) / speed - 1));
+
+ // move all effects to the correct producer
+ mltPasteEffects(clip, cut);
+
trackPlaylist.insert_at(startPos, *cut, 1);
clipIndex = trackPlaylist.get_clip_index_at(startPos);
newLength = trackPlaylist.clip_length(clipIndex);
GenTime maxLength = GenTime(blankEnd, m_fps) - info.startPos;
cut = prod->cut((int)(info.cropStart.frames(m_fps)), (int)(info.cropStart.frames(m_fps) + maxLength.frames(m_fps) - 1));
} else cut = prod->cut((int)(info.cropStart.frames(m_fps)), (int)((info.cropStart + newDuration).frames(m_fps)) - 1);
+
+ // move all effects to the correct producer
+ mltPasteEffects(clip, cut);
+
trackPlaylist.insert_at(startPos, *cut, 1);
clipIndex = trackPlaylist.get_clip_index_at(startPos);
newLength = trackPlaylist.clip_length(clipIndex);
cut = slowprod->cut((int)(info.cropStart.frames(m_fps) / speed), (int)(info.cropStart.frames(m_fps) / speed + maxLength.frames(m_fps) - 1));
} else cut = slowprod->cut((int)(info.cropStart.frames(m_fps) / speed), (int)((info.cropStart / speed + newDuration).frames(m_fps) - 1));
+ // move all effects to the correct producer
+ mltPasteEffects(clip, cut);
+
trackPlaylist.insert_at(startPos, *cut, 1);
clipIndex = trackPlaylist.get_clip_index_at(startPos);
newLength = trackPlaylist.clip_length(clipIndex);
mlt_service_unlock(service.get_service());
}
+
+ delete clip;
if (clipIndex + 1 == trackPlaylist.count()) mltCheckLength();
m_isBlocked = false;
return newLength;
Mlt::Producer *clip = prod->cut(clipProducer.get_in(), clipProducer.get_out());
// move all effects to the correct producer
- Mlt::Service clipService(clipProducer.get_service());
- Mlt::Service newClipService(clip->get_service());
-
- int ct = 0;
- Mlt::Filter *filter = clipService.filter(ct);
- while (filter) {
- if (filter->get("kdenlive_ix") != 0) {
- clipService.detach(*filter);
- newClipService.attach(*filter);
- } else ct++;
- filter = clipService.filter(ct);
- }
+ mltPasteEffects(&clipProducer, clip);
trackPlaylist.insert_at(pos, clip, 1);
mlt_service_unlock(m_mltConsumer->get_service());
}
// move all effects to the correct producer
- Mlt::Service clipService(clipProducer.get_service());
- Mlt::Service newClipService(clip->get_service());
-
- int ct = 0;
- Mlt::Filter *filter = clipService.filter(ct);
- while (filter) {
- if (filter->get("kdenlive_ix") != 0) {
- clipService.detach(*filter);
- newClipService.attach(*filter);
- } else ct++;
- filter = clipService.filter(ct);
- }
+ mltPasteEffects(&clipProducer, clip);
int newIndex = destTrackPlaylist.insert_at(moveEnd, clip, 1);
destTrackPlaylist.consolidate_blanks(0);
class Producer;
class Filter;
class Profile;
-class Multitrack;
+class Service;
};
/** Sets the description of this renderer to desc. */
void closeMlt();
void mltCheckLength();
+ void mltPasteEffects(Mlt::Producer *source, Mlt::Producer *dest);
QMap<QString, QString> mltGetTransitionParamsFromXml(QDomElement xml);
QMap<QString, Mlt::Producer *> m_slowmotionProducers;
void buildConsumer();
else m_ui.transitionTrack->setCurrentIndex(0);
m_ui.transitionTrack->blockSignals(false);
}
- if (update || t->duration() != m_transitionDuration || t->startPos() != m_transitionStart) {
- m_transitionDuration = t->duration();
+ if (update || t->cropDuration() != m_transitionDuration || t->startPos() != m_transitionStart) {
+ m_transitionDuration = t->cropDuration();
m_transitionStart = t->startPos();
slotTransitionChanged(false, true);
}
return;
} else if (update) return;
if (t) {
- m_transitionDuration = t->duration();
+ m_transitionDuration = t->cropDuration();
m_transitionStart = t->startPos();
m_ui.transitionTrack->blockSignals(true);
if (!t->forcedTrack()) m_ui.transitionTrack->setCurrentIndex(0);