static void consumer_frame_show(mlt_consumer, Render * self, mlt_frame frame_ptr)
{
// detect if the producer has finished playing. Is there a better way to do it?
- if (self->m_isBlocked) return;
Mlt::Frame frame(frame_ptr);
if (!frame.is_valid()) return;
self->emitFrameNumber(mlt_frame_get_position(frame_ptr));
static void consumer_paused(mlt_consumer, Render * self, mlt_frame /*frame_ptr*/)
{
// detect if the producer has finished playing. Is there a better way to do it?
- if (self->m_isBlocked) return;
self->emitConsumerStopped();
}
static void consumer_gl_frame_show(mlt_consumer, Render * self, mlt_frame frame_ptr)
{
// detect if the producer has finished playing. Is there a better way to do it?
- if (self->m_isBlocked) return;
Mlt::Frame frame(frame_ptr);
self->showFrame(frame);
if (frame.get_double("_speed") == 0.0) {
Render::Render(const QString & rendererName, int winid, QString profile, QWidget *parent) :
AbstractRender(rendererName, parent),
- m_isBlocked(0),
analyseAudio(KdenliveSettings::monitor_audio()),
m_name(rendererName),
m_mltConsumer(NULL),
Render::~Render()
{
- m_isBlocked = 1;
closeMlt();
delete m_mltProfile;
}
{
if (!m_mltProducer)
return;
- m_isBlocked = false;
m_mltProducer->seek((int)(time.frames(m_fps)));
refresh();
}
{
if (!m_mltProducer)
return;
- m_isBlocked = false;
m_mltProducer->seek(time);
refresh();
}
return -1;
}
- m_isBlocked = true;
if (m_mltProducer) {
m_mltProducer->set_speed(0);
delete m_mltProducer;
m_mltProducer->seek(position);
emit rendererPosition(position);
} else emit rendererPosition((int) m_mltProducer->position());
- m_isBlocked = false;
return error;
}
int Render::setSceneList(QString playlist, int position)
{
if (m_winid == -1) return -1;
- m_isBlocked = true;
int error = 0;
//kDebug() << "////// RENDER, SET SCENE LIST:\n" << playlist <<"\n..........:::.";
if (error == 0) error = connectPlaylist();
else connectPlaylist();
fillSlowMotionProducers();
-
- m_isBlocked = false;
blockSignals(false);
return error;
//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 {
- m_isBlocked = false;
refresh();
}
}
- m_isBlocked = false;
}
void Render::stop()
// delete m_mltConsumer;
// m_mltConsumer = NULL;
}
- m_isBlocked = true;
if (m_mltProducer) {
if (m_isZoneMode) resetZoneMode();
return;
if (m_mltProducer->get_speed() == 0.0) return;
if (m_isZoneMode) resetZoneMode();
- m_isBlocked = true;
m_mltConsumer->set("refresh", 0);
m_mltProducer->set_speed(0.0);
/*
return;
if (m_isZoneMode) resetZoneMode();
if (play && m_mltProducer->get_speed() == 0.0) {
- m_isBlocked = false;
if (m_name == "clip" && m_framePosition == (int) m_mltProducer->get_out()) m_mltProducer->seek(0);
m_mltProducer->set_speed(1.0);
m_mltConsumer->set("refresh", 1);
+ if (m_mltConsumer->is_stopped()) m_mltConsumer->start();
} else if (!play) {
- m_isBlocked = true;
- m_mltConsumer->set("refresh", 0);
+ stop();
+ m_mltConsumer->set("refresh", "0");
+ m_framePosition++;
+ m_mltProducer->seek(m_framePosition);
+ /*m_mltConsumer->set("refresh", 0);
+ m_mltConsumer->stop();
+ m_mltConsumer->purge();
m_mltProducer->set_speed(0.0);
- //emit rendererPosition(m_framePosition);
+ //m_framePosition = m_mltProducer->position();
m_mltProducer->seek(m_framePosition);
- //m_mltConsumer->purge();
+ emit rendererPosition(m_framePosition);*/
}
}
if (!m_mltProducer)
return;
// if (speed == 0.0) m_mltProducer->set("out", m_mltProducer->get_length() - 1);
- m_isBlocked = false;
m_mltProducer->set_speed(speed);
/*if (speed == 0.0) {
m_mltProducer->seek((int) m_framePosition + 1);
{
if (!m_mltProducer || !m_mltConsumer)
return;
- m_isBlocked = false;
m_mltProducer->seek((int)(startTime.frames(m_fps)));
m_mltProducer->set_speed(1.0);
m_mltConsumer->set("refresh", 1);
{
if (!m_mltProducer || !m_mltConsumer)
return;
- m_isBlocked = false;
if (!m_isZoneMode) m_originalOut = m_mltProducer->get_playtime() - 1;
m_mltProducer->set("out", (int)(stopTime.frames(m_fps)));
m_mltProducer->seek((int)(startTime.frames(m_fps)));
void Render::seekToFrame(int pos)
{
- //kDebug()<<" ********* RENDER SEEK TO POS";
if (!m_mltProducer)
return;
- m_isBlocked = false;
resetZoneMode();
m_mltProducer->seek(pos);
refresh();
void Render::seekToFrameDiff(int diff)
{
- //kDebug()<<" ********* RENDER SEEK TO POS";
if (!m_mltProducer)
return;
- m_isBlocked = false;
resetZoneMode();
m_mltProducer->seek(m_mltProducer->position() + diff);
refresh();
void Render::doRefresh()
{
// Use a Timer so that we don't refresh too much
- if (!m_isBlocked && m_mltConsumer) m_mltConsumer->set("refresh", 1);
+ if (m_mltConsumer) {
+ if (m_mltConsumer->is_stopped()) m_mltConsumer->start();
+ m_mltConsumer->set("refresh", 1);
+ }
}
void Render::refresh()
{
- if (!m_mltProducer || m_isBlocked)
+ if (!m_mltProducer)
return;
if (m_mltConsumer) {
m_mltConsumer->set("refresh", 1);
+ if (m_mltConsumer->is_stopped()) m_mltConsumer->start();
}
}
void Render::mltCutClip(int track, GenTime position)
{
- m_isBlocked = true;
-
Mlt::Service service(m_mltProducer->parent().get_service());
if (service.type() != tractor_type) {
kWarning() << "// TRACTOR PROBLEM";
int clipIndex = trackPlaylist.get_clip_index_at(cutPos);
if (trackPlaylist.is_blank(clipIndex)) {
kDebug() << "// WARNING, TRYING TO CUT A BLANK";
- m_isBlocked = false;
return;
}
mlt_service_lock(service.get_service());
kDebug()<<"CLIP "<<i<<": ("<<blankStart<<'x'<<blankStart + blankDuration<<")"<<blk;
}*/
- m_isBlocked = false;
}
bool Render::mltUpdateClip(ItemInfo info, QDomElement element, Mlt::Producer *prod)
//mlt_service_unlock(service.get_service());
return false;
}
- m_isBlocked = true;
Mlt::Producer *clip = trackPlaylist.replace_with_blank(clipIndex);
if (clip) delete clip;
trackPlaylist.consolidate_blanks(0);
}*/
//service.unlock();
if (track != 0 && trackPlaylist.count() <= clipIndex) mltCheckLength(&tractor);
- m_isBlocked = false;
return true;
}
int Render::mltChangeClipSpeed(ItemInfo info, ItemInfo speedIndependantInfo, double speed, double /*oldspeed*/, int strobe, Mlt::Producer *prod)
{
- m_isBlocked = true;
int newLength = 0;
Mlt::Service service(m_mltProducer->parent().get_service());
if (service.type() != tractor_type) {
}
delete original;
if (clipIndex + 1 == trackPlaylist.count()) mltCheckLength(&tractor);
- m_isBlocked = false;
return newLength;
}
Mlt::Playlist trackPlaylist((mlt_playlist) trackProducer.get_service());
Mlt::Service clipService(trackPlaylist.get_service());
- m_isBlocked = true;
mlt_service_lock(service.get_service());
int ct = 0;
Mlt::Filter *filter = clipService.filter(ct);
} else ct++;
filter = clipService.filter(ct);
}
- m_isBlocked = false;
mlt_service_unlock(service.get_service());
refresh();
return success;
}
delete clip;
- m_isBlocked = true;
mlt_service_lock(service.get_service());
int ct = 0;
Mlt::Filter *filter = clipService.filter(ct);
} else ct++;
filter = clipService.filter(ct);
}
- m_isBlocked = false;
mlt_service_unlock(service.get_service());
if (doRefresh) refresh();
return success;
const int filter_ix = params.paramValue("kdenlive_ix").toInt();
const QString region = params.paramValue("region");
int ct = 0;
- m_isBlocked = true;
mlt_service_lock(service.get_service());
Mlt::Filter *filter = service.filter(ct);
ct++;
filter = service.filter(ct);
}
- m_isBlocked = false;
mlt_service_unlock(service.get_service());
if (doRefresh) refresh();
return true;
}
} else {
kDebug() << "filter is NULL";
- m_isBlocked = false;
mlt_service_unlock(service.get_service());
return false;
}
filter->set("kdenlive_ix", filter->get_int("kdenlive_ix") + 1);
service.attach(*filter);
}
- m_isBlocked = false;
mlt_service_unlock(service.get_service());
if (doRefresh) refresh();
return true;
Mlt::Producer trackProducer(tractor.track(track));
Mlt::Playlist trackPlaylist((mlt_playlist) trackProducer.get_service());
Mlt::Service clipService(trackPlaylist.get_service());
- m_isBlocked = true;
int ct = 0;
QString index = params.paramValue("kdenlive_ix");
QString tag = params.paramValue("tag");
// filter was not found, it was probably a disabled filter, so add it to the correct place...
bool success = false;//mltAddTrackEffect(track, params);
- m_isBlocked = false;
return success;
}
QString prefix;
}
mlt_service_unlock(service.get_service());
- m_isBlocked = false;
refresh();
return true;
int diff = trackPlaylist.clip_start(clipIndex) + duration - m_mltProducer->position();
if (diff < 0 || diff > duration)
doRefresh = false;
- m_isBlocked = true;
int ct = 0;
Mlt::Filter *filter = clip->filter(ct);
// filter was not found, it was probably a disabled filter, so add it to the correct place...
bool success = mltAddEffect(track, position, params);
- m_isBlocked = false;
return success;
}
QString prefix;
delete clip;
mlt_service_unlock(service.get_service());
- m_isBlocked = false;
if (doRefresh) refresh();
return true;
}
if (diff < 0 || diff > duration) doRefresh = false;
delete clip;
- m_isBlocked = true;
int ct = 0;
Mlt::Filter *filter = clipService.filter(ct);
while (filter) {
} else ct++;
filter = clipService.filter(ct);
}
-
- m_isBlocked = false;
if (doRefresh) refresh();
}
if (diff < 0 || diff > duration) doRefresh = false;
delete clip;
- m_isBlocked = true;
int ct = 0;
QList <Mlt::Filter *> filtersList;
Mlt::Filter *filter = clipService.filter(ct);
clipService.attach(*(filtersList.at(i)));
}
- m_isBlocked = false;
if (doRefresh) refresh();
}
Mlt::Tractor tractor(service);
Mlt::Producer trackProducer(tractor.track(track));
Mlt::Playlist trackPlaylist((mlt_playlist) trackProducer.get_service());
-
Mlt::Service clipService(trackPlaylist.get_service());
-
- m_isBlocked = true;
int ct = 0;
QList <Mlt::Filter *> filtersList;
Mlt::Filter *filter = clipService.filter(ct);
for (int i = 0; i < filtersList.count(); i++) {
clipService.attach(*(filtersList.at(i)));
}
- m_isBlocked = false;
refresh();
}
bool Render::mltResizeClipEnd(ItemInfo info, GenTime clipDuration)
{
- m_isBlocked = true;
Mlt::Service service(m_mltProducer->parent().get_service());
Mlt::Tractor tractor(service);
Mlt::Producer trackProducer(tractor.track(info.track));
if (trackPlaylist.is_blank_at((int) info.startPos.frames(m_fps))) {
kDebug() << "//////// ERROR RSIZING BLANK CLIP!!!!!!!!!!!";
- m_isBlocked = false;
return false;
}
mlt_service_lock(service.get_service());
transpinfo.track = info.track;
mltAddClipTransparency(transpinfo, info.track - 1, QString(clip->parent().get("id")).toInt());
}*/
- m_isBlocked = false;
m_mltConsumer->set("refresh", 1);
return true;
}
mlt_service serv = m_mltProducer->parent().get_service();
Mlt::Field *field = tractor.field();
mlt_service_lock(serv);
- m_isBlocked++;
mlt_service nextservice = mlt_service_get_producer(serv);
mlt_properties properties = MLT_SERVICE_PROPERTIES(nextservice);
field->plant_transition(*transition, lowestTrack, i);
}
mlt_service_unlock(serv);
- m_isBlocked--;
}
bool Render::mltResizeClipCrop(ItemInfo info, GenTime diff)
int previousStart = clip->get_in();
int previousOut = clip->get_out();
delete clip;
- m_isBlocked = true;
trackPlaylist.resize_clip(clipIndex, previousStart + frameOffset, previousOut + frameOffset);
- m_isBlocked = false;
mlt_service_unlock(service.get_service());
m_mltConsumer->set("refresh", 1);
return true;
int previousStart = clip->get_in();
int previousOut = clip->get_out();
- m_isBlocked = true;
previousStart += moveFrame;
if (previousStart < 0) {
transpinfo.track = info.track;
mltAddClipTransparency(transpinfo, info.track - 1, QString(clip->parent().get("id")).toInt());
}*/
- m_isBlocked = false;
//m_mltConsumer->set("refresh", 1);
mlt_service_unlock(service.get_service());
m_mltConsumer->set("refresh", 1);
kDebug() << "// Warning, CLIP on track " << track << ", at: " << pos << " is invalid, cannot update it!!!";
return false;
}
- m_isBlocked++;
//kDebug() << "// TRYING TO UPDATE CLIP at: " << pos << ", TK: " << track;
Mlt::Service service(m_mltProducer->parent().get_service());
if (service.type() != tractor_type) {
kDebug() << "// ERROR UPDATING CLIP PROD";
delete clipProducer;
mlt_service_unlock(service.get_service());
- m_isBlocked--;
return false;
}
Mlt::Producer *clip = prod->cut(clipProducer->get_in(), clipProducer->get_out());
if (clip) delete clip;
delete clipProducer;
mlt_service_unlock(service.get_service());
- m_isBlocked--;
return false;
}
// move all effects to the correct producer
delete clip;
delete clipProducer;
mlt_service_unlock(service.get_service());
- m_isBlocked--;
return true;
}
bool Render::mltMoveClip(int startTrack, int endTrack, int moveStart, int moveEnd, Mlt::Producer *prod, bool overwrite, bool /*insert*/)
{
- m_isBlocked++;
-
Mlt::Service service(m_mltProducer->parent().get_service());
if (service.type() != tractor_type) {
kWarning() << "// TRACTOR PROBLEM";
//int ix = trackPlaylist.get_clip_index_at(moveEnd);
kDebug() << "// ERROR MOVING CLIP TO : " << moveEnd;
mlt_service_unlock(service.get_service());
- m_isBlocked--;
return false;
} else {
trackPlaylist.consolidate_blanks(0);
if (!overwrite && !destTrackPlaylist.is_blank_at(moveEnd)) {
// error, destination is not empty
mlt_service_unlock(service.get_service());
- m_isBlocked--;
return false;
} else {
Mlt::Producer *clipProducer = trackPlaylist.replace_with_blank(clipIndex);
if (clipProducer) delete clipProducer;
kDebug() << "// ERROR MOVING CLIP TO : " << moveEnd;
mlt_service_unlock(service.get_service());
- m_isBlocked--;
return false;
}
trackPlaylist.consolidate_blanks(0);
}
mlt_service_unlock(service.get_service());
if (checkLength) mltCheckLength(&tractor);
- m_isBlocked--;
//askForRefresh();
//m_mltConsumer->set("refresh", 1);
return true;
diff = new_out - m_mltProducer->position();
if (diff < 0 || diff > new_out - new_in) doRefresh = false;
}
-
- m_isBlocked++;
mlt_service_lock(service.get_service());
mlt_service nextservice = mlt_service_get_producer(service.get_service());
resource = mlt_properties_get(properties, "mlt_service");
}
mlt_service_unlock(service.get_service());
- m_isBlocked--;
if (doRefresh) refresh();
//if (m_isBlocked == 0) m_mltConsumer->set("refresh", 1);
return found;
{
mlt_service serv = m_mltProducer->parent().get_service();
mlt_service_lock(serv);
- m_isBlocked++;
mlt_service nextservice = mlt_service_get_producer(serv);
mlt_properties properties = MLT_SERVICE_PROPERTIES(nextservice);
resource = mlt_properties_get(properties, "mlt_service");
}
mlt_service_unlock(serv);
- m_isBlocked--;
//askForRefresh();
//if (m_isBlocked == 0) m_mltConsumer->set("refresh", 1);
}
void Render::mltDeleteTransition(QString tag, int /*a_track*/, int b_track, GenTime in, GenTime out, QDomElement /*xml*/, bool /*do_refresh*/)
{
mlt_service serv = m_mltProducer->parent().get_service();
- m_isBlocked++;
mlt_service_lock(serv);
Mlt::Service service(serv);
resource = mlt_properties_get(properties, "mlt_service");
}
mlt_service_unlock(serv);
- m_isBlocked--;
//askForRefresh();
//if (m_isBlocked == 0) m_mltConsumer->set("refresh", 1);
}
mlt_service_lock(service.get_service());
m_mltConsumer->set("refresh", 0);
- m_isBlocked++;
mlt_service serv = m_mltProducer->parent().get_service();
mlt_service nextservice = mlt_service_get_producer(serv);
resource = mlt_properties_get(properties, "mlt_service");
}
mlt_service_unlock(service.get_service());
- m_isBlocked--;
- if (m_isBlocked == 0) m_mltConsumer->set("refresh", 1);
+ m_mltConsumer->set("refresh", 1);
}
mlt_service_lock(service.get_service());
m_mltConsumer->set("refresh", 0);
- m_isBlocked++;
mlt_service serv = m_mltProducer->parent().get_service();
mlt_service nextservice = mlt_service_get_producer(serv);
mlt_type = mlt_properties_get(properties, "mlt_type");
resource = mlt_properties_get(properties, "mlt_service");
}
- m_isBlocked--;
mlt_service_unlock(service.get_service());
m_mltConsumer->set("refresh", 1);
}
//kDebug() << " ------ ADDING TRANS PARAM: " << key << ": " << it.value();
}
// attach transition
- m_isBlocked++;
mlt_service_lock(service.get_service());
mltPlantTransition(field, *transition, a_track, b_track);
// field->plant_transition(*transition, a_track, b_track);
mlt_service_unlock(service.get_service());
- m_isBlocked--;
if (do_refresh) refresh();
return true;
}
void Render::mltInsertTrack(int ix, bool videoTrack)
{
blockSignals(true);
- m_isBlocked++;
Mlt::Service service(m_mltProducer->parent().get_service());
mlt_service_lock(service.get_service());
mlt_service_unlock(service.get_service());
//tractor.multitrack()->refresh();
//tractor.refresh();
- m_isBlocked--;
blockSignals(false);
}