m_properties.insert(attributes.item(i).nodeName(), attributes.item(i).nodeValue());
}
+ if (xml.hasAttribute("cutzones")) {
+ QStringList cuts = xml.attribute("cutzones").split(";", QString::SkipEmptyParts);
+ for (int i = 0; i < cuts.count(); i++) {
+ QString z = cuts.at(i);
+ addCutZone(z.section('-', 0, 0).toInt(), z.section('-', 1, 1).toInt());
+ }
+ }
+
KUrl url = KUrl(xml.attribute("resource"));
if (!m_properties.contains("file_hash") && !url.isEmpty()) getFileHash(url.path());
DocClipBase::~DocClipBase()
{
+ kDebug() << "CLIP " << m_id << " DELETED******************************";
delete m_thumbProd;
if (m_audioTimer) {
m_audioTimer->stop();
delete m_audioTimer;
}
+ /*kDebug() <<" * * *CNT "<<m_baseTrackProducers.count();
+ if (m_baseTrackProducers.count() > 0) kDebug()<<"YOYO: "<<m_baseTrackProducers.at(0)->get_out()<<", CUT: "<<m_baseTrackProducers.at(0)->is_cut();*/
qDeleteAll(m_baseTrackProducers);
m_baseTrackProducers.clear();
qDeleteAll(m_audioTrackProducers);
const GenTime DocClipBase::maxDuration() const
{
if (m_clipType == COLOR || m_clipType == IMAGE || m_clipType == TEXT || (m_clipType == SLIDESHOW && m_properties.value("loop") == "1")) {
- const GenTime dur(15000, KdenliveSettings::project_fps());
- return dur;
+ /*const GenTime dur(15000, KdenliveSettings::project_fps());
+ return dur;*/
+ return GenTime();
}
return m_duration;
}
return true;
}
+qulonglong DocClipBase::fileSize() const
+{
+ return m_properties.value("file_size").toULongLong();
+}
// virtual
QDomElement DocClipBase::toXML() const
if (!i.value().isEmpty()) clip.setAttribute(i.key(), i.value());
}
doc.appendChild(clip);
- //kDebug()<<"/// CLIP XML: "<<doc.toString();
+ if (!m_cutZones.isEmpty()) {
+ QStringList cuts;
+ for (int i = 0; i < m_cutZones.size(); i++) {
+ cuts << QString::number(m_cutZones.at(i).x()) + "-" + QString::number(m_cutZones.at(i).y());
+ }
+ clip.setAttribute("cutzones", cuts.join(";"));
+ }
+ //kDebug() << "/// CLIP XML: " << doc.toString();
return doc.documentElement();
}
QList < GenTime > markers;
for (int count = 0; count < m_snapMarkers.count(); ++count) {
- markers.append(m_snapMarkers[count].time());
+ markers.append(m_snapMarkers.at(count).time());
}
return markers;
{
int it;
for (it = 0; it < m_snapMarkers.count(); it++) {
- if (m_snapMarkers[it].time() >= currTime)
+ if (m_snapMarkers.at(it).time() >= currTime)
break;
}
if (it == 0) return GenTime();
- else if (it == m_snapMarkers.count() - 1 && m_snapMarkers[it].time() < currTime)
- return m_snapMarkers[it].time();
- else return m_snapMarkers[it-1].time();
+ else if (it == m_snapMarkers.count() - 1 && m_snapMarkers.at(it).time() < currTime)
+ return m_snapMarkers.at(it).time();
+ else return m_snapMarkers.at(it -1).time();
}
GenTime DocClipBase::findNextSnapMarker(const GenTime & currTime)
{
int it;
for (it = 0; it < m_snapMarkers.count(); it++) {
- if (m_snapMarkers[it].time() > currTime)
+ if (m_snapMarkers.at(it).time() > currTime)
break;
}
- if (it < m_snapMarkers.count() && m_snapMarkers[it].time() > currTime) return m_snapMarkers[it].time();
+ if (it < m_snapMarkers.count() && m_snapMarkers.at(it).time() > currTime) return m_snapMarkers.at(it).time();
return duration();
}
return QString();
}
+void DocClipBase::clearProducers()
+{
+ m_baseTrackProducers.clear();
+}
+
void DocClipBase::deleteProducers()
{
+ kDebug() << "// CLIP KILL PRODS ct: " << m_baseTrackProducers.count();
+ if (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;
+
qDeleteAll(m_baseTrackProducers);
m_baseTrackProducers.clear();
- if (m_thumbProd) m_thumbProd->clearProducer();
qDeleteAll(m_audioTrackProducers);
m_audioTrackProducers.clear();
- delete m_videoOnlyProducer;
- m_videoOnlyProducer = NULL;
}
-void DocClipBase::setProducer(Mlt::Producer *producer)
+void DocClipBase::setProducer(Mlt::Producer *producer, bool reset)
{
if (producer == NULL) return;
+ if (reset) {
+ // Clear all previous producers
+ kDebug() << "/+++++++++++++++ DELETE ALL PRODS " << producer->get("id");
+ deleteProducers();
+ }
QString id = producer->get("id");
if (id.contains('_')) {
// this is a subtrack producer, insert it at correct place
}
if (m_audioTrackProducers.at(pos) == NULL) m_audioTrackProducers[pos] = producer;
return;
- }
- if (id.endsWith("video")) {
+ } else if (id.endsWith("video")) {
m_videoOnlyProducer = producer;
return;
}
}
//m_clipProducer = producer;
//m_clipProducer->set("transparency", m_properties.value("transparency").toInt());
- if (m_thumbProd && !m_thumbProd->hasProducer()) m_thumbProd->setProducer(producer);
+ if (m_thumbProd && (reset || !m_thumbProd->hasProducer())) m_thumbProd->setProducer(producer);
}
Mlt::Producer *DocClipBase::audioProducer(int track)
}
}
+void DocClipBase::setProducerProperty(const char *name, double data)
+{
+ for (int i = 0; i < m_baseTrackProducers.count(); i++) {
+ if (m_baseTrackProducers.at(i) != NULL)
+ m_baseTrackProducers[i]->set(name, data);
+ }
+}
+
void DocClipBase::setProducerProperty(const char *name, const char *data)
{
for (int i = 0; i < m_baseTrackProducers.count(); i++) {
file.close();
fileHash = QCryptographicHash::hash(fileData, QCryptographicHash::Md5);
m_properties.insert("file_hash", QString(fileHash.toHex()));
- //kDebug() << file.fileName() << file.size() << fileHash.toHex();
}
}
QString hash;
if (m_clipType == SLIDESHOW) hash = QCryptographicHash::hash(m_properties.value("resource").toAscii().data(), QCryptographicHash::Md5).toHex();
else if (m_clipType == COLOR) hash = QCryptographicHash::hash(m_properties.value("colour").toAscii().data(), QCryptographicHash::Md5).toHex();
+ else if (m_clipType == TEXT) hash = QCryptographicHash::hash(QString("title" + getId() + m_properties.value("xmldata")).toUtf8().data(), QCryptographicHash::Md5).toHex();
else hash = m_properties.value("file_hash");
return hash;
}
+// static
+QString DocClipBase::getHash(const QString &path)
+{
+ QFile file(path);
+ if (file.open(QIODevice::ReadOnly)) { // write size and hash only if resource points to a file
+ QByteArray fileData;
+ QByteArray fileHash;
+ /*
+ * 1 MB = 1 second per 450 files (or faster)
+ * 10 MB = 9 seconds per 450 files (or faster)
+ */
+ if (file.size() > 1000000*2) {
+ fileData = file.read(1000000);
+ if (file.seek(file.size() - 1000000))
+ fileData.append(file.readAll());
+ } else
+ fileData = file.readAll();
+ file.close();
+ return QCryptographicHash::hash(fileData, QCryptographicHash::Md5).toHex();
+ }
+ return QString();
+}
+
void DocClipBase::refreshThumbUrl()
{
if (m_thumbProd) m_thumbProd->updateThumbUrl(m_properties.value("file_hash"));
char *tmp = (char *) qstrdup(value.toUtf8().data());
setProducerProperty("colour", tmp);
delete[] tmp;
+ } else if (key == "templatetext") {
+ char *tmp = (char *) qstrdup(value.toUtf8().data());
+ setProducerProperty("templatetext", tmp);
+ delete[] tmp;
+ setProducerProperty("force_reload", 1);
} else if (key == "xmldata") {
+ char *tmp = (char *) qstrdup(value.toUtf8().data());
+ setProducerProperty("xmldata", tmp);
+ delete[] tmp;
setProducerProperty("force_reload", 1);
} else if (key == "force_aspect_ratio") {
if (value.isEmpty()) {
m_properties.remove("force_aspect_ratio");
+ //TODO: find a was to remove the "force_aspect_ratio" property from producer, currently does not work
setProducerProperty("force_aspect_ratio", 0);
} else setProducerProperty("force_aspect_ratio", value.toDouble());
} else if (key == "threads") {
return m_placeHolder;
}
+void DocClipBase::addCutZone(int in, int out)
+{
+ if (!m_cutZones.contains(QPoint(in, out))) {
+ m_cutZones.append(QPoint(in, out));
+ }
+}
+
+bool DocClipBase::hasCutZone(QPoint p) const
+{
+ return m_cutZones.contains(p);
+}
+
+
+void DocClipBase::removeCutZone(int in, int out)
+{
+ m_cutZones.removeAll(QPoint(in, out));
+}
+
+void DocClipBase::updateCutZone(int oldin, int oldout, int in, int out)
+{
+ QPoint old(oldin, oldout);
+ for (int i = 0; i < m_cutZones.size(); ++i) {
+ if (m_cutZones.at(i) == old) {
+ m_cutZones.replace(i, QPoint(in, out));
+ break;
+ }
+ }
+}
+
+QList <QPoint> DocClipBase::cutZones() const
+{
+ return m_cutZones;
+}
+