-------------------
begin : Fri Apr 12 2002
copyright : (C) 2002 by Jason Wood
- email : jasonwood@blueyonder.co.uk
+ copyright : (C) 2009 by Jean-Baptiste Mardelle
+
***************************************************************************/
/***************************************************************************
* *
***************************************************************************/
-#include <QCryptographicHash>
-
-#include <KDebug>
-#include "kdenlivesettings.h"
#include "docclipbase.h"
+#include "kdenlivesettings.h"
#include "kthumb.h"
#include "clipmanager.h"
+#include <KDebug>
+
+#include <QCryptographicHash>
+
DocClipBase::DocClipBase(ClipManager *clipManager, QDomElement xml, const QString &id):
m_id(id), m_description(QString()), m_refcount(0), m_audioThumbCreated(false), m_duration(GenTime()), m_thumbProd(NULL), m_audioTimer(NULL), m_properties(QMap <QString, QString> ()), audioFrameChache(QMap<int, QMap<int, QByteArray> > ()), m_baseTrackProducers(QList <Mlt::Producer *>()), m_snapMarkers(QList < CommentedTime > ()) {
int type = xml.attribute("type").toInt();
m_clipType = (CLIPTYPE) type;
- m_name = xml.attribute("name");
QDomNamedNodeMap attributes = xml.attributes();
for (unsigned int i = 0; i < attributes.count(); i++) {
out = xml.attribute("duration").toInt();
if (out != 0) setDuration(GenTime(out, KdenliveSettings::project_fps()));
}
- if (m_name.isEmpty()) m_name = url.fileName();
+ if (!m_properties.contains("name")) m_properties.insert("name", url.fileName());
//if (!url.isEmpty() && QFile::exists(url.path()))
{
- m_thumbProd = new KThumb(clipManager, url, m_id);
+ m_thumbProd = new KThumb(clipManager, url, m_id, m_properties.value("file_hash"));
if (m_clipType == AV || m_clipType == AUDIO) slotCreateAudioTimer();
}
//kDebug() << "type is video" << (m_clipType == AV) << " " << m_clipType;
}*/
DocClipBase::~DocClipBase() {
- if (m_thumbProd) delete m_thumbProd;
+ if (m_thumbProd) {
+ delete m_thumbProd;
+ }
+ if (m_audioTimer) {
+ m_audioTimer->stop();
+ delete m_audioTimer;
+ }
qDeleteAll(m_baseTrackProducers);
+ m_baseTrackProducers.clear();
+}
+
+void DocClipBase::setZone(QPoint zone) {
+ m_properties.insert("zone_in", QString::number(zone.x()));
+ m_properties.insert("zone_out", QString::number(zone.y()));
+}
+
+QPoint DocClipBase::zone() const {
+ QPoint zone;
+ zone.setX(m_properties.value("zone_in").toInt());
+ zone.setY(m_properties.value("zone_out", "50").toInt());
+ return zone;
}
void DocClipBase::slotCreateAudioTimer() {
return m_audioThumbCreated;
}
-void DocClipBase::setName(const QString name) {
- m_name = name;
-}
+const QString DocClipBase::name() const {
-const QString & DocClipBase::name() const {
-
- return m_name;
+ return m_properties.value("name");
}
const QString &DocClipBase::getId() const {
return m_duration;
}
-const GenTime &DocClipBase::maxDuration() const {
+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(10000, KdenliveSettings::project_fps());
+ const GenTime dur(15000, KdenliveSettings::project_fps());
return dur;
}
return m_duration;
// virtual
QDomElement DocClipBase::toXML() const {
QDomDocument doc;
-
QDomElement clip = doc.createElement("producer");
QMapIterator<QString, QString> i(m_properties);
i.next();
if (!i.value().isEmpty()) clip.setAttribute(i.key(), i.value());
}
- //doc.appendChild(clip);
+ doc.appendChild(clip);
//kDebug()<<"/// CLIP XML: "<<doc.toString();
- return clip;
+ return doc.documentElement();
}
DocClipBase *DocClipBase::
return (*itt).comment();
++itt;
}
- return QString::null;
+ return QString();
+}
+
+void DocClipBase::deleteProducers() {
+ qDeleteAll(m_baseTrackProducers);
+ m_baseTrackProducers.clear();
+ if (m_thumbProd) m_thumbProd->clearProducer();
}
void DocClipBase::setProducer(Mlt::Producer *producer) {
if (track == -1 || (m_clipType != AUDIO && m_clipType != AV)) {
if (m_baseTrackProducers.count() == 0) return NULL;
int i;
- for (i = 0; i < m_baseTrackProducers.count(); i++)
- if (m_baseTrackProducers.at(i) != NULL) break;
- if (i < m_baseTrackProducers.count()) return m_baseTrackProducers.at(i);
+ for (int i = 0; i < m_baseTrackProducers.count(); i++) {
+ if (m_baseTrackProducers.at(i) != NULL)
+ return m_baseTrackProducers.at(i);
+ }
return NULL;
}
if (track >= m_baseTrackProducers.count()) {
char *tmp = (char *) qstrdup(QString(getId() + '_' + QString::number(track)).toUtf8().data());
m_baseTrackProducers[track]->set("id", tmp);
delete[] tmp;
+ if (KdenliveSettings::dropbframes() && m_baseTrackProducers.at(i)->get("skip_loop_filter") && strcmp(m_baseTrackProducers.at(i)->get("skip_loop_filter"), "all") == 0) {
+ m_baseTrackProducers[track]->set("skip_loop_filter", "all");
+ m_baseTrackProducers[track]->set("skip_frame", "bidir");
+ }
}
return m_baseTrackProducers.at(track);
}
}
}
+const char *DocClipBase::producerProperty(const char *name) const {
+ for (int i = 0; i < m_baseTrackProducers.count(); i++) {
+ if (m_baseTrackProducers.at(i) != NULL) {
+ return m_baseTrackProducers.at(i)->get(name);
+ }
+ }
+ return NULL;
+}
+
+
void DocClipBase::slotRefreshProducer() {
if (m_baseTrackProducers.count() == 0) return;
kDebug() << "//////////// REFRESH CLIP !!!!!!!!!!!!!!!!";
char *tmp = (char *) qstrdup(resource.toUtf8().data());
filter->set("luma.resource", tmp);
delete[] tmp;
- if (getProperty("softness") != QString()) {
+ if (!getProperty("softness").isEmpty()) {
int soft = getProperty("softness").toInt();
filter->set("luma.softness", (double) soft / 100.0);
}
char *tmp = (char *) qstrdup(resource.toUtf8().data());
filter->set("luma.resource", tmp);
delete[] tmp;
- if (getProperty("softness") != QString()) {
+ if (!getProperty("softness").isEmpty()) {
int soft = getProperty("softness").toInt();
filter->set("luma.softness", (double) soft / 100.0);
}
if (refreshProducer) slotRefreshProducer();
}
+void DocClipBase::setMetadata(QMap <QString, QString> properties) {
+ m_metadata = properties;
+}
+
+QMap <QString, QString> DocClipBase::metadata() const {
+ return m_metadata;
+}
+
void DocClipBase::clearProperty(const QString &key) {
m_properties.remove(key);
}
}
}
+QString DocClipBase::getClipHash() const {
+ 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 hash = m_properties.value("file_hash");
+ return hash;
+}
+
+void DocClipBase::refreshThumbUrl() {
+ if (m_thumbProd) m_thumbProd->updateThumbUrl(m_properties.value("file_hash"));
+}
+
void DocClipBase::setProperty(const QString &key, const QString &value) {
m_properties.insert(key, value);
if (key == "resource") {
- m_thumbProd->updateClipUrl(KUrl(value));
getFileHash(value);
+ if (m_thumbProd) m_thumbProd->updateClipUrl(KUrl(value), m_properties.value("file_hash"));
} else if (key == "out") setDuration(GenTime(value.toInt(), KdenliveSettings::project_fps()));
//else if (key == "transparency") m_clipProducer->set("transparency", value.toInt());
else if (key == "colour") {
bool DocClipBase::slotGetAudioThumbs() {
if (m_thumbProd == NULL) return false;
+ if (!KdenliveSettings::audiothumbnails()) {
+ if (m_audioTimer != NULL) m_audioTimer->stop();
+ return false;
+ }
if (m_audioThumbCreated) {
if (m_audioTimer != NULL) m_audioTimer->stop();
return false;