if (props.contains("videocodec"))
new QTreeWidgetItem(m_view.clip_vproperties, QStringList() << i18n("Video codec") << props.value("videocodec"));
+ else if (props.contains("videocodecid"))
+ new QTreeWidgetItem(m_view.clip_vproperties, QStringList() << i18n("Video codec") << props.value("videocodecid"));
if (props.contains("frame_size"))
new QTreeWidgetItem(m_view.clip_vproperties, QStringList() << i18n("Frame size") << props.value("frame_size"));
if (hideTemporaryProperties && i.key().startsWith('_')) continue;
if (!i.value().isEmpty()) clip.setAttribute(i.key(), i.value());
}
+ QMapIterator<QString, QString> j(m_metadata);
+ while (j.hasNext()) {
+ j.next();
+ if (!j.value().isEmpty()) clip.setAttribute("meta.attr." + j.key(), j.value());
+ }
doc.appendChild(clip);
if (!m_cutZones.isEmpty()) {
QStringList cuts;
QDomNamedNodeMap attributes = elem.attributes();
for (int i = 0; i < attributes.count(); i++) {
QString attrname = attributes.item(i).nodeName();
- if (attrname != "resource")
+ if (attrname != "resource")
properties.insert(attrname, attributes.item(i).nodeValue());
- kDebug() << attrname << " = " << attributes.item(i).nodeValue();
+ //kDebug() << attrname << " = " << attributes.item(i).nodeValue();
}
clip->setProperties(properties);
emit addProjectClip(clip, false);
for (QDomNode m = orig.firstChild(); !m.isNull(); m = m.nextSibling()) {
QString name = m.toElement().attribute("name");
if (name.startsWith("meta.attr"))
- meta.insert(name.section('.', 2, 3), m.firstChild().nodeValue());
+ meta.insert(name.section('.', 2, -1), m.firstChild().nodeValue());
}
if (!meta.isEmpty()) {
if (clip == NULL)
<label>Ignore libav / ffmpeg codec checking.</label>
<default>false</default>
</entry>
+
+ <entry name="use_exiftool" type="Bool">
+ <label>Get h264 metadata using exiftool.</label>
+ <default>false</default>
+ </entry>
<entry name="title_duration" type="String">
<label>Default title clip duration.</label>
m_configMisc.kcfg_activatetabs->setVisible(false);
// Hide avformat-novalidate trick, causes crash (bug #2205 and #2206)
m_configMisc.kcfg_projectloading_avformatnovalidate->setVisible(false);
+
+ m_configMisc.kcfg_use_exiftool->setEnabled(!KStandardDirs::findExe("exiftool").isEmpty());
QWidget *p8 = new QWidget;
m_configProject.setupUi(p8);
}
}
+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);
+ }
+ }
+}
+
void ProjectList::slotReplyGetFileProperties(const QString &clipId, Mlt::Producer *producer, const stringMap &properties, const stringMap &metadata, bool replace)
{
}
item->setProperties(properties, metadata);
clip->setProducer(producer, replace);
+ if (KdenliveSettings::use_exiftool()) extractMetadata(clip);
m_render->processingDone(clipId);
// Proxy stuff
/** @brief Create rounded shape pixmap for project tree thumb. */
QPixmap roundedPixmap(QImage img);
QPixmap roundedPixmap(QPixmap source);
+ void extractMetadata(DocClipBase *clip);
private slots:
void slotClipSelected();
snprintf(property, sizeof(property), "meta.media.%d.codec.long_name", vindex);
if (producer->get(property)) {
filePropertyMap["videocodec"] = producer->get(property);
- } else {
- snprintf(property, sizeof(property), "meta.media.%d.codec.name", vindex);
- if (producer->get(property))
- filePropertyMap["videocodec"] = producer->get(property);
+ }
+ snprintf(property, sizeof(property), "meta.media.%d.codec.name", vindex);
+ if (producer->get(property)) {
+ filePropertyMap["videocodecid"] = producer->get(property);
}
QString query;
query = QString("meta.media.%1.codec.pix_fmt").arg(vindex);
<rect>
<x>0</x>
<y>0</y>
- <width>380</width>
- <height>395</height>
+ <width>411</width>
+ <height>423</height>
</rect>
</property>
<layout class="QGridLayout" name="gridLayout_4">
<property name="topMargin">
<number>0</number>
</property>
- <item row="5" column="0">
- <widget class="QCheckBox" name="kcfg_on_monitor_effects">
- <property name="text">
- <string>Use on-monitor effects</string>
- </property>
- </widget>
- </item>
- <item row="7" column="0">
- <widget class="QCheckBox" name="kcfg_disable_effect_parameters">
- <property name="text">
- <string>Disable parameters when the effect is disabled</string>
- </property>
- </widget>
- </item>
- <item row="1" column="0" colspan="2">
- <widget class="QCheckBox" name="kcfg_checkfirstprojectclip">
- <property name="text">
- <string>Check if first added clip matches project profile</string>
- </property>
- </widget>
- </item>
- <item row="0" column="0" colspan="3">
- <widget class="QCheckBox" name="kcfg_openlastproject">
- <property name="text">
- <string>Open last project on startup</string>
- </property>
- </widget>
- </item>
- <item row="8" column="0">
- <widget class="QCheckBox" name="kcfg_automultistreams">
- <property name="text">
- <string>Automatically import all streams in multi stream clips</string>
- </property>
- </widget>
- </item>
- <item row="11" column="0">
- <widget class="QCheckBox" name="kcfg_autoimagesequence">
- <property name="text">
- <string>Automatically import image sequences</string>
- </property>
- </widget>
- </item>
- <item row="12" column="0">
- <widget class="QCheckBox" name="kcfg_autoimagetransparency">
- <property name="text">
- <string>Transparent background for imported images</string>
- </property>
- </widget>
- </item>
- <item row="13" column="0" colspan="3">
- <spacer>
- <property name="orientation">
- <enum>Qt::Vertical</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>20</width>
- <height>40</height>
- </size>
- </property>
- </spacer>
- </item>
- <item row="4" column="0" colspan="2">
- <widget class="QCheckBox" name="kcfg_usekuiserver">
- <property name="text">
- <string>Use KDE job tracking for render jobs</string>
- </property>
- </widget>
- </item>
- <item row="10" column="0" colspan="3">
+ <item row="11" column="0" colspan="3">
<widget class="QGroupBox" name="groupBox">
<property name="title">
<string>Default Durations</string>
</layout>
</widget>
</item>
- <item row="6" column="0">
- <widget class="QCheckBox" name="kcfg_projectloading_avformatnovalidate">
+ <item row="9" column="0">
+ <widget class="QCheckBox" name="kcfg_bypasscodeccheck">
<property name="text">
- <string>Do not validate the video files when loading a project (faster)</string>
+ <string>Bypass codec verification</string>
</property>
</widget>
</item>
- <item row="3" column="0" colspan="3">
- <widget class="QCheckBox" name="kcfg_activatetabs">
+ <item row="5" column="0">
+ <widget class="QCheckBox" name="kcfg_on_monitor_effects">
<property name="text">
- <string>Open projects in new tabs</string>
+ <string>Use on-monitor effects</string>
</property>
</widget>
</item>
</property>
</widget>
</item>
- <item row="9" column="0">
- <widget class="QCheckBox" name="kcfg_bypasscodeccheck">
+ <item row="1" column="0" colspan="2">
+ <widget class="QCheckBox" name="kcfg_checkfirstprojectclip">
<property name="text">
- <string>Bypass codec verification</string>
+ <string>Check if first added clip matches project profile</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="0" colspan="3">
+ <widget class="QCheckBox" name="kcfg_openlastproject">
+ <property name="text">
+ <string>Open last project on startup</string>
+ </property>
+ </widget>
+ </item>
+ <item row="12" column="0">
+ <widget class="QCheckBox" name="kcfg_autoimagesequence">
+ <property name="text">
+ <string>Automatically import image sequences</string>
+ </property>
+ </widget>
+ </item>
+ <item row="13" column="0">
+ <widget class="QCheckBox" name="kcfg_autoimagetransparency">
+ <property name="text">
+ <string>Transparent background for imported images</string>
+ </property>
+ </widget>
+ </item>
+ <item row="14" column="0" colspan="3">
+ <spacer>
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="4" column="0" colspan="2">
+ <widget class="QCheckBox" name="kcfg_usekuiserver">
+ <property name="text">
+ <string>Use KDE job tracking for render jobs</string>
+ </property>
+ </widget>
+ </item>
+ <item row="8" column="0">
+ <widget class="QCheckBox" name="kcfg_automultistreams">
+ <property name="text">
+ <string>Automatically import all streams in multi stream clips</string>
+ </property>
+ </widget>
+ </item>
+ <item row="7" column="0">
+ <widget class="QCheckBox" name="kcfg_disable_effect_parameters">
+ <property name="text">
+ <string>Disable parameters when the effect is disabled</string>
+ </property>
+ </widget>
+ </item>
+ <item row="6" column="0">
+ <widget class="QCheckBox" name="kcfg_projectloading_avformatnovalidate">
+ <property name="text">
+ <string>Do not validate the video files when loading a project (faster)</string>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="0" colspan="3">
+ <widget class="QCheckBox" name="kcfg_activatetabs">
+ <property name="text">
+ <string>Open projects in new tabs</string>
+ </property>
+ </widget>
+ </item>
+ <item row="10" column="0">
+ <widget class="QCheckBox" name="kcfg_use_exiftool">
+ <property name="text">
+ <string>Get clip metadata with exiftool</string>
</property>
</widget>
</item>