ProjectItem *item = getItemById(id);
if (item) {
slotUpdateClipProperties(item, properties);
- if (properties.contains("out") || properties.contains("force_fps") || properties.contains("resource") || properties.contains("video_index") || properties.contains("audio_index") || properties.contains("full_luma")) {
+ if (properties.contains("out") || properties.contains("force_fps") || properties.contains("resource") || properties.contains("video_index") || properties.contains("audio_index") || properties.contains("full_luma") || properties.contains("force_progressive") || properties.contains("force_tff") || properties.contains("force_colorspace")) {
slotReloadClip(id);
} else if (properties.contains("colour") ||
properties.contains("xmldata") ||
properties.contains("templatetext")) {
slotRefreshClipThumbnail(item);
emit refreshClip(id, true);
- } else if (properties.contains("force_colorspace") || properties.contains("loop")) {
+ } else if (properties.contains("loop")) {
emit refreshClip(id, false);
}
}
if (item->type() == PROJECTFOLDERTYPE) {
if (column == 0) {
FolderProjectItem *folder = static_cast <FolderProjectItem*>(item);
+ if (item->text(0) == folder->groupName()) return;
editFolder(item->text(0), folder->groupName(), folder->clipId());
folder->setGroupName(item->text(0));
m_doc->clipManager()->addFolder(folder->clipId(), item->text(0));
}
}
+void ProjectList::extractMetadata(DocClipBase *clip)
+{
+ QMap <QString, QString> props = clip->properties();
+ if (KdenliveSettings::use_exiftool() && !props.contains("exiftool")) {
+ QString codecid = props.value("videocodecid").simplified();
+ if (codecid == "h264") {
+ QProcess p;
+ QStringList args;
+ args << "-g" << "-args" << clip->fileURL().encodedPathAndQuery();
+ p.start("exiftool", args);
+ p.waitForFinished();
+ QString res = p.readAllStandardOutput();
+ QStringList list = res.split("\n");
+ QMap <QString, QString> meta;
+ foreach(QString tagline, list) {
+ if (!tagline.startsWith("-H264")) continue;
+ QString tag = tagline.section(':', 1);
+ if (tag.startsWith("ImageWidth") || tag.startsWith("ImageHeight")) continue;
+ meta.insert(tag.section('=', 0, 0), tag.section('=', 1));
+ }
+ clip->setProperty("exiftool", "1");
+ if (!meta.isEmpty()) {
+ clip->setMetadata(meta, "ExifTool");
+ //checkCamcorderFilters(clip, meta);
+ }
+ }
+ }
+ if (KdenliveSettings::use_magicLantern() && !props.contains("magiclantern")) {
+ QMap <QString, QString> meta;
+ QString url = clip->fileURL().path();
+ url = url.section('.', 0, -2) + ".LOG";
+ if (QFile::exists(url)) {
+ QFile file(url);
+ if (file.open(QIODevice::ReadOnly | QIODevice::Text)) {
+ while (!file.atEnd()) {
+ QString line = file.readLine().simplified();
+ if (line.startsWith('#') || line.isEmpty() || !line.contains(':')) continue;
+ if (line.startsWith("CSV data")) break;
+ meta.insert(line.section(':', 0, 0).simplified(), line.section(':', 1).simplified());
+ }
+ }
+ }
+ url = url.section('.', 0, -2) + ".THM";
+ if (QFile::exists(url) && KdenliveSettings::use_exiftool()) {
+ // Read the exif metadata embeded in the THM file
+ QProcess p;
+ QStringList args;
+ args << "-g" << "-args" << url;
+ p.start("exiftool", args);
+ p.waitForFinished();
+ QString res = p.readAllStandardOutput();
+ QStringList list = res.split("\n");
+ foreach(QString tagline, list) {
+ if (tagline.startsWith("-File") || tagline.startsWith("-ExifTool")) continue;
+ QString tag = tagline.section(':', 1).simplified();
+ if (tag.startsWith("ImageWidth") || tag.startsWith("ImageHeight")) continue;
+ if (!tag.section('=', 0, 0).isEmpty() && !tag.section('=', 1).simplified().isEmpty())
+ meta.insert(tag.section('=', 0, 0), tag.section('=', 1).simplified());
+ }
+ }
+
+ if (!meta.isEmpty())
+ clip->setMetadata(meta, "Magic Lantern");
+ clip->setProperty("magiclantern", "1");
+ }
+}
+
void ProjectList::slotReplyGetFileProperties(const QString &clipId, Mlt::Producer *producer, const stringMap &properties, const stringMap &metadata, bool replace)
{
+ QMutexLocker lock(&m_processMutex);
QString toReload;
ProjectItem *item = getItemById(clipId);
if (item && producer) {
}
item->setProperties(properties, metadata);
clip->setProducer(producer, replace);
+ extractMetadata(clip);
m_render->processingDone(clipId);
// Proxy stuff
m_listView->scrollToItem(sub);
m_listView->editItem(sub, 1);
}
- m_doc->clipManager()->requestThumbs(QString('#' + id), QList <int>() << in);
+ m_doc->clipManager()->slotRequestThumbs(QString('#' + id), QList <int>() << in);
monitorItemEditing(true);
}
emit projectModified();
}
+/*
+// Work in progress: apply filter based on clip's camcorder
+void ProjectList::checkCamcorderFilters(DocClipBase *clip, QMap <QString, QString> meta)
+{
+ KConfig conf("camcorderfilters.rc", KConfig::CascadeConfig, "appdata");
+ QStringList groups = conf.groupList();
+ foreach(QString grp, groups) {
+ if (!meta.contains(grp)) continue;
+ KConfigGroup group(&conf, grp);
+ QString value = group.readEntry(meta.value(grp));
+ if (value.isEmpty()) continue;
+ clip->setProperty(value.section(' ', 0, 0), value.section(' ', 1));
+ break;
+ }
+}*/
+
#include "projectlist.moc"