#include "kdenlivesettings.h"
#include "kthumb.h"
#include "clipmanager.h"
+#include "slideshowclip.h"
#include <KIO/NetAccess>
#include <KDebug>
//m_clipProducer->set("transparency", m_properties.value("transparency").toInt());
}
+static double getPixelAspect(QMap<QString, QString>& props) {
+ int width = props.value("frame_size").section('x', 0, 0).toInt();
+ int height = props.value("frame_size").section('x', 1, 1).toInt();
+ int aspectNumerator = props.value("force_aspect_num").toInt();
+ int aspectDenominator = props.value("force_aspect_den").toInt();
+ if (aspectDenominator != 0 && width != 0)
+ return double(height) * aspectNumerator / aspectDenominator / width;
+ else
+ return 1.0;
+}
+
Mlt::Producer *DocClipBase::audioProducer(int track)
{
if (m_audioTrackProducers.count() <= track) {
if (m_audioTrackProducers.at(track) == NULL) {
Mlt::Producer *base = producer();
m_audioTrackProducers[track] = new Mlt::Producer(*(base->profile()), base->get("resource"));
- if (m_properties.contains("force_aspect_ratio")) m_audioTrackProducers.at(track)->set("force_aspect_ratio", m_properties.value("force_aspect_ratio").toDouble());
+ if (m_properties.contains("force_aspect_num") && m_properties.contains("force_aspect_den") && m_properties.contains("frame_size"))
+ m_audioTrackProducers.at(track)->set("force_aspect_ratio", getPixelAspect(m_properties));
if (m_properties.contains("force_fps")) m_audioTrackProducers.at(track)->set("force_fps", m_properties.value("force_fps").toDouble());
if (m_properties.contains("force_progressive")) m_audioTrackProducers.at(track)->set("force_progressive", m_properties.value("force_progressive").toInt());
+ if (m_properties.contains("force_tff")) m_audioTrackProducers.at(track)->set("force_tff", m_properties.value("force_tff").toInt());
if (m_properties.contains("threads")) m_audioTrackProducers.at(track)->set("threads", m_properties.value("threads").toInt());
m_audioTrackProducers.at(track)->set("video_index", -1);
if (m_properties.contains("audio_index")) m_audioTrackProducers.at(track)->set("audio_index", m_properties.value("audio_index").toInt());
- char *tmp = (char *) qstrdup(QString(getId() + '_' + QString::number(track) + "_audio").toUtf8().data());
- m_audioTrackProducers.at(track)->set("id", tmp);
- delete[] tmp;
+ m_audioTrackProducers.at(track)->set("id", QString(getId() + '_' + QString::number(track) + "_audio").toUtf8().data());
+ if (m_properties.contains("force_colorspace")) m_audioTrackProducers.at(track)->set("force_colorspace", m_properties.value("force_colorspace").toInt());
+ if (m_properties.contains("full_luma")) m_audioTrackProducers.at(track)->set("set.force_full_luma", m_properties.value("full_luma").toInt());
}
return m_audioTrackProducers.at(track);
}
if (m_baseTrackProducers.at(i) != NULL) break;
if (i >= m_baseTrackProducers.count()) return NULL;
m_videoOnlyProducer = new Mlt::Producer(*m_baseTrackProducers.at(i)->profile(), m_baseTrackProducers.at(i)->get("resource"));
- if (m_properties.contains("force_aspect_ratio")) m_videoOnlyProducer->set("force_aspect_ratio", m_properties.value("force_aspect_ratio").toDouble());
+ if (m_properties.contains("force_aspect_num") && m_properties.contains("force_aspect_den") && m_properties.contains("frame_size"))
+ m_videoOnlyProducer->set("force_aspect_ratio", getPixelAspect(m_properties));
if (m_properties.contains("force_fps")) m_videoOnlyProducer->set("force_fps", m_properties.value("force_fps").toDouble());
if (m_properties.contains("force_progressive")) m_videoOnlyProducer->set("force_progressive", m_properties.value("force_progressive").toInt());
+ if (m_properties.contains("force_tff")) m_videoOnlyProducer->set("force_tff", m_properties.value("force_tff").toInt());
if (m_properties.contains("threads")) m_videoOnlyProducer->set("threads", m_properties.value("threads").toInt());
m_videoOnlyProducer->set("audio_index", -1);
if (m_properties.contains("video_index")) m_videoOnlyProducer->set("video_index", m_properties.value("video_index").toInt());
- char *tmp = (char *) qstrdup(QString(getId() + "_video").toUtf8().data());
- m_videoOnlyProducer->set("id", tmp);
- delete[] tmp;
+ m_videoOnlyProducer->set("id", QString(getId() + "_video").toUtf8().data());
+ if (m_properties.contains("force_colorspace")) m_videoOnlyProducer->set("force_colorspace", m_properties.value("force_colorspace").toInt());
+ if (m_properties.contains("full_luma")) m_videoOnlyProducer->set("set.force_full_luma", m_properties.value("full_luma").toInt());
}
return m_videoOnlyProducer;
}
m_baseTrackProducers[track] = NULL;
return NULL;
}
- if (m_properties.contains("force_aspect_ratio")) m_baseTrackProducers[track]->set("force_aspect_ratio", m_properties.value("force_aspect_ratio").toDouble());
+ if (m_properties.contains("force_aspect_num") && m_properties.contains("force_aspect_den") && m_properties.contains("frame_size"))
+ m_baseTrackProducers[track]->set("force_aspect_raio", getPixelAspect(m_properties));
if (m_properties.contains("force_fps")) m_baseTrackProducers[track]->set("force_fps", m_properties.value("force_fps").toDouble());
if (m_properties.contains("force_progressive")) m_baseTrackProducers[track]->set("force_progressive", m_properties.value("force_progressive").toInt());
+ if (m_properties.contains("force_tff")) m_baseTrackProducers[track]->set("force_tff", m_properties.value("force_tff").toInt());
if (m_properties.contains("threads")) m_baseTrackProducers[track]->set("threads", m_properties.value("threads").toInt());
if (m_properties.contains("video_index")) m_baseTrackProducers[track]->set("video_index", m_properties.value("video_index").toInt());
if (m_properties.contains("audio_index")) m_baseTrackProducers[track]->set("audio_index", m_properties.value("audio_index").toInt());
- 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");
- }
+ m_baseTrackProducers[track]->set("id", QString(getId() + '_' + QString::number(track)).toUtf8().data());
+
+ if (m_properties.contains("force_colorspace")) m_baseTrackProducers[track]->set("force_colorspace", m_properties.value("force_colorspace").toInt());
+ if (m_properties.contains("full_luma")) m_baseTrackProducers[track]->set("set.force_full_luma", m_properties.value("full_luma").toInt());
}
return m_baseTrackProducers.at(track);
}
if (m_baseTrackProducers.count() == 0) return;
kDebug() << "//////////// REFRESH CLIP !!!!!!!!!!!!!!!!";
if (m_clipType == SLIDESHOW) {
- /*char *tmp = (char *) qstrdup(getProperty("resource").toUtf8().data());
- Mlt::Producer producer(*(m_clipProducer->profile()), tmp);
- delete[] tmp;
+ /*Mlt::Producer producer(*(m_clipProducer->profile()), getProperty("resource").toUtf8().data());
delete m_clipProducer;
m_clipProducer = new Mlt::Producer(producer.get_producer());
if (!getProperty("out").isEmpty()) m_clipProducer->set_in_and_out(getProperty("in").toInt(), getProperty("out").toInt());*/
setProducerProperty("ttl", getProperty("ttl").toInt());
//m_clipProducer->set("id", getProperty("id"));
+ if (!getProperty("animation").isEmpty()) {
+ Mlt::Service clipService(m_baseTrackProducers.at(0)->get_service());
+ int ct = 0;
+ Mlt::Filter *filter = clipService.filter(ct);
+ while (filter) {
+ if (strcmp(filter->get("mlt_service"), "affine") == 0) {
+ break;
+ } else if (strcmp(filter->get("mlt_service"), "boxblur") == 0) {
+ clipService.detach(*filter);
+ } else ct++;
+ filter = clipService.filter(ct);
+ }
+
+ if (!filter || strcmp(filter->get("mlt_service"), "affine")) {
+ // filter does not exist, create it.
+ Mlt::Filter *filter = new Mlt::Filter(*(m_baseTrackProducers.at(0)->profile()), "affine");
+ if (filter && filter->is_valid()) {
+ int cycle = getProperty("ttl").toInt();
+ QString geometry = SlideshowClip::animationToGeometry(getProperty("animation"), cycle);
+ if (!geometry.isEmpty()) {
+ if (getProperty("animation").contains("low-pass")) {
+ Mlt::Filter *blur = new Mlt::Filter(*(m_baseTrackProducers.at(0)->profile()), "boxblur");
+ if (blur && blur->is_valid())
+ clipService.attach(*blur);
+ }
+ filter->set("transition.geometry", geometry.toUtf8().data());
+ filter->set("transition.cycle", cycle);
+ clipService.attach(*filter);
+ }
+ }
+ }
+ } else {
+ Mlt::Service clipService(m_baseTrackProducers.at(0)->get_service());
+ int ct = 0;
+ Mlt::Filter *filter = clipService.filter(0);
+ while (filter) {
+ if (strcmp(filter->get("mlt_service"), "affine") == 0 || strcmp(filter->get("mlt_service"), "boxblur") == 0) {
+ clipService.detach(*filter);
+ } else ct++;
+ filter = clipService.filter(ct);
+ }
+ }
if (getProperty("fade") == "1") {
// we want a fade filter effect
kDebug() << "//////////// FADE WANTED";
}
if (filter && strcmp(filter->get("mlt_service"), "luma") == 0) {
- filter->set("period", getProperty("ttl").toInt() - 1);
- filter->set("luma.out", getProperty("luma_duration").toInt());
- QString resource = getProperty("luma_file");
- char *tmp = (char *) qstrdup(resource.toUtf8().data());
- filter->set("luma.resource", tmp);
- delete[] tmp;
+ filter->set("cycle", getProperty("ttl").toInt());
+ filter->set("duration", getProperty("luma_duration").toInt());
+ filter->set("luma.resource", getProperty("luma_file").toUtf8().data());
if (!getProperty("softness").isEmpty()) {
int soft = getProperty("softness").toInt();
filter->set("luma.softness", (double) soft / 100.0);
} else {
// filter does not exist, create it...
Mlt::Filter *filter = new Mlt::Filter(*(m_baseTrackProducers.at(0)->profile()), "luma");
- filter->set("period", getProperty("ttl").toInt() - 1);
- filter->set("luma.out", getProperty("luma_duration").toInt());
- QString resource = getProperty("luma_file");
- char *tmp = (char *) qstrdup(resource.toUtf8().data());
- filter->set("luma.resource", tmp);
- delete[] tmp;
+ filter->set("cycle", getProperty("ttl").toInt());
+ filter->set("duration", getProperty("luma_duration").toInt());
+ filter->set("luma.resource", getProperty("luma_file").toUtf8().data());
if (!getProperty("softness").isEmpty()) {
int soft = getProperty("softness").toInt();
filter->set("luma.softness", (double) soft / 100.0);
filter = clipService.filter(ct);
}
}
+ if (getProperty("crop") == "1") {
+ // we want a center crop filter effect
+ Mlt::Service clipService(m_baseTrackProducers.at(0)->get_service());
+ int ct = 0;
+ Mlt::Filter *filter = clipService.filter(ct);
+ while (filter) {
+ if (strcmp(filter->get("mlt_service"), "crop") == 0) {
+ break;
+ }
+ ct++;
+ filter = clipService.filter(ct);
+ }
+
+ if (!filter || strcmp(filter->get("mlt_service"), "crop")) {
+ // filter does not exist, create it...
+ Mlt::Filter *filter = new Mlt::Filter(*(m_baseTrackProducers.at(0)->profile()), "crop");
+ filter->set("center", 1);
+ clipService.attach(*filter);
+ }
+ } else {
+ Mlt::Service clipService(m_baseTrackProducers.at(0)->get_service());
+ int ct = 0;
+ Mlt::Filter *filter = clipService.filter(0);
+ while (filter) {
+ if (strcmp(filter->get("mlt_service"), "crop") == 0) {
+ clipService.detach(*filter);
+ } else ct++;
+ filter = clipService.filter(ct);
+ }
+ }
}
}
QMapIterator<QString, QString> i(properties);
bool refreshProducer = false;
QStringList keys;
- keys << "luma_duration" << "luma_file" << "fade" << "ttl" << "softness";
+ keys << "luma_duration" << "luma_file" << "fade" << "ttl" << "softness" << "crop" << "animation";
while (i.hasNext()) {
i.next();
setProperty(i.key(), i.value());
} 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") {
- char *tmp = (char *) qstrdup(value.toUtf8().data());
- setProducerProperty("colour", tmp);
- delete[] tmp;
+ setProducerProperty("colour", value.toUtf8().data());
} else if (key == "templatetext") {
- char *tmp = (char *) qstrdup(value.toUtf8().data());
- setProducerProperty("templatetext", tmp);
- delete[] tmp;
+ setProducerProperty("templatetext", value.toUtf8().data());
setProducerProperty("force_reload", 1);
} else if (key == "xmldata") {
- char *tmp = (char *) qstrdup(value.toUtf8().data());
- setProducerProperty("xmldata", tmp);
- delete[] tmp;
+ setProducerProperty("xmldata", value.toUtf8().data());
setProducerProperty("force_reload", 1);
- } else if (key == "force_aspect_ratio") {
+ } else if (key == "force_aspect_num") {
+ if (value.isEmpty()) {
+ m_properties.remove("force_aspect_num");
+ resetProducerProperty("force_aspect_ratio");
+ } else setProducerProperty("force_aspect_ratio", getPixelAspect(m_properties));
+ } else if (key == "force_aspect_den") {
if (value.isEmpty()) {
- m_properties.remove("force_aspect_ratio");
+ m_properties.remove("force_aspect_den");
resetProducerProperty("force_aspect_ratio");
- } else setProducerProperty("force_aspect_ratio", value.toDouble());
+ } else setProducerProperty("force_aspect_ratio", getPixelAspect(m_properties));
} else if (key == "force_fps") {
if (value.isEmpty()) {
m_properties.remove("force_fps");
m_properties.remove("force_progressive");
resetProducerProperty("force_progressive");
} else setProducerProperty("force_progressive", value.toInt());
+ } else if (key == "force_tff") {
+ if (value.isEmpty()) {
+ m_properties.remove("force_tff");
+ resetProducerProperty("force_tff");
+ } else setProducerProperty("force_tff", value.toInt());
} else if (key == "threads") {
if (value.isEmpty()) {
m_properties.remove("threads");
m_properties.remove("audio_index");
setProducerProperty("audio_index", m_properties.value("default_audio").toInt());
} else setProducerProperty("audio_index", value.toInt());
+ } else if (key == "force_colorspace") {
+ if (value.isEmpty()) {
+ m_properties.remove("force_colorspace");
+ resetProducerProperty("force_colorspace");
+ } else setProducerProperty("force_colorspace", value.toInt());
+ } else if (key == "full_luma") {
+ if (value.isEmpty()) {
+ m_properties.remove("full_luma");
+ resetProducerProperty("set.force_full_luma");
+ } else setProducerProperty("set.force_full_luma", value.toInt());
}
}
bool DocClipBase::slotGetAudioThumbs()
{
- if (m_thumbProd == NULL) return false;
+ if (m_thumbProd == NULL || isPlaceHolder()) return false;
if (!KdenliveSettings::audiothumbnails() || m_audioTimer == NULL) {
if (m_audioTimer != NULL) m_audioTimer->stop();
return false;