m_audioTimer->stop();
delete m_audioTimer;
}
+ qDeleteAll(m_toDeleteProducers);
+ m_toDeleteProducers.clear();
qDeleteAll(m_baseTrackProducers);
m_baseTrackProducers.clear();
qDeleteAll(m_audioTrackProducers);
return m_id;
}
-void DocClipBase::setId(const QString &newId)
-{
- m_id = newId;
-}
-
const CLIPTYPE & DocClipBase::clipType() const
{
return m_clipType;
void DocClipBase::deleteProducers()
{
- m_thumbProd->clearProducer();
+ if (m_thumbProd) m_thumbProd->clearProducer();
if (numReferences() > 0) {
// Clip is used in timeline, delay producers deletion
void DocClipBase::cleanupProducers()
{
+ /*
+ int ct = 0;
+ kDebug()<<"----------------------------------------------------------------------------------";
+ for (int i = 0; i < m_toDeleteProducers.count(); i++) {
+ if (m_toDeleteProducers.at(i) != NULL) {
+ Mlt::Properties props(m_toDeleteProducers.at(i)->get_properties());
+ if (props.ref_count() > 2) {
+ kDebug()<<"PRODUCER: "<<i<<", COUNTS: "<<props.ref_count();
+ //exit(1);
+ }
+ ct++;
+ }
+ }*/
+
qDeleteAll(m_toDeleteProducers);
m_toDeleteProducers.clear();
m_replaceMutex.unlock();
m_audioTrackProducers[pos] = producer;
updated = true;
}
+ else delete producer;
return;
} else if (id.endsWith("video")) {
if (m_videoOnlyProducer == NULL) {
m_videoOnlyProducer = producer;
updated = true;
}
+ else delete producer;
return;
}
int pos = id.toInt();
m_baseTrackProducers[pos] = producer;
updated = true;
}
+ else delete producer;
} else {
if (m_baseTrackProducers.isEmpty()) {
m_baseTrackProducers.append(producer);
m_baseTrackProducers[0] = producer;
updated = true;
}
+ else delete producer;
}
if (updated && readPropertiesFromProducer && (m_clipType != COLOR && m_clipType != IMAGE && m_clipType != TEXT))
setDuration(GenTime(producer->get_length(), KdenliveSettings::project_fps()));
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);
// 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);
}
}
-void DocClipBase::slotExtractImage(int frame, int frame2)
+void DocClipBase::slotExtractImage(QList <int> frames)
{
if (m_thumbProd == NULL) return;
- m_thumbProd->extractImage(frame, frame2);
+ m_thumbProd->extractImage(frames);
}
QPixmap DocClipBase::extractImage(int frame, int width, int height)