From a3b6a34d67b2a04c13f63a30092acde2fc821455 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Mardelle Date: Mon, 15 Oct 2012 01:40:08 +0200 Subject: [PATCH] Fix freeze when seeking with opengl display --- src/renderer.cpp | 54 +++++++++++++++++++++++++++++++----------------- src/renderer.h | 3 +++ 2 files changed, 38 insertions(+), 19 deletions(-) diff --git a/src/renderer.cpp b/src/renderer.cpp index 482384d8..8e67bfdf 100644 --- a/src/renderer.cpp +++ b/src/renderer.cpp @@ -95,13 +95,11 @@ static void consumer_gl_frame_show(mlt_consumer, Render * self, mlt_frame frame_ { // 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) : @@ -131,6 +129,7 @@ Render::Render(Kdenlive::MONITORID rendererName, int winid, QString profile, QWi m_refreshTimer.setInterval(100); connect(&m_refreshTimer, SIGNAL(timeout()), this, SLOT(refresh())); connect(this, SIGNAL(multiStreamFound(const QString &,QList,QList,stringMap)), this, SLOT(slotMultiStreamProducerFound(const QString &,QList,QList,stringMap))); + connect(this, SIGNAL(checkSeeking()), this, SLOT(slotCheckSeeking())); } Render::~Render() @@ -397,7 +396,7 @@ void Render::seek(int time) if (requestedSeekPosition == SEEK_INACTIVE) { requestedSeekPosition = time; m_mltProducer->seek(time); - m_mltConsumer->purge(); + //m_mltConsumer->purge(); if (m_mltProducer->get_speed() == 0) { refresh(); } @@ -1715,10 +1714,10 @@ void Render::emitFrameNumber() emit rendererPosition(currentPos); if (requestedSeekPosition != SEEK_INACTIVE) { m_mltProducer->seek(requestedSeekPosition); - requestedSeekPosition = SEEK_INACTIVE; if (m_mltProducer->get_speed() == 0) { refresh(); } + requestedSeekPosition = SEEK_INACTIVE; } } @@ -1767,17 +1766,34 @@ void Render::exportCurrentFrame(KUrl url, bool /*notify*/) 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: "<seek(requestedSeekPosition); + //m_mltConsumer->purge(); + if (m_mltProducer->get_speed() == 0) { + refresh(); + } } } diff --git a/src/renderer.h b/src/renderer.h index 201e353b..f1ca980c 100644 --- a/src/renderer.h +++ b/src/renderer.h @@ -396,6 +396,8 @@ private slots: /** @brief A clip with multiple video streams was found, ask what to do. */ void slotMultiStreamProducerFound(const QString path, QList audio_list, QList video_list, stringMap data); + void slotCheckSeeking(); + signals: /** @brief The renderer received a reply to a getFileProperties request. */ @@ -439,6 +441,7 @@ signals: void showImageSignal(QImage); void showAudioSignal(const QByteArray &); void addClip(const KUrl &, stringMap); + void checkSeeking(); public slots: -- 2.39.2