]> git.sesse.net Git - kdenlive/commitdiff
Correctly handle unsupported filters
authorJean-Baptiste Mardelle <jb@kdenlive.org>
Mon, 1 Apr 2013 10:25:43 +0000 (12:25 +0200)
committerJean-Baptiste Mardelle <jb@kdenlive.org>
Mon, 1 Apr 2013 10:25:43 +0000 (12:25 +0200)
src/customtrackview.cpp
src/renderer.cpp

index 4d577af23af7c6e27551348e905865092824e18d..b178039a6fbcc8cdc79f430bd477f031344936f1 100644 (file)
@@ -1899,9 +1899,11 @@ void CustomTrackView::addEffect(int track, GenTime pos, QDomElement effect)
             return;
         }
         EffectsParameterList params = clip->addEffect(effect);
-        if (!m_document->renderer()->mltAddEffect(track, pos, params))
+        if (!m_document->renderer()->mltAddEffect(track, pos, params)) {
             emit displayMessage(i18n("Problem adding effect to clip"), ErrorMessage);
-       clip->setSelectedEffect(params.paramValue("kdenlive_ix").toInt());
+           clip->deleteEffect(params.paramValue("kdenlive_ix"));
+       }
+       else clip->setSelectedEffect(params.paramValue("kdenlive_ix").toInt());
         if (clip->isMainSelectedClip()) emit clipItemSelected(clip);
     } else emit displayMessage(i18n("Cannot find clip to add effect"), ErrorMessage);
 }
index dc47c393ef2d3db661e02ab1962a8b9b32d3e32c..9a2a314c4ba965f45233d24748f630588d79d9ce 100644 (file)
@@ -2856,7 +2856,7 @@ bool Render::mltAddEffect(Mlt::Service service, EffectsParameterList params, int
         filter = service.filter(ct);
     }
 
-    addFilterToService(service, params, duration);
+    bool success = addFilterToService(service, params, duration);
 
     // re-add following filters
     for (int i = 0; i < filtersList.count(); i++) {
@@ -2867,7 +2867,7 @@ bool Render::mltAddEffect(Mlt::Service service, EffectsParameterList params, int
     }
     service.unlock();
     if (doRefresh) refresh();
-    return true;
+    return success;
 }
 
 
@@ -2876,10 +2876,8 @@ bool Render::addFilterToService(Mlt::Service service, EffectsParameterList param
       // create filter
     QString tag =  params.paramValue("tag");
     //kDebug() << " / / INSERTING EFFECT: " << tag << ", REGI: " << region;
-    char *filterTag = qstrdup(tag.toUtf8().constData());
-    char *filterId = qstrdup(params.paramValue("id").toUtf8().constData());
     QString kfr = params.paramValue("keyframes");
-  if (!kfr.isEmpty()) {
+    if (!kfr.isEmpty()) {
         QStringList keyFrames = kfr.split(';', QString::SkipEmptyParts);
         //kDebug() << "// ADDING KEYFRAME EFFECT: " << params.paramValue("keyframes");
         char *starttag = qstrdup(params.paramValue("starttag", "start").toUtf8().constData());
@@ -2899,9 +2897,9 @@ bool Render::addFilterToService(Mlt::Service service, EffectsParameterList param
         int offset = 0;
         // Special case, only one keyframe, means we want a constant value
         if (keyFrames.count() == 1) {
-            Mlt::Filter *filter = new Mlt::Filter(*m_mltProfile, filterTag);
+            Mlt::Filter *filter = new Mlt::Filter(*m_mltProfile, qstrdup(tag.toUtf8().constData()));
             if (filter && filter->is_valid()) {
-                filter->set("kdenlive_id", filterId);
+                filter->set("kdenlive_id", qstrdup(params.paramValue("id").toUtf8().constData()));
                 int x1 = keyFrames.at(0).section(':', 0, 0).toInt();
                 double y1 = keyFrames.at(0).section(':', 1, 1).toDouble();
                 for (int j = 0; j < params.count(); j++) {
@@ -2911,11 +2909,17 @@ bool Render::addFilterToService(Mlt::Service service, EffectsParameterList param
                 //kDebug() << "// ADDING KEYFRAME vals: " << min<<" / "<<max<<", "<<y1<<", factor: "<<factor;
                 filter->set(starttag, m_locale.toString(((min + y1) - paramOffset) / factor).toUtf8().data());
                 service.attach(*filter);
-            }
+            } else {
+               delete[] starttag;
+               delete[] endtag;
+               kDebug() << "filter is NULL";
+               service.unlock();
+               return false;
+           }
         } else for (int i = 0; i < keyFrames.size() - 1; ++i) {
-                Mlt::Filter *filter = new Mlt::Filter(*m_mltProfile, filterTag);
+                Mlt::Filter *filter = new Mlt::Filter(*m_mltProfile, qstrdup(tag.toUtf8().constData()));
                 if (filter && filter->is_valid()) {
-                    filter->set("kdenlive_id", filterId);
+                    filter->set("kdenlive_id", qstrdup(params.paramValue("id").toUtf8().constData()));
                     int x1 = keyFrames.at(i).section(':', 0, 0).toInt() + offset;
                     double y1 = keyFrames.at(i).section(':', 1, 1).toDouble();
                     int x2 = keyFrames.at(i + 1).section(':', 0, 0).toInt();
@@ -2933,16 +2937,22 @@ bool Render::addFilterToService(Mlt::Service service, EffectsParameterList param
                     filter->set(endtag, m_locale.toString(((min + y2) - paramOffset) / factor).toUtf8().data());
                     service.attach(*filter);
                     offset = 1;
-                }
+                } else {
+                   delete[] starttag;
+                   delete[] endtag;
+                   kDebug() << "filter is NULL";
+                   service.unlock();
+                   return false;
+               }
             }
         delete[] starttag;
         delete[] endtag;
     } else {
         Mlt::Filter *filter;
         QString prefix;
-        filter = new Mlt::Filter(*m_mltProfile, filterTag);
+        filter = new Mlt::Filter(*m_mltProfile, qstrdup(tag.toUtf8().constData()));
         if (filter && filter->is_valid()) {
-            filter->set("kdenlive_id", filterId);
+            filter->set("kdenlive_id", qstrdup(params.paramValue("id").toUtf8().constData()));
         } else {
             kDebug() << "filter is NULL";
             service.unlock();
@@ -2977,9 +2987,6 @@ bool Render::addFilterToService(Mlt::Service service, EffectsParameterList param
         // attach filter to the clip
         service.attach(*filter);
     }
-       
-    delete[] filterId;
-    delete[] filterTag;
     return true;
 }