void DocClipBase::setProducer(Mlt::Producer *producer, bool reset, bool readPropertiesFromProducer)
{
- if (producer == NULL || (m_placeHolder && !reset)) return;
+ if (m_placeHolder && producer) {
+ char *tmp = qstrdup(i18n("Missing clip").toUtf8().constData());
+ producer->set("markup", tmp);
+ producer->set("bgcolour", "0xff0000ff");
+ producer->set("pad", "10");
+ delete[] tmp;
+ }
+ if (producer == NULL /*|| (m_placeHolder && !reset)*/) return;
if (m_thumbProd && (reset || !m_thumbProd->hasProducer())) m_thumbProd->setProducer(producer);
if (reset) {
// Clear all previous producers
}
Mlt::Producer *base = producer();
- m_audioTrackProducers[track] = new Mlt::Producer(*(base->profile()), base->get("resource"));
+ m_audioTrackProducers[track] = cloneProducer(base);
adjustProducerProperties(m_audioTrackProducers.at(track), QString(getId() + '_' + QString::number(track) + "_audio"), false, true);
}
return m_audioTrackProducers.at(track);
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"));
+ m_videoOnlyProducer = cloneProducer(m_baseTrackProducers.at(i));
adjustProducerProperties(m_videoOnlyProducer, QString(getId() + "_video"), true, false);
}
return m_videoOnlyProducer;
// Could not find a valid producer for that clip, check in
return NULL;
}
-
- if (KIO::NetAccess::exists(KUrl(m_baseTrackProducers.at(i)->get("resource")), KIO::NetAccess::SourceSide, 0))
- m_baseTrackProducers[track] = new Mlt::Producer(*m_baseTrackProducers.at(i)->profile(), m_baseTrackProducers.at(i)->get("resource"));
- else { // special case for placeholder clips
- m_baseTrackProducers[track] = NULL;
- return NULL;
- }
+
+ m_baseTrackProducers[track] = cloneProducer(m_baseTrackProducers.at(i));
adjustProducerProperties(m_baseTrackProducers.at(track), QString(getId() + '_' + QString::number(track)), false, false);
}
return m_baseTrackProducers.at(track);
}
+
+Mlt::Producer *DocClipBase::cloneProducer(Mlt::Producer *source)
+{
+ Mlt::Producer *result;
+ if (KIO::NetAccess::exists(KUrl(source->get("resource")), KIO::NetAccess::SourceSide, 0)) {
+ result = new Mlt::Producer(*source->profile(), source->get("resource"));
+ }
+ else {
+ // placeholder clip
+ QString txt = "+" + i18n("Missing clip") + ".txt";
+ char *tmp = qstrdup(txt.toUtf8().constData());
+ result = new Mlt::Producer(*source->profile(), tmp);
+ delete[] tmp;
+ if (result == NULL)
+ result = new Mlt::Producer(*source->profile(), "colour:red");
+ else {
+ result->set("bgcolour", "0xff0000ff");
+ result->set("pad", "10");
+ }
+ }
+ Mlt::Properties props(result->get_properties());
+ Mlt::Properties src_props(source->get_properties());
+ props.inherit(src_props);
+ return result;
+}
+
void DocClipBase::setProducerProperty(const char *name, int data)
{
for (int i = 0; i < m_baseTrackProducers.count(); i++) {
void getFileHash(const QString url);
/** @brief When duplicating a producer, make sure all manually set properties are passed to it. */
void adjustProducerProperties(Mlt::Producer *prod, const QString &id, bool mute, bool blind);
+ /** @brief Create another instance of a producer. */
+ Mlt::Producer *cloneProducer(Mlt::Producer *source);
public slots:
void updateAudioThumbnail(QMap<int, QMap<int, QByteArray> > data);
item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsDropEnabled);
int height = m_listView->iconSize().height();
int width = (int)(height * m_render->dar());
- QPixmap pixmap = QPixmap(width, height);
- pixmap.fill(Qt::transparent);
+ QPixmap pixmap = qVariantValue<QPixmap>(item->data(0, Qt::DecorationRole));
+ if (pixmap.isNull()) {
+ pixmap = QPixmap(width, height);
+ pixmap.fill(Qt::transparent);
+ }
KIcon icon("dialog-close");
QPainter p(&pixmap);
p.drawPixmap(3, 3, icon.pixmap(width - 6, height - 6));
item->setData(0, Qt::DecorationRole, pixmap);
if (item->referencedClip()) {
item->referencedClip()->setPlaceHolder(true);
- if (m_render == NULL) kDebug() << "********* ERROR, NULL RENDR";
- item->referencedClip()->setProducer(m_render->invalidProducer(id), true);
+ if (m_render == NULL) {
+ kDebug() << "********* ERROR, NULL RENDR";
+ return;
+ }
+ Mlt::Producer *newProd = m_render->invalidProducer(id);
+ if (item->referencedClip()->producer()) {
+ Mlt::Properties props(newProd->get_properties());
+ Mlt::Properties src_props(item->referencedClip()->producer()->get_properties());
+ props.inherit(src_props);
+ }
+ item->referencedClip()->setProducer(newProd, true);
item->slotSetToolTip();
emit clipNeedsReload(id, true);
}
if (item->data(0, Qt::DecorationRole).isNull()) {
item->setData(0, Qt::DecorationRole, missingPixmap);
}
+ else {
+ QPixmap pixmap = qVariantValue<QPixmap>(item->data(0, Qt::DecorationRole));
+ QPainter p(&pixmap);
+ p.drawPixmap(3, 3, KIcon("dialog-close").pixmap(pixmap.width() - 6, pixmap.height() - 6));
+ p.end();
+ item->setData(0, Qt::DecorationRole, pixmap);
+ }
}
} else {
if (displayRatioChanged || item->data(0, Qt::DecorationRole).isNull())
if (item->data(0, DurationRole).toString().isEmpty()) {
item->changeDuration(item->referencedClip()->producer()->get_playtime());
}
+ if (clip->isPlaceHolder()) {
+ QPixmap pixmap = qVariantValue<QPixmap>(item->data(0, Qt::DecorationRole));
+ if (pixmap.isNull()) {
+ pixmap = QPixmap(width, height);
+ pixmap.fill(Qt::transparent);
+ }
+ QPainter p(&pixmap);
+ p.drawPixmap(3, 3, KIcon("dialog-close").pixmap(pixmap.width() - 6, pixmap.height() - 6));
+ p.end();
+ item->setData(0, Qt::DecorationRole, pixmap);
+ }
}
item->setData(0, UsageRole, QString::number(item->numReferences()));
}
Mlt::Producer *Render::invalidProducer(const QString &id)
{
- Mlt::Producer *clip = new Mlt::Producer(*m_mltProfile, "colour", "red");
+ Mlt::Producer *clip;
+ QString txt = "+" + i18n("Missing clip") + ".txt";
+ char *tmp = qstrdup(txt.toUtf8().constData());
+ clip = new Mlt::Producer(*m_mltProfile, tmp);
+ delete[] tmp;
+ if (clip == NULL) clip = new Mlt::Producer(*m_mltProfile, "colour", "red");
+ else {
+ clip->set("bgcolour", "0xff0000ff");
+ clip->set("pad", "10");
+ }
clip->set("id", id.toUtf8().constData());
clip->set("mlt_type", "producer");
return clip;