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;
}
tractor.removeChild(track);
//kDebug() << "/////////// RESULT SCENE: \n" << doc.toString();
- setSceneList(doc.toString(), m_framePosition);
+ setSceneList(doc.toString(), m_mltConsumer->position());
emit refreshDocumentProducers(false, false);
}