void DocClipBase::deleteProducers(bool clearThumbCreator)
{
if (clearThumbCreator && m_thumbProd) m_thumbProd->clearProducer();
- /*kDebug()<<"// CLIP KILL PRODS ct: "<<m_baseTrackProducers.count();
- int max = m_baseTrackProducers.count();
- for (int i = 0; i < max; i++) {
- kDebug()<<"// CLIP KILL PROD "<<i;
- Mlt::Producer *p = m_baseTrackProducers.takeAt(i);
- if (p != NULL) {
- delete p;
- p = NULL;
- }
- m_baseTrackProducers.insert(i, NULL);
- }*/
delete m_videoOnlyProducer;
m_videoOnlyProducer = NULL;
}
if (updated && readPropertiesFromProducer && (m_clipType != COLOR && m_clipType != IMAGE && m_clipType != TEXT))
setDuration(GenTime(producer->get_length(), KdenliveSettings::project_fps()));
- //m_clipProducer = producer;
- //m_clipProducer->set("transparency", m_properties.value("transparency").toInt());
}
static double getPixelAspect(QMap<QString, QString>& props) {
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 && m_clipType != PLAYLIST)) {
if (m_baseTrackProducers.count() == 0) return NULL;
for (int i = 0; i < m_baseTrackProducers.count(); i++) {
// 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 *DocClipBase::cloneProducer(Mlt::Producer *source)
{
- Mlt::Producer *result;
+ Mlt::Producer *result = NULL;
if (KIO::NetAccess::exists(KUrl(source->get("resource")), KIO::NetAccess::SourceSide, 0)) {
result = new Mlt::Producer(*source->profile(), source->get("resource"));
}
- else {
+ if (result == NULL) {
// placeholder clip
QString txt = "+" + i18n("Missing clip") + ".txt";
char *tmp = qstrdup(txt.toUtf8().constData());
const int CLIPOK = 1;
const int CLIPPLACEHOLDER = 2;
const int CLIPWRONGDURATION = 3;
+const int PROXYMISSING = 4;
const int LUMAMISSING = 10;
const int LUMAOK = 11;
QDomNodeList documentProducers = m_doc.elementsByTagName("producer");
QList <QDomElement> wrongDurationClips;
QList <QDomElement> missingClips;
+ QList <QDomElement> missingProxies;
for (int i = 0; i < m_info.count(); i++) {
e = m_info.item(i).toElement();
clipType = e.attribute("type").toInt();
continue;
}
resource = e.attribute("resource");
+ if (e.hasAttribute("proxy")) {
+ QString proxyresource = e.attribute("proxy");
+ if (!KIO::NetAccess::exists(KUrl(proxyresource), KIO::NetAccess::SourceSide, 0)) {
+ // Missing clip found
+ missingProxies.append(e);
+ }
+ }
if (clipType == SLIDESHOW) resource = KUrl(resource).directory();
if (!KIO::NetAccess::exists(KUrl(resource), KIO::NetAccess::SourceSide, 0)) {
// Missing clip found
}
}
- if (missingClips.isEmpty() && missingLumas.isEmpty() && wrongDurationClips.isEmpty())
+ if (missingClips.isEmpty() && missingLumas.isEmpty() && wrongDurationClips.isEmpty() && missingProxies.isEmpty())
return false;
m_dialog = new QDialog();
else if (wrongDurationClips.count() > 0) {
m_ui.infoLabel->setText(i18n("The project file contains clips with duration mismatch"));
}
+ if (missingProxies.count() > 0) {
+ if (!m_ui.infoLabel->text().isEmpty()) m_ui.infoLabel->setText(m_ui.infoLabel->text() + ". ");
+ m_ui.infoLabel->setText(m_ui.infoLabel->text() + i18n("Missing proxies will be recreated after opening."));
+ }
+
m_ui.removeSelected->setEnabled(!missingClips.isEmpty());
m_ui.recursiveSearch->setEnabled(!missingClips.isEmpty());
m_ui.usePlaceholders->setEnabled(!missingClips.isEmpty());
item->setData(0, idRole, e.attribute("id"));
item->setToolTip(0, i18n("Duration mismatch"));
}
+
+
+ for (int i = 0; i < missingProxies.count(); i++) {
+ e = missingProxies.at(i).toElement();
+ QString clipType;
+ int t = e.attribute("type").toInt();
+ QTreeWidgetItem *item = new QTreeWidgetItem(m_ui.treeWidget, QStringList() << i18n("Proxy clip"));
+ item->setIcon(0, KIcon("dialog-close"));
+ item->setText(1, e.attribute("proxy"));
+ item->setData(0, hashRole, e.attribute("file_hash"));
+ item->setData(0, statusRole, PROXYMISSING);
+ item->setData(0, typeRole, t);
+ item->setData(0, idRole, e.attribute("id"));
+ item->setToolTip(0, i18n("Missing proxy"));
+ }
connect(m_ui.recursiveSearch, SIGNAL(pressed()), this, SLOT(slotSearchClips()));
connect(m_ui.usePlaceholders, SIGNAL(pressed()), this, SLOT(slotPlaceholders()));
m_infoQueue.insert(clip->getId(), e);
}
else if (item->hasProxy() && !item->isProxyRunning()) {
- slotCreateProxy(clip->getId(), false);
+ slotCreateProxy(clip->getId());
}
clip->askForAudioThumbs();
return list;
}
-void ProjectList::slotCreateProxy(const QString id, bool createProducer)
+void ProjectList::slotCreateProxy(const QString id)
{
ProjectItem *item = getItemById(id);
- if (!item || item->isProxyRunning()) return;
-
- // If proxy producer already exists, skip creation
- if (!createProducer) {
- setProxyStatus(id, PROXYDONE);
- return;
- }
+ if (!item || item->isProxyRunning() || item->referencedClip()->isPlaceHolder()) return;
setProxyStatus(id, PROXYWAITING);
if (m_abortProxyId.contains(id)) m_abortProxyId.removeAll(id);
- emit projectModified();
QtConcurrent::run(this, &ProjectList::slotGenerateProxy, id);
}
return;
}
else {
+ emit projectModified();
// Make sure proxy path is writable
QFile file(path);
if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) {
/** @brief Enable / disable proxy for current clip. */
void slotProxyCurrentItem(bool doProxy);
/** @brief Put clip in the proxy waiting list. */
- void slotCreateProxy(const QString id, bool createProducer = true);
+ void slotCreateProxy(const QString id);
/** @brief Stop creation of this clip's proxy. */
void slotAbortProxy(const QString id);
/** @brief Start creation of proxy clip. */