From: Jean-Baptiste Mardelle Date: Mon, 1 Apr 2013 10:25:43 +0000 (+0200) Subject: Correctly handle unsupported filters X-Git-Url: https://git.sesse.net/?a=commitdiff_plain;h=370296c589123a89113a7ee52eb9586b516328d5;p=kdenlive Correctly handle unsupported filters --- diff --git a/src/customtrackview.cpp b/src/customtrackview.cpp index 4d577af2..b178039a 100644 --- a/src/customtrackview.cpp +++ b/src/customtrackview.cpp @@ -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); } diff --git a/src/renderer.cpp b/src/renderer.cpp index dc47c393..9a2a314c 100644 --- a/src/renderer.cpp +++ b/src/renderer.cpp @@ -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<<" / "<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; }