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);
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) {
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) {
m_refcount(0),
m_baseTrackProducers(),
m_audioTrackProducers(),
- m_videoOnlyProducer(NULL),
+ m_videoTrackProducers(),
m_snapMarkers(QList < CommentedTime >()),
m_duration(),
m_thumbProd(NULL),
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)
{
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();
}
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;
}
-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()
/** 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);
* 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. */