]> git.sesse.net Git - kdenlive/commitdiff
Make the Fade to Black video filter work, and let the audio Fade In and Fade Out...
authorDan Dennedy <dan@dennedy.org>
Mon, 16 Feb 2009 08:04:05 +0000 (08:04 +0000)
committerDan Dennedy <dan@dennedy.org>
Mon, 16 Feb 2009 08:04:05 +0000 (08:04 +0000)
svn path=/branches/KDE4/; revision=3057

src/clipitem.cpp
src/customtrackview.cpp
src/effectstackedit.cpp

index 98e9b3c76b359a01fb3299b501eab927e30b6979..d0cf6bec8be185426428ab366386d8035c86776d 100644 (file)
@@ -155,15 +155,41 @@ void ClipItem::initEffect(QDomElement effect) {
         }
     }
 
-    if (effect.attribute("tag") == "volume") {
-        if (effect.attribute("id") == "fadeout") {
+    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 start = end - EffectsList::parameter(effect, "in").toInt();
+            int start = end;
+            if (effect.attribute("id") == "fadeout" ) {
+                if (m_effectList.hasEffect("", "fade_to_black") == -1) {
+                    start -= EffectsList::parameter(effect, "in").toInt();
+                } else {
+                    QDomElement fadeout = m_effectList.getEffectByTag("", "fade_to_black");
+                    start -= EffectsList::parameter(fadeout, "out").toInt() - EffectsList::parameter(fadeout, "in").toInt();
+                }
+            } else if (effect.attribute("id") == "fade_to_black" ) {
+                if (m_effectList.hasEffect("", "fadeout") == -1) {
+                    start -= EffectsList::parameter(effect, "in").toInt();
+                } else {
+                    QDomElement fadeout = m_effectList.getEffectByTag("", "fadeout");
+                    start -= EffectsList::parameter(fadeout, "out").toInt() - EffectsList::parameter(fadeout, "in").toInt();
+                }
+            }
             EffectsList::setParameter(effect, "in", QString::number(start));
             EffectsList::setParameter(effect, "out", QString::number(end));
-        } else if (effect.attribute("id") == "fadein") {
+        } else if (effect.attribute("id") == "fadein" || effect.attribute("id") == "fade_from_black") {
             int start = cropStart().frames(m_fps);
-            int end = start + EffectsList::parameter(effect, "out").toInt();
+            int end = start;
+            if (effect.attribute("id") == "fadein" ) {
+                if (m_effectList.hasEffect("", "fade_from_black") == -1)
+                    end += EffectsList::parameter(effect, "out").toInt();
+                else
+                    end += EffectsList::parameter(m_effectList.getEffectByTag("", "fade_from_black"), "out").toInt();
+            } else if (effect.attribute("id") == "fade_from_black" ) {
+                if (m_effectList.hasEffect("", "fadein") == -1)
+                    end += EffectsList::parameter(effect, "out").toInt();
+                else
+                    end += EffectsList::parameter(m_effectList.getEffectByTag("", "fadein"), "out").toInt();
+            }
             EffectsList::setParameter(effect, "in", QString::number(start));
             EffectsList::setParameter(effect, "out", QString::number(end));
         }
@@ -1128,7 +1154,9 @@ void ClipItem::setEffectAt(int ix, QDomElement effect) {
     m_effectList.insert(ix, effect);
     m_effectList.removeAt(ix + 1);
     m_effectNames = m_effectList.effectNames().join(" / ");
-    if (effect.attribute("id") == "fadein" || effect.attribute("id") == "fadeout") update(boundingRect());
+       QString id = effect.attribute("id");
+    if (id == "fadein" || id == "fadeout" || id == "fade_from_black" || id == "fade_to_black")
+        update(boundingRect());
     else {
         QRectF r = boundingRect();
         r.setHeight(20);
@@ -1180,12 +1208,44 @@ EffectsParameterList ClipItem::addEffect(QDomElement effect, bool animate) {
                 // check if it is a fade effect
                 if (effectId == "fadein") {
                     needRepaint = true;
-                    if (e.attribute("name") == "out") fade += e.attribute("value").toInt();
-                    else if (e.attribute("name") == "in") fade -= e.attribute("value").toInt();
+                    if (m_effectList.hasEffect("", "fade_from_black") == -1) {
+                        if (e.attribute("name") == "out") fade += e.attribute("value").toInt();
+                        else if (e.attribute("name") == "in") fade -= e.attribute("value").toInt();
+                    } else {
+                        QDomElement fadein = m_effectList.getEffectByTag("", "fade_from_black");
+                        if (fadein.attribute("name") == "out") fade += fadein.attribute("value").toInt();
+                        else if (fadein.attribute("name") == "in") fade -= fadein.attribute("value").toInt();
+                    }
+                } else if (effectId == "fade_from_black") {
+                    needRepaint = true;
+                    if (m_effectList.hasEffect("", "fadein") == -1) {
+                        if (e.attribute("name") == "out") fade += e.attribute("value").toInt();
+                        else if (e.attribute("name") == "in") fade -= e.attribute("value").toInt();
+                    } else {
+                        QDomElement fadein = m_effectList.getEffectByTag("", "fadein");
+                        if (fadein.attribute("name") == "out") fade += fadein.attribute("value").toInt();
+                        else if (fadein.attribute("name") == "in") fade -= fadein.attribute("value").toInt();
+                    }
                 } else if (effectId == "fadeout") {
                     needRepaint = true;
-                    if (e.attribute("name") == "out") fade -= e.attribute("value").toInt();
-                    else if (e.attribute("name") == "in") fade += e.attribute("value").toInt();
+                    if (m_effectList.hasEffect("", "fade_to_black") == -1) {
+                        if (e.attribute("name") == "out") fade -= e.attribute("value").toInt();
+                        else if (e.attribute("name") == "in") fade += e.attribute("value").toInt();
+                    } else {
+                        QDomElement fadeout = m_effectList.getEffectByTag("", "fade_to_black");
+                        if (fadeout.attribute("name") == "out") fade -= fadeout.attribute("value").toInt();
+                        else if (fadeout.attribute("name") == "in") fade += fadeout.attribute("value").toInt();
+                    }
+                } else if (effectId == "fade_to_black") {
+                    needRepaint = true;
+                    if (m_effectList.hasEffect("", "fadeout") == -1) {
+                        if (e.attribute("name") == "out") fade -= e.attribute("value").toInt();
+                        else if (e.attribute("name") == "in") fade += e.attribute("value").toInt();
+                    } else {
+                        QDomElement fadeout = m_effectList.getEffectByTag("", "fadeout");
+                        if (fadeout.attribute("name") == "out") fade -= fadeout.attribute("value").toInt();
+                        else if (fadeout.attribute("name") == "in") fade += fadeout.attribute("value").toInt();
+                    }
                 }
             } else {
                 parameters.addParam(e.attribute("name"), QString::number(e.attribute("value").toDouble() / f));
@@ -1260,13 +1320,17 @@ EffectsParameterList ClipItem::getEffectArgs(QDomElement effect) {
 void ClipItem::deleteEffect(QString index) {
     bool needRepaint = false;
     QString ix;
+
     for (int i = 0; i < m_effectList.size(); ++i) {
         ix = m_effectList.at(i).attribute("kdenlive_ix");
         if (ix == index) {
-            if (m_effectList.at(i).attribute("id") == "fadein") {
+            QString effectId = m_effectList.at(i).attribute("id");
+            if ((effectId == "fadein" && hasEffect("", "fade_from_black") == -1) ||
+                (effectId == "fade_from_black" && hasEffect("", "fadein") == -1)) {
                 m_startFade = 0;
                 needRepaint = true;
-            } else if (m_effectList.at(i).attribute("id") == "fadeout") {
+            } else if ((effectId == "fadeout" && hasEffect("", "fade_to_black") == -1) ||
+                       (effectId == "fade_to_black" && hasEffect("", "fadeout") == -1)) {
                 m_endFade = 0;
                 needRepaint = true;
             }
index 182548438a9f8fb9a9b7bab2206d42195abdcb8b..0d03219095d5b003dd8a364651b19af6c3068494 100644 (file)
@@ -1116,13 +1116,13 @@ void CustomTrackView::updateEffect(int track, GenTime pos, QDomElement effect, i
             clip->setSelectedEffect(ix);
             if (!triggeredByUser) emit clipItemSelected(clip, ix);
         }
-        if (effect.attribute("tag") == "volume") {
+        if (effect.attribute("tag") == "volume" || effect.attribute("tag") == "brightness") {
             // A fade effect was modified, update the clip
-            if (effect.attribute("id") == "fadein") {
+            if (effect.attribute("id") == "fadein" || effect.attribute("id") == "fade_from_black") {
                 int pos = effectParams.paramValue("out").toInt() - effectParams.paramValue("in").toInt();
                 clip->setFadeIn(pos);
             }
-            if (effect.attribute("id") == "fadeout") {
+            if (effect.attribute("id") == "fadeout" || effect.attribute("id") == "fade_to_black") {
                 int pos = effectParams.paramValue("out").toInt() - effectParams.paramValue("in").toInt();
                 clip->setFadeOut(pos);
             }
@@ -2196,11 +2196,27 @@ void CustomTrackView::mouseReleaseEvent(QMouseEvent * event) {
                 slotUpdateClipEffect(item, effect, oldeffect, ix);
                 emit clipItemSelected(item, ix);
             }
-        } else if (item->fadeIn() != 0) {
+        } else if (item->fadeIn() != 0 && item->hasEffect("", "fade_from_black") == -1) {
             QDomElement effect = MainWindow::audioEffects.getEffectByTag("volume", "fadein").cloneNode().toElement();
             EffectsList::setParameter(effect, "out", QString::number(item->fadeIn()));
             slotAddEffect(effect, m_dragItem->startPos(), m_dragItem->track());
         }
+        ix = item->hasEffect("volume", "fade_from_black");
+        if (ix != -1) {
+            QDomElement oldeffect = item->effectAt(ix);
+            int start = item->cropStart().frames(m_document->fps());
+            int end = item->fadeIn();
+            if (end == 0) {
+                slotDeleteEffect(item, oldeffect);
+            } else {
+                end += start;
+                QDomElement effect = oldeffect.cloneNode().toElement();
+                EffectsList::setParameter(oldeffect, "in", QString::number(start));
+                EffectsList::setParameter(oldeffect, "out", QString::number(end));
+                slotUpdateClipEffect(item, effect, oldeffect, ix);
+                emit clipItemSelected(item, ix);
+            }
+        }
     } else if (m_operationMode == FADEOUT) {
         // resize fade in effect
         ClipItem * item = (ClipItem *) m_dragItem;
@@ -2220,12 +2236,29 @@ void CustomTrackView::mouseReleaseEvent(QMouseEvent * event) {
                 slotUpdateClipEffect(item, effect, oldeffect, ix);
                 emit clipItemSelected(item, ix);
             }
-        } else if (item->fadeOut() != 0) {
+        } else if (item->fadeOut() != 0 && item->hasEffect("", "fade_to_black") == -1) {
             QDomElement effect = MainWindow::audioEffects.getEffectByTag("volume", "fadeout").cloneNode().toElement();
             EffectsList::setParameter(effect, "in", QString::number(item->fadeOut()));
             EffectsList::setParameter(effect, "out", QString::number(0));
             slotAddEffect(effect, m_dragItem->startPos(), m_dragItem->track());
         }
+        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 start = item->fadeOut();
+            if (start == 0) {
+                slotDeleteEffect(item, oldeffect);
+            } else {
+                start = end - start;
+                QDomElement effect = oldeffect.cloneNode().toElement();
+                EffectsList::setParameter(oldeffect, "in", QString::number(start));
+                EffectsList::setParameter(oldeffect, "out", QString::number(end));
+                // kDebug()<<"EDIT FADE OUT : "<<start<<"x"<<end;
+                slotUpdateClipEffect(item, effect, oldeffect, ix);
+                emit clipItemSelected(item, ix);
+            }
+        }
     } else if (m_operationMode == KEYFRAME) {
         // update the MLT effect
         ClipItem * item = (ClipItem *) m_dragItem;
@@ -2678,42 +2711,78 @@ void CustomTrackView::updateClipFade(ClipItem * item, bool updateFadeOut) {
         if (end != 0) {
             // there is a fade in effect
             int effectPos = item->hasEffect("volume", "fadein");
-            if (effectPos == -1) return;
-            QDomElement oldeffect = item->effectAt(effectPos);
-            int start = item->cropStart().frames(m_document->fps());
-            int max = item->cropDuration().frames(m_document->fps());
-            if (end > max) {
-                item->setFadeIn(max);
-                end = item->fadeIn();
+            if (effectPos != -1) {
+                QDomElement oldeffect = item->effectAt(effectPos);
+                int start = item->cropStart().frames(m_document->fps());
+                int max = item->cropDuration().frames(m_document->fps());
+                if (end > max) {
+                    item->setFadeIn(max);
+                    end = item->fadeIn();
+                }
+                end += start;
+                EffectsList::setParameter(oldeffect, "in", QString::number(start));
+                EffectsList::setParameter(oldeffect, "out", QString::number(end));
+                if (!m_document->renderer()->mltEditEffect(m_document->tracksCount() - item->track(), item->startPos(), item->getEffectArgs(oldeffect)))
+                    emit displayMessage(i18n("Problem editing effect"), ErrorMessage);
+                // if fade effect is displayed, update the effect edit widget with new clip duration
+                if (item->isSelected() && effectPos == item->selectedEffectIndex()) emit clipItemSelected(item, effectPos);
+            }
+            effectPos = item->hasEffect("brightness", "fade_from_black");
+            if (effectPos != -1) {
+                QDomElement oldeffect = item->effectAt(effectPos);
+                int start = item->cropStart().frames(m_document->fps());
+                int max = item->cropDuration().frames(m_document->fps());
+                if (end > max) {
+                    item->setFadeIn(max);
+                    end = item->fadeIn();
+                }
+                end += start;
+                EffectsList::setParameter(oldeffect, "in", QString::number(start));
+                EffectsList::setParameter(oldeffect, "out", QString::number(end));
+                if (!m_document->renderer()->mltEditEffect(m_document->tracksCount() - item->track(), item->startPos(), item->getEffectArgs(oldeffect)))
+                    emit displayMessage(i18n("Problem editing effect"), ErrorMessage);
+                // if fade effect is displayed, update the effect edit widget with new clip duration
+                if (item->isSelected() && effectPos == item->selectedEffectIndex()) emit clipItemSelected(item, effectPos);
             }
-            end += start;
-            EffectsList::setParameter(oldeffect, "in", QString::number(start));
-            EffectsList::setParameter(oldeffect, "out", QString::number(end));
-            if (!m_document->renderer()->mltEditEffect(m_document->tracksCount() - item->track(), item->startPos(), item->getEffectArgs(oldeffect)))
-                emit displayMessage(i18n("Problem editing effect"), ErrorMessage);
-            // if fade effect is displayed, update the effect edit widget with new clip duration
-            if (item->isSelected() && effectPos == item->selectedEffectIndex()) emit clipItemSelected(item, effectPos);
         }
     } else {
         int start = item->fadeOut();
         if (start != 0) {
             // there is a fade in effect
             int effectPos = item->hasEffect("volume", "fadeout");
-            if (effectPos == -1) return;
-            QDomElement oldeffect = item->effectAt(effectPos);
-            int end = (item->duration() - item->cropStart()).frames(m_document->fps());
-            int max = item->cropDuration().frames(m_document->fps());
-            if (end > max) {
-                item->setFadeOut(max);
-                start = item->fadeOut();
+            if (effectPos != -1) {
+                QDomElement oldeffect = item->effectAt(effectPos);
+                int end = (item->duration() - item->cropStart()).frames(m_document->fps());
+                int max = item->cropDuration().frames(m_document->fps());
+                if (end > max) {
+                    item->setFadeOut(max);
+                    start = item->fadeOut();
+                }
+                start = end - start;
+                EffectsList::setParameter(oldeffect, "in", QString::number(start));
+                EffectsList::setParameter(oldeffect, "out", QString::number(end));
+                if (!m_document->renderer()->mltEditEffect(m_document->tracksCount() - item->track(), item->startPos(), item->getEffectArgs(oldeffect)))
+                    emit displayMessage(i18n("Problem editing effect"), ErrorMessage);
+                // if fade effect is displayed, update the effect edit widget with new clip duration
+                if (item->isSelected() && effectPos == item->selectedEffectIndex()) emit clipItemSelected(item, effectPos);
+            }
+            effectPos = item->hasEffect("brightness", "fade_to_black");
+            if (effectPos != -1) {
+                QDomElement oldeffect = item->effectAt(effectPos);
+                int end = (item->duration() - item->cropStart()).frames(m_document->fps());
+                int max = item->cropDuration().frames(m_document->fps());
+                if (end > max) {
+                    item->setFadeOut(max);
+                    start = item->fadeOut();
+                }
+                start = end - start;
+                EffectsList::setParameter(oldeffect, "in", QString::number(start));
+                EffectsList::setParameter(oldeffect, "out", QString::number(end));
+                if (!m_document->renderer()->mltEditEffect(m_document->tracksCount() - item->track(), item->startPos(), item->getEffectArgs(oldeffect)))
+                    emit displayMessage(i18n("Problem editing effect"), ErrorMessage);
+                // if fade effect is displayed, update the effect edit widget with new clip duration
+                if (item->isSelected() && effectPos == item->selectedEffectIndex()) emit clipItemSelected(item, effectPos);
             }
-            start = end - start;
-            EffectsList::setParameter(oldeffect, "in", QString::number(start));
-            EffectsList::setParameter(oldeffect, "out", QString::number(end));
-            if (!m_document->renderer()->mltEditEffect(m_document->tracksCount() - item->track(), item->startPos(), item->getEffectArgs(oldeffect)))
-                emit displayMessage(i18n("Problem editing effect"), ErrorMessage);
-            // if fade effect is displayed, update the effect edit widget with new clip duration
-            if (item->isSelected() && effectPos == item->selectedEffectIndex()) emit clipItemSelected(item, effectPos);
         }
     }
 }
index c9c91dfdec037f52975e2be9ac9b3fcdfaab9771..81e83508301109a7bbf7a866da2814a1777e6922 100644 (file)
@@ -195,9 +195,9 @@ void EffectStackEdit::transferParamDesc(const QDomElement& d, int in, int out) {
             Ui::Positionval_UI *pval = new Ui::Positionval_UI;
             pval->setupUi(toFillin);
             int pos = value.toInt();
-            if (d.attribute("id") == "fadein") {
+            if (d.attribute("id") == "fadein" || d.attribute("id") == "fade_from_black") {
                 pos = pos - m_in;
-            } else if (d.attribute("id") == "fadeout") {
+            } else if (d.attribute("id") == "fadeout" || d.attribute("id") == "fade_to_black") {
                 // fadeout position starts from clip end
                 pos = m_out - (pos - m_in);
             }
@@ -378,13 +378,13 @@ void EffectStackEdit::collectAllParameters() {
         } else if (type == "position") {
             KRestrictedLine *line = ((Ui::Positionval_UI*)valueItems[paramName+"position"])->krestrictedline;
             int pos = m_timecode.getFrameCount(line->text(), KdenliveSettings::project_fps());
-            if (params.attribute("id") == "fadein") {
+            if (params.attribute("id") == "fadein" || params.attribute("id") == "fade_from_black") {
                 pos += m_in;
                 if (pos > m_out) {
                     pos = m_out;
                     line->setText(m_timecode.getTimecodeFromFrames(pos));
                 }
-            } else if (params.attribute("id") == "fadeout") {
+            } else if (params.attribute("id") == "fadeout" || params.attribute("id") == "fade_to_black") {
                 pos = m_out - (pos - m_in);
                 if (pos > m_out - m_in) {
                     pos = m_out - m_in;