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?
+ self->emitFrameNumber();
Mlt::Frame frame(frame_ptr);
if (!frame.is_valid()) return;
- self->emitFrameNumber(mlt_frame_get_position(frame_ptr));
if (self->sendFrameForAnalysis && frame_ptr->convert_image) {
self->emitFrameUpdated(frame);
}
m_mltConsumer(NULL),
m_mltProducer(NULL),
m_mltProfile(NULL),
- m_framePosition(0),
m_externalConsumer(false),
m_isZoneMode(false),
m_isLoopMode(false),
m_externalConsumer = true;
m_mltConsumer->listen("consumer-frame-show", this, (mlt_listener) consumer_frame_show);
m_mltConsumer->set("terminate_on_pause", 0);
- m_mltConsumer->set("buffer", 12);
m_mltConsumer->set("deinterlace_method", "onefield");
m_mltConsumer->set("real_time", KdenliveSettings::mltthreads());
mlt_log_set_callback(kdenlive_callback);
{
if (!m_mltProducer)
return;
+
m_mltProducer->seek((int)(time.frames(m_fps)));
- refresh();
+ if (m_mltProducer->get_speed() == 0) {
+ refresh();
+ }
}
void Render::seek(int time)
{
if (!m_mltProducer)
return;
+
m_mltProducer->seek(time);
- refresh();
+ if (m_mltProducer->get_speed() == 0) {
+ refresh();
+ }
}
//static
//refresh();
}
-void Render::refreshDisplay()
-{
-
- if (!m_mltProducer) return;
- //m_mltConsumer->set("refresh", 0);
-
- //mlt_properties properties = MLT_PRODUCER_PROPERTIES(m_mltProducer->get_producer());
- /*if (KdenliveSettings::osdtimecode()) {
- mlt_properties_set_int( properties, "meta.attr.timecode", 1);
- mlt_properties_set( properties, "meta.attr.timecode.markup", "#timecode#");
- m_osdInfo->set("dynamic", "1");
- m_mltProducer->attach(*m_osdInfo);
- }
- else {
- m_mltProducer->detach(*m_osdInfo);
- m_osdInfo->set("dynamic", "0");
- }*/
- refresh();
-}
int Render::volume() const
{
{
if (m_mltProducer == NULL) return;
if (m_mltConsumer && !m_mltConsumer->is_stopped()) {
- //kDebug() << "///////////// RENDER STOPPED: " << m_name;
- //m_mltConsumer->set("refresh", 0);
m_mltConsumer->stop();
- // delete m_mltConsumer;
- // m_mltConsumer = NULL;
}
if (m_mltProducer) {
if (m_isZoneMode) resetZoneMode();
m_mltProducer->set_speed(0.0);
- //m_mltProducer->set("out", m_mltProducer->get_length() - 1);
- //kDebug() << m_mltProducer->get_length();
}
}
if (m_isZoneMode) resetZoneMode();
m_mltConsumer->set("refresh", 0);
m_mltProducer->set_speed(0.0);
- /*
- The 2 lines below create a flicker loop
- emit rendererPosition(m_framePosition);
- m_mltProducer->seek(m_framePosition);*/
m_mltConsumer->purge();
}
return;
if (m_isZoneMode) resetZoneMode();
if (play && m_mltProducer->get_speed() == 0.0) {
- if (m_name == "clip" && m_framePosition == (int) m_mltProducer->get_out()) m_mltProducer->seek(0);
+ if (m_name == "clip" && m_mltConsumer->position() == m_mltProducer->get_out()) m_mltProducer->seek(0);
+ if (m_mltConsumer->is_stopped()) {
+ m_mltConsumer->start();
+ }
+ m_mltConsumer->set("refresh", "1");
m_mltProducer->set_speed(1.0);
- m_mltConsumer->set("refresh", 1);
- if (m_mltConsumer->is_stopped()) m_mltConsumer->start();
} else if (!play) {
+ m_mltConsumer->set("refresh", 0);
stop();
- m_mltConsumer->set("refresh", "0");
- m_framePosition++;
- m_mltProducer->seek(m_framePosition);
+ m_mltProducer->seek(m_mltConsumer->position());
+ //emitConsumerStopped();
/*m_mltConsumer->set("refresh", 0);
m_mltConsumer->stop();
m_mltConsumer->purge();
{
if (!m_mltProducer)
return;
+
resetZoneMode();
m_mltProducer->seek(pos);
- refresh();
+ if (m_mltProducer->get_speed() == 0) {
+ refresh();
+ }
}
void Render::seekToFrameDiff(int diff)
if (!m_mltProducer)
return;
if (m_mltConsumer) {
- m_mltConsumer->set("refresh", 1);
if (m_mltConsumer->is_stopped()) m_mltConsumer->start();
+ m_mltConsumer->purge();
+ m_mltConsumer->set("refresh", 1);
}
}
emit frameUpdated(qimage);
}
-void Render::emitFrameNumber(double position)
+void Render::emitFrameNumber()
{
- m_framePosition = position;
- emit rendererPosition((int) position);
+ if (m_mltConsumer) emit rendererPosition((int) m_mltConsumer->position());
}
void Render::emitConsumerStopped()
void Render::showFrame(Mlt::Frame& frame)
{
- m_framePosition = qMax(frame.get_int("_position"), 0);
- emit rendererPosition((int) m_framePosition);
+ emit rendererPosition((int) m_mltConsumer->position());
mlt_image_format format = mlt_image_rgb24a;
int width = 0;
int height = 0;
}
-void Render::lock()
+Mlt::Tractor *Render::lockService()
{
- if (!m_mltProducer) return;
+ if (!m_mltProducer) return NULL;
Mlt::Service service(m_mltProducer->parent().get_service());
if (service.type() != tractor_type) {
kWarning() << "// TRACTOR PROBLEM";
- return;
+ return NULL;
}
service.lock();
+ return new Mlt::Tractor(service);
+
}
-void Render::unlock()
+void Render::unlockService(Mlt::Tractor *tractor)
{
+ if (tractor) delete tractor;
if (!m_mltProducer) return;
Mlt::Service service(m_mltProducer->parent().get_service());
if (service.type() != tractor_type) {
service.unlock();
}
-bool Render::mltUpdateClip(ItemInfo info, QDomElement element, Mlt::Producer *prod)
+bool Render::mltUpdateClip(Mlt::Tractor *tractor, ItemInfo info, QDomElement element, Mlt::Producer *prod)
{
// TODO: optimize
- if (prod == NULL) {
+ if (prod == NULL || tractor == NULL) {
kDebug() << "Cannot update clip with null producer //////";
return false;
}
- Mlt::Service service(m_mltProducer->parent().get_service());
- if (service.type() != tractor_type) {
- kWarning() << "// TRACTOR PROBLEM";
- return false;
- }
- Mlt::Tractor tractor(service);
- Mlt::Producer trackProducer(tractor.track(tractor.count() - 1 - info.track));
+ Mlt::Producer trackProducer(tractor->track(tractor->count() - 1 - info.track));
Mlt::Playlist trackPlaylist((mlt_playlist) trackProducer.get_service());
int startPos = info.startPos.frames(m_fps);
int clipIndex = trackPlaylist.get_clip_index_at(startPos);
}
-bool Render::mltUpdateClipProducer(int track, int pos, Mlt::Producer *prod)
+bool Render::mltUpdateClipProducer(Mlt::Tractor *tractor, int track, int pos, Mlt::Producer *prod)
{
- if (prod == NULL || !prod->is_valid()) {
+ if (prod == NULL || !prod->is_valid() || tractor == NULL || !tractor->is_valid()) {
kDebug() << "// Warning, CLIP on track " << track << ", at: " << pos << " is invalid, cannot update it!!!";
return false;
}
- //kDebug() << "// TRYING TO UPDATE CLIP at: " << pos << ", TK: " << track;
- Mlt::Service service(m_mltProducer->parent().get_service());
- if (service.type() != tractor_type) {
- kWarning() << "// TRACTOR PROBLEM";
- return false;
- }
- service.lock();
- Mlt::Tractor tractor(service);
- Mlt::Producer trackProducer(tractor.track(track));
+
+ Mlt::Producer trackProducer(tractor->track(track));
Mlt::Playlist trackPlaylist((mlt_playlist) trackProducer.get_service());
int clipIndex = trackPlaylist.get_clip_index_at(pos);
Mlt::Producer *clipProducer = trackPlaylist.replace_with_blank(clipIndex);
if (clipProducer == NULL || clipProducer->is_blank()) {
kDebug() << "// ERROR UPDATING CLIP PROD";
delete clipProducer;
- service.unlock();
return false;
}
Mlt::Producer *clip = prod->cut(clipProducer->get_in(), clipProducer->get_out());
if (!clip || !clip->is_valid()) {
if (clip) delete clip;
delete clipProducer;
- service.unlock();
return false;
}
// move all effects to the correct producer
trackPlaylist.insert_at(pos, clip, 1);
delete clip;
delete clipProducer;
- service.unlock();
return true;
}
}
tractor.removeChild(track);
//kDebug() << "/////////// RESULT SCENE: \n" << doc.toString();
- setSceneList(doc.toString(), m_framePosition);
+ setSceneList(doc.toString(), m_mltConsumer->position());
emit refreshDocumentProducers(false, false);
}