add_definitions (${QT_DEFINITIONS})
FIND_PACKAGE(LIBMLT REQUIRED)
-FIND_PACKAGE(LIBMLTPLUS REQUIRED)
find_package(MSGFMT REQUIRED)
find_program(EXTRACTRC_EXECUTABLE extractrc)
#
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}\"\\\")
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} )
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}")
} 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);
}
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");
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();
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");
}
}
void RenderJob::slotAbort()
{
- qDebug() << "Kdenlive-render: JOB ABORTED BY USER...";
+ qDebug() << "Kdenlive-render: JOB ABORTED BY USER...";
m_renderProcess->kill();
if (m_kdenliveinterface) {
QString result = QString(m_renderProcess->readAllStandardError()).simplified();
if (!result.startsWith("Current Frame")) m_errorMessage.append(result + "<br>");
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;
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();
}
changecliptypecommand.cpp
documentchecker.cpp
dvdwizardchapters.cpp
+ documentconvert.cpp
)
add_definitions( ${KDE4_DEFINITIONS} )
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();
e = producers.item(i).toElement();
if (deletedIds.contains(e.attribute("id"))) {
// Remove clip
- westley.removeChild(e);
+ mlt.removeChild(e);
break;
}
}
--- /dev/null
+/***************************************************************************
+ * 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 <KDebug>
+#include <KMessageBox>
+#include <KApplication>
+#include <KLocale>
+
+#include <QColor>
+
+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"<<tdoc.toString();
+ prod.removeChild(m);
+ } // End conversion of title clips.
+
+ } else if (m.isText()) {
+ QString comment = m.nodeValue();
+ if (!comment.isEmpty()) {
+ prod.setAttribute("description", comment);
+ }
+ prod.removeChild(m);
+ }
+ }
+ int duration = prod.attribute("duration").toInt();
+ if (duration > 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 <avfile /> information to <kdenlive_producer />
+ QDomNodeList kproducers = m_doc.elementsByTagName("kdenlive_producer");
+ QDomNodeList avfiles = kdenlivedoc_old.elementsByTagName("avfile");
+ kDebug() << "found" << avfiles.count() << "<avfile />s and" << kproducers.count() << "<kdenlive_producer />s";
+ for (int i = 0; i < avfiles.count(); ++i) {
+ QDomElement avfile = avfiles.at(i).toElement();
+ QDomElement kproducer;
+ if (avfile.isNull())
+ kWarning() << "found an <avfile /> 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 <kdenlive_producer /> 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 <avfile /> with id =" << id;
+ else {
+ //kDebug() << "ready to set additional <avfile />'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");
+ }
+}
+
--- /dev/null
+/***************************************************************************
+ * 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 <QDomDocument>
+#include <QColor>
+
+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
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);
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);
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()));
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);
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()) {
#include "titlewidget.h"
#include "mainwindow.h"
#include "documentchecker.h"
+#include "documentconvert.h"
#include "kdenlive-config.h"
#include <KDebug>
#include <mlt++/Mlt.h>
+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),
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 <kdenlivedoc> to get all the new stuff
- * (convertDocument() can now do anything without breaking
+ * read again <kdenlivedoc> and <mlt> 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");
m_tracksList.append(projectTrack);
}
}
- westley.removeChild(tracksinfo);
+ mlt.removeChild(tracksinfo);
}
QDomNodeList producers = m_document.elementsByTagName("producer");
QDomNodeList infoproducers = m_document.elementsByTagName("kdenlive_producer");
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();
{
// Creating new document
QDomDocument doc;
- QDomElement westley = doc.createElement("westley");
- doc.appendChild(westley);
+ QDomElement mlt = doc.createElement("mlt");
+ doc.appendChild(mlt);
TrackInfo videoTrack;
QDomElement multitrack = doc.createElement("multitrack");
QDomElement playlist = doc.createElement("playlist");
playlist.setAttribute("id", "black_track");
- westley.appendChild(playlist);
+ mlt.appendChild(playlist);
// create playlists
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");
transition.appendChild(property);
tractor.appendChild(transition);
}
- westley.appendChild(tractor);
+ mlt.appendChild(tractor);
return doc;
}
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"<<tdoc.toString();
- prod.removeChild(m);
- } // End conversion of title clips.
-
- } else if (m.isText()) {
- QString comment = m.nodeValue();
- if (!comment.isEmpty()) {
- prod.setAttribute("description", comment);
- }
- prod.removeChild(m);
- }
- }
- int duration = prod.attribute("duration").toInt();
- if (duration > 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 <avfile /> information to <kdenlive_producer />
- QDomNodeList kproducers = m_document.elementsByTagName("kdenlive_producer");
- QDomNodeList avfiles = kdenlivedoc_old.elementsByTagName("avfile");
- kDebug() << "found" << avfiles.count() << "<avfile />s and" << kproducers.count() << "<kdenlive_producer />s";
- for (int i = 0; i < avfiles.count(); ++i) {
- QDomElement avfile = avfiles.at(i).toElement();
- QDomElement kproducer;
- if (avfile.isNull())
- kWarning() << "found an <avfile /> 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 <kdenlive_producer /> 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 <avfile /> with id =" << id;
- else {
- //kDebug() << "ready to set additional <avfile />'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;
{
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");
}
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;
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;
QList <TrackInfo> 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;
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();
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);
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;
if (url.isEmpty()) return pix;
char *tmp = Render::decodedString(url.path());
- //"<westley><playlist><producer resource=\"" + url.path() + "\" /></playlist></westley>");
- //Mlt::Producer producer(profile, "westley-xml", tmp);
+ //"<mlt><playlist><producer resource=\"" + url.path() + "\" /></playlist></mlt>");
+ //Mlt::Producer producer(profile, "xml-string", tmp);
Mlt::Producer *producer = new Mlt::Producer(profile, tmp);
delete[] tmp;
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()) {
//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);
}
}
//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);
}
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);
}
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());
}
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;
}
{
if (e->type() == QEvent::User) {
// The timeline playing position changed...
- kDebug() << "RECEIVED JOG EVEMNT!!!";
+ kDebug() << "RECEIVED JOG EVEMNT!!!";
}
}
void MainWindow::slotActivateEffectStackView()
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);
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();
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);
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);
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()));
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");
}
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());
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)
}
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");
}
}
-/** 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");
QDomElement playlist5 = doc.createElement("playlist");
multitrack.appendChild(playlist5);
tractor.appendChild(multitrack);
- westley.appendChild(tractor);
+ mlt.appendChild(tractor);
// kDebug()<<doc.toString();
/*
- QString tmp = QString("<westley><producer resource=\"colour\" colour=\"red\" id=\"red\" /><tractor><multitrack><playlist></playlist><playlist></playlist><playlist /><playlist /><playlist></playlist></multitrack></tractor></westley>");*/
+ QString tmp = QString("<mlt><producer resource=\"colour\" colour=\"red\" id=\"red\" /><tractor><multitrack><playlist></playlist><playlist></playlist><playlist /><playlist /><playlist></playlist></multitrack></tractor></mlt>");*/
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;
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();
-/** 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;
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;
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 );
//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;
}
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;
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);
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
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
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;
}
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;
}
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;
}
void Render::mltInsertSpace(QMap <int, int> trackClipStartList, QMap <int, int> 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;
}
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);
}
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);
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++;
//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());
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 <Mlt::Filter *> filtersList;
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);
//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());
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;
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);
for (int i = 0;i < attribs.count();i++) {
QDomElement e = attribs.item(i).toElement();
QString name = e.attribute("name");
- //kDebug()<<"-- TRANSITION PARAM: "<<name<<" = "<< e.attribute("name")<<" / " << e.attribute("value");
+ //kDebug()<<"-- TRANSITION PARAM: "<<name<<" = "<< e.attribute("name")<<" / " << e.attribute("value");
map[name] = e.attribute("default");
if (!e.attribute("value").isEmpty()) {
map[name] = e.attribute("value");
void Render::mltSavePlaylist()
{
kWarning() << "// UPDATING PLAYLIST TO DISK++++++++++++++++";
- Mlt::Consumer fileConsumer(*m_mltProfile, "westley");
- fileConsumer.set("resource", "/tmp/playlist.westley");
+ Mlt::Consumer fileConsumer(*m_mltProfile, "xml");
+ fileConsumer.set("resource", "/tmp/playlist.mlt");
Mlt::Service service(m_mltProducer->get_service());
/*
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;
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;
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));
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();
}
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
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();
} 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);
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);
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())
<item row="1" column="0" >
<widget class="QLabel" name="label_2" >
<property name="text" >
- <string>Inigo path</string>
+ <string>Melt path</string>
</property>
</widget>
</item>
#include <QXmlStreamWriter>
#include <QTimer>
-const double recommendedMltVersion = 38;
+const double recommendedMltVersion = 40;
Wizard::Wizard(bool upgrade, QWidget *parent) :
QWizard(parent)
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();
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 {
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);
}
/*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();
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();
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;
}
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;
// 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";
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 )
{
return true;
}
-QImage WestleyPreview::getFrame(const QString &path)
+QImage MltPreview::getFrame(const QString &path)
{
QStringList args;
const int START = 25;
}
-uint WestleyPreview::imageVariance(QImage image)
+uint MltPreview::imageVariance(QImage image)
{
uint delta = 0;
uint avg = 0;
return delta / STEPS;
}
-ThumbCreator::Flags WestleyPreview::flags() const
+ThumbCreator::Flags MltPreview::flags() const
{
return None;
}
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;
static uint imageVariance(QImage image);
private:
- QProcess *m_inigoprocess;
+ QProcess *m_meltProcess;
KRandomSequence *m_rand;
QString m_playerBin;
bool startAndWaitProcess(const QStringList &args);