#include <mlt++/Mlt.h>
-const double DOCUMENTVERSION = 0.83;
+const double DOCUMENTVERSION = 0.84;
KdenliveDoc::KdenliveDoc(const KUrl &url, const KUrl &projectFolder, QUndoGroup *undoGroup, QString profileName, const QPoint tracks, Render *render, MainWindow *parent) :
QObject(parent),
// init default document properties
m_documentProperties["zoom"] = "7";
+ m_documentProperties["verticalzoom"] = "1";
m_documentProperties["zonein"] = "0";
m_documentProperties["zoneout"] = "100";
// Something went wrong, or a new file was requested: create a new project
if (!success) {
+ setProfilePath(QString());
m_url = KUrl();
m_document = createEmptyDocument(tracks.x(), tracks.y());
}
+ KdenliveSettings::setCurrent_profile(profilePath());
+
// Set the video profile (empty == default)
// Make sure the project folder is usable
KStandardDirs::makeDir(m_projectFolder.path(KUrl::AddTrailingSlash) + "ladspa/");
kDebug() << "Kdenlive document, init timecode: " << m_fps;
- if (m_fps == 30000.0 / 1001.0) m_timecode.setFormat(30, true);
- else m_timecode.setFormat((int) m_fps);
+ if (m_fps == 30000.0 / 1001.0) m_timecode.setFormat(m_fps, true);
+ else m_timecode.setFormat(m_fps);
//kDebug() << "// SETTING SCENE LIST:\n\n" << m_document.toString();
connect(m_autoSaveTimer, SIGNAL(timeout()), this, SLOT(slotAutoSave()));
KdenliveDoc::~KdenliveDoc()
{
+ m_autoSaveTimer->stop();
delete m_commandStack;
+ kDebug() << "// DEL CLP MAN";
delete m_clipManager;
+ kDebug() << "// DEL CLP MAN done";
delete m_autoSaveTimer;
if (m_autosave) {
if (!m_autosave->fileName().isEmpty()) m_autosave->remove();
}
}
-void KdenliveDoc::setSceneList()
+int KdenliveDoc::setSceneList()
{
- m_render->setSceneList(m_document.toString(), m_documentProperties.value("position").toInt());
+ m_render->resetProfile();
+ if (m_render->setSceneList(m_document.toString(), m_documentProperties.value("position").toInt()) == -1) {
+ // INVALID MLT Consumer, something is wrong
+ return -1;
+ }
m_documentProperties.remove("position");
// m_document xml is now useless, clear it
m_document.clear();
checkProjectClips();
+ return 0;
}
QDomDocument KdenliveDoc::createEmptyDocument(const int videotracks, const int audiotracks)
audioTrack.isBlind = true;
audioTrack.isLocked = false;
+ // Create black producer
+ // For some unknown reason, we have to build the black producer here and not in renderer.cpp, otherwise
+ // the composite transitions with the black track are corrupted.
+ QDomElement blk = doc.createElement("producer");
+ blk.setAttribute("in", 0);
+ blk.setAttribute("out", 500);
+ blk.setAttribute("id", "black");
+
+ QDomElement property = doc.createElement("property");
+ property.setAttribute("name", "mlt_type");
+ QDomText value = doc.createTextNode("producer");
+ property.appendChild(value);
+ blk.appendChild(property);
+
+ property = doc.createElement("property");
+ property.setAttribute("name", "aspect_ratio");
+ value = doc.createTextNode(QString::number(0.0));
+ property.appendChild(value);
+ blk.appendChild(property);
+
+ property = doc.createElement("property");
+ property.setAttribute("name", "length");
+ value = doc.createTextNode(QString::number(15000));
+ property.appendChild(value);
+ blk.appendChild(property);
+
+ property = doc.createElement("property");
+ property.setAttribute("name", "eof");
+ value = doc.createTextNode("pause");
+ property.appendChild(value);
+ blk.appendChild(property);
+
+ property = doc.createElement("property");
+ property.setAttribute("name", "resource");
+ value = doc.createTextNode("black");
+ property.appendChild(value);
+ blk.appendChild(property);
+
+ property = doc.createElement("property");
+ property.setAttribute("name", "mlt_service");
+ value = doc.createTextNode("colour");
+ property.appendChild(value);
+ blk.appendChild(property);
+
+ mlt.appendChild(blk);
+
+
QDomElement tractor = doc.createElement("tractor");
tractor.setAttribute("id", "maintractor");
QDomElement multitrack = doc.createElement("multitrack");
playlist.setAttribute("id", "black_track");
mlt.appendChild(playlist);
+ QDomElement blank0 = doc.createElement("entry");
+ blank0.setAttribute("in", "0");
+ blank0.setAttribute("out", "0");
+ blank0.setAttribute("producer", "black");
+ playlist.appendChild(blank0);
// create playlists
int total = audiotracks + videotracks + 1;
}
}
-void KdenliveDoc::setZoom(int factor)
+void KdenliveDoc::setZoom(int horizontal, int vertical)
{
- m_documentProperties["zoom"] = QString::number(factor);
+ m_documentProperties["zoom"] = QString::number(horizontal);
+ m_documentProperties["verticalzoom"] = QString::number(vertical);
}
-int KdenliveDoc::zoom() const
+QPoint KdenliveDoc::zoom() const
{
- return m_documentProperties.value("zoom").toInt();
+ return QPoint(m_documentProperties.value("zoom").toInt(), m_documentProperties.value("verticalzoom").toInt());
}
void KdenliveDoc::setZone(int start, int end)
m_width = m_profile.width;
m_height = m_profile.height;
kDebug() << "Kdenlive document, init timecode from path: " << path << ", " << m_fps;
- if (m_fps == 30000.0 / 1001.0) m_timecode.setFormat(30, true);
- else m_timecode.setFormat((int) m_fps);
+ if (m_fps == 30000.0 / 1001.0) m_timecode.setFormat(m_fps, true);
+ else m_timecode.setFormat(m_fps);
}
double KdenliveDoc::dar()
kDebug() << "+++++++++++++ + + + + CHK PCLIPS";
if (m_render == NULL) return;
m_clipManager->resetProducersList(m_render->producersList());
- return;
-
- // Useless now...
- QList <Mlt::Producer *> prods = m_render->producersList();
- QString id ;
- QString prodId ;
- QString prodTrack ;
- for (int i = 0; i < prods.count(); i++) {
- id = prods.at(i)->get("id");
- prodId = id.section('_', 0, 0);
- prodTrack = id.section('_', 1, 1);
- DocClipBase *clip = m_clipManager->getClipById(prodId);
- if (clip) clip->setProducer(prods.at(i));
- if (clip && clip->clipType() == TEXT && !QFile::exists(clip->fileURL().path())) {
- // regenerate text clip image if required
- //kDebug() << "// TITLE: " << clip->getProperty("titlename") << " Preview file: " << clip->getProperty("resource") << " DOES NOT EXIST";
- QString titlename = clip->getProperty("name");
- QString titleresource;
- if (titlename.isEmpty()) {
- QStringList titleInfo = TitleWidget::getFreeTitleInfo(projectFolder());
- titlename = titleInfo.at(0);
- titleresource = titleInfo.at(1);
- clip->setProperty("name", titlename);
- kDebug() << "// New title set to: " << titlename;
- } else {
- titleresource = TitleWidget::getFreeTitleInfo(projectFolder()).at(1);
- //titleresource = TitleWidget::getTitleResourceFromName(projectFolder(), titlename);
- }
- TitleWidget *dia_ui = new TitleWidget(KUrl(), KUrl(titleresource).directory(), m_render, kapp->activeWindow());
- QDomDocument doc;
- doc.setContent(clip->getProperty("xmldata"));
- dia_ui->setXml(doc);
- QImage pix = dia_ui->renderedPixmap();
- pix.save(titleresource);
- clip->setProperty("resource", titleresource);
- delete dia_ui;
- clip->producer()->set("force_reload", 1);
- }
- }
}
void KdenliveDoc::updatePreviewSettings()
int KdenliveDoc::getFramePos(QString duration)
{
- return m_timecode.getFrameCount(duration, m_fps);
+ return m_timecode.getFrameCount(duration);
}
QString KdenliveDoc::producerName(const QString &id)
if (elem.attribute("type").toInt() == SLIDESHOW) {
extension = KUrl(path).fileName();
path = KUrl(path).directory();
- } else if (elem.attribute("type").toInt() == TEXT && QFile::exists(path) == false) {
+ } /*else if (elem.attribute("type").toInt() == TEXT && QFile::exists(path) == false) {
kDebug() << "// TITLE: " << elem.attribute("name") << " Preview file: " << elem.attribute("resource") << " DOES NOT EXIST";
QString titlename = elem.attribute("name");
QString titleresource;
elem.setAttribute("resource", titleresource);
setNewClipResource(clipId, titleresource);
delete dia_ui;
- }
+ }*/
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();
void KdenliveDoc::deleteClip(const QString &clipId)
{
emit signalDeleteProjectClip(clipId);
- m_clipManager->deleteClip(clipId);
}
void KdenliveDoc::slotAddClipList(const KUrl::List urls, const QString group, const QString &groupId)
{
QString titlesFolder = projectFolder().path(KUrl::AddTrailingSlash) + "titles/";
KStandardDirs::makeDir(titlesFolder);
- TitleWidget *dia_ui = new TitleWidget(templatePath, titlesFolder, m_render, kapp->activeWindow());
+ TitleWidget *dia_ui = new TitleWidget(templatePath, m_timecode, titlesFolder, m_render, kapp->activeWindow());
if (dia_ui->exec() == QDialog::Accepted) {
- QStringList titleInfo = TitleWidget::getFreeTitleInfo(projectFolder());
+ /*QStringList titleInfo = TitleWidget::getFreeTitleInfo(projectFolder());
QImage pix = dia_ui->renderedPixmap();
- pix.save(titleInfo.at(1));
+ pix.save(titleInfo.at(1));*/
//dia_ui->saveTitle(path + ".kdenlivetitle");
- m_clipManager->slotAddTextClipFile(titleInfo.at(0), titleInfo.at(1), dia_ui->xml().toString(), group, groupId);
+ m_clipManager->slotAddTextClipFile(i18n("Title clip"), dia_ui->duration(), dia_ui->xml().toString(), group, groupId);
setModified(true);
emit selectLastAddedClip(QString::number(m_clipManager->lastClipId()));
}
QStringList titleInfo = TitleWidget::getFreeTitleInfo(projectFolder(), true);
- TitleWidget *dia_ui = new TitleWidget(path, titlesFolder, m_render, kapp->activeWindow());
+ //TODO: rewrite with new title system (just set resource)
+ /*TitleWidget *dia_ui = new TitleWidget(path, titlesFolder, m_render, kapp->activeWindow());
QImage pix = dia_ui->renderedPixmap();
pix.save(titleInfo.at(1));
delete dia_ui;
m_clipManager->slotAddTextTemplateClip(titleInfo.at(0), titleInfo.at(1), path, group, groupId);
- setModified(true);
+ setModified(true);*/
emit selectLastAddedClip(QString::number(m_clipManager->lastClipId()));
}