+ if (isAudioOnly())
+ return m_clip->audioProducer(track);
+ else if (isVideoOnly())
+ return m_clip->videoProducer();
+ else
+ return m_clip->producer(trackSpecific ? track : -1);
+}
+
+QMap<int, QDomElement> ClipItem::adjustEffectsToDuration(int width, int height, ItemInfo oldInfo)
+{
+ QMap<int, QDomElement> effects;
+ for (int i = 0; i < m_effectList.count(); i++) {
+ QDomElement effect = m_effectList.at(i);
+
+ if (effect.attribute("id").startsWith("fade")) {
+ QString id = effect.attribute("id");
+ int in = EffectsList::parameter(effect, "in").toInt();
+ int out = EffectsList::parameter(effect, "out").toInt();
+ int clipEnd = (cropStart() + cropDuration()).frames(m_fps) - 1;
+ if (id == "fade_from_black" || id == "fadein") {
+ if (in != cropStart().frames(m_fps)) {
+ effects[i] = effect.cloneNode().toElement();
+ int diff = in - cropStart().frames(m_fps);
+ in -= diff;
+ out -= diff;
+ EffectsList::setParameter(effect, "in", QString::number(in));
+ EffectsList::setParameter(effect, "out", QString::number(out));
+ }
+ if (out > clipEnd) {
+ if (!effects.contains(i))
+ effects[i] = effect.cloneNode().toElement();
+ EffectsList::setParameter(effect, "out", QString::number(clipEnd));
+ }
+ if (effects.contains(i))
+ setFadeIn(out - in);
+ } else {
+ if (out != clipEnd) {
+ effects[i] = effect.cloneNode().toElement();
+ int diff = out - clipEnd;
+ in = qMax(in - diff, (int) cropStart().frames(m_fps));
+ out -= diff;
+ EffectsList::setParameter(effect, "in", QString::number(in));
+ EffectsList::setParameter(effect, "out", QString::number(out));
+ }
+ if (in < cropStart().frames(m_fps)) {
+ if (!effects.contains(i))
+ effects[i] = effect.cloneNode().toElement();
+ EffectsList::setParameter(effect, "in", QString::number(cropStart().frames(m_fps)));
+ }
+ if (effects.contains(i))
+ setFadeOut(out - in);
+ }
+ continue;
+ } else if (effect.attribute("id") == "freeze" && cropStart() != oldInfo.cropStart) {
+ effects[i] = effect.cloneNode().toElement();
+ int diff = (oldInfo.cropStart - cropStart()).frames(m_fps);
+ int frame = EffectsList::parameter(effect, "frame").toInt();
+ EffectsList::setParameter(effect, "frame", QString::number(frame - diff));
+ continue;
+ }