X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fdocclipbase.cpp;h=9b55d6b16ab75209a302b3bd320909807d055fb9;hb=67c082885c7a6b6cd428ba8568bf5ee8b2b357a2;hp=f54eaff7d0d6f8d05e846be388d8650177776418;hpb=a1f0a54b93ab364a37fd8242c1881c61d066ada7;p=kdenlive diff --git a/src/docclipbase.cpp b/src/docclipbase.cpp index f54eaff7..9b55d6b1 100644 --- a/src/docclipbase.cpp +++ b/src/docclipbase.cpp @@ -44,8 +44,8 @@ DocClipBase::DocClipBase(ClipManager *clipManager, QDomElement xml, const QStrin m_audioFrameCache(), m_refcount(0), m_baseTrackProducers(), + m_videoTrackProducers(), m_audioTrackProducers(), - m_videoOnlyProducer(NULL), m_snapMarkers(QList < CommentedTime >()), m_duration(), m_thumbProd(NULL), @@ -66,7 +66,7 @@ DocClipBase::DocClipBase(ClipManager *clipManager, QDomElement xml, const QStrin } if (xml.hasAttribute("cutzones")) { - QStringList cuts = xml.attribute("cutzones").split(";", QString::SkipEmptyParts); + QStringList cuts = xml.attribute("cutzones").split(';', QString::SkipEmptyParts); for (int i = 0; i < cuts.count(); i++) { QString z = cuts.at(i); addCutZone(z.section('-', 0, 0).toInt(), z.section('-', 1, 1).toInt(), z.section('-', 2, 2)); @@ -106,8 +106,8 @@ DocClipBase::~DocClipBase() m_baseTrackProducers.clear(); qDeleteAll(m_audioTrackProducers); m_audioTrackProducers.clear(); - delete m_videoOnlyProducer; - m_videoOnlyProducer = NULL; + qDeleteAll(m_videoTrackProducers); + m_videoTrackProducers.clear(); } void DocClipBase::setZone(QPoint zone) @@ -243,7 +243,7 @@ QDomElement DocClipBase::toXML(bool hideTemporaryProperties) const QMapIterator i(m_properties); while (i.hasNext()) { i.next(); - if (hideTemporaryProperties && i.key().startsWith("_")) continue; + if (hideTemporaryProperties && i.key().startsWith('_')) continue; if (!i.value().isEmpty()) clip.setAttribute(i.key(), i.value()); } doc.appendChild(clip); @@ -405,24 +405,26 @@ void DocClipBase::deleteProducers() { if (m_thumbProd) m_thumbProd->clearProducer(); - if (numReferences() > 0) { + if (numReferences() > 0 && (!m_baseTrackProducers.isEmpty() || !m_videoTrackProducers.isEmpty() || !m_audioTrackProducers.isEmpty())) { // Clip is used in timeline, delay producers deletion - if (m_videoOnlyProducer) m_toDeleteProducers.append(m_videoOnlyProducer); for (int i = 0; i < m_baseTrackProducers.count(); i++) { m_toDeleteProducers.append(m_baseTrackProducers.at(i)); } + for (int i = 0; i < m_videoTrackProducers.count(); i++) { + m_toDeleteProducers.append(m_videoTrackProducers.at(i)); + } for (int i = 0; i < m_audioTrackProducers.count(); i++) { m_toDeleteProducers.append(m_audioTrackProducers.at(i)); } } else { - delete m_videoOnlyProducer; qDeleteAll(m_baseTrackProducers); + qDeleteAll(m_videoTrackProducers); qDeleteAll(m_audioTrackProducers); m_replaceMutex.unlock(); } - m_videoOnlyProducer = NULL; m_baseTrackProducers.clear(); + m_videoTrackProducers.clear(); m_audioTrackProducers.clear(); } @@ -501,8 +503,16 @@ void DocClipBase::setProducer(Mlt::Producer *producer, bool reset, bool readProp else delete producer; return; } else if (id.endsWith("video")) { - if (m_videoOnlyProducer == NULL) { - m_videoOnlyProducer = producer; + int pos = 0; + // Keep compatibility with older projects where video only producers were not track specific + if (id.contains('_')) pos = id.section('_', 0, 0).toInt(); + if (pos >= m_videoTrackProducers.count()) { + while (m_videoTrackProducers.count() - 1 < pos) { + m_videoTrackProducers.append(NULL); + } + } + if (m_videoTrackProducers.at(pos) == NULL) { + m_videoTrackProducers[pos] = producer; updated = true; } else delete producer; @@ -598,18 +608,33 @@ void DocClipBase::adjustProducerProperties(Mlt::Producer *prod, const QString &i } -Mlt::Producer *DocClipBase::videoProducer() +Mlt::Producer *DocClipBase::videoProducer(int track) { QMutexLocker locker(&m_producerMutex); - if (m_videoOnlyProducer == NULL) { + if (m_videoTrackProducers.count() <= track) { + while (m_videoTrackProducers.count() - 1 < track) { + m_videoTrackProducers.append(NULL); + } + } + if (m_videoTrackProducers.at(track) == NULL) { int i; - for (i = 0; i < m_baseTrackProducers.count(); i++) - if (m_baseTrackProducers.at(i) != NULL) break; - if (i >= m_baseTrackProducers.count()) return NULL; - m_videoOnlyProducer = cloneProducer(m_baseTrackProducers.at(i)); - adjustProducerProperties(m_videoOnlyProducer, QString(getId() + "_video"), true, false); + for (i = 0; i < m_videoTrackProducers.count(); i++) + if (m_videoTrackProducers.at(i) != NULL) break; + Mlt::Producer *base; + if (i >= m_videoTrackProducers.count()) { + // Could not find a valid producer for that clip + locker.unlock(); + base = getProducer(); + if (base == NULL) { + return NULL; + } + locker.relock(); + } + else base = m_videoTrackProducers.at(i); + m_videoTrackProducers[track] = cloneProducer(base); + adjustProducerProperties(m_videoTrackProducers.at(track), QString(getId() + '_' + QString::number(track) + "_video"), true, false); } - return m_videoOnlyProducer; + return m_videoTrackProducers.at(track); } Mlt::Producer *DocClipBase::getCloneProducer() @@ -651,6 +676,7 @@ Mlt::Producer *DocClipBase::getCloneProducer() return prod; } + Mlt::Producer *DocClipBase::getProducer(int track) { QMutexLocker locker(&m_producerMutex); @@ -691,6 +717,10 @@ Mlt::Producer *DocClipBase::cloneProducer(Mlt::Producer *source) { Mlt::Producer *result = NULL; QString url = QString::fromUtf8(source->get("resource")); + if (url == "" || url == "" || url == "") { + // Xml producer sometimes loses the correct url + url = m_properties.value("resource"); + } if (m_clipType == SLIDESHOW || KIO::NetAccess::exists(KUrl(url), KIO::NetAccess::SourceSide, 0)) { result = new Mlt::Producer(*(source->profile()), url.toUtf8().constData()); }