{
// detect if the producer has finished playing. Is there a better way to do it?
Mlt::Frame frame(frame_ptr);
- self->showFrame(frame);
- if (frame.get_double("_speed") == 0.0) {
- self->emitConsumerStopped();
- } else if (frame.get_double("_speed") < 0.0 && mlt_frame_get_position(frame_ptr) <= 0) {
- self->pause();
- self->emitConsumerStopped();
+ if (frame.get_double("_speed") < 0.0 && mlt_frame_get_position(frame_ptr) <= 0) {
+ self->pause();
+ self->emitConsumerStopped();
}
+ self->showFrame(frame);
}
Render::Render(Kdenlive::MONITORID rendererName, int winid, QString profile, QWidget *parent) :
m_refreshTimer.setInterval(100);
connect(&m_refreshTimer, SIGNAL(timeout()), this, SLOT(refresh()));
connect(this, SIGNAL(multiStreamFound(const QString &,QList<int>,QList<int>,stringMap)), this, SLOT(slotMultiStreamProducerFound(const QString &,QList<int>,QList<int>,stringMap)));
+ connect(this, SIGNAL(checkSeeking()), this, SLOT(slotCheckSeeking()));
}
Render::~Render()
if (requestedSeekPosition == SEEK_INACTIVE) {
requestedSeekPosition = time;
m_mltProducer->seek(time);
- m_mltConsumer->purge();
+ //m_mltConsumer->purge();
if (m_mltProducer->get_speed() == 0) {
refresh();
}
emit rendererPosition(currentPos);
if (requestedSeekPosition != SEEK_INACTIVE) {
m_mltProducer->seek(requestedSeekPosition);
- requestedSeekPosition = SEEK_INACTIVE;
if (m_mltProducer->get_speed() == 0) {
refresh();
}
+ requestedSeekPosition = SEEK_INACTIVE;
}
}
void Render::showFrame(Mlt::Frame& frame)
{
- emit rendererPosition((int) m_mltConsumer->position());
- mlt_image_format format = mlt_image_rgb24a;
- int width = 0;
- int height = 0;
- const uchar* image = frame.get_image(format, width, height);
- QImage qimage(width, height, QImage::Format_ARGB32_Premultiplied);
- memcpy(qimage.scanLine(0), image, width * height * 4);
- emit showImageSignal(qimage);
- if (analyseAudio) showAudio(frame);
- if (sendFrameForAnalysis && frame.get_frame()->convert_image) {
- emit frameUpdated(qimage.rgbSwapped());
+ int currentPos = m_mltConsumer->position();
+ if (currentPos == requestedSeekPosition) requestedSeekPosition = SEEK_INACTIVE;
+ emit rendererPosition(currentPos);
+ if (frame.is_valid()) {
+ mlt_image_format format = mlt_image_rgb24a;
+ int width = 0;
+ int height = 0;
+ const uchar* image = frame.get_image(format, width, height);
+ QImage qimage(width, height, QImage::Format_ARGB32_Premultiplied);
+ memcpy(qimage.scanLine(0), image, width * height * 4);
+ emit showImageSignal(qimage);
+ if (analyseAudio) showAudio(frame);
+ if (sendFrameForAnalysis && frame.get_frame()->convert_image) {
+ emit frameUpdated(qimage.rgbSwapped());
+ }
+ }
+ emit checkSeeking();
+}
+
+void Render::slotCheckSeeking()
+{
+ if (requestedSeekPosition != SEEK_INACTIVE) {
+ kDebug()<<"// SEEKONG: "<<requestedSeekPosition;
+ m_mltProducer->seek(requestedSeekPosition);
+ //m_mltConsumer->purge();
+ if (m_mltProducer->get_speed() == 0) {
+ refresh();
+ }
}
}