X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fdocclipbase.cpp;h=9e581942067f82e7311b64653ab5b4b0c5bda40e;hb=848304cd283eb5a6c13cecc57b696e91bb92f729;hp=171392ddff4db9d22cb753cc8b9338a6b4feb587;hpb=78d8a88448e1d73bed1e8dd0d495fd32788fbd3a;p=kdenlive diff --git a/src/docclipbase.cpp b/src/docclipbase.cpp index 171392dd..9e581942 100644 --- a/src/docclipbase.cpp +++ b/src/docclipbase.cpp @@ -98,6 +98,8 @@ DocClipBase::~DocClipBase() m_audioTimer->stop(); delete m_audioTimer; } + qDeleteAll(m_toDeleteProducers); + m_toDeleteProducers.clear(); qDeleteAll(m_baseTrackProducers); m_baseTrackProducers.clear(); qDeleteAll(m_audioTrackProducers); @@ -163,11 +165,6 @@ const QString &DocClipBase::getId() const return m_id; } -void DocClipBase::setId(const QString &newId) -{ - m_id = newId; -} - const CLIPTYPE & DocClipBase::clipType() const { return m_clipType; @@ -416,9 +413,15 @@ void DocClipBase::clearThumbProducer() if (m_thumbProd) m_thumbProd->clearProducer(); } +void DocClipBase::reloadThumbProducer() +{ + if (m_thumbProd && !m_thumbProd->hasProducer()) + m_thumbProd->setProducer(getProducer()); +} + void DocClipBase::deleteProducers() { - m_thumbProd->clearProducer(); + if (m_thumbProd) m_thumbProd->clearProducer(); if (numReferences() > 0) { // Clip is used in timeline, delay producers deletion @@ -624,6 +627,45 @@ Mlt::Producer *DocClipBase::videoProducer() return m_videoOnlyProducer; } +Mlt::Producer *DocClipBase::getCloneProducer() +{ + Mlt::Producer *source = NULL; + Mlt::Producer *prod = NULL; + if (m_clipType != AUDIO && m_clipType != AV && m_clipType != PLAYLIST) { + source = getProducer(); + if (!source) return NULL; + } + if (m_clipType == COLOR) { + prod = new Mlt::Producer(*(source->profile()), 0, QString("colour:" + QString(source->get("resource"))).toUtf8().constData()); + } else if (m_clipType == TEXT) { + prod = new Mlt::Producer(*(source->profile()), 0, QString("kdenlivetitle:" + QString(source->get("resource"))).toUtf8().constData()); + if (prod && prod->is_valid() && m_properties.contains("xmldata")) + prod->set("xmldata", m_properties.value("xmldata").toUtf8().constData()); + } + if (!prod) { + if (!source) { + QMutexLocker locker(&m_producerMutex); + for (int i = 0; i < m_baseTrackProducers.count(); i++) { + if (m_baseTrackProducers.at(i) != NULL) { + source = m_baseTrackProducers.at(i); + break; + } + } + if (!source) return NULL; + } + prod = cloneProducer(source); + } + if (prod) { + adjustProducerProperties(prod, getId() + "_", false, false); + if (!m_properties.contains("proxy_out")) { + // Adjust length in case... + if (m_properties.contains("duration")) prod->set("length", m_properties.value("duration").toInt()); + if (m_properties.contains("out"))prod->set("out", m_properties.value("out").toInt()); + } + } + return prod; +} + Mlt::Producer *DocClipBase::getProducer(int track) { QMutexLocker locker(&m_producerMutex); @@ -652,8 +694,9 @@ Mlt::Producer *DocClipBase::getProducer(int track) // Could not find a valid producer for that clip, check in return NULL; } - m_baseTrackProducers[track] = cloneProducer(m_baseTrackProducers.at(i)); - adjustProducerProperties(m_baseTrackProducers.at(track), QString(getId() + '_' + QString::number(track)), false, false); + Mlt::Producer *prod = cloneProducer(m_baseTrackProducers.at(i)); + adjustProducerProperties(prod, QString(getId() + '_' + QString::number(track)), false, false); + m_baseTrackProducers[track] = prod; } return m_baseTrackProducers.at(track); } @@ -662,6 +705,7 @@ Mlt::Producer *DocClipBase::getProducer(int track) Mlt::Producer *DocClipBase::cloneProducer(Mlt::Producer *source) { Mlt::Producer *result = NULL; + QString invalidClip = source->get("markup"); QString url = QString::fromUtf8(source->get("resource")); if (KIO::NetAccess::exists(KUrl(url), KIO::NetAccess::SourceSide, 0)) { result = new Mlt::Producer(*(source->profile()), url.toUtf8().constData()); @@ -1172,10 +1216,10 @@ bool DocClipBase::hasAudioCodec(const QString &codec) const } -void DocClipBase::slotExtractImage(int frame, int frame2) +void DocClipBase::slotExtractImage(QList frames) { if (m_thumbProd == NULL) return; - m_thumbProd->extractImage(frame, frame2); + m_thumbProd->extractImage(frames); } QPixmap DocClipBase::extractImage(int frame, int width, int height)