]> git.sesse.net Git - kdenlive/commitdiff
Update scopes using a frame image from the consumer-frame-show event
authorDan Dennedy <dan@dennedy.org>
Mon, 9 Aug 2010 04:42:30 +0000 (04:42 +0000)
committerDan Dennedy <dan@dennedy.org>
Mon, 9 Aug 2010 04:42:30 +0000 (04:42 +0000)
handler instead of requesting it from the producer with possibly an
undesirable seek as a side effect.

svn path=/trunk/kdenlive/; revision=4691

13 files changed:
CMakeLists.txt
src/abstractscopewidget.cpp
src/abstractscopewidget.h
src/histogram.cpp
src/histogram.h
src/renderer.cpp
src/renderer.h
src/rgbparade.cpp
src/rgbparade.h
src/vectorscope.cpp
src/vectorscope.h
src/waveform.cpp
src/waveform.h

index 4df7fdc8e88322be6952c7928c7f3125a80fcece..3fb304921b441af6f3526f59d5251857d451902f 100644 (file)
@@ -60,4 +60,4 @@ add_subdirectory(titles)
 add_subdirectory(po)
 add_subdirectory(man)
 
-configure_file(${CMAKE_SOURCE_DIR}/kdenlive-config.h.cmake kdenlive-config.h @ONLY)
\ No newline at end of file
+configure_file(${CMAKE_SOURCE_DIR}/kdenlive-config.h.cmake kdenlive-config.h @ONLY)
index d38d6b4ce8902aa52a4f39a6992d726fe03ed20a..f0317534fe859eb280f9611d4f8ff1209c86b6fc 100644 (file)
@@ -68,7 +68,7 @@ AbstractScopeWidget::AbstractScopeWidget(Monitor *projMonitor, Monitor *clipMoni
     b &= connect(this, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(customContextMenuRequested(QPoint)));
 
     b &= connect(m_activeRender, SIGNAL(rendererPosition(int)), this, SLOT(slotRenderZoneUpdated()));
-    b &= connect(m_activeRender, SIGNAL(frameUpdated(int)), this, SLOT(slotRenderZoneUpdated()));
+    b &= connect(m_activeRender, SIGNAL(frameUpdated(QImage)), this, SLOT(slotRenderZoneUpdated(QImage)));
 
     b &= connect(this, SIGNAL(signalHUDRenderingFinished(uint,uint)), this, SLOT(slotHUDRenderingFinished(uint,uint)));
     b &= connect(this, SIGNAL(signalScopeRenderingFinished(uint,uint)), this, SLOT(slotScopeRenderingFinished(uint,uint)));
@@ -122,7 +122,7 @@ void AbstractScopeWidget::prodScopeThread()
 
             // See http://doc.qt.nokia.com/latest/qtconcurrentrun.html#run about
             // running member functions in a thread
-            m_threadScope = QtConcurrent::run(this, &AbstractScopeWidget::renderScope, m_accelFactorScope);
+            m_threadScope = QtConcurrent::run(this, &AbstractScopeWidget::renderScope, m_accelFactorScope, m_scopeImage);
 
             qDebug() << "Scope thread started in " << widgetName();
 
@@ -328,7 +328,7 @@ void AbstractScopeWidget::slotActiveMonitorChanged(bool isClipMonitor)
     m_activeRender = (isClipMonitor) ? m_clipMonitor->render : m_projMonitor->render;
 
     b &= connect(m_activeRender, SIGNAL(rendererPosition(int)), this, SLOT(slotRenderZoneUpdated()));
-    b &= connect(m_activeRender, SIGNAL(frameUpdated(int)), this, SLOT(slotRenderZoneUpdated()));
+    b &= connect(m_activeRender, SIGNAL(frameUpdated(QImage)), this, SLOT(slotRenderZoneUpdated(QImage)));
     Q_ASSERT(b);
 
     // Update the scope for the new monitor.
@@ -357,6 +357,12 @@ void AbstractScopeWidget::slotRenderZoneUpdated()
     }
 }
 
+void AbstractScopeWidget::slotRenderZoneUpdated(QImage frame)
+{
+    m_scopeImage = frame;
+    slotRenderZoneUpdated();
+}
+
 void AbstractScopeWidget::slotResetRealtimeFactor(bool realtimeChecked)
 {
     if (!realtimeChecked) {
index 9514db5c3ee2e2f5d4ef7fa9a4f1d26b209f9870..415c8bc2c50e190673422ce5fc7fe04f3c3af0d4 100644 (file)
@@ -125,7 +125,7 @@ protected:
     /** @brief Scope renderer. Must emit signalScopeRenderingFinished()
         when calculation has finished, to allow multi-threading.
         accelerationFactor hints how much faster than usual the calculation should be accomplished, if possible. */
-    virtual QImage renderScope(uint accelerationFactor) = 0;
+    virtual QImage renderScope(uint accelerationFactor, QImage) = 0;
     /** @brief Background renderer. Must emit signalBackgroundRenderingFinished(). @see renderScope */
     virtual QImage renderBackground(uint accelerationFactor) = 0;
 
@@ -193,6 +193,8 @@ private:
     QFuture<QImage> m_threadScope;
     QFuture<QImage> m_threadBackground;
 
+    QImage m_scopeImage;
+
     bool initialDimensionUpdateDone;
     void prodHUDThread();
     void prodScopeThread();
@@ -206,6 +208,7 @@ private slots:
     void slotActiveMonitorChanged(bool isClipMonitor);
     void customContextMenuRequested(const QPoint &pos);
     void slotRenderZoneUpdated();
+    void slotRenderZoneUpdated(QImage);
     void slotHUDRenderingFinished(uint mseconds, uint accelerationFactor);
     void slotScopeRenderingFinished(uint mseconds, uint accelerationFactor);
     void slotBackgroundRenderingFinished(uint mseconds, uint accelerationFactor);
index 52935f3178650d2cda26a1bb34297fba9bd0a0b1..64c307a871918edc019a793984c27f7906dc8976 100644 (file)
@@ -65,7 +65,7 @@ QImage Histogram::renderHUD(uint)
     emit signalHUDRenderingFinished(0, 1);
     return QImage();
 }
-QImage Histogram::renderScope(uint accelFactor)
+QImage Histogram::renderScope(uint accelFactor, QImage qimage)
 {
     QTime start = QTime::currentTime();
     start.start();
@@ -75,7 +75,7 @@ QImage Histogram::renderScope(uint accelFactor)
                                | (ui->cbG->isChecked() ? 1 : 0) * HistogramGenerator::ComponentG
                                | (ui->cbB->isChecked() ? 1 : 0) * HistogramGenerator::ComponentB;
 
-    QImage histogram = m_histogramGenerator->calculateHistogram(m_scopeRect.size(), m_activeRender->extractFrame(m_activeRender->seekFramePosition()),
+    QImage histogram = m_histogramGenerator->calculateHistogram(m_scopeRect.size(), qimage,
                                                        componentFlags, m_aUnscaled->isChecked(), accelFactor);
 
     emit signalScopeRenderingFinished(start.elapsed(), accelFactor);
index 1c653e9a2fd0aef4accb16d0831f31b8b5a91026..2b1f1eb96439cf274af99c64bdfdb04d1a88ba7c 100644 (file)
@@ -34,7 +34,7 @@ private:
     bool isScopeDependingOnInput() const;
     bool isBackgroundDependingOnInput() const;
     QImage renderHUD(uint accelerationFactor);
-    QImage renderScope(uint accelerationFactor);
+    QImage renderScope(uint accelerationFactor, QImage);
     QImage renderBackground(uint accelerationFactor);
     Ui::Histogram_UI *ui;
 
index 26791b5beae82497ee564a2f44ac87a28175b112..3f5cf863224c1253c687c94ddcd52728f02c0c6d 100644 (file)
@@ -65,6 +65,8 @@ static void consumer_frame_show(mlt_consumer, Render * self, mlt_frame frame_ptr
 #endif
 
     self->emitFrameNumber(mlt_frame_get_position(frame_ptr));
+    if (frame_ptr->convert_image)
+        self->emitFrameUpdated(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) {
@@ -1438,12 +1440,19 @@ const QString & Render::rendererName() const
     return m_name;
 }
 
+void Render::emitFrameUpdated(Mlt::Frame& frame)
+{
+    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);
+       memcpy(qimage.bits(), image, width * height * 4);
+       emit frameUpdated(qimage);
+}
+
 void Render::emitFrameNumber(double position)
 {
-    if (position == m_framePosition) {
-        emit frameUpdated((int) position);
-        return;
-    }
     m_framePosition = position;
     emit rendererPosition((int) position);
 }
index 3c0e98dccb2601bfd589a25038b28d9859d1f724..3b51dc7a144c88d3823b32d2919d2f4729754117 100644 (file)
@@ -161,6 +161,7 @@ Q_OBJECT public:
     GenTime seekPosition() const;
     int seekFramePosition() const;
 
+    void emitFrameUpdated(Mlt::Frame&);
     void emitFrameNumber(double position);
     void emitConsumerStopped();
 
@@ -344,7 +345,7 @@ signals:
      * Used in Mac OS X. */
     void showImageSignal(QImage);
     /** @brief The renderer refreshed the current frame, but no seeking was done. */
-    void frameUpdated(int);
+    void frameUpdated(QImage);
 
 public slots:
 
index 3e412ab7e6a65b59dbe95643f161663fcc21c9eb..3fe44412e78cf7d059e0eb0dfee33ecb5bc396b2 100644 (file)
@@ -37,11 +37,11 @@ QRect RGBParade::scopeRect()
 }
 
 QImage RGBParade::renderHUD(uint) { return QImage(); }
-QImage RGBParade::renderScope(uint accelerationFactor)
+QImage RGBParade::renderScope(uint accelerationFactor, QImage qimage)
 {
     QTime start = QTime::currentTime();
     start.start();
-    QImage parade = m_rgbParadeGenerator->calculateRGBParade(m_scopeRect.size(), m_activeRender->extractFrame(m_activeRender->seekFramePosition()),
+    QImage parade = m_rgbParadeGenerator->calculateRGBParade(m_scopeRect.size(), qimage,
                                                     true, accelerationFactor);
     emit signalScopeRenderingFinished(start.elapsed(), accelerationFactor);
     return parade;
index a02fb8da102556c956834374616f1c09b5668e51..21233cfe62d0ee76a602228539f5801b82d9c5eb 100644 (file)
@@ -39,7 +39,7 @@ private:
     bool isBackgroundDependingOnInput() const;
 
     QImage renderHUD(uint accelerationFactor);
-    QImage renderScope(uint accelerationFactor);
+    QImage renderScope(uint accelerationFactor, QImage);
     QImage renderBackground(uint accelerationFactor);
 };
 
index cca16ef1dfca189071cf18d8bf751386e54b8536..01a41d4dd6ff187a50372b510a780c47e4c4b827 100644 (file)
@@ -192,7 +192,7 @@ QImage Vectorscope::renderHUD(uint)
     return hud;
 }
 
-QImage Vectorscope::renderScope(uint accelerationFactor)
+QImage Vectorscope::renderScope(uint accelerationFactor, QImage qimage)
 {
     QTime start = QTime::currentTime();
     QImage scope;
@@ -202,7 +202,7 @@ QImage Vectorscope::renderScope(uint accelerationFactor)
     } else {
 
         scope = m_vectorscopeGenerator->calculateVectorscope(m_scopeRect.size(),
-                                                             m_activeRender->extractFrame(m_activeRender->seekFramePosition()),
+                                                             qimage,
                                                              m_gain, (VectorscopeGenerator::PaintMode) ui->paintMode->itemData(ui->paintMode->currentIndex()).toInt(),
                                                              m_aAxisEnabled->isChecked(), accelerationFactor);
 
index 438efa4c9eec342aaa2ca18e3e0907fbd57d127a..bf6e5c08406503042d88acf2940f6de7786ea411 100644 (file)
@@ -41,7 +41,7 @@ protected:
     ///// Implemented methods /////
     QRect scopeRect();
     QImage renderHUD(uint accelerationFactor);
-    QImage renderScope(uint accelerationFactor);
+    QImage renderScope(uint accelerationFactor, QImage);
     QImage renderBackground(uint accelerationFactor);
     bool isHUDDependingOnInput() const;
     bool isScopeDependingOnInput() const;
index fdd22b97d2147505fee82b79f77f287736796925..c4191fa97b9e4bd45f2beb4ba8f5459aef032026 100644 (file)
@@ -58,13 +58,13 @@ QImage Waveform::renderHUD(uint)
     return QImage();
 }
 
-QImage Waveform::renderScope(uint accelFactor)
+QImage Waveform::renderScope(uint accelFactor, QImage qimage)
 {
     QTime start = QTime::currentTime();
     start.start();
 
     QImage wave = m_waveformGenerator->calculateWaveform(scopeRect().size(),
-                                                         m_activeRender->extractFrame(m_activeRender->seekFramePosition()), true, accelFactor);
+                                                         qimage, true, accelFactor);
 
     emit signalScopeRenderingFinished(start.elapsed(), 1);
     return wave;
index 7e4f07392fa6d06095f26a102b4b8b6fee0141c4..d1e3735f887f0f8bc5545ffb2227e8b5f5c475ec 100644 (file)
@@ -39,7 +39,7 @@ private:
     /// Implemented methods ///
     QRect scopeRect();
     QImage renderHUD(uint);
-    QImage renderScope(uint);
+    QImage renderScope(uint, QImage);
     QImage renderBackground(uint);
     bool isHUDDependingOnInput() const;
     bool isScopeDependingOnInput() const;