m_reloadAction(NULL),
m_extractAudioAction(NULL),
m_transcodeAction(NULL),
- m_stabilizeAction(NULL),
+ m_clipsActionsMenu(NULL),
m_doc(NULL),
m_refreshed(false),
m_allClipsProcessed(false),
m_menu->addMenu(stabilizeMenu);
if (stabilizeMenu->isEmpty())
stabilizeMenu->setEnabled(false);
- m_stabilizeAction=stabilizeMenu;
+ m_clipsActionsMenu = stabilizeMenu;
}
m_menu->addAction(m_reloadAction);
m_reloadAction->setEnabled(false);
m_extractAudioAction->setEnabled(false);
m_transcodeAction->setEnabled(false);
- m_stabilizeAction->setEnabled(false);
+ m_clipsActionsMenu->setEnabled(false);
} else {
if (item->type() == PROJECTSUBCLIPTYPE) {
// this is a sub item, use base clip
emit clipSelected(clip->referencedClip(), sub->zone());
m_extractAudioAction->setEnabled(false);
m_transcodeAction->setEnabled(false);
- m_stabilizeAction->setEnabled(false);
+ m_clipsActionsMenu->setEnabled(false);
m_reloadAction->setEnabled(false);
adjustProxyActions(clip);
return;
m_reloadAction->setEnabled(true);
m_extractAudioAction->setEnabled(true);
m_transcodeAction->setEnabled(true);
- m_stabilizeAction->setEnabled(true);
+ m_clipsActionsMenu->setEnabled(true);
if (clip && clip->clipType() == IMAGE && !KdenliveSettings::defaultimageapp().isEmpty()) {
m_openAction->setIcon(KIcon(KdenliveSettings::defaultimageapp()));
m_openAction->setEnabled(true);
m_reloadAction->setEnabled(false);
m_extractAudioAction->setEnabled(true);
m_transcodeAction->setEnabled(false);
- m_stabilizeAction->setEnabled(false);
+ m_clipsActionsMenu->setEnabled(false);
}
adjustProxyActions(clip);
}
{
if (clip == NULL || clip->type() != PROJECTCLIPTYPE || clip->clipType() == COLOR || clip->clipType() == TEXT || clip->clipType() == SLIDESHOW) {
- m_stabilizeAction->setEnabled(false);
+ m_clipsActionsMenu->setEnabled(false);
return;
}
- m_stabilizeAction->setEnabled(true);
+ m_clipsActionsMenu->setEnabled(true);
}
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));
m_reloadAction->setEnabled(enable);
m_extractAudioAction->setEnabled(enable);
m_transcodeAction->setEnabled(enable);
- m_stabilizeAction->setEnabled(enable);
+ m_clipsActionsMenu->setEnabled(enable);
if (enable) {
ProjectItem *clip = NULL;
if (m_listView->currentItem()->type() == PROJECTSUBCLIPTYPE) {
clip = static_cast <ProjectItem*>(item->parent());
m_extractAudioAction->setEnabled(false);
m_transcodeAction->setEnabled(false);
- m_stabilizeAction->setEnabled(false);
+ m_clipsActionsMenu->setEnabled(false);
adjustProxyActions(clip);
} else if (m_listView->currentItem()->type() == PROJECTCLIPTYPE) {
clip = static_cast <ProjectItem*>(item);
} else {
m_extractAudioAction->setEnabled(false);
m_transcodeAction->setEnabled(false);
- m_stabilizeAction->setEnabled(false);
+ m_clipsActionsMenu->setEnabled(false);
}
if (clip && clip->clipType() == IMAGE && !KdenliveSettings::defaultimageapp().isEmpty()) {
m_openAction->setIcon(KIcon(KdenliveSettings::defaultimageapp()));
m_openAction->setEnabled(true);
m_reloadAction->setEnabled(true);
m_transcodeAction->setEnabled(true);
- m_stabilizeAction->setEnabled(true);
+ m_clipsActionsMenu->setEnabled(true);
return;
}
else if (item && item->type() == PROJECTFOLDERTYPE && item->childCount() > 0) {
m_openAction->setEnabled(false);
m_reloadAction->setEnabled(false);
m_transcodeAction->setEnabled(false);
- m_stabilizeAction->setEnabled(false);
+ m_clipsActionsMenu->setEnabled(false);
m_proxyAction->setEnabled(false);
}
resetThumbsProducer(clip);
m_render->getFileProperties(xml, clip->getId(), m_listView->iconSize().height(), replace);
}
+ else if (item->numReferences() > 0) {
+ // In some cases, like slowmotion clips, the producer is not loaded automatically be MLT
+ m_render->getFileProperties(xml, clip->getId(), m_listView->iconSize().height(), replace);
+ }
}
else if (clip->isPlaceHolder()) {
item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsDropEnabled);
}
}
+void ProjectList::extractMetadata(DocClipBase *clip)
+{
+ QMap <QString, QString> props = clip->properties();
+ if (props.contains("exiftool")) {
+ // metadata was already extracted
+ return;
+ }
+ 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);
+ //checkCamcorderFilters(clip, meta);
+ }
+ }
+}
+
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);
+ if (KdenliveSettings::use_exiftool()) extractMetadata(clip);
m_render->processingDone(clipId);
// Proxy stuff
} else if (KdenliveSettings::checkfirstprojectclip() && m_listView->topLevelItemCount() == 1 && m_refreshed && m_allClipsProcessed) {
// this is the first clip loaded in project, check if we want to adjust project settings to the clip
updatedProfile = adjustProjectProfileToItem(item);
+ if (updatedProfile == false) {
+ emit clipSelected(item->referencedClip());
+ }
}
if (updatedProfile == false) {
//emit clipSelected(item->referencedClip());
m_reloadAction->setEnabled(true);
m_extractAudioAction->setEnabled(true);
m_transcodeAction->setEnabled(true);
- m_stabilizeAction->setEnabled(true);
+ m_clipsActionsMenu->setEnabled(true);
if (clip->clipType() == IMAGE && !KdenliveSettings::defaultimageapp().isEmpty()) {
m_openAction->setIcon(KIcon(KdenliveSettings::defaultimageapp()));
m_openAction->setEnabled(true);
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"