From ffeb5522f4502243a85b57f1d658ecaa085eee68 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Mardelle Date: Tue, 11 Sep 2012 09:01:58 +0200 Subject: [PATCH] Duplicate video only producer for each track: http://kdenlive.org/mantis/view.php?id=2668 --- src/clipitem.cpp | 2 +- src/customtrackview.cpp | 6 ++--- src/docclipbase.cpp | 57 +++++++++++++++++++++++++++++------------ src/docclipbase.h | 4 +-- src/renderer.cpp | 2 +- 5 files changed, 47 insertions(+), 24 deletions(-) diff --git a/src/clipitem.cpp b/src/clipitem.cpp index e3d78049..16b18962 100644 --- a/src/clipitem.cpp +++ b/src/clipitem.cpp @@ -1879,7 +1879,7 @@ Mlt::Producer *ClipItem::getProducer(int track, bool trackSpecific) if (isAudioOnly()) return m_clip->audioProducer(track); else if (isVideoOnly()) - return m_clip->videoProducer(); + return m_clip->videoProducer(track); else return m_clip->getProducer(trackSpecific ? track : -1); } diff --git a/src/customtrackview.cpp b/src/customtrackview.cpp index ee8a31c7..f67d893d 100644 --- a/src/customtrackview.cpp +++ b/src/customtrackview.cpp @@ -4354,7 +4354,7 @@ void CustomTrackView::slotUpdateClip(const QString &clipId, bool reload) ItemInfo info = clip->info(); Mlt::Producer *prod = NULL; if (clip->isAudioOnly()) prod = baseClip->audioProducer(info.track); - else if (clip->isVideoOnly()) prod = baseClip->videoProducer(); + else if (clip->isVideoOnly()) prod = baseClip->videoProducer(info.track); else prod = baseClip->getProducer(info.track); if (reload && !m_document->renderer()->mltUpdateClip(tractor, info, clip->xml(), prod)) { emit displayMessage(i18n("Cannot update clip (time: %1, track: %2)", info.startPos.frames(m_document->fps()), info.track), ErrorMessage); @@ -6386,7 +6386,7 @@ void CustomTrackView::doSplitAudio(const GenTime &pos, int track, EffectsList ef if (audioClip) { Mlt::Tractor *tractor = m_document->renderer()->lockService(); clip->setVideoOnly(true); - if (m_document->renderer()->mltUpdateClipProducer(tractor, m_document->tracksCount() - track, start, clip->baseClip()->videoProducer()) == false) { + if (m_document->renderer()->mltUpdateClipProducer(tractor, m_document->tracksCount() - track, start, clip->baseClip()->videoProducer(info.track)) == false) { emit displayMessage(i18n("Cannot update clip (time: %1, track: %2)", start, track), ErrorMessage); } if (m_document->renderer()->mltUpdateClipProducer(tractor, m_document->tracksCount() - info.track, start, clip->baseClip()->audioProducer(info.track)) == false) { @@ -6546,7 +6546,7 @@ void CustomTrackView::doChangeClipType(const GenTime &pos, int track, bool video int start = pos.frames(m_document->fps()); clip->setVideoOnly(true); clip->setAudioOnly(false); - if (m_document->renderer()->mltUpdateClipProducer(tractor, m_document->tracksCount() - track, start, clip->baseClip()->videoProducer()) == false) { + if (m_document->renderer()->mltUpdateClipProducer(tractor, m_document->tracksCount() - track, start, clip->baseClip()->videoProducer(track)) == false) { emit displayMessage(i18n("Cannot update clip (time: %1, track: %2)", start, track), ErrorMessage); } } else if (audioOnly) { diff --git a/src/docclipbase.cpp b/src/docclipbase.cpp index 1095381a..40ff96f4 100644 --- a/src/docclipbase.cpp +++ b/src/docclipbase.cpp @@ -45,7 +45,7 @@ DocClipBase::DocClipBase(ClipManager *clipManager, QDomElement xml, const QStrin m_refcount(0), m_baseTrackProducers(), m_audioTrackProducers(), - m_videoOnlyProducer(NULL), + m_videoTrackProducers(), m_snapMarkers(QList < CommentedTime >()), m_duration(), m_thumbProd(NULL), @@ -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) @@ -405,24 +405,26 @@ void DocClipBase::deleteProducers() { if (m_thumbProd) m_thumbProd->clearProducer(); - if (numReferences() > 0 && (!m_baseTrackProducers.isEmpty() || m_videoOnlyProducer || !m_audioTrackProducers.isEmpty())) { + 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,14 @@ 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 = 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 +606,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() diff --git a/src/docclipbase.h b/src/docclipbase.h index fd84c467..fa363746 100644 --- a/src/docclipbase.h +++ b/src/docclipbase.h @@ -123,7 +123,7 @@ Q_OBJECT public: /** Get a copy of the producer, for use in the clip monitor */ Mlt::Producer *getCloneProducer(); /** Retrieve the producer that shows only video */ - Mlt::Producer *videoProducer(); + Mlt::Producer *videoProducer(int track); /** Retrieve the producer that shows only audio */ Mlt::Producer *audioProducer(int track); @@ -211,9 +211,9 @@ private: // Private attributes * that exist. */ uint m_refcount; QList m_baseTrackProducers; + QList m_videoTrackProducers; QList m_audioTrackProducers; QList m_toDeleteProducers; - Mlt::Producer *m_videoOnlyProducer; CLIPTYPE m_clipType; /** A list of snap markers; these markers are added to a clips snap-to points, and are displayed as necessary. */ diff --git a/src/renderer.cpp b/src/renderer.cpp index dde112eb..b32c7f56 100644 --- a/src/renderer.cpp +++ b/src/renderer.cpp @@ -3557,7 +3557,7 @@ bool Render::mltMoveClip(int startTrack, int endTrack, int moveStart, int moveEn // check if we are moving a slowmotion producer QString serv = clipProducer->parent().get("mlt_service"); QString currentid = clipProducer->parent().get("id"); - if (serv == "framebuffer" || currentid.endsWith("_video")) { + if (serv == "framebuffer") { clip = clipProducer; } else { if (prod == NULL) { -- 2.39.2