From 5dda83668ef9215247a991561726761cded0ca94 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Mardelle Date: Mon, 21 Jul 2008 15:18:50 +0000 Subject: [PATCH] * New: split monitor to view several tracks at once * Fixed audio mixing stopping at 10 minutes svn path=/branches/KDE4/; revision=2334 --- src/docclipbase.cpp | 16 ++++----- src/kdenlivedoc.cpp | 4 +-- src/monitor.cpp | 3 ++ src/projectlist.cpp | 2 +- src/renderer.cpp | 79 +++++++++++++++++++++++++++++++++++++++++---- src/renderer.h | 1 + 6 files changed, 86 insertions(+), 19 deletions(-) diff --git a/src/docclipbase.cpp b/src/docclipbase.cpp index 0cdc17a7..0dc9b1a8 100644 --- a/src/docclipbase.cpp +++ b/src/docclipbase.cpp @@ -398,10 +398,10 @@ void DocClipBase::slotRefreshProducer() { char *tmp = (char *) qstrdup(resource.toUtf8().data()); filter->set("luma.resource", tmp); delete[] tmp; - if (getProperty("softness") != QString()) { - int soft = getProperty("softness").toInt(); - filter->set("luma.softness", (double) soft / 100.0); - } + if (getProperty("softness") != QString()) { + int soft = getProperty("softness").toInt(); + filter->set("luma.softness", (double) soft / 100.0); + } } else { // filter does not exist, create it... Mlt::Filter *filter = new Mlt::Filter(*(m_clipProducer->profile()), "luma"); @@ -411,10 +411,10 @@ void DocClipBase::slotRefreshProducer() { char *tmp = (char *) qstrdup(resource.toUtf8().data()); filter->set("luma.resource", tmp); delete[] tmp; - if (getProperty("softness") != QString()) { - int soft = getProperty("softness").toInt(); - filter->set("luma.softness", (double) soft / 100.0); - } + if (getProperty("softness") != QString()) { + int soft = getProperty("softness").toInt(); + filter->set("luma.softness", (double) soft / 100.0); + } clipService.attach(*filter); } } else { diff --git a/src/kdenlivedoc.cpp b/src/kdenlivedoc.cpp index c0fd48c3..e08946c7 100644 --- a/src/kdenlivedoc.cpp +++ b/src/kdenlivedoc.cpp @@ -161,9 +161,7 @@ KdenliveDoc::KdenliveDoc(const KUrl &url, const KUrl &projectFolder, MltVideoPro for (uint i = 2; i < total ; i++) { QDomElement transition = m_document.createElement("transition"); - transition.setAttribute("in", "0"); - //TODO: Make audio mix last for all project duration - transition.setAttribute("out", "15000"); + transition.setAttribute("always_active", "1"); QDomElement property = m_document.createElement("property"); property.setAttribute("name", "a_track"); diff --git a/src/monitor.cpp b/src/monitor.cpp index 03cc00db..a87e389d 100644 --- a/src/monitor.cpp +++ b/src/monitor.cpp @@ -104,6 +104,9 @@ Monitor::Monitor(QString name, MonitorManager *manager, QWidget *parent) if (name != "clip") { connect(render, SIGNAL(rendererPosition(int)), this, SIGNAL(renderPosition(int))); connect(render, SIGNAL(durationChanged(int)), this, SIGNAL(durationChanged(int))); + QAction *splitView = m_contextMenu->addAction(KIcon("document-new"), i18n("Split view")); + splitView->setCheckable(true); + connect(splitView, SIGNAL(toggled(bool)), render, SLOT(slotSplitView(bool))); } else { QAction *setThumbFrame = m_contextMenu->addAction(KIcon("document-new"), i18n("Set current image as thumbnail")); connect(setThumbFrame, SIGNAL(triggered()), this, SLOT(slotSetThumbFrame())); diff --git a/src/projectlist.cpp b/src/projectlist.cpp index 8cec2bcf..d11deaf5 100644 --- a/src/projectlist.cpp +++ b/src/projectlist.cpp @@ -386,7 +386,7 @@ void ProjectList::slotAddSlideshowClip() { groupId = item->clipId(); } - m_doc->slotAddSlideshowClipFile(dia->clipName(), dia->selectedPath(), dia->imageCount(), dia->clipDuration(), dia->loop(), dia->fade(), dia->lumaDuration(), dia->lumaFile(), dia->softness(),group, groupId); + m_doc->slotAddSlideshowClipFile(dia->clipName(), dia->selectedPath(), dia->imageCount(), dia->clipDuration(), dia->loop(), dia->fade(), dia->lumaDuration(), dia->lumaFile(), dia->softness(), group, groupId); } delete dia; } diff --git a/src/renderer.cpp b/src/renderer.cpp index 324d03a3..23e08fc5 100644 --- a/src/renderer.cpp +++ b/src/renderer.cpp @@ -381,6 +381,71 @@ const double Render::dar() const { return m_mltProfile->dar(); } +void Render::slotSplitView(bool doit) { + Mlt::Service service(m_mltProducer->parent().get_service()); + Mlt::Tractor tractor(service); + Mlt::Field *field = tractor.field(); + if (doit) { + int screen = 0; + for (int i = 1; i < tractor.count() && screen < 4; i++) { + Mlt::Producer trackProducer(tractor.track(i)); + kDebug() << "// TRACK: " << i << ", HIDE: " << trackProducer.get("hide"); + if (QString(trackProducer.get("hide")).toInt() != 1) { + kDebug() << "// ADIDNG TRACK: " << i; + Mlt::Transition *transition = new Mlt::Transition(*m_mltProfile, "composite"); + transition->set("mlt_service", "composite"); + transition->set("a_track", 0); + transition->set("b_track", i); + transition->set("distort", 1); + transition->set("internal_added", "200"); + char *tmp; + switch (screen) { + case 0: + tmp = "0,0:50%x50%"; + break; + case 1: + tmp = "50%,0:50%x50%"; + break; + case 2: + tmp = "0,50%:50%x50%"; + break; + case 3: + tmp = "50%,50%:50%x50%"; + break; + } + transition->set("geometry", tmp); + transition->set("always_active", "1"); + field->plant_transition(*transition, 0, i); + //delete[] tmp; + screen++; + } + } + m_mltConsumer->set("refresh", 1); + } else { + + mlt_service serv = m_mltProducer->parent().get_service(); + + mlt_service nextservice = mlt_service_get_producer(serv); + mlt_properties properties = MLT_SERVICE_PROPERTIES(nextservice); + QString mlt_type = mlt_properties_get(properties, "mlt_type"); + QString resource = mlt_properties_get(properties, "mlt_service"); + + while (mlt_type == "transition") { + QString added = mlt_properties_get(MLT_SERVICE_PROPERTIES(nextservice), "internal_added"); + if (added == "200") { + mlt_field_disconnect_service(field->get_field(), nextservice); + } + nextservice = mlt_service_producer(nextservice); + if (nextservice == NULL) break; + properties = MLT_SERVICE_PROPERTIES(nextservice); + mlt_type = mlt_properties_get(properties, "mlt_type"); + resource = mlt_properties_get(properties, "mlt_service"); + m_mltConsumer->set("refresh", 1); + } + } + +} + void Render::getFileProperties(const QDomElement &xml, int clipId) { int height = 50; int width = (int)(height * m_mltProfile->dar()); @@ -437,10 +502,10 @@ void Render::getFileProperties(const QDomElement &xml, int clipId) { char *tmp = decodedString(xml.attribute("luma_file")); filter->set("luma.resource", tmp); delete[] tmp; - if (xml.hasAttribute("softness")) { - int soft = xml.attribute("softness").toInt(); - filter->set("luma.softness", (double) soft / 100.0); - } + if (xml.hasAttribute("softness")) { + int soft = xml.attribute("softness").toInt(); + filter->set("luma.softness", (double) soft / 100.0); + } } Mlt::Service clipService(producer->get_service()); clipService.attach(*filter); @@ -1796,9 +1861,8 @@ QMap Render::mltGetTransitionParamsFromXml(QDomElement xml) { } void Render::mltAddTransition(QString tag, int a_track, int b_track, GenTime in, GenTime out, QDomElement xml, bool do_refresh) { - QMap args = mltGetTransitionParamsFromXml(xml); - + QMap args = mltGetTransitionParamsFromXml(xml); Mlt::Service service(m_mltProducer->parent().get_service()); Mlt::Tractor tractor(service); @@ -1806,7 +1870,8 @@ void Render::mltAddTransition(QString tag, int a_track, int b_track, GenTime in, char *transId = decodedString(tag); Mlt::Transition *transition = new Mlt::Transition(*m_mltProfile, transId); - transition->set_in_and_out((int) in.frames(m_fps), (int) out.frames(m_fps)); + if (out != GenTime()) + transition->set_in_and_out((int) in.frames(m_fps), (int) out.frames(m_fps)); QMap::Iterator it; QString key; diff --git a/src/renderer.h b/src/renderer.h index 75a6daed..59d3fe58 100644 --- a/src/renderer.h +++ b/src/renderer.h @@ -253,6 +253,7 @@ public slots: // Public slots void exportFileToFirewire(QString srcFileName, int port, GenTime startTime, GenTime endTime); static char *decodedString(QString str); void mltSavePlaylist(); + void slotSplitView(bool doit); }; #endif -- 2.39.2