- for (i = 0; i < m_baseTrackProducers.count(); i++)
- if (m_baseTrackProducers.at(i) != NULL) break;
- if (i >= m_baseTrackProducers.count()) return NULL;
- m_videoOnlyProducer = new Mlt::Producer(*m_baseTrackProducers.at(i)->profile(), m_baseTrackProducers.at(i)->get("resource"));
- if (m_properties.contains("force_aspect_num") && m_properties.contains("force_aspect_den") && m_properties.contains("frame_size"))
- m_videoOnlyProducer->set("force_aspect_ratio", getPixelAspect(m_properties));
- if (m_properties.contains("force_fps")) m_videoOnlyProducer->set("force_fps", m_properties.value("force_fps").toDouble());
- if (m_properties.contains("force_progressive")) m_videoOnlyProducer->set("force_progressive", m_properties.value("force_progressive").toInt());
- if (m_properties.contains("force_tff")) m_videoOnlyProducer->set("force_tff", m_properties.value("force_tff").toInt());
- if (m_properties.contains("threads")) m_videoOnlyProducer->set("threads", m_properties.value("threads").toInt());
- m_videoOnlyProducer->set("audio_index", -1);
- if (m_properties.contains("video_index")) m_videoOnlyProducer->set("video_index", m_properties.value("video_index").toInt());
- m_videoOnlyProducer->set("id", QString(getId() + "_video").toUtf8().data());
- if (m_properties.contains("force_colorspace")) m_videoOnlyProducer->set("force_colorspace", m_properties.value("force_colorspace").toInt());
- if (m_properties.contains("full_luma")) m_videoOnlyProducer->set("set.force_full_luma", m_properties.value("full_luma").toInt());
- }
- return m_videoOnlyProducer;
-}
-
-Mlt::Producer *DocClipBase::producer(int track)
-{
- /*for (int i = 0; i < m_baseTrackProducers.count(); i++) {
- if (m_baseTrackProducers.at(i)) kDebug() << "// PROD: " << i << ", ID: " << m_baseTrackProducers.at(i)->get("id");
- }*/
- if (track == -1 || (m_clipType != AUDIO && m_clipType != AV)) {
- if (m_baseTrackProducers.count() == 0) return NULL;
- for (int i = 0; i < m_baseTrackProducers.count(); i++) {
- if (m_baseTrackProducers.at(i) != NULL)
+ 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_videoTrackProducers.at(track);
+}
+
+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());
+ }
+ if (m_clipType == AUDIO) {
+ prod->set("_audioclip", 1);
+ }
+ }
+ return prod;
+}
+
+
+Mlt::Producer *DocClipBase::getProducer(int track)
+{
+ QMutexLocker locker(&m_producerMutex);
+ if (track == -1 || (m_clipType != AUDIO && m_clipType != AV && m_clipType != PLAYLIST)) {
+ if (m_baseTrackProducers.count() == 0) {
+ return NULL;
+ }
+ for (int i = 0; i < m_baseTrackProducers.count(); ++i) {
+ if (m_baseTrackProducers.at(i) != NULL) {