From: Jean-Baptiste Mardelle Date: Mon, 18 May 2009 21:52:54 +0000 (+0000) Subject: Update to the new MLT structure (based on patch by Dan Dennedy) X-Git-Url: https://git.sesse.net/?a=commitdiff_plain;h=9600c5a0f5444b9cb4855bbab784afedb27b3e02;p=kdenlive Update to the new MLT structure (based on patch by Dan Dennedy) svn path=/trunk/kdenlive/; revision=3393 --- diff --git a/CMakeLists.txt b/CMakeLists.txt index be801de7..3e99981e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -16,7 +16,6 @@ set(catalogname kdenlive) add_definitions (${QT_DEFINITIONS}) FIND_PACKAGE(LIBMLT REQUIRED) -FIND_PACKAGE(LIBMLTPLUS REQUIRED) find_package(MSGFMT REQUIRED) find_program(EXTRACTRC_EXECUTABLE extractrc) diff --git a/cmake/modules/FindLIBMLT.cmake b/cmake/modules/FindLIBMLT.cmake index 1fec029e..d6cf747b 100644 --- a/cmake/modules/FindLIBMLT.cmake +++ b/cmake/modules/FindLIBMLT.cmake @@ -3,7 +3,7 @@ # FIND_PROGRAM(MLT_CONFIG_EXECUTABLE pkg-config) -EXEC_PROGRAM(${MLT_CONFIG_EXECUTABLE} ARGS --variable=prefix mlt-framework OUTPUT_VARIABLE MLT_PATH ) +EXEC_PROGRAM(${MLT_CONFIG_EXECUTABLE} ARGS --variable=prefix mlt++ OUTPUT_VARIABLE MLT_PATH ) MESSAGE(STATUS "Found MLT INSTALL PATH: ${MLT_PATH}") SET(CMAKE_CXX_FLAGS -DMLT_PREFIX=\\\"\"${MLT_PATH}\"\\\") @@ -23,6 +23,22 @@ FIND_LIBRARY(LIBMLT_LIBRARY MESSAGE(STATUS "Found MLT LIBR: ${LIBMLT_LIBRARY}") +FIND_PATH(LIBMLTPLUS_INCLUDE_DIR + NAMES mlt++/Mlt.h + PATHS ${MLT_PATH}/include /usr/local/include /usr/include + NO_DEFAULT_PATH +) + +MESSAGE(STATUS "Found MLT++ INCLUDES: ${LIBMLTPLUS_INCLUDE_DIR}") + +FIND_LIBRARY(LIBMLTPLUS_LIBRARY + NAMES mlt++ + PATHS ${MLT_PATH}/lib /usr/lib /usr/local/lib + NO_DEFAULT_PATH +) + +MESSAGE(STATUS "Found MLT++ LIBR: ${LIBMLTPLUS_LIBRARY}") + IF (LIBMLT_LIBRARY AND LIBMLT_INCLUDE_DIR) SET( LIBMLT_FOUND 1 ) SET( LIBMLT_LIBRARIES ${LIBMLT_LIBRARY} ) @@ -30,6 +46,14 @@ ELSE (LIBMLT_LIBRARY AND LIBMLT_INCLUDE_DIR) SET( LIBMLT_FOUND 0 ) ENDIF (LIBMLT_LIBRARY AND LIBMLT_INCLUDE_DIR) + +IF (LIBMLTPLUS_LIBRARY AND LIBMLTPLUS_INCLUDE_DIR) + SET( LIBMLT_FOUND 1 ) + SET( LIBMLTPLUS_LIBRARIES ${LIBMLTPLUS_LIBRARY} ) +ELSE (LIBMLTPLUS_LIBRARY AND LIBMLTPLUS_INCLUDE_DIR) + SET( LIBMLT_FOUND 0 ) +ENDIF (LIBMLTPLUS_LIBRARY AND LIBMLTPLUS_INCLUDE_DIR) + IF (LIBMLT_FOUND) IF (NOT LIBMLT_FIND_QUIETLY) MESSAGE(STATUS "Found MLT library: ${LIBMLT_LIBRARY}") diff --git a/plugins/sampleplugin/sampleplugin.cpp b/plugins/sampleplugin/sampleplugin.cpp index 347658b6..0c9ec033 100644 --- a/plugins/sampleplugin/sampleplugin.cpp +++ b/plugins/sampleplugin/sampleplugin.cpp @@ -47,7 +47,7 @@ KUrl SamplePlugin::generatedClip(const QString &generator, const KUrl &projectFo } else prePath = projectFolder.path() + "/counter"; int ct = 0; QString counter = QString::number(ct).rightJustified(5, '0', false); - while (QFile::exists(prePath + counter + ".westley")) { + while (QFile::exists(prePath + counter + ".mlt")) { ct++; counter = QString::number(ct).rightJustified(5, '0', false); } @@ -63,11 +63,11 @@ KUrl SamplePlugin::generatedClip(const QString &generator, const KUrl &projectFo view.font->setValue(height); } - QString clipFile = prePath + counter + ".westley"; + QString clipFile = prePath + counter + ".mlt"; view.path->setPath(clipFile); if (d.exec() == QDialog::Accepted) { QDomDocument doc; - QDomElement westley = doc.createElement("westley"); + QDomElement mlt = doc.createElement("mlt"); QDomElement playlist = doc.createElement("playlist"); if (generator == i18n("Noise")) { QDomElement prod = doc.createElement("producer"); @@ -83,15 +83,15 @@ KUrl SamplePlugin::generatedClip(const QString &generator, const KUrl &projectFo prod.setAttribute("in", "0"); prod.setAttribute("out", QString::number((int) fps)); prod.setAttribute("text", QString::number(view.duration->value() - i)); - //FIXME: the font and pad values are approximate, the pango producer seems unable + //FIXME: the font and pad values are approximate, the pango producer seems unable // to produce a predictable frame size. prod.setAttribute("font", QString::number(view.font->value()) + "px"); //prod.setAttribute("pad", 50); playlist.appendChild(prod); } } - westley.appendChild(playlist); - doc.appendChild(westley); + mlt.appendChild(playlist); + doc.appendChild(mlt); QFile file(view.path->url().path()); if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) { kWarning() << "////// ERROR writing to file: " << view.path->url().path(); diff --git a/renderer/kdenlive_render.cpp b/renderer/kdenlive_render.cpp index ca352bdb..d84f11b3 100644 --- a/renderer/kdenlive_render.cpp +++ b/renderer/kdenlive_render.cpp @@ -90,16 +90,16 @@ int main(int argc, char **argv) fprintf(stderr, "Kdenlive video renderer for MLT.\nUsage: " "kdenlive_render [-erase] [-kuiserver] [in=pos] [out=pos] [render] [profile] [rendermodule] [player] [src] [dest] [[arg1] [arg2] ...]\n" " -erase: if that parameter is present, src file will be erased at the end\n" - " -kuiserver: if that parameter is present, use KDE job tracker\n" + " -kuiserver: if that parameter is present, use KDE job tracker\n" " in=pos: start rendering at frame pos\n" " out=pos: end rendering at frame pos\n" - " render: path to inigo render\n" + " render: path to MLT melt renderer\n" " profile: the MLT video profile\n" " rendermodule: the MLT consumer used for rendering, usually it is avformat\n" " player: path to video player to play when rendering is over, use '-' to disable playing\n" - " src: source file (usually westley playlist)\n" - " dest: destination file\n" - " args: space separated libavformat arguments\n"); + " src: source file (usually MLT XML)\n" + " dest: destination file\n" + " args: space separated libavformat arguments\n"); } } diff --git a/renderer/renderjob.cpp b/renderer/renderjob.cpp index 3f7da99d..9d832e41 100644 --- a/renderer/renderjob.cpp +++ b/renderer/renderjob.cpp @@ -104,7 +104,7 @@ void RenderJob::slotAbort(const QString& url) void RenderJob::slotAbort() { - qDebug() << "Kdenlive-render: JOB ABORTED BY USER..."; + qDebug() << "Kdenlive-render: JOB ABORTED BY USER..."; m_renderProcess->kill(); if (m_kdenliveinterface) { @@ -132,7 +132,7 @@ void RenderJob::receivedStderr() QString result = QString(m_renderProcess->readAllStandardError()).simplified(); if (!result.startsWith("Current Frame")) m_errorMessage.append(result + "
"); else { - // m_logstream << "ReceivedStderr from inigo: " << result << endl; + // m_logstream << "ReceivedStderr from melt: " << result << endl; result = result.section(' ', -1); int pro = result.toInt(); if (pro < 0 || pro > 100) return; @@ -142,14 +142,14 @@ void RenderJob::receivedStderr() if (!m_kdenliveinterface->isValid()) { delete m_kdenliveinterface; m_kdenliveinterface = NULL; - // qDebug() << "BROKEN COMMUNICATION WITH KDENLIVE"; + // qDebug() << "BROKEN COMMUNICATION WITH KDENLIVE"; } else { m_dbusargs[1] = pro; m_kdenliveinterface->callWithArgumentList(QDBus::NoBlock, "setRenderingProgress", m_dbusargs); } } else if (pro % 5 == 0) { // Try to restart communication with Kdenlive every 5 percents - // qDebug() << "TRYING TO RESTART COMMUNICATION WITH KDENLIVE"; + // qDebug() << "TRYING TO RESTART COMMUNICATION WITH KDENLIVE"; initKdenliveDbusInterface(); } diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index a0a2690f..34a4e1cd 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -159,6 +159,7 @@ set(kdenlive_SRCS changecliptypecommand.cpp documentchecker.cpp dvdwizardchapters.cpp + documentconvert.cpp ) add_definitions( ${KDE4_DEFINITIONS} ) diff --git a/src/documentchecker.cpp b/src/documentchecker.cpp index e4cb7059..7abadea0 100644 --- a/src/documentchecker.cpp +++ b/src/documentchecker.cpp @@ -278,8 +278,8 @@ void DocumentChecker::slotDeleteSelected() QDomNodeList producers = m_doc.elementsByTagName("producer"); QDomNodeList infoproducers = m_doc.elementsByTagName("kdenlive_producer"); - QDomElement westley = m_doc.firstChildElement("westley"); - QDomElement kdenlivedoc = westley.firstChildElement("kdenlivedoc"); + QDomElement mlt = m_doc.firstChildElement("mlt"); + QDomElement kdenlivedoc = mlt.firstChildElement("kdenlivedoc"); for (int i = 0; i < infoproducers.count(); i++) { e = infoproducers.item(i).toElement(); @@ -294,7 +294,7 @@ void DocumentChecker::slotDeleteSelected() e = producers.item(i).toElement(); if (deletedIds.contains(e.attribute("id"))) { // Remove clip - westley.removeChild(e); + mlt.removeChild(e); break; } } diff --git a/src/documentconvert.cpp b/src/documentconvert.cpp new file mode 100644 index 00000000..67cca687 --- /dev/null +++ b/src/documentconvert.cpp @@ -0,0 +1,645 @@ +/*************************************************************************** + * Copyright (C) 2007 by Jean-Baptiste Mardelle (jb@kdenlive.org) * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * + ***************************************************************************/ + + +#include "documentconvert.h" +#include "definitions.h" + +#include +#include +#include +#include + +#include + +DocumentConvert::DocumentConvert(QDomDocument doc): + m_doc(doc), + m_modified(false) +{} + + +bool DocumentConvert::doConvert(double version, const double current_version) +{ + kDebug() << "Opening a document with version " << version; + + if (version == current_version) return true; + + if (version > current_version) { + kDebug() << "Unable to open document with version " << version; + KMessageBox::sorry(kapp->activeWindow(), i18n("This project type is unsupported (version %1) and can't be loaded.\nPlease consider upgrading you Kdenlive version.", version), i18n("Unable to open project")); + return false; + } + + // Opening a old Kdenlive document + if (version == 0.5 || version == 0.7) { + KMessageBox::sorry(kapp->activeWindow(), i18n("This project type is unsupported (version %1) and can't be loaded.", version), i18n("Unable to open project")); + kDebug() << "Unable to open document with version " << version; + // TODO: convert 0.7 (0.5?) files to the new document format. + return false; + } + + m_modified = true; + + if (version == 0.82) { + convertToMelt(); + return true; + } + + if (version == 0.81) { + // Add correct tracks info + QDomNode kdenlivedoc = m_doc.elementsByTagName("kdenlivedoc").at(0); + QDomElement infoXml = kdenlivedoc.toElement(); + infoXml.setAttribute("version", current_version); + QString currentTrackOrder = infoXml.attribute("tracks"); + QDomElement tracksinfo = m_doc.createElement("tracksinfo"); + for (int i = 0; i < currentTrackOrder.size(); i++) { + QDomElement trackinfo = m_doc.createElement("trackinfo"); + if (currentTrackOrder.data()[i] == 'a') { + trackinfo.setAttribute("type", "audio"); + trackinfo.setAttribute("blind", true); + } else trackinfo.setAttribute("blind", false); + trackinfo.setAttribute("mute", false); + trackinfo.setAttribute("locked", false); + tracksinfo.appendChild(trackinfo); + } + infoXml.appendChild(tracksinfo); + convertToMelt(); + return true; + } + + if (version == 0.8) { + // Add the tracks information + QDomNodeList tracks = m_doc.elementsByTagName("track"); + int max = tracks.count(); + + QDomNode kdenlivedoc = m_doc.elementsByTagName("kdenlivedoc").at(0); + QDomElement infoXml = kdenlivedoc.toElement(); + infoXml.setAttribute("version", current_version); + QDomElement tracksinfo = m_doc.createElement("tracksinfo"); + + for (int i = 0; i < max; i++) { + QDomElement trackinfo = m_doc.createElement("trackinfo"); + QDomElement t = tracks.at(i).toElement(); + if (t.attribute("hide") == "video") { + trackinfo.setAttribute("type", "audio"); + trackinfo.setAttribute("blind", true); + } else trackinfo.setAttribute("blind", false); + trackinfo.setAttribute("mute", false); + trackinfo.setAttribute("locked", false); + if (t.attribute("producer") != "black_track") tracksinfo.appendChild(trackinfo); + } + infoXml.appendChild(tracksinfo); + convertToMelt(); + return true; + } + + QDomNode westley = m_doc.elementsByTagName("westley").at(1); + QDomNode tractor = m_doc.elementsByTagName("tractor").at(0); + QDomNode kdenlivedoc = m_doc.elementsByTagName("kdenlivedoc").at(0); + QDomElement kdenlivedoc_old = kdenlivedoc.cloneNode(true).toElement(); // Needed for folders + QDomElement infoXml = kdenlivedoc.toElement(); + infoXml.setAttribute("version", current_version); + QDomNode multitrack = m_doc.elementsByTagName("multitrack").at(0); + QDomNodeList playlists = m_doc.elementsByTagName("playlist"); + + QDomNode props = m_doc.elementsByTagName("properties").at(0).toElement(); + QString profile = props.toElement().attribute("videoprofile"); + int startPos = props.toElement().attribute("timeline_position").toInt(); + infoXml.setAttribute("position", startPos); + if (profile == "dv_wide") profile = "dv_pal_wide"; + + // move playlists outside of tractor and add the tracks instead + int max = playlists.count(); + if (westley.isNull()) + westley = m_doc.elementsByTagName("westley").at(1); + if (westley.isNull()) { + westley = m_doc.createElement("mlt"); + m_doc.documentElement().appendChild(westley); + } + if (tractor.isNull()) { + kDebug() << "// NO MLT PLAYLIST, building empty one"; + QDomElement blank_tractor = m_doc.createElement("tractor"); + westley.appendChild(blank_tractor); + QDomElement blank_playlist = m_doc.createElement("playlist"); + blank_playlist.setAttribute("id", "black_track"); + westley.insertBefore(blank_playlist, QDomNode()); + QDomElement blank_track = m_doc.createElement("track"); + blank_track.setAttribute("producer", "black_track"); + blank_tractor.appendChild(blank_track); + + QDomNodeList kdenlivetracks = m_doc.elementsByTagName("kdenlivetrack"); + for (int i = 0; i < kdenlivetracks.count(); i++) { + blank_playlist = m_doc.createElement("playlist"); + blank_playlist.setAttribute("id", "playlist" + QString::number(i)); + westley.insertBefore(blank_playlist, QDomNode()); + blank_track = m_doc.createElement("track"); + blank_track.setAttribute("producer", "playlist" + QString::number(i)); + blank_tractor.appendChild(blank_track); + if (kdenlivetracks.at(i).toElement().attribute("cliptype") == "Sound") { + blank_playlist.setAttribute("hide", "video"); + blank_track.setAttribute("hide", "video"); + } + } + } else for (int i = 0; i < max; i++) { + QDomNode n = playlists.at(i); + westley.insertBefore(n, QDomNode()); + QDomElement pl = n.toElement(); + QDomElement track = m_doc.createElement("track"); + QString trackType = pl.attribute("hide"); + if (!trackType.isEmpty()) + track.setAttribute("hide", trackType); + QString playlist_id = pl.attribute("id"); + if (playlist_id.isEmpty()) { + playlist_id = "black_track"; + pl.setAttribute("id", playlist_id); + } + track.setAttribute("producer", playlist_id); + //tractor.appendChild(track); +#define KEEP_TRACK_ORDER 1 +#ifdef KEEP_TRACK_ORDER + tractor.insertAfter(track, QDomNode()); +#else + // Insert the new track in an order that hopefully matches the 3 video, then 2 audio tracks of Kdenlive 0.7.0 + // insertion sort - O( tracks*tracks ) + // Note, this breaks _all_ transitions - but you can move them up and down afterwards. + QDomElement tractor_elem = tractor.toElement(); + if (! tractor_elem.isNull()) { + QDomNodeList tracks = tractor_elem.elementsByTagName("track"); + int size = tracks.size(); + if (size == 0) { + tractor.insertAfter(track, QDomNode()); + } else { + bool inserted = false; + for (int i = 0; i < size; ++i) { + QDomElement track_elem = tracks.at(i).toElement(); + if (track_elem.isNull()) { + tractor.insertAfter(track, QDomNode()); + inserted = true; + break; + } else { + kDebug() << "playlist_id: " << playlist_id << " producer:" << track_elem.attribute("producer"); + if (playlist_id < track_elem.attribute("producer")) { + tractor.insertBefore(track, track_elem); + inserted = true; + break; + } + } + } + // Reach here, no insertion, insert last + if (!inserted) { + tractor.insertAfter(track, QDomNode()); + } + } + } else { + kWarning() << "tractor was not a QDomElement"; + tractor.insertAfter(track, QDomNode()); + } +#endif + } + tractor.removeChild(multitrack); + + // audio track mixing transitions should not be added to track view, so add required attribute + QDomNodeList transitions = m_doc.elementsByTagName("transition"); + max = transitions.count(); + for (int i = 0; i < max; i++) { + QDomElement tr = transitions.at(i).toElement(); + if (tr.attribute("combine") == "1" && tr.attribute("mlt_service") == "mix") { + QDomElement property = m_doc.createElement("property"); + property.setAttribute("name", "internal_added"); + QDomText value = m_doc.createTextNode("237"); + property.appendChild(value); + tr.appendChild(property); + property = m_doc.createElement("property"); + property.setAttribute("name", "mlt_service"); + value = m_doc.createTextNode("mix"); + property.appendChild(value); + tr.appendChild(property); + } else { + // convert transition + QDomNamedNodeMap attrs = tr.attributes(); + for (int j = 0; j < attrs.count(); j++) { + QString attrName = attrs.item(j).nodeName(); + if (attrName != "in" && attrName != "out" && attrName != "id") { + QDomElement property = m_doc.createElement("property"); + property.setAttribute("name", attrName); + QDomText value = m_doc.createTextNode(attrs.item(j).nodeValue()); + property.appendChild(value); + tr.appendChild(property); + } + } + } + } + + // move transitions after tracks + for (int i = 0; i < max; i++) { + tractor.insertAfter(transitions.at(0), QDomNode()); + } + + // Fix filters format + QDomNodeList entries = m_doc.elementsByTagName("entry"); + max = entries.count(); + for (int i = 0; i < max; i++) { + QString last_id; + int effectix = 0; + QDomNode m = entries.at(i).firstChild(); + while (!m.isNull()) { + if (m.toElement().tagName() == "filter") { + QDomElement filt = m.toElement(); + QDomNamedNodeMap attrs = filt.attributes(); + QString current_id = filt.attribute("kdenlive_id"); + if (current_id != last_id) { + effectix++; + last_id = current_id; + } + QDomElement e = m_doc.createElement("property"); + e.setAttribute("name", "kdenlive_ix"); + QDomText value = m_doc.createTextNode(QString::number(effectix)); + e.appendChild(value); + filt.appendChild(e); + for (int j = 0; j < attrs.count(); j++) { + QDomAttr a = attrs.item(j).toAttr(); + if (!a.isNull()) { + kDebug() << " FILTER; adding :" << a.name() << ":" << a.value(); + QDomElement e = m_doc.createElement("property"); + e.setAttribute("name", a.name()); + QDomText value = m_doc.createTextNode(a.value()); + e.appendChild(value); + filt.appendChild(e); + + } + } + } + m = m.nextSibling(); + } + } + + /* + QDomNodeList filters = m_doc.elementsByTagName("filter"); + max = filters.count(); + QString last_id; + int effectix = 0; + for (int i = 0; i < max; i++) { + QDomElement filt = filters.at(i).toElement(); + QDomNamedNodeMap attrs = filt.attributes(); + QString current_id = filt.attribute("kdenlive_id"); + if (current_id != last_id) { + effectix++; + last_id = current_id; + } + QDomElement e = m_doc.createElement("property"); + e.setAttribute("name", "kdenlive_ix"); + QDomText value = m_doc.createTextNode(QString::number(1)); + e.appendChild(value); + filt.appendChild(e); + for (int j = 0; j < attrs.count(); j++) { + QDomAttr a = attrs.item(j).toAttr(); + if (!a.isNull()) { + kDebug() << " FILTER; adding :" << a.name() << ":" << a.value(); + QDomElement e = m_doc.createElement("property"); + e.setAttribute("name", a.name()); + QDomText value = m_doc.createTextNode(a.value()); + e.appendChild(value); + filt.appendChild(e); + } + } + }*/ + + // fix slowmotion + QDomNodeList producers = westley.toElement().elementsByTagName("producer"); + max = producers.count(); + for (int i = 0; i < max; i++) { + QDomElement prod = producers.at(i).toElement(); + if (prod.attribute("mlt_service") == "framebuffer") { + QString slowmotionprod = prod.attribute("resource"); + slowmotionprod.replace(':', '?'); + kDebug() << "// FOUND WRONG SLOWMO, new: " << slowmotionprod; + prod.setAttribute("resource", slowmotionprod); + } + } + // move producers to correct place, markers to a global list, fix clip descriptions + QDomElement markers = m_doc.createElement("markers"); + // This will get the xml producers: + producers = m_doc.elementsByTagName("producer"); + max = producers.count(); + for (int i = 0; i < max; i++) { + QDomElement prod = producers.at(0).toElement(); + // add resource also as a property (to allow path correction in setNewResource()) + // TODO: will it work with slowmotion? needs testing + /*if (!prod.attribute("resource").isEmpty()) { + QDomElement prop_resource = m_doc.createElement("property"); + prop_resource.setAttribute("name", "resource"); + QDomText resource = m_doc.createTextNode(prod.attribute("resource")); + prop_resource.appendChild(resource); + prod.appendChild(prop_resource); + }*/ + QDomNode m = prod.firstChild(); + if (!m.isNull()) { + if (m.toElement().tagName() == "markers") { + QDomNodeList prodchilds = m.childNodes(); + int maxchild = prodchilds.count(); + for (int k = 0; k < maxchild; k++) { + QDomElement mark = prodchilds.at(0).toElement(); + mark.setAttribute("id", prod.attribute("id")); + markers.insertAfter(mark, QDomNode()); + } + prod.removeChild(m); + } else if (prod.attribute("type").toInt() == TEXT) { + // convert title clip + if (m.toElement().tagName() == "textclip") { + QDomDocument tdoc; + QDomElement titleclip = m.toElement(); + QDomElement title = tdoc.createElement("kdenlivetitle"); + tdoc.appendChild(title); + QDomNodeList objects = titleclip.childNodes(); + int maxchild = objects.count(); + for (int k = 0; k < maxchild; k++) { + QString objectxml; + QDomElement ob = objects.at(k).toElement(); + if (ob.attribute("type") == "3") { + // text object - all of this goes into "xmldata"... + QDomElement item = tdoc.createElement("item"); + item.setAttribute("z-index", ob.attribute("z")); + item.setAttribute("type", "QGraphicsTextItem"); + QDomElement position = tdoc.createElement("position"); + position.setAttribute("x", ob.attribute("x")); + position.setAttribute("y", ob.attribute("y")); + QDomElement content = tdoc.createElement("content"); + content.setAttribute("font", ob.attribute("font_family")); + content.setAttribute("font-size", ob.attribute("font_size")); + content.setAttribute("font-bold", ob.attribute("bold")); + content.setAttribute("font-italic", ob.attribute("italic")); + content.setAttribute("font-underline", ob.attribute("underline")); + QString col = ob.attribute("color"); + QColor c(col); + content.setAttribute("font-color", colorToString(c)); + // todo: These fields are missing from the newly generated xmldata: + // transform, startviewport, endviewport, background + + QDomText conttxt = tdoc.createTextNode(ob.attribute("text")); + content.appendChild(conttxt); + item.appendChild(position); + item.appendChild(content); + title.appendChild(item); + } else if (ob.attribute("type") == "5") { + // rectangle object + QDomElement item = tdoc.createElement("item"); + item.setAttribute("z-index", ob.attribute("z")); + item.setAttribute("type", "QGraphicsRectItem"); + QDomElement position = tdoc.createElement("position"); + position.setAttribute("x", ob.attribute("x")); + position.setAttribute("y", ob.attribute("y")); + QDomElement content = tdoc.createElement("content"); + QString col = ob.attribute("color"); + QColor c(col); + content.setAttribute("brushcolor", colorToString(c)); + QString rect = "0,0,"; + rect.append(ob.attribute("width")); + rect.append(","); + rect.append(ob.attribute("height")); + content.setAttribute("rect", rect); + item.appendChild(position); + item.appendChild(content); + title.appendChild(item); + } + } + prod.setAttribute("xmldata", tdoc.toString()); + // mbd todo: This clearly does not work, as every title gets the same name - trying to leave it empty + // QStringList titleInfo = TitleWidget::getFreeTitleInfo(projectFolder()); + // prod.setAttribute("titlename", titleInfo.at(0)); + // prod.setAttribute("resource", titleInfo.at(1)); + //kDebug()<<"TITLE DATA:\n"< 0) prod.setAttribute("out", QString::number(duration)); + // The clip goes back in, but text clips should not go back in, at least not modified + westley.insertBefore(prod, QDomNode()); + + } + + QDomNode westley0 = m_doc.elementsByTagName("westley").at(0); + if (!markers.firstChild().isNull()) westley0.appendChild(markers); + + + // Convert as much of the kdenlivedoc as possible. Use the producer in westley + // First, remove the old stuff from westley, and add a new empty one + // Also, track the max id in order to use it for the adding of groups/folders + int max_kproducer_id = 0; + westley0.removeChild(kdenlivedoc); + QDomElement kdenlivedoc_new = m_doc.createElement("kdenlivedoc"); + kdenlivedoc_new.setAttribute("profile", profile); + + // Add tracks info + QDomNodeList tracks = m_doc.elementsByTagName("track"); + max = tracks.count(); + QDomElement tracksinfo = m_doc.createElement("tracksinfo"); + for (int i = 0; i < max; i++) { + QDomElement trackinfo = m_doc.createElement("trackinfo"); + QDomElement t = tracks.at(i).toElement(); + if (t.attribute("hide") == "video") { + trackinfo.setAttribute("type", "audio"); + trackinfo.setAttribute("blind", true); + } else trackinfo.setAttribute("blind", false); + trackinfo.setAttribute("mute", false); + trackinfo.setAttribute("locked", false); + if (t.attribute("producer") != "black_track") tracksinfo.appendChild(trackinfo); + } + kdenlivedoc_new.appendChild(tracksinfo); + + // Add all the producers that has a resource in westley + QDomElement westley_element = westley0.toElement(); + if (westley_element.isNull()) { + kWarning() << "westley0 element in document was not a QDomElement - unable to add producers to new kdenlivedoc"; + } else { + QDomNodeList wproducers = westley_element.elementsByTagName("producer"); + int kmax = wproducers.count(); + for (int i = 0; i < kmax; i++) { + QDomElement wproducer = wproducers.at(i).toElement(); + if (wproducer.isNull()) { + kWarning() << "Found producer in westley0, that was not a QDomElement"; + continue; + } + if (wproducer.attribute("id") == "black") continue; + // We have to do slightly different things, depending on the type + kDebug() << "Converting producer element with type" << wproducer.attribute("type"); + if (wproducer.attribute("type").toInt() == TEXT) { + kDebug() << "Found TEXT element in producer" << endl; + QDomElement kproducer = wproducer.cloneNode(true).toElement(); + kproducer.setTagName("kdenlive_producer"); + kdenlivedoc_new.appendChild(kproducer); + // TODO: Perhaps needs some more changes here to "frequency", aspect ratio as a float, frame_size, channels, and later, ressource and title name + } else { + QDomElement kproducer = m_doc.createElement("kdenlive_producer"); + kproducer.setAttribute("id", wproducer.attribute("id")); + if (!wproducer.attribute("description").isEmpty()) + kproducer.setAttribute("description", wproducer.attribute("description")); + kproducer.setAttribute("resource", wproducer.attribute("resource")); + kproducer.setAttribute("type", wproducer.attribute("type")); + // Testing fix for 358 + if (!wproducer.attribute("aspect_ratio").isEmpty()) { + kproducer.setAttribute("aspect_ratio", wproducer.attribute("aspect_ratio")); + } + if (!wproducer.attribute("source_fps").isEmpty()) { + kproducer.setAttribute("fps", wproducer.attribute("source_fps")); + } + if (!wproducer.attribute("length").isEmpty()) { + kproducer.setAttribute("duration", wproducer.attribute("length")); + } + kdenlivedoc_new.appendChild(kproducer); + } + if (wproducer.attribute("id").toInt() > max_kproducer_id) { + max_kproducer_id = wproducer.attribute("id").toInt(); + } + } + } +#define LOOKUP_FOLDER 1 +#ifdef LOOKUP_FOLDER + // Look through all the folder elements of the old doc, for each folder, for each producer, + // get the id, look it up in the new doc, set the groupname and groupid + // Note, this does not work at the moment - at least one folders shows up missing, and clips with no folder + // does not show up. + // QDomElement kdenlivedoc_old = kdenlivedoc.toElement(); + if (!kdenlivedoc_old.isNull()) { + QDomNodeList folders = kdenlivedoc_old.elementsByTagName("folder"); + int fsize = folders.size(); + int groupId = max_kproducer_id + 1; // Start at +1 of max id of the kdenlive_producers + for (int i = 0; i < fsize; ++i) { + QDomElement folder = folders.at(i).toElement(); + if (!folder.isNull()) { + QString groupName = folder.attribute("name"); + kDebug() << "groupName: " << groupName << " with groupId: " << groupId; + QDomNodeList fproducers = folder.elementsByTagName("producer"); + int psize = fproducers.size(); + for (int j = 0; j < psize; ++j) { + QDomElement fproducer = fproducers.at(j).toElement(); + if (!fproducer.isNull()) { + QString id = fproducer.attribute("id"); + // This is not very effective, but compared to loading the clips, its a breeze + QDomNodeList kdenlive_producers = kdenlivedoc_new.elementsByTagName("kdenlive_producer"); + int kpsize = kdenlive_producers.size(); + for (int k = 0; k < kpsize; ++k) { + QDomElement kproducer = kdenlive_producers.at(k).toElement(); // Its an element for sure + if (id == kproducer.attribute("id")) { + // We do not check that it already is part of a folder + kproducer.setAttribute("groupid", groupId); + kproducer.setAttribute("groupname", groupName); + break; + } + } + } + } + ++groupId; + } + } + } +#endif + westley0.appendChild(kdenlivedoc_new); + + QDomNodeList elements = westley.childNodes(); + max = elements.count(); + for (int i = 0; i < max; i++) { + QDomElement prod = elements.at(0).toElement(); + westley0.insertAfter(prod, QDomNode()); + } + + westley0.removeChild(westley); + + // experimental and probably slow + // adds information to + QDomNodeList kproducers = m_doc.elementsByTagName("kdenlive_producer"); + QDomNodeList avfiles = kdenlivedoc_old.elementsByTagName("avfile"); + kDebug() << "found" << avfiles.count() << "s and" << kproducers.count() << "s"; + for (int i = 0; i < avfiles.count(); ++i) { + QDomElement avfile = avfiles.at(i).toElement(); + QDomElement kproducer; + if (avfile.isNull()) + kWarning() << "found an that is not a QDomElement"; + else { + QString id = avfile.attribute("id"); + // this is horrible, must be rewritten, it's just for test + for (int j = 0; j < kproducers.count(); ++j) { + //kDebug() << "checking with id" << kproducers.at(j).toElement().attribute("id"); + if (kproducers.at(j).toElement().attribute("id") == id) { + kproducer = kproducers.at(j).toElement(); + break; + } + } + if (kproducer == QDomElement()) + kWarning() << "no match for with id =" << id; + else { + //kDebug() << "ready to set additional 's attributes (id =" << id << ")"; + kproducer.setAttribute("channels", avfile.attribute("channels")); + kproducer.setAttribute("duration", avfile.attribute("duration")); + kproducer.setAttribute("frame_size", avfile.attribute("width") + 'x' + avfile.attribute("height")); + kproducer.setAttribute("frequency", avfile.attribute("frequency")); + if (kproducer.attribute("description").isEmpty() && !avfile.attribute("description").isEmpty()) + kproducer.setAttribute("description", avfile.attribute("description")); + } + } + } + + /*kDebug() << "///////////////// CONVERTED DOC:"; + kDebug() << m_doc.toString(); + kDebug() << "///////////////// END CONVERTED DOC:"; + + QFile file("converted.kdenlive"); + if (file.open(QIODevice::WriteOnly)) { + QTextStream stream(&file); + stream << m_doc.toString().toUtf8(); + file.close(); + } else { + kDebug() << "Unable to dump file to converted.kdenlive"; + }*/ + + //kDebug() << "///////////////// END CONVERTED DOC:"; + convertToMelt(); + return true; +} + +QString DocumentConvert::colorToString(const QColor& c) +{ + QString ret = "%1,%2,%3,%4"; + ret = ret.arg(c.red()).arg(c.green()).arg(c.blue()).arg(c.alpha()); + return ret; +} + +bool DocumentConvert::isModified() const +{ + return m_modified; +} + +void DocumentConvert::convertToMelt() +{ + QDomNodeList list = m_doc.elementsByTagName("westley"); + int max = list.count(); + for (int i = 0; i < max; i++) { + QDomElement elem = list.at(i).toElement(); + elem.setTagName("mlt"); + } +} + diff --git a/src/documentconvert.h b/src/documentconvert.h new file mode 100644 index 00000000..a06d85b0 --- /dev/null +++ b/src/documentconvert.h @@ -0,0 +1,42 @@ +/*************************************************************************** + * Copyright (C) 2009 by Jean-Baptiste Mardelle (jb@kdenlive.org) * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * + ***************************************************************************/ + + +#ifndef DOCUMENTCONVERT_H +#define DOCUMENTCONVERT_H + +#include +#include + +class DocumentConvert +{ + +public: + DocumentConvert(QDomDocument doc); + bool doConvert(double version, const double current_version); + bool isModified() const; + +private: + bool m_modified; + QDomDocument m_doc; + QString colorToString(const QColor& c); + void convertToMelt(); +}; + +#endif diff --git a/src/dvdwizard.cpp b/src/dvdwizard.cpp index 2cfe9dcc..7e370ddc 100644 --- a/src/dvdwizard.cpp +++ b/src/dvdwizard.cpp @@ -231,7 +231,7 @@ void DvdWizard::generateDvd() renderbg.start(KdenliveSettings::rendererpath(), args); if (renderbg.waitForFinished()) { if (renderbg.exitStatus() == QProcess::CrashExit) { - kDebug() << "/// RENDERING MENU vob crashed"; + kDebug() << "/// RENDERING MENU vob crashed"; QByteArray result = renderbg.readAllStandardError(); vobitem->setIcon(KIcon("dialog-close")); m_status.error_log->setText(result); @@ -239,7 +239,7 @@ void DvdWizard::generateDvd() return; } } else { - kDebug() << "/// RENDERING MENU vob timed out"; + kDebug() << "/// RENDERING MENU vob timed out"; vobitem->setIcon(KIcon("dialog-close")); m_status.error_log->setText(i18n("Rendering job timed out")); m_status.error_box->setHidden(false); @@ -282,7 +282,7 @@ void DvdWizard::generateDvd() else but.setAttribute("up", 'b' + QString::number(max)); QRect r = it.value(); //int target = it.key(); - // TODO: solve play all button + // TODO: solve play all button //if (target == 0) target = 1; buttonsTarget.append(it.key()); but.setAttribute("x0", QString::number(r.x())); @@ -470,7 +470,7 @@ void DvdWizard::slotRenderFinished(int /*exitCode*/, QProcess::ExitStatus status delete m_dvdauthor; m_dvdauthor = NULL; - // Check if DVD structure has the necessary infos + // Check if DVD structure has the necessary infos if (!QFile::exists(m_iso.tmp_folder->url().path() + "/DVD/VIDEO_TS/VIDEO_TS.IFO")) { m_status.error_log->setText(m_creationLog + '\n' + i18n("DVD structure broken")); m_status.error_box->setHidden(false); @@ -518,7 +518,7 @@ void DvdWizard::slotIsoFinished(int /*exitCode*/, QProcess::ExitStatus status) delete m_mkiso; m_mkiso = NULL; - // Check if DVD iso is ok + // Check if DVD iso is ok QFile iso(m_iso.iso_image->url().path()); if (!iso.exists() || iso.size() == 0) { if (iso.exists()) { diff --git a/src/kdenlivedoc.cpp b/src/kdenlivedoc.cpp index 7fc0333b..13d1f4fa 100644 --- a/src/kdenlivedoc.cpp +++ b/src/kdenlivedoc.cpp @@ -27,6 +27,7 @@ #include "titlewidget.h" #include "mainwindow.h" #include "documentchecker.h" +#include "documentconvert.h" #include "kdenlive-config.h" #include @@ -43,6 +44,8 @@ #include +const double DOCUMENTVERSION = 0.83; + KdenliveDoc::KdenliveDoc(const KUrl &url, const KUrl &projectFolder, QUndoGroup *undoGroup, const QString &profileName, const QPoint tracks, Render *render, MainWindow *parent) : QObject(parent), m_autosave(NULL), @@ -83,20 +86,22 @@ KdenliveDoc::KdenliveDoc(const KUrl &url, const KUrl &projectFolder, QUndoGroup double version = infoXml.attribute("version").toDouble(); // Upgrade old Kdenlive documents to current version - if (!convertDocument(version)) { + DocumentConvert converter(m_document); + if (!converter.doConvert(version, DOCUMENTVERSION)) { m_url.clear(); m_document = createEmptyDocument(tracks.x(), tracks.y()); setProfilePath(profileName); } else { /* - * read again to get all the new stuff - * (convertDocument() can now do anything without breaking + * read again and to get all the new + * stuff (convertDocument() can now do anything without breaking * document loading) */ + setModified(converter.isModified()); infoXmlNode = m_document.elementsByTagName("kdenlivedoc").at(0); infoXml = infoXmlNode.toElement(); version = infoXml.attribute("version").toDouble(); - QDomNode westley = m_document.elementsByTagName("westley").at(0); + QDomNode mlt = m_document.elementsByTagName("mlt").at(0); QString profilePath = infoXml.attribute("profile"); QString projectFolderPath = infoXml.attribute("projectfolder"); @@ -131,7 +136,7 @@ KdenliveDoc::KdenliveDoc(const KUrl &url, const KUrl &projectFolder, QUndoGroup m_tracksList.append(projectTrack); } } - westley.removeChild(tracksinfo); + mlt.removeChild(tracksinfo); } QDomNodeList producers = m_document.elementsByTagName("producer"); QDomNodeList infoproducers = m_document.elementsByTagName("kdenlive_producer"); @@ -196,7 +201,7 @@ KdenliveDoc::KdenliveDoc(const KUrl &url, const KUrl &projectFolder, QUndoGroup m_clipManager->getClipById(e.attribute("id"))->addSnapMarker(GenTime(e.attribute("time").toDouble()), e.attribute("comment")); } } - westley.removeChild(markers); + mlt.removeChild(markers); } m_document.removeChild(infoXmlNode); kDebug() << "Reading file: " << url.path() << ", found clips: " << producers.count(); @@ -259,8 +264,8 @@ QDomDocument KdenliveDoc::createEmptyDocument(const int videotracks, const int a { // Creating new document QDomDocument doc; - QDomElement westley = doc.createElement("westley"); - doc.appendChild(westley); + QDomElement mlt = doc.createElement("mlt"); + doc.appendChild(mlt); TrackInfo videoTrack; @@ -280,7 +285,7 @@ QDomDocument KdenliveDoc::createEmptyDocument(const int videotracks, const int a QDomElement multitrack = doc.createElement("multitrack"); QDomElement playlist = doc.createElement("playlist"); playlist.setAttribute("id", "black_track"); - westley.appendChild(playlist); + mlt.appendChild(playlist); // create playlists @@ -289,7 +294,7 @@ QDomDocument KdenliveDoc::createEmptyDocument(const int videotracks, const int a for (int i = 1; i < total; i++) { QDomElement playlist = doc.createElement("playlist"); playlist.setAttribute("id", "playlist" + QString::number(i)); - westley.appendChild(playlist); + mlt.appendChild(playlist); } QDomElement track0 = doc.createElement("track"); @@ -348,7 +353,7 @@ QDomDocument KdenliveDoc::createEmptyDocument(const int videotracks, const int a transition.appendChild(property); tractor.appendChild(transition); } - westley.appendChild(tractor); + mlt.appendChild(tractor); return doc; } @@ -404,591 +409,6 @@ int KdenliveDoc::zoom() const return m_zoom; } -bool KdenliveDoc::convertDocument(double version) -{ - kDebug() << "Opening a document with version " << version; - const double current_version = 0.82; - - if (version == current_version) return true; - - if (version > current_version) { - kDebug() << "Unable to open document with version " << version; - KMessageBox::sorry(kapp->activeWindow(), i18n("This project type is unsupported (version %1) and can't be loaded.\nPlease consider upgrading you Kdenlive version.", version), i18n("Unable to open project")); - return false; - } - - // Opening a old Kdenlive document - if (version == 0.5 || version == 0.7) { - KMessageBox::sorry(kapp->activeWindow(), i18n("This project type is unsupported (version %1) and can't be loaded.", version), i18n("Unable to open project")); - kDebug() << "Unable to open document with version " << version; - // TODO: convert 0.7 (0.5?) files to the new document format. - return false; - } - - setModified(true); - - if (version == 0.81) { - // Add correct tracks info - QDomNode kdenlivedoc = m_document.elementsByTagName("kdenlivedoc").at(0); - QDomElement infoXml = kdenlivedoc.toElement(); - infoXml.setAttribute("version", current_version); - QString currentTrackOrder = infoXml.attribute("tracks"); - QDomElement tracksinfo = m_document.createElement("tracksinfo"); - for (int i = 0; i < currentTrackOrder.size(); i++) { - QDomElement trackinfo = m_document.createElement("trackinfo"); - if (currentTrackOrder.data()[i] == 'a') { - trackinfo.setAttribute("type", "audio"); - trackinfo.setAttribute("blind", true); - } else trackinfo.setAttribute("blind", false); - trackinfo.setAttribute("mute", false); - trackinfo.setAttribute("locked", false); - tracksinfo.appendChild(trackinfo); - } - infoXml.appendChild(tracksinfo); - return true; - } - - if (version == 0.8) { - // Add the tracks information - QDomNodeList tracks = m_document.elementsByTagName("track"); - int max = tracks.count(); - - QDomNode kdenlivedoc = m_document.elementsByTagName("kdenlivedoc").at(0); - QDomElement infoXml = kdenlivedoc.toElement(); - infoXml.setAttribute("version", current_version); - QDomElement tracksinfo = m_document.createElement("tracksinfo"); - - for (int i = 0; i < max; i++) { - QDomElement trackinfo = m_document.createElement("trackinfo"); - QDomElement t = tracks.at(i).toElement(); - if (t.attribute("hide") == "video") { - trackinfo.setAttribute("type", "audio"); - trackinfo.setAttribute("blind", true); - } else trackinfo.setAttribute("blind", false); - trackinfo.setAttribute("mute", false); - trackinfo.setAttribute("locked", false); - if (t.attribute("producer") != "black_track") tracksinfo.appendChild(trackinfo); - } - infoXml.appendChild(tracksinfo); - return true; - } - - QDomNode westley = m_document.elementsByTagName("westley").at(1); - QDomNode tractor = m_document.elementsByTagName("tractor").at(0); - QDomNode kdenlivedoc = m_document.elementsByTagName("kdenlivedoc").at(0); - QDomElement kdenlivedoc_old = kdenlivedoc.cloneNode(true).toElement(); // Needed for folders - QDomElement infoXml = kdenlivedoc.toElement(); - infoXml.setAttribute("version", current_version); - QDomNode multitrack = m_document.elementsByTagName("multitrack").at(0); - QDomNodeList playlists = m_document.elementsByTagName("playlist"); - - QDomNode props = m_document.elementsByTagName("properties").at(0).toElement(); - QString profile = props.toElement().attribute("videoprofile"); - m_startPos = props.toElement().attribute("timeline_position").toInt(); - if (profile == "dv_wide") profile = "dv_pal_wide"; - - // move playlists outside of tractor and add the tracks instead - int max = playlists.count(); - if (westley.isNull()) { - westley = m_document.createElement("westley"); - m_document.documentElement().appendChild(westley); - } - if (tractor.isNull()) { - kDebug() << "// NO WESTLEY PLAYLIST, building empty one"; - QDomElement blank_tractor = m_document.createElement("tractor"); - westley.appendChild(blank_tractor); - QDomElement blank_playlist = m_document.createElement("playlist"); - blank_playlist.setAttribute("id", "black_track"); - westley.insertBefore(blank_playlist, QDomNode()); - QDomElement blank_track = m_document.createElement("track"); - blank_track.setAttribute("producer", "black_track"); - blank_tractor.appendChild(blank_track); - - QDomNodeList kdenlivetracks = m_document.elementsByTagName("kdenlivetrack"); - for (int i = 0; i < kdenlivetracks.count(); i++) { - blank_playlist = m_document.createElement("playlist"); - blank_playlist.setAttribute("id", "playlist" + QString::number(i)); - westley.insertBefore(blank_playlist, QDomNode()); - blank_track = m_document.createElement("track"); - blank_track.setAttribute("producer", "playlist" + QString::number(i)); - blank_tractor.appendChild(blank_track); - if (kdenlivetracks.at(i).toElement().attribute("cliptype") == "Sound") { - blank_playlist.setAttribute("hide", "video"); - blank_track.setAttribute("hide", "video"); - } - } - } else for (int i = 0; i < max; i++) { - QDomNode n = playlists.at(i); - westley.insertBefore(n, QDomNode()); - QDomElement pl = n.toElement(); - QDomElement track = m_document.createElement("track"); - QString trackType = pl.attribute("hide"); - if (!trackType.isEmpty()) - track.setAttribute("hide", trackType); - QString playlist_id = pl.attribute("id"); - if (playlist_id.isEmpty()) { - playlist_id = "black_track"; - pl.setAttribute("id", playlist_id); - } - track.setAttribute("producer", playlist_id); - //tractor.appendChild(track); -#define KEEP_TRACK_ORDER 1 -#ifdef KEEP_TRACK_ORDER - tractor.insertAfter(track, QDomNode()); -#else - // Insert the new track in an order that hopefully matches the 3 video, then 2 audio tracks of Kdenlive 0.7.0 - // insertion sort - O( tracks*tracks ) - // Note, this breaks _all_ transitions - but you can move them up and down afterwards. - QDomElement tractor_elem = tractor.toElement(); - if (! tractor_elem.isNull()) { - QDomNodeList tracks = tractor_elem.elementsByTagName("track"); - int size = tracks.size(); - if (size == 0) { - tractor.insertAfter(track, QDomNode()); - } else { - bool inserted = false; - for (int i = 0; i < size; ++i) { - QDomElement track_elem = tracks.at(i).toElement(); - if (track_elem.isNull()) { - tractor.insertAfter(track, QDomNode()); - inserted = true; - break; - } else { - kDebug() << "playlist_id: " << playlist_id << " producer:" << track_elem.attribute("producer"); - if (playlist_id < track_elem.attribute("producer")) { - tractor.insertBefore(track, track_elem); - inserted = true; - break; - } - } - } - // Reach here, no insertion, insert last - if (!inserted) { - tractor.insertAfter(track, QDomNode()); - } - } - } else { - kWarning() << "tractor was not a QDomElement"; - tractor.insertAfter(track, QDomNode()); - } -#endif - } - tractor.removeChild(multitrack); - - // audio track mixing transitions should not be added to track view, so add required attribute - QDomNodeList transitions = m_document.elementsByTagName("transition"); - max = transitions.count(); - for (int i = 0; i < max; i++) { - QDomElement tr = transitions.at(i).toElement(); - if (tr.attribute("combine") == "1" && tr.attribute("mlt_service") == "mix") { - QDomElement property = m_document.createElement("property"); - property.setAttribute("name", "internal_added"); - QDomText value = m_document.createTextNode("237"); - property.appendChild(value); - tr.appendChild(property); - property = m_document.createElement("property"); - property.setAttribute("name", "mlt_service"); - value = m_document.createTextNode("mix"); - property.appendChild(value); - tr.appendChild(property); - } else { - // convert transition - QDomNamedNodeMap attrs = tr.attributes(); - for (int j = 0; j < attrs.count(); j++) { - QString attrName = attrs.item(j).nodeName(); - if (attrName != "in" && attrName != "out" && attrName != "id") { - QDomElement property = m_document.createElement("property"); - property.setAttribute("name", attrName); - QDomText value = m_document.createTextNode(attrs.item(j).nodeValue()); - property.appendChild(value); - tr.appendChild(property); - } - } - } - } - - // move transitions after tracks - for (int i = 0; i < max; i++) { - tractor.insertAfter(transitions.at(0), QDomNode()); - } - - // Fix filters format - QDomNodeList entries = m_document.elementsByTagName("entry"); - max = entries.count(); - for (int i = 0; i < max; i++) { - QString last_id; - int effectix = 0; - QDomNode m = entries.at(i).firstChild(); - while (!m.isNull()) { - if (m.toElement().tagName() == "filter") { - QDomElement filt = m.toElement(); - QDomNamedNodeMap attrs = filt.attributes(); - QString current_id = filt.attribute("kdenlive_id"); - if (current_id != last_id) { - effectix++; - last_id = current_id; - } - QDomElement e = m_document.createElement("property"); - e.setAttribute("name", "kdenlive_ix"); - QDomText value = m_document.createTextNode(QString::number(effectix)); - e.appendChild(value); - filt.appendChild(e); - for (int j = 0; j < attrs.count(); j++) { - QDomAttr a = attrs.item(j).toAttr(); - if (!a.isNull()) { - kDebug() << " FILTER; adding :" << a.name() << ":" << a.value(); - QDomElement e = m_document.createElement("property"); - e.setAttribute("name", a.name()); - QDomText value = m_document.createTextNode(a.value()); - e.appendChild(value); - filt.appendChild(e); - - } - } - } - m = m.nextSibling(); - } - } - - /* - QDomNodeList filters = m_document.elementsByTagName("filter"); - max = filters.count(); - QString last_id; - int effectix = 0; - for (int i = 0; i < max; i++) { - QDomElement filt = filters.at(i).toElement(); - QDomNamedNodeMap attrs = filt.attributes(); - QString current_id = filt.attribute("kdenlive_id"); - if (current_id != last_id) { - effectix++; - last_id = current_id; - } - QDomElement e = m_document.createElement("property"); - e.setAttribute("name", "kdenlive_ix"); - QDomText value = m_document.createTextNode(QString::number(1)); - e.appendChild(value); - filt.appendChild(e); - for (int j = 0; j < attrs.count(); j++) { - QDomAttr a = attrs.item(j).toAttr(); - if (!a.isNull()) { - kDebug() << " FILTER; adding :" << a.name() << ":" << a.value(); - QDomElement e = m_document.createElement("property"); - e.setAttribute("name", a.name()); - QDomText value = m_document.createTextNode(a.value()); - e.appendChild(value); - filt.appendChild(e); - } - } - }*/ - - // fix slowmotion - QDomNodeList producers = westley.toElement().elementsByTagName("producer"); - max = producers.count(); - for (int i = 0; i < max; i++) { - QDomElement prod = producers.at(i).toElement(); - if (prod.attribute("mlt_service") == "framebuffer") { - QString slowmotionprod = prod.attribute("resource"); - slowmotionprod.replace(':', '?'); - kDebug() << "// FOUND WRONG SLOWMO, new: " << slowmotionprod; - prod.setAttribute("resource", slowmotionprod); - } - } - // move producers to correct place, markers to a global list, fix clip descriptions - QDomElement markers = m_document.createElement("markers"); - // This will get the westley producers: - producers = m_document.elementsByTagName("producer"); - max = producers.count(); - for (int i = 0; i < max; i++) { - QDomElement prod = producers.at(0).toElement(); - // add resource also as a property (to allow path correction in setNewResource()) - // TODO: will it work with slowmotion? needs testing - /*if (!prod.attribute("resource").isEmpty()) { - QDomElement prop_resource = m_document.createElement("property"); - prop_resource.setAttribute("name", "resource"); - QDomText resource = m_document.createTextNode(prod.attribute("resource")); - prop_resource.appendChild(resource); - prod.appendChild(prop_resource); - }*/ - QDomNode m = prod.firstChild(); - if (!m.isNull()) { - if (m.toElement().tagName() == "markers") { - QDomNodeList prodchilds = m.childNodes(); - int maxchild = prodchilds.count(); - for (int k = 0; k < maxchild; k++) { - QDomElement mark = prodchilds.at(0).toElement(); - mark.setAttribute("id", prod.attribute("id")); - markers.insertAfter(mark, QDomNode()); - } - prod.removeChild(m); - } else if (prod.attribute("type").toInt() == TEXT) { - // convert title clip - if (m.toElement().tagName() == "textclip") { - QDomDocument tdoc; - QDomElement titleclip = m.toElement(); - QDomElement title = tdoc.createElement("kdenlivetitle"); - tdoc.appendChild(title); - QDomNodeList objects = titleclip.childNodes(); - int maxchild = objects.count(); - for (int k = 0; k < maxchild; k++) { - QString objectxml; - QDomElement ob = objects.at(k).toElement(); - if (ob.attribute("type") == "3") { - // text object - all of this goes into "xmldata"... - QDomElement item = tdoc.createElement("item"); - item.setAttribute("z-index", ob.attribute("z")); - item.setAttribute("type", "QGraphicsTextItem"); - QDomElement position = tdoc.createElement("position"); - position.setAttribute("x", ob.attribute("x")); - position.setAttribute("y", ob.attribute("y")); - QDomElement content = tdoc.createElement("content"); - content.setAttribute("font", ob.attribute("font_family")); - content.setAttribute("font-size", ob.attribute("font_size")); - content.setAttribute("font-bold", ob.attribute("bold")); - content.setAttribute("font-italic", ob.attribute("italic")); - content.setAttribute("font-underline", ob.attribute("underline")); - QString col = ob.attribute("color"); - QColor c(col); - content.setAttribute("font-color", colorToString(c)); - // todo: These fields are missing from the newly generated xmldata: - // transform, startviewport, endviewport, background - - QDomText conttxt = tdoc.createTextNode(ob.attribute("text")); - content.appendChild(conttxt); - item.appendChild(position); - item.appendChild(content); - title.appendChild(item); - } else if (ob.attribute("type") == "5") { - // rectangle object - QDomElement item = tdoc.createElement("item"); - item.setAttribute("z-index", ob.attribute("z")); - item.setAttribute("type", "QGraphicsRectItem"); - QDomElement position = tdoc.createElement("position"); - position.setAttribute("x", ob.attribute("x")); - position.setAttribute("y", ob.attribute("y")); - QDomElement content = tdoc.createElement("content"); - QString col = ob.attribute("color"); - QColor c(col); - content.setAttribute("brushcolor", colorToString(c)); - QString rect = "0,0,"; - rect.append(ob.attribute("width")); - rect.append(","); - rect.append(ob.attribute("height")); - content.setAttribute("rect", rect); - item.appendChild(position); - item.appendChild(content); - title.appendChild(item); - } - } - prod.setAttribute("xmldata", tdoc.toString()); - // mbd todo: This clearly does not work, as every title gets the same name - trying to leave it empty - // QStringList titleInfo = TitleWidget::getFreeTitleInfo(projectFolder()); - // prod.setAttribute("titlename", titleInfo.at(0)); - // prod.setAttribute("resource", titleInfo.at(1)); - //kDebug()<<"TITLE DATA:\n"< 0) prod.setAttribute("out", QString::number(duration)); - // The clip goes back in, but text clips should not go back in, at least not modified - westley.insertBefore(prod, QDomNode()); - - } - - QDomNode westley0 = m_document.elementsByTagName("westley").at(0); - if (!markers.firstChild().isNull()) westley0.appendChild(markers); - - - // Convert as much of the kdenlivedoc as possible. Use the producer in westley - // First, remove the old stuff from westley, and add a new empty one - // Also, track the max id in order to use it for the adding of groups/folders - int max_kproducer_id = 0; - westley0.removeChild(kdenlivedoc); - QDomElement kdenlivedoc_new = m_document.createElement("kdenlivedoc"); - kdenlivedoc_new.setAttribute("profile", profile); - - // Add tracks info - QDomNodeList tracks = m_document.elementsByTagName("track"); - max = tracks.count(); - QDomElement tracksinfo = m_document.createElement("tracksinfo"); - for (int i = 0; i < max; i++) { - QDomElement trackinfo = m_document.createElement("trackinfo"); - QDomElement t = tracks.at(i).toElement(); - if (t.attribute("hide") == "video") { - trackinfo.setAttribute("type", "audio"); - trackinfo.setAttribute("blind", true); - } else trackinfo.setAttribute("blind", false); - trackinfo.setAttribute("mute", false); - trackinfo.setAttribute("locked", false); - if (t.attribute("producer") != "black_track") tracksinfo.appendChild(trackinfo); - } - kdenlivedoc_new.appendChild(tracksinfo); - - // Add all the producers that has a ressource in westley - QDomElement westley_element = westley0.toElement(); - if (westley_element.isNull()) { - kWarning() << "westley0 element in document was not a QDomElement - unable to add producers to new kdenlivedoc"; - } else { - QDomNodeList wproducers = westley_element.elementsByTagName("producer"); - int kmax = wproducers.count(); - for (int i = 0; i < kmax; i++) { - QDomElement wproducer = wproducers.at(i).toElement(); - if (wproducer.isNull()) { - kWarning() << "Found producer in westley0, that was not a QDomElement"; - continue; - } - if (wproducer.attribute("id") == "black") continue; - // We have to do slightly different things, depending on the type - kDebug() << "Converting producer element with type" << wproducer.attribute("type"); - if (wproducer.attribute("type").toInt() == TEXT) { - kDebug() << "Found TEXT element in producer" << endl; - QDomElement kproducer = wproducer.cloneNode(true).toElement(); - kproducer.setTagName("kdenlive_producer"); - kdenlivedoc_new.appendChild(kproducer); - // TODO: Perhaps needs some more changes here to "frequency", aspect ratio as a float, frame_size, channels, and later, ressource and title name - } else { - QDomElement kproducer = m_document.createElement("kdenlive_producer"); - kproducer.setAttribute("id", wproducer.attribute("id")); - if (!wproducer.attribute("description").isEmpty()) - kproducer.setAttribute("description", wproducer.attribute("description")); - kproducer.setAttribute("resource", wproducer.attribute("resource")); - kproducer.setAttribute("type", wproducer.attribute("type")); - // Testing fix for 358 - if (!wproducer.attribute("aspect_ratio").isEmpty()) { - kproducer.setAttribute("aspect_ratio", wproducer.attribute("aspect_ratio")); - } - if (!wproducer.attribute("source_fps").isEmpty()) { - kproducer.setAttribute("fps", wproducer.attribute("source_fps")); - } - if (!wproducer.attribute("length").isEmpty()) { - kproducer.setAttribute("duration", wproducer.attribute("length")); - } - kdenlivedoc_new.appendChild(kproducer); - } - if (wproducer.attribute("id").toInt() > max_kproducer_id) { - max_kproducer_id = wproducer.attribute("id").toInt(); - } - } - } -#define LOOKUP_FOLDER 1 -#ifdef LOOKUP_FOLDER - // Look through all the folder elements of the old doc, for each folder, for each producer, - // get the id, look it up in the new doc, set the groupname and groupid - // Note, this does not work at the moment - at least one folders shows up missing, and clips with no folder - // does not show up. - // QDomElement kdenlivedoc_old = kdenlivedoc.toElement(); - if (!kdenlivedoc_old.isNull()) { - QDomNodeList folders = kdenlivedoc_old.elementsByTagName("folder"); - int fsize = folders.size(); - int groupId = max_kproducer_id + 1; // Start at +1 of max id of the kdenlive_producers - for (int i = 0; i < fsize; ++i) { - QDomElement folder = folders.at(i).toElement(); - if (!folder.isNull()) { - QString groupName = folder.attribute("name"); - kDebug() << "groupName: " << groupName << " with groupId: " << groupId; - QDomNodeList fproducers = folder.elementsByTagName("producer"); - int psize = fproducers.size(); - for (int j = 0; j < psize; ++j) { - QDomElement fproducer = fproducers.at(j).toElement(); - if (!fproducer.isNull()) { - QString id = fproducer.attribute("id"); - // This is not very effective, but compared to loading the clips, its a breeze - QDomNodeList kdenlive_producers = kdenlivedoc_new.elementsByTagName("kdenlive_producer"); - int kpsize = kdenlive_producers.size(); - for (int k = 0; k < kpsize; ++k) { - QDomElement kproducer = kdenlive_producers.at(k).toElement(); // Its an element for sure - if (id == kproducer.attribute("id")) { - // We do not check that it already is part of a folder - kproducer.setAttribute("groupid", groupId); - kproducer.setAttribute("groupname", groupName); - break; - } - } - } - } - ++groupId; - } - } - } -#endif - westley0.appendChild(kdenlivedoc_new); - - QDomNodeList elements = westley.childNodes(); - max = elements.count(); - for (int i = 0; i < max; i++) { - QDomElement prod = elements.at(0).toElement(); - westley0.insertAfter(prod, QDomNode()); - } - - westley0.removeChild(westley); - - // experimental and probably slow - // adds information to - QDomNodeList kproducers = m_document.elementsByTagName("kdenlive_producer"); - QDomNodeList avfiles = kdenlivedoc_old.elementsByTagName("avfile"); - kDebug() << "found" << avfiles.count() << "s and" << kproducers.count() << "s"; - for (int i = 0; i < avfiles.count(); ++i) { - QDomElement avfile = avfiles.at(i).toElement(); - QDomElement kproducer; - if (avfile.isNull()) - kWarning() << "found an that is not a QDomElement"; - else { - QString id = avfile.attribute("id"); - // this is horrible, must be rewritten, it's just for test - for (int j = 0; j < kproducers.count(); ++j) { - //kDebug() << "checking with id" << kproducers.at(j).toElement().attribute("id"); - if (kproducers.at(j).toElement().attribute("id") == id) { - kproducer = kproducers.at(j).toElement(); - break; - } - } - if (kproducer == QDomElement()) - kWarning() << "no match for with id =" << id; - else { - //kDebug() << "ready to set additional 's attributes (id =" << id << ")"; - kproducer.setAttribute("channels", avfile.attribute("channels")); - kproducer.setAttribute("duration", avfile.attribute("duration")); - kproducer.setAttribute("frame_size", avfile.attribute("width") + 'x' + avfile.attribute("height")); - kproducer.setAttribute("frequency", avfile.attribute("frequency")); - if (kproducer.attribute("description").isEmpty() && !avfile.attribute("description").isEmpty()) - kproducer.setAttribute("description", avfile.attribute("description")); - } - } - } - - /*kDebug() << "///////////////// CONVERTED DOC:"; - kDebug() << m_document.toString(); - kDebug() << "///////////////// END CONVERTED DOC:"; - - QFile file("converted.kdenlive"); - if (file.open(QIODevice::WriteOnly)) { - QTextStream stream(&file); - stream << m_document.toString().toUtf8(); - file.close(); - } else { - kDebug() << "Unable to dump file to converted.kdenlive"; - }*/ - - //kDebug() << "///////////////// END CONVERTED DOC:"; - - return true; -} - -QString KdenliveDoc::colorToString(const QColor& c) -{ - QString ret = "%1,%2,%3,%4"; - ret = ret.arg(c.red()).arg(c.green()).arg(c.blue()).arg(c.alpha()); - return ret; -} - void KdenliveDoc::setZone(int start, int end) { m_zoneStart = start; @@ -1004,9 +424,9 @@ bool KdenliveDoc::saveSceneList(const QString &path, const QString &scene) { QDomDocument sceneList; sceneList.setContent(scene, true); - QDomNode wes = sceneList.elementsByTagName("westley").at(0); + QDomNode mlt = sceneList.elementsByTagName("mlt").at(0); QDomElement addedXml = sceneList.createElement("kdenlivedoc"); - wes.appendChild(addedXml); + mlt.appendChild(addedXml); QDomElement markers = sceneList.createElement("markers"); addedXml.setAttribute("version", "0.82"); @@ -1390,7 +810,7 @@ void KdenliveDoc::addClip(QDomElement elem, QString clipId, bool createClipItem) } if (path.isEmpty() == false && QFile::exists(path) == false && elem.attribute("type").toInt() != TEXT && !elem.hasAttribute("placeholder")) { - kDebug() << "// FOUND MISSING CLIP: " << path << ", TYPE: " << elem.attribute("type").toInt(); + kDebug() << "// FOUND MISSING CLIP: " << path << ", TYPE: " << elem.attribute("type").toInt(); const QString size = elem.attribute("file_size"); const QString hash = elem.attribute("file_hash"); QString newpath; diff --git a/src/kdenlivedoc.h b/src/kdenlivedoc.h index e92c0a81..70f3180f 100644 --- a/src/kdenlivedoc.h +++ b/src/kdenlivedoc.h @@ -130,7 +130,7 @@ private: MltVideoProfile m_profile; QTimer *m_autoSaveTimer; QString m_searchFolder; - /** tells whether current doc has been changed since last save event */ + /** tells whether current doc has been changed since last save event */ bool m_modified; /** Project folder, used to store project files (titles, effects,...) */ KUrl m_projectFolder; @@ -142,9 +142,7 @@ private: QList m_tracksList; - bool convertDocument(double version); QDomDocument createEmptyDocument(const int videotracks, const int audiotracks); - QString colorToString(const QColor& c); void setNewClipResource(const QString &id, const QString &path); QString searchFileRecursively(const QDir &dir, const QString &matchSize, const QString &matchHash) const; @@ -167,7 +165,7 @@ signals: void updateClipDisplay(const QString&); void deleteTimelineClip(const QString&); void progressInfo(const QString &, int); - /** emitted when the document state has been modified (= needs saving or not) */ + /** emitted when the document state has been modified (= needs saving or not) */ void docModified(bool); void selectLastAddedClip(const QString &); void guidesUpdated(); diff --git a/src/kthumb.cpp b/src/kthumb.cpp index 8f1cf8f2..a8ce5ca5 100644 --- a/src/kthumb.cpp +++ b/src/kthumb.cpp @@ -184,19 +184,21 @@ QPixmap KThumb::getImage(KUrl url, int width, int height) void KThumb::extractImage(int frame, int frame2) { + kDebug() << "//extract thumb: " << frame << ", " << frame2; if (m_url.isEmpty() || !KdenliveSettings::videothumbnails() || m_producer == NULL) return; const int twidth = (int)(KdenliveSettings::trackheight() * m_dar); const int theight = KdenliveSettings::trackheight(); - mlt_image_format format = mlt_image_yuv422; if (m_producer->is_blank()) { QPixmap pix(twidth, theight); pix.fill(Qt::black); - emit thumbReady(frame, pix); + if (frame != -1) emit thumbReady(frame, pix); + if (frame2 != -1) emit thumbReady(frame2, pix); return; } Mlt::Frame *mltFrame; + mlt_image_format format = mlt_image_yuv422; if (frame != -1) { //videoThumbProducer.getThumb(frame); m_producer->seek(frame); @@ -236,7 +238,7 @@ void KThumb::extractImage(int frame, int frame2) kDebug() << "///// BROKEN FRAME"; QPixmap p(twidth, theight); p.fill(Qt::red); - emit thumbReady(frame, p); + emit thumbReady(frame2, p); return; } else { int frame_width = 0; @@ -275,8 +277,8 @@ QPixmap KThumb::getImage(KUrl url, int frame, int width, int height) if (url.isEmpty()) return pix; char *tmp = Render::decodedString(url.path()); - //""); - //Mlt::Producer producer(profile, "westley-xml", tmp); + //""); + //Mlt::Producer producer(profile, "xml-string", tmp); Mlt::Producer *producer = new Mlt::Producer(profile, tmp); delete[] tmp; @@ -296,13 +298,13 @@ QPixmap KThumb::getImage(QDomElement xml, int frame, int width, int height) { Mlt::Profile profile((char*) KdenliveSettings::current_profile().data()); QPixmap pix(width, height); QDomDocument doc; - QDomElement westley = doc.createElement("westley"); + QDomElement mlt = doc.createElement("mlt"); QDomElement play = doc.createElement("playlist"); - doc.appendChild(westley); - westley.appendChild(play); + doc.appendChild(mlt); + mlt.appendChild(play); play.appendChild(doc.importNode(xml, true)); char *tmp = Render::decodedString(doc.toString()); - Mlt::Producer producer(profile, "westley-xml", tmp); + Mlt::Producer producer(profile, "xml-string", tmp); delete[] tmp; if (producer.is_blank()) { diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 7d6d493d..19161222 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -1163,7 +1163,7 @@ void MainWindow::readOptions() //Add new settings from 0.7.1 if (KdenliveSettings::defaultprojectfolder().isEmpty()) { QString path = QDir::homePath() + "/kdenlive"; - if (KStandardDirs::makeDir(path) == false) kDebug() << "/// ERROR CREATING PROJECT FOLDER: " << path; + if (KStandardDirs::makeDir(path) == false) kDebug() << "/// ERROR CREATING PROJECT FOLDER: " << path; KdenliveSettings::setDefaultprojectfolder(path); } } @@ -1441,24 +1441,24 @@ void MainWindow::parseProfiles(const QString &mltPath) //KdenliveSettings::setDefaulttmpfolder(); if (!mltPath.isEmpty()) { KdenliveSettings::setMltpath(mltPath + "/share/mlt/profiles/"); - KdenliveSettings::setRendererpath(mltPath + "/bin/inigo"); + KdenliveSettings::setRendererpath(mltPath + "/bin/melt"); } if (KdenliveSettings::mltpath().isEmpty()) { KdenliveSettings::setMltpath(QString(MLT_PREFIX) + QString("/share/mlt/profiles/")); } - if (KdenliveSettings::rendererpath().isEmpty()) { - QString inigoPath = QString(MLT_PREFIX) + QString("/bin/inigo"); - if (!QFile::exists(inigoPath)) - inigoPath = KStandardDirs::findExe("inigo"); - else KdenliveSettings::setRendererpath(inigoPath); + if (KdenliveSettings::rendererpath().isEmpty() || KdenliveSettings::rendererpath().endsWith("inigo")) { + QString meltPath = QString(MLT_PREFIX) + QString("/bin/melt"); + if (!QFile::exists(meltPath)) + meltPath = KStandardDirs::findExe("melt"); + KdenliveSettings::setRendererpath(meltPath); } QStringList profilesFilter; profilesFilter << "*"; QStringList profilesList = QDir(KdenliveSettings::mltpath()).entryList(profilesFilter, QDir::Files); if (profilesList.isEmpty()) { - // Cannot find MLT path, try finding inigo + // Cannot find MLT path, try finding melt QString profilePath = KdenliveSettings::rendererpath(); if (!profilePath.isEmpty()) { profilePath = profilePath.section('/', 0, -3); @@ -1482,8 +1482,8 @@ void MainWindow::parseProfiles(const QString &mltPath) } if (KdenliveSettings::rendererpath().isEmpty()) { - // Cannot find the MLT inigo renderer, ask for location - KUrlRequesterDialog *getUrl = new KUrlRequesterDialog(QString(), i18n("Cannot find the inigo program required for rendering (part of Mlt)"), this); + // Cannot find the MLT melt renderer, ask for location + KUrlRequesterDialog *getUrl = new KUrlRequesterDialog(QString(), i18n("Cannot find the melt program required for rendering (part of Mlt)"), this); if (getUrl->exec() == QDialog::Rejected) { ::exit(0); } @@ -1580,17 +1580,17 @@ void MainWindow::slotDoRender(const QStringList args, const QStringList overlay_ KTemporaryFile temp; temp.setAutoRemove(false); - temp.setSuffix(".westley"); + temp.setSuffix(".mlt"); if (!scriptExport.isEmpty() || temp.open()) { if (KdenliveSettings::dropbframes()) { KdenliveSettings::setDropbframes(false); m_activeDocument->clipManager()->updatePreviewSettings(); - if (!scriptExport.isEmpty()) m_projectMonitor->saveSceneList(scriptExport + ".westley"); + if (!scriptExport.isEmpty()) m_projectMonitor->saveSceneList(scriptExport + ".mlt"); else m_projectMonitor->saveSceneList(temp.fileName()); KdenliveSettings::setDropbframes(true); m_activeDocument->clipManager()->updatePreviewSettings(); } else { - if (!scriptExport.isEmpty()) m_projectMonitor->saveSceneList(scriptExport + ".westley"); + if (!scriptExport.isEmpty()) m_projectMonitor->saveSceneList(scriptExport + ".mlt"); else m_projectMonitor->saveSceneList(temp.fileName()); } @@ -1608,7 +1608,7 @@ void MainWindow::slotDoRender(const QStringList args, const QStringList overlay_ if (videoPlayer.isEmpty()) KMessageBox::sorry(this, i18n("Cannot play video after rendering because the default video player application is not set.\nPlease define it in Kdenlive settings dialog.")); } if (!QFile::exists(KdenliveSettings::rendererpath())) { - KMessageBox::sorry(this, i18n("Cannot find the inigo program required for rendering (part of Mlt)")); + KMessageBox::sorry(this, i18n("Cannot find the melt program required for rendering (part of Mlt)")); setRenderingProgress(dest, -3); return; } @@ -2312,7 +2312,7 @@ void MainWindow::customEvent(QEvent* e) { if (e->type() == QEvent::User) { // The timeline playing position changed... - kDebug() << "RECEIVED JOG EVEMNT!!!"; + kDebug() << "RECEIVED JOG EVEMNT!!!"; } } void MainWindow::slotActivateEffectStackView() @@ -2505,7 +2505,7 @@ void MainWindow::slotSaveZone(Render *render, QPoint zone) QLabel *label1 = new QLabel(i18n("Save clip zone as:"), this); QString path = m_activeDocument->projectFolder().path(); path.append("/"); - path.append("untitled.westley"); + path.append("untitled.mlt"); KUrlRequester *url = new KUrlRequester(KUrl(path), this); url->setFilter("video/mlt-playlist"); QLabel *label2 = new QLabel(i18n("Description:"), this); @@ -2635,7 +2635,7 @@ void MainWindow::slotShowTimeline(bool show) void MainWindow::slotMaximizeCurrent(bool show) { - //TODO: is there a way to maximize current widget? + //TODO: is there a way to maximize current widget? //if (show == true) { m_timelineState = saveState(); diff --git a/src/markerdialog.cpp b/src/markerdialog.cpp index 57e612eb..1994c6c8 100644 --- a/src/markerdialog.cpp +++ b/src/markerdialog.cpp @@ -45,13 +45,13 @@ MarkerDialog::MarkerDialog(DocClipBase *clip, CommentedTime t, Timecode tc, cons m_profile = new Mlt::Profile((char*) KdenliveSettings::current_profile().data()); m_dar = m_profile->dar(); QDomDocument doc; - QDomElement westley = doc.createElement("westley"); - QDomElement play = doc.createElement("playlist"); - doc.appendChild(westley); - westley.appendChild(play); + QDomElement mlt = doc.createElement("mlt"); + QDomElement play = doc.createElement("mlt"); + doc.appendChild(mlt); + mlt.appendChild(play); play.appendChild(doc.importNode(clip->toXML(), true)); //char *tmp = doc.toString().toUtf8().data(); - m_producer = new Mlt::Producer(*m_profile, "westley-xml", doc.toString().toUtf8().data()); + m_producer = new Mlt::Producer(*m_profile, "xml-string", doc.toString().toUtf8().data()); //delete[] tmp; QPixmap p((int)(100 * m_dar), 100); diff --git a/src/monitor.cpp b/src/monitor.cpp index 571fb884..a4db4461 100644 --- a/src/monitor.cpp +++ b/src/monitor.cpp @@ -697,10 +697,10 @@ void Monitor::slotOpenFile(const QString &file) if (render == NULL) return; activateMonitor(); QDomDocument doc; - QDomElement westley = doc.createElement("westley"); - doc.appendChild(westley); + QDomElement mlt = doc.createElement("mlt"); + doc.appendChild(mlt); QDomElement prod = doc.createElement("producer"); - westley.appendChild(prod); + mlt.appendChild(prod); prod.setAttribute("mlt_service", "avformat"); prod.setAttribute("resource", file); render->setSceneList(doc, 0); diff --git a/src/renderer.cpp b/src/renderer.cpp index 110f4122..0ef31973 100644 --- a/src/renderer.cpp +++ b/src/renderer.cpp @@ -66,7 +66,7 @@ Render::Render(const QString & rendererName, int winid, int /* extid */, QWidget m_blackClip(NULL), m_winid(winid) { - kDebug() << "////////// USING PROFILE: " << (char*)KdenliveSettings::current_profile().toUtf8().data(); + kDebug() << "////////// USING PROFILE: " << (char*)KdenliveSettings::current_profile().toUtf8().data(); m_refreshTimer = new QTimer(this); connect(m_refreshTimer, SIGNAL(timeout()), this, SLOT(refresh())); @@ -195,7 +195,7 @@ int Render::resetProfile() setSceneList(scene, pos); /*char *tmp = decodedString(scene); - Mlt::Producer *producer = new Mlt::Producer(*m_mltProfile , "westley-xml", tmp); + Mlt::Producer *producer = new Mlt::Producer(*m_mltProfile , "xml-string", tmp); delete[] tmp; m_mltProducer = producer; m_blackClip = new Mlt::Producer(*m_mltProfile , "colour", "black"); @@ -499,17 +499,17 @@ void Render::getFileProperties(const QDomElement &xml, const QString &clipId, bo } if (xml.attribute("type").toInt() == COLOR) { char *tmp = decodedString("colour:" + xml.attribute("colour")); - producer = new Mlt::Producer(*m_mltProfile, "fezzik", tmp); + producer = new Mlt::Producer(*m_mltProfile, 0, tmp); delete[] tmp; } else if (url.isEmpty()) { QDomDocument doc; - QDomElement westley = doc.createElement("westley"); + QDomElement mlt = doc.createElement("mlt"); QDomElement play = doc.createElement("playlist"); - doc.appendChild(westley); - westley.appendChild(play); + doc.appendChild(mlt); + mlt.appendChild(play); play.appendChild(doc.importNode(xml, true)); char *tmp = decodedString(doc.toString()); - producer = new Mlt::Producer(*m_mltProfile, "westley-xml", tmp); + producer = new Mlt::Producer(*m_mltProfile, "xml-string", tmp); delete[] tmp; } else { char *tmp = decodedString(url.path()); @@ -593,7 +593,7 @@ void Render::getFileProperties(const QDomElement &xml, const QString &clipId, bo filePropertyMap["aspect_ratio"] = frame->get("aspect_ratio"); if (frame->get_int("test_image") == 0) { - if (url.path().endsWith(".westley") || url.path().endsWith(".kdenlive")) { + if (url.path().endsWith(".mlt") || url.path().endsWith(".westley") || url.path().endsWith(".kdenlive")) { filePropertyMap["type"] = "playlist"; metadataPropertyMap["comment"] = QString::fromUtf8(producer->get("title")); } else if (frame->get_int("test_audio") == 0) @@ -670,11 +670,11 @@ void Render::getFileProperties(const QDomElement &xml, const QString &clipId, bo } if (KdenliveSettings::dropbframes()) { - kDebug() << "// LOOKING FOR H264 on: " << default_video; + kDebug() << "// LOOKING FOR H264 on: " << default_video; snprintf(property, sizeof(property), "meta.media.%d.codec.name", default_video); kDebug() << "PROP: " << property << " = " << producer->get(property); if (producer->get(property) && strcmp(producer->get(property), "h264") == 0) { - kDebug() << "// GOT H264 CLIP, SETTING FAST PROPS"; + kDebug() << "// GOT H264 CLIP, SETTING FAST PROPS"; producer->set("skip_loop_filter", "all"); producer->set("skip_frame", "bidir"); } @@ -714,14 +714,14 @@ void Render::getFileProperties(const QDomElement &xml, const QString &clipId, bo } -/** Create the producer from the Westley QDomDocument */ +/** Create the producer from the MLT XML QDomDocument */ #if 0 void Render::initSceneList() { kDebug() << "-------- INIT SCENE LIST ------_"; QDomDocument doc; - QDomElement westley = doc.createElement("westley"); - doc.appendChild(westley); + QDomElement mlt = doc.createElement("mlt"); + doc.appendChild(mlt); QDomElement prod = doc.createElement("producer"); prod.setAttribute("resource", "colour"); prod.setAttribute("colour", "red"); @@ -744,17 +744,17 @@ void Render::initSceneList() QDomElement playlist5 = doc.createElement("playlist"); multitrack.appendChild(playlist5); tractor.appendChild(multitrack); - westley.appendChild(tractor); + mlt.appendChild(tractor); // kDebug()<");*/ + QString tmp = QString("");*/ setSceneList(doc, 0); } #endif -/** Create the producer from the Westley QDomDocument */ +/** Create the producer from the MLT XML QDomDocument */ void Render::setProducer(Mlt::Producer *producer, int position) { if (m_winid == -1) return; @@ -779,7 +779,7 @@ void Render::setProducer(Mlt::Producer *producer, int position) m_mltProducer->set("skip_loop_filter", "all"); m_mltProducer->set("skip_frame", "bidir"); }*/ - if (!m_mltProducer || !m_mltProducer->is_valid()) kDebug() << " WARNING - - - - -INVALID PLAYLIST: "; + if (!m_mltProducer || !m_mltProducer->is_valid()) kDebug() << " WARNING - - - - -INVALID PLAYLIST: "; m_fps = m_mltProducer->get_fps(); connectPlaylist(); @@ -792,13 +792,13 @@ void Render::setProducer(Mlt::Producer *producer, int position) -/** Create the producer from the Westley QDomDocument */ +/** Create the producer from the MLT XML QDomDocument */ void Render::setSceneList(QDomDocument list, int position) { setSceneList(list.toString(), position); } -/** Create the producer from the Westley QDomDocument */ +/** Create the producer from the MLT XML QDomDocument */ void Render::setSceneList(QString playlist, int position) { if (m_winid == -1) return; @@ -827,7 +827,7 @@ void Render::setSceneList(QString playlist, int position) blockSignals(true); char *tmp = decodedString(playlist); - m_mltProducer = new Mlt::Producer(*m_mltProfile, "westley-xml", tmp); + m_mltProducer = new Mlt::Producer(*m_mltProfile, "xml-string", tmp); if (!m_mltProducer || !m_mltProducer->is_valid()) { kDebug() << " WARNING - - - - -INVALID PLAYLIST: " << tmp; @@ -842,7 +842,7 @@ void Render::setSceneList(QString playlist, int position) delete m_osdInfo; QString attr = "attr_check"; mlt_filter filter = mlt_factory_filter( "data_feed", (char*) attr.ascii() ); - mlt_properties_set_int( MLT_FILTER_PROPERTIES( filter ), "_fezzik", 1 ); + mlt_properties_set_int( MLT_FILTER_PROPERTIES( filter ), "_loader", 1 ); mlt_producer_attach( m_mltProducer->get_producer(), filter ); mlt_filter_close( filter ); @@ -876,20 +876,20 @@ void Render::setSceneList(QString playlist, int position) //if (position != 0) emit rendererPosition(position); } -/** Create the producer from the Westley QDomDocument */ +/** Create the producer from the MLT XML QDomDocument */ const QString Render::sceneList() { QString playlist; - Mlt::Consumer westleyConsumer(*m_mltProfile , "westley:kdenlive_playlist"); + Mlt::Consumer xmlConsumer(*m_mltProfile , "xml:kdenlive_playlist"); m_mltProducer->optimise(); - westleyConsumer.set("terminate_on_pause", 1); + xmlConsumer.set("terminate_on_pause", 1); Mlt::Producer prod(m_mltProducer->get_producer()); bool split = m_isSplitView; if (split) slotSplitView(false); - westleyConsumer.connect(prod); - westleyConsumer.start(); - while (!westleyConsumer.is_stopped()) {} - playlist = QString::fromUtf8(westleyConsumer.get("kdenlive_playlist")); + xmlConsumer.connect(prod); + xmlConsumer.start(); + while (!xmlConsumer.is_stopped()) {} + playlist = QString::fromUtf8(xmlConsumer.get("kdenlive_playlist")); if (split) slotSplitView(true); return playlist; } @@ -901,8 +901,8 @@ bool Render::saveSceneList(QString path, QDomElement kdenliveData) doc.setContent(sceneList(), false); if (!kdenliveData.isNull()) { // add Kdenlive specific tags - QDomNode wes = doc.elementsByTagName("westley").at(0); - wes.appendChild(doc.importNode(kdenliveData, true)); + QDomNode mlt = doc.elementsByTagName("mlt").at(0); + mlt.appendChild(doc.importNode(kdenliveData, true)); } if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) { kWarning() << "////// ERROR writing to file: " << path; @@ -921,11 +921,11 @@ bool Render::saveSceneList(QString path, QDomElement kdenliveData) void Render::saveZone(KUrl url, QString desc, QPoint zone) { kDebug() << "// SAVING CLIP ZONE, RENDER: " << m_name; - char *tmppath = decodedString("westley:" + url.path()); - Mlt::Consumer westleyConsumer(*m_mltProfile , tmppath); + char *tmppath = decodedString("xml:" + url.path()); + Mlt::Consumer xmlConsumer(*m_mltProfile , tmppath); m_mltProducer->optimise(); delete[] tmppath; - westleyConsumer.set("terminate_on_pause", 1); + xmlConsumer.set("terminate_on_pause", 1); if (m_name == "clip") { Mlt::Producer *prod = m_mltProducer->cut(zone.x(), zone.y()); tmppath = decodedString(desc); @@ -933,7 +933,7 @@ void Render::saveZone(KUrl url, QString desc, QPoint zone) list.insert_at(0, prod, 0); list.set("title", tmppath); delete[] tmppath; - westleyConsumer.connect(list); + xmlConsumer.connect(list); } else { //TODO: not working yet, save zone from timeline @@ -945,10 +945,10 @@ void Render::saveZone(KUrl url, QString desc, QPoint zone) tmppath = decodedString(desc); //prod->set("title", tmppath); delete[] tmppath; - westleyConsumer.connect(*p1); //list); + xmlConsumer.connect(*p1); //list); } - westleyConsumer.start(); + xmlConsumer.start(); } double Render::fps() const @@ -1358,12 +1358,12 @@ void Render::mltCheckLength() void Render::mltInsertClip(ItemInfo info, QDomElement element, Mlt::Producer *prod) { if (!m_mltProducer) { - kDebug() << "PLAYLIST NOT INITIALISED //////"; + kDebug() << "PLAYLIST NOT INITIALISED //////"; return; } Mlt::Producer parentProd(m_mltProducer->parent()); if (parentProd.get_producer() == NULL) { - kDebug() << "PLAYLIST BROKEN, CANNOT INSERT CLIP //////"; + kDebug() << "PLAYLIST BROKEN, CANNOT INSERT CLIP //////"; return; } @@ -1544,12 +1544,12 @@ bool Render::mltRemoveClip(int track, GenTime position) int Render::mltGetSpaceLength(const GenTime pos, int track, bool fromBlankStart) { if (!m_mltProducer) { - kDebug() << "PLAYLIST NOT INITIALISED //////"; + kDebug() << "PLAYLIST NOT INITIALISED //////"; return -1; } Mlt::Producer parentProd(m_mltProducer->parent()); if (parentProd.get_producer() == NULL) { - kDebug() << "PLAYLIST BROKEN, CANNOT INSERT CLIP //////"; + kDebug() << "PLAYLIST BROKEN, CANNOT INSERT CLIP //////"; return -1; } @@ -1568,12 +1568,12 @@ int Render::mltGetSpaceLength(const GenTime pos, int track, bool fromBlankStart) int Render::mltTrackDuration(int track) { if (!m_mltProducer) { - kDebug() << "PLAYLIST NOT INITIALISED //////"; + kDebug() << "PLAYLIST NOT INITIALISED //////"; return -1; } Mlt::Producer parentProd(m_mltProducer->parent()); if (parentProd.get_producer() == NULL) { - kDebug() << "PLAYLIST BROKEN, CANNOT INSERT CLIP //////"; + kDebug() << "PLAYLIST BROKEN, CANNOT INSERT CLIP //////"; return -1; } @@ -1587,12 +1587,12 @@ int Render::mltTrackDuration(int track) void Render::mltInsertSpace(QMap trackClipStartList, QMap trackTransitionStartList, int track, const GenTime duration, const GenTime timeOffset) { if (!m_mltProducer) { - kDebug() << "PLAYLIST NOT INITIALISED //////"; + kDebug() << "PLAYLIST NOT INITIALISED //////"; return; } Mlt::Producer parentProd(m_mltProducer->parent()); if (parentProd.get_producer() == NULL) { - kDebug() << "PLAYLIST BROKEN, CANNOT INSERT CLIP //////"; + kDebug() << "PLAYLIST BROKEN, CANNOT INSERT CLIP //////"; return; } //kDebug()<<"// CLP STRT LST: "< trackClipStartList, QMap } trackPlaylist.consolidate_blanks(0); } - // now move transitions + // now move transitions mlt_service serv = m_mltProducer->parent().get_service(); mlt_service nextservice = mlt_service_get_producer(serv); mlt_properties properties = MLT_SERVICE_PROPERTIES(nextservice); @@ -1681,7 +1681,7 @@ void Render::mltInsertSpace(QMap trackClipStartList, QMap } trackNb--; } - // now move transitions + // now move transitions mlt_service serv = m_mltProducer->parent().get_service(); mlt_service nextservice = mlt_service_get_producer(serv); mlt_properties properties = MLT_SERVICE_PROPERTIES(nextservice); @@ -1857,7 +1857,7 @@ bool Render::mltRemoveEffect(int track, GenTime position, QString index, bool up if (clipService.detach(*filter) == 0) success = true; kDebug() << " / / / DLEETED EFFECT: " << ct; } else if (updateIndex) { - // Adjust the other effects index + // Adjust the other effects index if (QString(filter->get("kdenlive_ix")).toInt() > index.toInt()) filter->set("kdenlive_ix", QString(filter->get("kdenlive_ix")).toInt() - 1); ct++; } else ct++; @@ -2028,7 +2028,7 @@ bool Render::mltEditEffect(int track, GenTime position, EffectsParameterList par //int clipIndex = trackPlaylist.get_clip_index_at(position.frames(m_fps)); Mlt::Producer *clip = trackPlaylist.get_clip_at((int) position.frames(m_fps)); if (!clip) { - kDebug() << "WARINIG, CANNOT FIND CLIP ON track: " << track << ", AT POS: " << position.frames(m_fps); + kDebug() << "WARINIG, CANNOT FIND CLIP ON track: " << track << ", AT POS: " << position.frames(m_fps); return false; } Mlt::Service clipService(clip->get_service()); @@ -2045,7 +2045,7 @@ bool Render::mltEditEffect(int track, GenTime position, EffectsParameterList par if (!filter) { kDebug() << "WARINIG, FILTER FOR EDITING NOT FOUND, ADDING IT!!!!!"; - // filter was not found, it was probably a disabled filter, so add it to the correct place... + // filter was not found, it was probably a disabled filter, so add it to the correct place... int ct = 0; filter = clipService.filter(ct); QList filtersList; @@ -2082,7 +2082,7 @@ bool Render::mltEditEffect(int track, GenTime position, EffectsParameterList par void Render::mltMoveEffect(int track, GenTime position, int oldPos, int newPos) { - kDebug() << "MOVING EFFECT FROM " << oldPos << ", TO: " << newPos; + kDebug() << "MOVING EFFECT FROM " << oldPos << ", TO: " << newPos; Mlt::Service service(m_mltProducer->parent().get_service()); Mlt::Tractor tractor(service); @@ -2091,7 +2091,7 @@ void Render::mltMoveEffect(int track, GenTime position, int oldPos, int newPos) //int clipIndex = trackPlaylist.get_clip_index_at(position.frames(m_fps)); Mlt::Producer *clip = trackPlaylist.get_clip_at((int) position.frames(m_fps)); if (!clip) { - kDebug() << "WARINIG, CANNOT FIND CLIP ON track: " << track << ", AT POS: " << position.frames(m_fps); + kDebug() << "WARINIG, CANNOT FIND CLIP ON track: " << track << ", AT POS: " << position.frames(m_fps); return; } Mlt::Service clipService(clip->get_service()); @@ -2191,7 +2191,7 @@ bool Render::mltResizeClipEnd(ItemInfo info, GenTime clipDuration) if (diff > 0) { // clip was made longer, trim next blank if there is one. if (clipIndex < trackPlaylist.count()) { - // If this is not the last clip in playlist + // If this is not the last clip in playlist if (trackPlaylist.is_blank(clipIndex)) { int blankStart = trackPlaylist.clip_start(clipIndex); int blankDuration = trackPlaylist.clip_length(clipIndex) - 1; @@ -2508,7 +2508,7 @@ bool Render::mltMoveTransition(QString type, int startTrack, int newTrack, int n if (resource == type && startTrack == currentTrack && currentIn <= old_pos && currentOut >= old_pos) { mlt_transition_set_in_and_out(tr, new_in, new_out); if (newTrack - startTrack != 0) { - kDebug() << "///// TRANSITION CHANGE TRACK. CUrrent (b): " << currentTrack << 'x' << mlt_transition_get_a_track(tr) << ", NEw: " << newTrack << 'x' << newTransitionTrack; + kDebug() << "///// TRANSITION CHANGE TRACK. CUrrent (b): " << currentTrack << 'x' << mlt_transition_get_a_track(tr) << ", NEw: " << newTrack << 'x' << newTransitionTrack; mlt_properties properties = MLT_TRANSITION_PROPERTIES(tr); mlt_properties_set_int(properties, "a_track", newTransitionTrack); @@ -2639,7 +2639,7 @@ QMap Render::mltGetTransitionParamsFromXml(QDomElement xml) for (int i = 0;i < attribs.count();i++) { QDomElement e = attribs.item(i).toElement(); QString name = e.attribute("name"); - //kDebug()<<"-- TRANSITION PARAM: "<get_service()); diff --git a/src/renderwidget.cpp b/src/renderwidget.cpp index 6e28f843..7b624a31 100644 --- a/src/renderwidget.cpp +++ b/src/renderwidget.cpp @@ -468,7 +468,7 @@ void RenderWidget::slotDeleteProfile(bool refresh) /* QString edit = m_view.size_list->currentItem()->data(EditableRole).toString(); if (!edit.endsWith("customprofiles.xml")) { - // This is a KNewStuff installed file, process through KNS + // This is a KNewStuff installed file, process through KNS KNS::Engine engine(0); if (engine.init("kdenlive_render.knsrc")) { KNS::Entry::List entries; @@ -602,7 +602,7 @@ void RenderWidget::slotExport(bool scriptExport) QString filterFile = KStandardDirs::locate("appdata", "metadata.properties"); overlayargs << "meta.attr.timecode=1" << "meta.attr.timecode.markup=#timecode"; overlayargs << "-attach" << "data_feed:attr_check" << "-attach"; - overlayargs << "data_show:" + filterFile << "_fezzik=1" << "dynamic=1"; + overlayargs << "data_show:" + filterFile << "_loader=1" << "dynamic=1"; } double startPos = -1; double endPos = -1; @@ -1290,7 +1290,7 @@ void RenderWidget::parseScriptFiles() m_view.scripts_list->clear(); QTreeWidgetItem *item; - // List the project scripts + // List the project scripts QStringList scriptFiles = QDir(m_projectFolder + "/scripts").entryList(scriptsFilter, QDir::Files); for (int i = 0; i < scriptFiles.size(); ++i) { KUrl scriptpath(m_projectFolder + "/scripts/" + scriptFiles.at(i)); @@ -1365,7 +1365,7 @@ void RenderWidget::slotDeleteScript() QTreeWidgetItem *item = m_view.scripts_list->currentItem(); if (item) { QString path = item->data(0, Qt::UserRole + 1).toString(); - KIO::NetAccess::del(path + ".westley", this); + KIO::NetAccess::del(path + ".mlt", this); KIO::NetAccess::del(path, this); parseScriptFiles(); } diff --git a/src/trackview.cpp b/src/trackview.cpp index 59ddbea1..0fe426c8 100644 --- a/src/trackview.cpp +++ b/src/trackview.cpp @@ -209,7 +209,7 @@ void TrackView::parseDocument(QDomDocument doc) trackduration = slotAddProjectTrack(pos, p, m_doc->isTrackLocked(i - 1)); pos--; - //kDebug() << " PRO DUR: " << trackduration << ", TRACK DUR: " << duration; + //kDebug() << " PRO DUR: " << trackduration << ", TRACK DUR: " << duration; if (trackduration > duration) duration = trackduration; } else { // background black track @@ -243,10 +243,10 @@ void TrackView::parseDocument(QDomDocument doc) p = transitionparams.item(k).toElement(); if (!p.isNull()) { QString paramName = p.attribute("name"); - // do not add audio mixing transitions + // do not add audio mixing transitions if (paramName == "internal_added" && p.text() == "237") { transitionAdd = false; - //kDebug() << "// TRANSITRION " << i << " IS NOT VALID (INTERN ADDED)"; + //kDebug() << "// TRANSITRION " << i << " IS NOT VALID (INTERN ADDED)"; //break; } else if (paramName == "a_track") a_track = p.text().toInt(); else if (paramName == "b_track") b_track = p.text().toInt(); @@ -451,14 +451,14 @@ int TrackView::slotAddProjectTrack(int ix, QDomElement xml, bool locked) } else id = id.section('_', 0, 0); DocClipBase *clip = m_doc->clipManager()->getClipById(id); if (clip == NULL) { - // The clip in playlist was not listed in the kdenlive producers, + // The clip in playlist was not listed in the kdenlive producers, // something went wrong, repair required. kWarning() << "CANNOT INSERT CLIP " << id; clip = getMissingProducer(id); if (!clip) { // We cannot find the producer, something is really wrong, add - // placeholder color clip + // placeholder color clip QDomDocument doc; QDomElement producerXml = doc.createElement("producer"); doc.appendChild(producerXml); @@ -487,7 +487,7 @@ int TrackView::slotAddProjectTrack(int ix, QDomElement xml, bool locked) clipinfo.endPos = clipinfo.startPos + GenTime(out - in + 1, m_doc->fps()); clipinfo.cropStart = GenTime(in, m_doc->fps()); clipinfo.track = ix; - //kDebug() << "// INSERTING CLIP: " << in << "x" << out << ", track: " << ix << ", ID: " << id << ", SCALE: " << m_scale << ", FPS: " << m_doc->fps(); + //kDebug() << "// INSERTING CLIP: " << in << "x" << out << ", track: " << ix << ", ID: " << id << ", SCALE: " << m_scale << ", FPS: " << m_doc->fps(); ClipItem *item = new ClipItem(clip, clipinfo, m_doc->fps(), speed, false); if (idString.endsWith("_video")) item->setVideoOnly(true); else if (idString.endsWith("_audio")) item->setAudioOnly(true); @@ -695,7 +695,7 @@ DocClipBase *TrackView::getMissingProducer(const QString id) const break; } } - // prepend westley document root if no path in clip resource and not a color clip + // prepend MLT XML document root if no path in clip resource and not a color clip if (!resource.contains('/') && !resource.startsWith("0x")) resource.prepend(docRoot); DocClipBase *missingClip = NULL; if (!resource.isEmpty()) diff --git a/src/widgets/configenv_ui.ui b/src/widgets/configenv_ui.ui index 9673b08c..2b448004 100644 --- a/src/widgets/configenv_ui.ui +++ b/src/widgets/configenv_ui.ui @@ -40,7 +40,7 @@ - Inigo path + Melt path diff --git a/src/wizard.cpp b/src/wizard.cpp index 9ef7ad00..3717ff59 100644 --- a/src/wizard.cpp +++ b/src/wizard.cpp @@ -31,7 +31,7 @@ #include #include -const double recommendedMltVersion = 38; +const double recommendedMltVersion = 40; Wizard::Wizard(bool upgrade, QWidget *parent) : QWizard(parent) @@ -126,17 +126,17 @@ void Wizard::checkMltComponents() QTreeWidgetItem *mltitem = new QTreeWidgetItem(m_mltCheck.programList); - QTreeWidgetItem *inigoitem = new QTreeWidgetItem(m_mltCheck.programList, QStringList() << QString() << i18n("Inigo") + " (" + KdenliveSettings::rendererpath() + ')'); - inigoitem->setData(1, Qt::UserRole, i18n("Required for rendering (part of MLT package)")); - inigoitem->setSizeHint(0, itemSize); - inigoitem->setIcon(0, m_okIcon); + QTreeWidgetItem *meltitem = new QTreeWidgetItem(m_mltCheck.programList, QStringList() << QString() << i18n("Melt") + " (" + KdenliveSettings::rendererpath() + ')'); + meltitem->setData(1, Qt::UserRole, i18n("Required for rendering (part of MLT package)")); + meltitem->setSizeHint(0, itemSize); + meltitem->setIcon(0, m_okIcon); // Check MLT's installed producers QProcess checkProcess; checkProcess.start(KdenliveSettings::rendererpath(), QStringList() << "-query" << "producer"); if (!checkProcess.waitForStarted()) { - inigoitem->setIcon(0, m_badIcon); - inigoitem->setData(1, Qt::UserRole, i18n("Error starting MLT's command line player (inigo)")); + meltitem->setIcon(0, m_badIcon); + meltitem->setData(1, Qt::UserRole, i18n("Error starting MLT's command line player (melt)")); button(QWizard::NextButton)->setEnabled(false); } else { checkProcess.waitForFinished(); @@ -157,7 +157,7 @@ void Wizard::checkMltComponents() QString mltVersion; QString exepath = KStandardDirs::findExe("pkg-config"); if (!exepath.isEmpty()) { - checkProcess.start(exepath, QStringList() << "--variable=version" << "mlt-framework"); + checkProcess.start(exepath, QStringList() << "--variable=version" << "mlt++"); if (!checkProcess.waitForStarted()) { kDebug() << "// Error querying MLT's version"; } else { @@ -459,7 +459,7 @@ void Wizard::adjustSettings() KdenliveSettings::setDefault_profile(selectedProfile); } QString path = m_extra.projectfolder->url().path(); - if (KStandardDirs::makeDir(path) == false) kDebug() << "/// ERROR CREATING PROJECT FOLDER: " << path; + if (KStandardDirs::makeDir(path) == false) kDebug() << "/// ERROR CREATING PROJECT FOLDER: " << path; KdenliveSettings::setDefaultprojectfolder(path); } @@ -473,7 +473,7 @@ void Wizard::slotCheckMlt() /*QProcess checkProcess; checkProcess.start(KdenliveSettings::rendererpath(), QStringList() << "-query" << "producer"); if (!checkProcess.waitForStarted()) - errorMessage.append(i18n("Error starting MLT's command line player (inigo)") + ".\n"); + errorMessage.append(i18n("Error starting MLT's command line player (melt)") + ".\n"); checkProcess.waitForFinished(); @@ -483,7 +483,7 @@ void Wizard::slotCheckMlt() QProcess checkProcess2; checkProcess2.start(KdenliveSettings::rendererpath(), QStringList() << "-query" << "consumer"); if (!checkProcess2.waitForStarted()) - errorMessage.append(i18n("Error starting MLT's command line player (inigo).") + '\n'); + errorMessage.append(i18n("Error starting MLT's command line player (melt).") + '\n'); checkProcess2.waitForFinished(); diff --git a/thumbnailer/westleypreview.cpp b/thumbnailer/westleypreview.cpp index f8ee646e..9f00782e 100644 --- a/thumbnailer/westleypreview.cpp +++ b/thumbnailer/westleypreview.cpp @@ -43,47 +43,47 @@ extern "C" { KDE_EXPORT ThumbCreator *new_creator() { - return new WestleyPreview; + return new MltPreview; } } -WestleyPreview::WestleyPreview() : +MltPreview::MltPreview() : QObject(), ThumbCreator(), - m_inigoprocess(0), + m_meltProcess(0), m_rand(0) { } -WestleyPreview::~WestleyPreview() +MltPreview::~MltPreview() { delete m_rand; - delete m_inigoprocess; + delete m_meltProcess; } -bool WestleyPreview::startAndWaitProcess(const QStringList &args) +bool MltPreview::startAndWaitProcess(const QStringList &args) { - kDebug(DBG_AREA) << "westleypreview: starting process with args: " << args << endl; - m_inigoprocess->start(args.join(" ")); - if (! m_inigoprocess->waitForStarted()) { - kDebug(DBG_AREA) << "westleypreview: PROCESS NOT STARTED!!! exiting\n"; + kDebug(DBG_AREA) << "MltPreview: starting process with args: " << args << endl; + m_meltProcess->start(args.join(" ")); + if (! m_meltProcess->waitForStarted()) { + kDebug(DBG_AREA) << "MltPreview: PROCESS NOT STARTED!!! exiting\n"; return false; } - if (! m_inigoprocess->waitForFinished()) { - kDebug(DBG_AREA) << "westleypreview: PROCESS DIDN'T FINISH!! exiting\n"; - m_inigoprocess->close(); + if (! m_meltProcess->waitForFinished()) { + kDebug(DBG_AREA) << "MltPreview: PROCESS DIDN'T FINISH!! exiting\n"; + m_meltProcess->close(); return false; } - kDebug() << "westleypreview: process started and ended correctly\n"; + kDebug() << "MltPreview: process started and ended correctly\n"; return true; } -bool WestleyPreview::create(const QString &path, int width, int /*height*/, QImage &img) +bool MltPreview::create(const QString &path, int width, int /*height*/, QImage &img) { QFileInfo fi(path); - m_playerBin = KStandardDirs::findExe("inigo"); + m_playerBin = KStandardDirs::findExe("melt"); if (m_playerBin.isEmpty()) { - kDebug(DBG_AREA) << "westleypreview: inigo not found, exiting.\n"; + kDebug(DBG_AREA) << "MltPreview: melt not found, exiting.\n"; return false; } @@ -91,7 +91,7 @@ bool WestleyPreview::create(const QString &path, int width, int /*height*/, QIma fileinfo.fps = 0; m_rand = new KRandomSequence(QDateTime::currentDateTime().toTime_t()); - m_inigoprocess = new QProcess(); + m_meltProcess = new QProcess(); KUrl furl(path); kDebug(DBG_AREA) << "videopreview: url=" << furl << "; local:" << furl.isLocalFile() << endl; fileinfo.towidth = width; @@ -100,7 +100,7 @@ bool WestleyPreview::create(const QString &path, int width, int /*height*/, QIma // if(furl.isLocalFile()) // { QStringList args; - //TODO: modify inigo so that it can return some infos about a westley clip (duration, track number,fps,...) + //TODO: modify melt so that it can return some infos about a MLT XML clip (duration, track number,fps,...) // without actually playing the file /* args << playerBin << QString("\"" + path + "\"") << "-file-info"; @@ -108,7 +108,7 @@ bool WestleyPreview::create(const QString &path, int width, int /*height*/, QIma kDebug(DBG_AREA) << "videopreview: starting process: --_" << " " << args.join(" ") << "_--\n"; if (! startAndWaitProcess(args) ) return NULL; - QString information=QString(inigoprocess->readAllStandardOutput() ); + QString information=QString(meltProcess->readAllStandardOutput() ); QRegExp findInfos("ID_VIDEO_FPS=([\\d]*).*ID_LENGTH=([\\d]*).*"); if(findInfos.indexIn( information) == -1 ) { @@ -141,7 +141,7 @@ bool WestleyPreview::create(const QString &path, int width, int /*height*/, QIma return true; } -QImage WestleyPreview::getFrame(const QString &path) +QImage MltPreview::getFrame(const QString &path) { QStringList args; const int START = 25; @@ -163,7 +163,7 @@ QImage WestleyPreview::getFrame(const QString &path) } -uint WestleyPreview::imageVariance(QImage image) +uint MltPreview::imageVariance(QImage image) { uint delta = 0; uint avg = 0; @@ -186,7 +186,7 @@ uint WestleyPreview::imageVariance(QImage image) return delta / STEPS; } -ThumbCreator::Flags WestleyPreview::flags() const +ThumbCreator::Flags MltPreview::flags() const { return None; } diff --git a/thumbnailer/westleypreview.h b/thumbnailer/westleypreview.h index 80aff9c9..f2501804 100644 --- a/thumbnailer/westleypreview.h +++ b/thumbnailer/westleypreview.h @@ -33,12 +33,12 @@ class QProcess; class KTempDir; class KRandomSequence; -class WestleyPreview : public QObject, public ThumbCreator +class MltPreview : public QObject, public ThumbCreator { Q_OBJECT public: - WestleyPreview(); - virtual ~WestleyPreview(); + MltPreview(); + virtual ~MltPreview(); virtual bool create(const QString &path, int width, int height, QImage &img); virtual Flags flags() const; @@ -47,7 +47,7 @@ protected: static uint imageVariance(QImage image); private: - QProcess *m_inigoprocess; + QProcess *m_meltProcess; KRandomSequence *m_rand; QString m_playerBin; bool startAndWaitProcess(const QStringList &args);