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)
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)));
// 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();
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.
}
}
+void AbstractScopeWidget::slotRenderZoneUpdated(QImage frame)
+{
+ m_scopeImage = frame;
+ slotRenderZoneUpdated();
+}
+
void AbstractScopeWidget::slotResetRealtimeFactor(bool realtimeChecked)
{
if (!realtimeChecked) {
/** @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;
QFuture<QImage> m_threadScope;
QFuture<QImage> m_threadBackground;
+ QImage m_scopeImage;
+
bool initialDimensionUpdateDone;
void prodHUDThread();
void prodScopeThread();
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);
emit signalHUDRenderingFinished(0, 1);
return QImage();
}
-QImage Histogram::renderScope(uint accelFactor)
+QImage Histogram::renderScope(uint accelFactor, QImage qimage)
{
QTime start = QTime::currentTime();
start.start();
| (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);
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;
#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) {
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);
}
GenTime seekPosition() const;
int seekFramePosition() const;
+ void emitFrameUpdated(Mlt::Frame&);
void emitFrameNumber(double position);
void emitConsumerStopped();
* 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:
}
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;
bool isBackgroundDependingOnInput() const;
QImage renderHUD(uint accelerationFactor);
- QImage renderScope(uint accelerationFactor);
+ QImage renderScope(uint accelerationFactor, QImage);
QImage renderBackground(uint accelerationFactor);
};
return hud;
}
-QImage Vectorscope::renderScope(uint accelerationFactor)
+QImage Vectorscope::renderScope(uint accelerationFactor, QImage qimage)
{
QTime start = QTime::currentTime();
QImage scope;
} 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);
///// 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;
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;
/// Implemented methods ///
QRect scopeRect();
QImage renderHUD(uint);
- QImage renderScope(uint);
+ QImage renderScope(uint, QImage);
QImage renderBackground(uint);
bool isHUDDependingOnInput() const;
bool isScopeDependingOnInput() const;