]> git.sesse.net Git - kdenlive/commitdiff
Fix freeze when seeking with opengl display
authorJean-Baptiste Mardelle <jb@kdenlive.org>
Sun, 14 Oct 2012 23:40:08 +0000 (01:40 +0200)
committerJean-Baptiste Mardelle <jb@kdenlive.org>
Sun, 14 Oct 2012 23:40:08 +0000 (01:40 +0200)
src/renderer.cpp
src/renderer.h

index 482384d8d3af9a5a6692a0468b014f0deaad3fe9..8e67bfdfd3d7582d39191310d0bcb06833837095 100644 (file)
@@ -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<int>,QList<int>,stringMap)), this, SLOT(slotMultiStreamProducerFound(const QString &,QList<int>,QList<int>,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: "<<requestedSeekPosition;
+       m_mltProducer->seek(requestedSeekPosition);
+       //m_mltConsumer->purge();
+       if (m_mltProducer->get_speed() == 0) {
+           refresh();
+       }
     }
 }
 
index 201e353bb6550663da81b07ece4580f9853266d4..f1ca980ce43f5420cd1622136deebafbe24d9cc6 100644 (file)
@@ -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<int> audio_list, QList<int> 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: