- QObject(),
- lastSeekPosition(0),
- audioFrameCache(),
- m_refcount(0),
- m_baseTrackProducers(),
- m_videoTrackProducers(),
- m_audioTrackProducers(),
- m_snapMarkers(QList < CommentedTime >()),
- m_duration(),
- m_thumbProd(NULL),
- m_audioThumbCreated(false),
- m_id(id),
- m_placeHolder(xml.hasAttribute("placeholder")),
- m_properties()
+ QObject(),
+ lastSeekPosition(0),
+ audioFrameCache(),
+ m_refcount(0),
+ m_baseTrackProducers(),
+ m_videoTrackProducers(),
+ m_audioTrackProducers(),
+ m_snapMarkers(QList < CommentedTime >()),
+ m_duration(),
+ m_thumbProd(NULL),
+ m_audioThumbCreated(false),
+ m_id(id),
+ m_placeHolder(xml.hasAttribute("placeholder")),
+ m_properties()
{
int type = xml.attribute("type").toInt();
m_clipType = (CLIPTYPE) type;
if (m_placeHolder) xml.removeAttribute("placeholder");
QDomNamedNodeMap attributes = xml.attributes();
{
int type = xml.attribute("type").toInt();
m_clipType = (CLIPTYPE) type;
if (m_placeHolder) xml.removeAttribute("placeholder");
QDomNamedNodeMap attributes = xml.attributes();
QString z = cuts.at(i);
addCutZone(z.section('-', 0, 0).toInt(), z.section('-', 1, 1).toInt(), z.section('-', 2, 2));
}
}
if (xml.hasAttribute("analysisdata")) {
QString z = cuts.at(i);
addCutZone(z.section('-', 0, 0).toInt(), z.section('-', 1, 1).toInt(), z.section('-', 2, 2));
}
}
if (xml.hasAttribute("analysisdata")) {
- QStringList adata = xml.attribute("analysisdata").split('#', QString::SkipEmptyParts);
- for (int i = 0; i < adata.count(); i++)
- m_analysisdata.insert(adata.at(i).section('?', 0, 0), adata.at(i).section('?', 1, 1));
+ QStringList adata = xml.attribute("analysisdata").split('#', QString::SkipEmptyParts);
+ for (int i = 0; i < adata.count(); ++i)
+ m_analysisdata.insert(adata.at(i).section('?', 0, 0), adata.at(i).section('?', 1, 1));
+
+ QMapIterator<QString, QStringList> j(m_metadata);
+ // Metadata name can have special chars so we cannot pass it as simple attribute
+ while (j.hasNext()) {
+ j.next();
+ if (!j.value().isEmpty()) {
+ QDomElement property = doc.createElement("metaproperty");
+ property.setAttribute("name", "meta.attr." + j.key());
+ QStringList values = j.value();
+ QDomText value = doc.createTextNode(values.at(0));
+ if (values.count() > 1) property.setAttribute("tool", values.at(1));
+ property.appendChild(value);
+ clip.appendChild(property);
+ }
+ }
+const QString DocClipBase::shortInfo() const
+{
+
+ QString info;
+ if (m_clipType == AV || m_clipType == VIDEO || m_clipType == IMAGE || m_clipType == PLAYLIST) {
+ info = m_properties.value("frame_size") + " ";
+ if (m_properties.contains("fps")) {
+ info.append(i18n("%1 fps", m_properties.value("fps").left(5)));
+ }
+ if (!info.simplified().isEmpty()) info.prepend(" - ");
+ }
+ else if (m_clipType == AUDIO) {
+ info = " - " + m_properties.value("frequency") + i18n("Hz");
+ }
+ QString tip = "<b>";
+ switch (m_clipType) {
+ case AUDIO:
+ tip.append(i18n("Audio clip") + "</b>" + info + "<br />" + fileURL().path());
+ break;
+ case VIDEO:
+ tip.append(i18n("Mute video clip") + "</b>" + info + "<br />" + fileURL().path());
+ break;
+ case AV:
+ tip.append(i18n("Video clip") + "</b>" + info + "<br />" + fileURL().path());
+ break;
+ case COLOR:
+ tip.append(i18n("Color clip"));
+ break;
+ case IMAGE:
+ tip.append(i18n("Image clip") + "</b>" + info + "<br />" + fileURL().path());
+ break;
+ case TEXT:
+ if (!fileURL().isEmpty() && getProperty("xmldata").isEmpty()) tip.append(i18n("Template text clip") + "</b><br />" + fileURL().path());
+ else tip.append(i18n("Text clip") + "</b><br />" + fileURL().path());
+ break;
+ case SLIDESHOW:
+ tip.append(i18n("Slideshow clip") + "</b><br />" + fileURL().directory());
+ break;
+ case VIRTUAL:
+ tip.append(i18n("Virtual clip"));
+ break;
+ case PLAYLIST:
+ tip.append(i18n("Playlist clip") + "</b>" + info + "<br />" + fileURL().path());
+ break;
+ default:
+ tip.append(i18n("Unknown clip"));
+ break;
+ }
+ return tip;
+}
+
- if (m_properties.contains("force_aspect_num") && m_properties.contains("force_aspect_den") && m_properties.contains("frame_size"))
- prod->set("force_aspect_ratio", getPixelAspect(m_properties));
- if (m_properties.contains("force_fps")) prod->set("force_fps", m_properties.value("force_fps").toDouble());
- if (m_properties.contains("force_progressive")) prod->set("force_progressive", m_properties.value("force_progressive").toInt());
- if (m_properties.contains("force_tff")) prod->set("force_tff", m_properties.value("force_tff").toInt());
- if (m_properties.contains("threads")) prod->set("threads", m_properties.value("threads").toInt());
- if (mute) prod->set("audio_index", -1);
- else if (m_properties.contains("audio_index")) prod->set("audio_index", m_properties.value("audio_index").toInt());
- if (blind) prod->set("video_index", -1);
- else if (m_properties.contains("video_index")) prod->set("video_index", m_properties.value("video_index").toInt());
- prod->set("id", id.toUtf8().constData());
- if (m_properties.contains("force_colorspace")) prod->set("force_colorspace", m_properties.value("force_colorspace").toInt());
- if (m_properties.contains("full_luma")) prod->set("set.force_full_luma", m_properties.value("full_luma").toInt());
- if (m_properties.contains("proxy_out")) {
- // We have a proxy clip, make sure the proxy has same duration as original
- prod->set("length", m_properties.value("duration").toInt());
- prod->set("out", m_properties.value("proxy_out").toInt());
- }
+ if (m_properties.contains("force_aspect_num") && m_properties.contains("force_aspect_den") && m_properties.contains("frame_size"))
+ prod->set("force_aspect_ratio", getPixelAspect(m_properties));
+ if (m_properties.contains("force_fps")) prod->set("force_fps", m_properties.value("force_fps").toDouble());
+ if (m_properties.contains("force_progressive")) prod->set("force_progressive", m_properties.value("force_progressive").toInt());
+ if (m_properties.contains("force_tff")) prod->set("force_tff", m_properties.value("force_tff").toInt());
+ if (m_properties.contains("threads")) prod->set("threads", m_properties.value("threads").toInt());
+ if (mute) prod->set("audio_index", -1);
+ else if (m_properties.contains("audio_index")) prod->set("audio_index", m_properties.value("audio_index").toInt());
+ if (blind) prod->set("video_index", -1);
+ else if (m_properties.contains("video_index")) prod->set("video_index", m_properties.value("video_index").toInt());
+ prod->set("id", id.toUtf8().constData());
+ if (m_properties.contains("force_colorspace")) prod->set("force_colorspace", m_properties.value("force_colorspace").toInt());
+ if (m_properties.contains("full_luma")) prod->set("set.force_full_luma", m_properties.value("full_luma").toInt());
+ if (m_properties.contains("proxy_out")) {
+ // We have a proxy clip, make sure the proxy has same duration as original
+ prod->set("length", m_properties.value("duration").toInt());
+ prod->set("out", m_properties.value("proxy_out").toInt());
+ }
- } else if (key == "out") setDuration(GenTime(value.toInt(), KdenliveSettings::project_fps()));
- //else if (key == "transparency") m_clipProducer->set("transparency", value.toInt());
+ //else if (key == "transparency") m_clipProducer->set("transparency", value.toInt());
+ } else if (key == "out") {
+ setDuration(GenTime(value.toInt() + 1, KdenliveSettings::project_fps()));
+ }
- if (m_analysisdata.contains(name)) {
- if (KMessageBox::questionYesNo(kapp->activeWindow(), i18n("Clip already contains analysis data %1", name), QString(), KGuiItem(i18n("Merge")), KGuiItem(i18n("Add"))) == KMessageBox::Yes) {
- // Merge data
- Mlt::Profile *profile = m_baseTrackProducers.at(0)->profile();
- Mlt::Geometry geometry(m_analysisdata.value(name).toUtf8().data(), m_properties.value("duration").toInt(), profile->width(), profile->height());
- Mlt::Geometry newGeometry(data.toUtf8().data(), m_properties.value("duration").toInt(), profile->width(), profile->height());
- Mlt::GeometryItem item;
- int pos = 0;
- while (!newGeometry.next_key(&item, pos)) {
- pos = item.frame();
- item.frame(pos + offset);
- pos++;
- geometry.insert(item);
- }
- m_analysisdata.insert(name, geometry.serialise());
- }
- else {
- // Add data with another name
- int i = 1;
- QString newname = name + " " + QString::number(i);
- while (m_analysisdata.contains(newname)) {
- i++;
- newname = name + " " + QString::number(i);
- }
- m_analysisdata.insert(newname, geometryWithOffset(data, offset));
- }
- }
- else m_analysisdata.insert(name, geometryWithOffset(data, offset));
- }
-}
-
-const QString DocClipBase::geometryWithOffset(QString data, int offset)
+ if (m_analysisdata.contains(name)) {
+ if (KMessageBox::questionYesNo(kapp->activeWindow(), i18n("Clip already contains analysis data %1", name), QString(), KGuiItem(i18n("Merge")), KGuiItem(i18n("Add"))) == KMessageBox::Yes) {
+ // Merge data
+ Mlt::Profile *profile = m_baseTrackProducers.at(0)->profile();
+ Mlt::Geometry geometry(m_analysisdata.value(name).toUtf8().data(), m_properties.value("duration").toInt(), profile->width(), profile->height());
+ Mlt::Geometry newGeometry(data.toUtf8().data(), m_properties.value("duration").toInt(), profile->width(), profile->height());
+ Mlt::GeometryItem item;
+ int pos = 0;
+ while (!newGeometry.next_key(&item, pos)) {
+ pos = item.frame();
+ item.frame(pos + offset);
+ pos++;
+ geometry.insert(item);
+ }
+ m_analysisdata.insert(name, geometry.serialise());
+ }
+ else {
+ // Add data with another name
+ int i = 1;
+ QString newname = name + " " + QString::number(i);
+ while (m_analysisdata.contains(newname)) {
+ ++i;
+ newname = name + " " + QString::number(i);
+ }
+ m_analysisdata.insert(newname, geometryWithOffset(data, offset));
+ }
+ }
+ else m_analysisdata.insert(name, geometryWithOffset(data, offset));
+ }
+}
+
+const QString DocClipBase::geometryWithOffset(const QString &data, int offset)
{
if (offset == 0) return data;
Mlt::Profile *profile = m_baseTrackProducers.at(0)->profile();
Mlt::Geometry geometry(data.toUtf8().data(), m_properties.value("duration").toInt(), profile->width(), profile->height());
{
if (offset == 0) return data;
Mlt::Profile *profile = m_baseTrackProducers.at(0)->profile();
Mlt::Geometry geometry(data.toUtf8().data(), m_properties.value("duration").toInt(), profile->width(), profile->height());