]> git.sesse.net Git - kdenlive/commitdiff
Duplicate video only producer for each track:
authorJean-Baptiste Mardelle <jb@kdenlive.org>
Tue, 11 Sep 2012 07:01:58 +0000 (09:01 +0200)
committerJean-Baptiste Mardelle <jb@kdenlive.org>
Tue, 11 Sep 2012 07:01:58 +0000 (09:01 +0200)
http://kdenlive.org/mantis/view.php?id=2668

src/clipitem.cpp
src/customtrackview.cpp
src/docclipbase.cpp
src/docclipbase.h
src/renderer.cpp

index e3d7804976654c04db9f28df211c20e240651fe5..16b18962a1f3107a31305615dc965f35875b3968 100644 (file)
@@ -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);
 }
index ee8a31c75f0c03b215614619738bd04e35eb6115..f67d893d6c5817e726e343e77743bbfa1b32ff65 100644 (file)
@@ -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) {
index 1095381aca7d8f0457fb49b44bb25d16107129ca..40ff96f4c261c29db57c383ef07e60fdfdb8be6c 100644 (file)
@@ -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()
index fd84c4670ea18cc055b78cbb61a35987cb9e087b..fa363746de9081425d298039932d0360973276ab 100644 (file)
@@ -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 <Mlt::Producer *> m_baseTrackProducers;
+    QList <Mlt::Producer *> m_videoTrackProducers;
     QList <Mlt::Producer *> m_audioTrackProducers;
     QList <Mlt::Producer *> 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. */
index dde112eb566ea59d2f7feb93bed1bbd29fb40aaf..b32c7f5680c9584c1c7c5720b221e12974c29be6 100644 (file)
@@ -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) {