setenv("MLT_PROFILE", tmp, 1);
m_mltProfile = new Mlt::Profile(tmp);
m_mltProfile->set_explicit(true);
- kDebug()<<"// ********* PROFILE AR: "<<m_mltProfile->dar();
delete[] tmp;
m_blackClip = new Mlt::Producer(*m_mltProfile, "colour", "black");
return clip;
}
+bool Render::hasProfile(const QString &profileName) const
+{
+ return m_activeProfile == profileName;
+}
+
int Render::resetProfile(const QString &profileName, bool dropSceneList)
{
- QString scene;
- if (!dropSceneList) scene = sceneList();
if (m_mltConsumer) {
if (m_externalConsumer == KdenliveSettings::external_display()) {
if (KdenliveSettings::external_display() && m_activeProfile == profileName) return 1;
delete m_mltConsumer;
m_mltConsumer = NULL;
}
+ QString scene;
+ if (!dropSceneList) scene = sceneList();
int pos = 0;
double current_fps = m_mltProfile->fps();
double current_dar = m_mltProfile->dar();
if (info.xml.hasAttribute("templatetext"))
producer->set("templatetext", info.xml.attribute("templatetext").toUtf8().constData());
+
+ int imageWidth = (int)((double) info.imageHeight * m_mltProfile->width() / m_mltProfile->height() + 0.5);
+ int fullWidth = (int)((double) info.imageHeight * m_mltProfile->dar() + 0.5);
+ int frameNumber = info.xml.attribute("thumbnail", "-1").toInt();
if ((!info.replaceProducer && info.xml.hasAttribute("file_hash")) || proxyProducer) {
// Clip already has all properties
- emit replyGetFileProperties(info.clipId, producer, stringMap(), stringMap(), info.replaceProducer, true);
+ if (proxyProducer) {
+ // Recreate clip thumb
+ if (frameNumber > 0) producer->seek(frameNumber);
+ Mlt::Frame *frame = producer->get_frame();
+ if (frame && frame->is_valid()) {
+ QImage img = KThumb::getFrame(frame, imageWidth, fullWidth, info.imageHeight);
+ delete frame;
+ emit replyGetImage(info.clipId, img);
+ }
+ }
+ emit replyGetFileProperties(info.clipId, producer, stringMap(), stringMap(), info.replaceProducer);
m_processingClipId.clear();
continue;
}
- int imageWidth = (int)((double) info.imageHeight * m_mltProfile->width() / m_mltProfile->height() + 0.5);
- int fullWidth = (int)((double) info.imageHeight * m_mltProfile->dar() + 0.5);
stringMap filePropertyMap;
stringMap metadataPropertyMap;
-
- int frameNumber = info.xml.attribute("thumbnail", "-1").toInt();
if (frameNumber > 0) producer->seek(frameNumber);
duration = duration > 0 ? duration : producer->get_playtime();
QMutexLocker locker(&m_mutex);
QString currentId;
int consumerPosition = 0;
- if (m_winid == -1) return -1;
- if (m_mltProducer) m_mltProducer->set_speed(0);
- if (m_mltConsumer) {
- m_mltConsumer->set("refresh", 0);
- m_mltConsumer->purge();
- consumerPosition = m_mltConsumer->position();
- if (!m_mltConsumer->is_stopped()) {
- m_mltConsumer->stop();
- }
- }
- else {
- return -1;
+ if (m_winid == -1 || !m_mltConsumer) return -1;
+ m_mltConsumer->set("refresh", 0);
+ if (!m_mltConsumer->is_stopped()) {
+ m_mltConsumer->stop();
}
+ m_mltConsumer->purge();
+ consumerPosition = m_mltConsumer->position();
if (m_mltProducer) {
+ m_mltProducer->set_speed(0);
currentId = m_mltProducer->get("id");
delete m_mltProducer;
m_mltProducer = NULL;
emit stopped();
}
+
blockSignals(true);
if (producer && producer->is_valid()) {
m_mltProducer = producer;
m_fps = m_mltProducer->get_fps();
blockSignals(false);
int error = connectPlaylist();
- if (producer == NULL) {
- return error;
- }
- emit rendererPosition((int) m_mltProducer->position());
+ position = m_mltProducer->position();
+ m_mltConsumer->set("refresh", 1);
+ // Make sure the first frame is displayed, otherwise if we change producer too fast
+ // We can crash the avformat producer
+ Mlt::Event *ev = m_mltConsumer->setup_wait_for("consumer-frame-show");
+ m_mltConsumer->wait_for(ev);
+ delete ev;
+ emit rendererPosition(position);
return error;
}
int Render::setSceneList(QString playlist, int position)
{
+ QMutexLocker locker(&m_mutex);
if (m_winid == -1) return -1;
int error = 0;
int Render::connectPlaylist()
{
if (!m_mltConsumer) return -1;
- //m_mltConsumer->set("refresh", "0");
m_mltConsumer->connect(*m_mltProducer);
m_mltProducer->set_speed(0);
if (m_mltConsumer->start() == -1) {
}
emit durationChanged(m_mltProducer->get_playtime());
return 0;
- //refresh();
}
void Render::start()
{
+ QMutexLocker locker(&m_mutex);
if (m_winid == -1) {
kDebug() << "----- BROKEN MONITOR: " << m_name << ", RESTART";
return;
//KMessageBox::error(qApp->activeWindow(), i18n("Could not create the video preview window.\nThere is something wrong with your Kdenlive install or your driver settings, please fix it."));
kDebug(QtWarningMsg) << "/ / / / CANNOT START MONITOR";
} else {
- refresh();
+ m_mltConsumer->purge();
+ m_mltConsumer->set("refresh", 1);
}
}
}
void Render::stop()
{
+ QMutexLocker locker(&m_mutex);
if (m_mltProducer == NULL) return;
if (m_mltConsumer && !m_mltConsumer->is_stopped()) {
m_mltConsumer->stop();
+ m_mltConsumer->purge();
}
if (m_mltProducer) {
void Render::stop(const GenTime & startTime)
{
+ QMutexLocker locker(&m_mutex);
if (m_mltProducer) {
if (m_isZoneMode) resetZoneMode();
m_mltProducer->set_speed(0.0);
void Render::switchPlay(bool play)
{
+ QMutexLocker locker(&m_mutex);
if (!m_mltProducer || !m_mltConsumer)
return;
if (m_isZoneMode) resetZoneMode();
m_mltConsumer->set("refresh", "1");
m_mltProducer->set_speed(1.0);
} else if (!play) {
+ m_mltProducer->set_speed(0.0);
m_mltConsumer->set("refresh", 0);
m_mltProducer->seek(m_mltConsumer->position());
- stop();
+ if (!m_mltConsumer->is_stopped()) m_mltConsumer->stop();
+ if (m_isZoneMode) resetZoneMode();
+
//emitConsumerStopped();
/*m_mltConsumer->set("refresh", 0);
m_mltConsumer->stop();
void Render::doRefresh()
{
// Use a Timer so that we don't refresh too much
+ QMutexLocker locker(&m_mutex);
if (m_mltConsumer) {
if (m_mltConsumer->is_stopped()) m_mltConsumer->start();
m_mltConsumer->set("refresh", 1);
void Render::refresh()
{
+ QMutexLocker locker(&m_mutex);
if (!m_mltProducer)
return;
if (m_mltConsumer) {
void Render::setDropFrames(bool show)
{
+ QMutexLocker locker(&m_mutex);
if (m_mltConsumer) {
int dropFrames = KdenliveSettings::mltthreads();
if (show == false) dropFrames = -dropFrames;
Mlt::Tractor *Render::lockService()
{
// we are going to replace some clips, purge consumer
+ QMutexLocker locker(&m_mutex);
if (!m_mltProducer) return NULL;
if (m_mltConsumer) {
if (!m_mltConsumer->is_stopped()) m_mltConsumer->stop();
kDebug() << "////// RESTARTING CONSUMER";
if (!m_mltConsumer || !m_mltProducer) return;
if (m_mltProducer->get_playtime() == 0) return;
+ QMutexLocker locker(&m_mutex);
Mlt::Service service(m_mltProducer->parent().get_service());
if (service.type() != tractor_type) return;