#include <KDebug>
#include <KStandardDirs>
#include <KMessageBox>
-#include <KLocale>
+#include <KLocalizedString>
#include <KTemporaryFile>
#include <QTimer>
#include <QString>
#include <QApplication>
#include <QThread>
+#include <QTimer>
#include <cstdlib>
#include <cstdarg>
self->showFrame(frame);
}
-static void rec_consumer_frame_show(mlt_consumer, MltDeviceCapture * self, mlt_frame frame_ptr)
+/*static void rec_consumer_frame_show(mlt_consumer, MltDeviceCapture * self, mlt_frame frame_ptr)
{
Mlt::Frame frame(frame_ptr);
if (!frame.is_valid()) return;
self->gotCapturedFrame(frame);
-}
+}*/
static void rec_consumer_frame_preview(mlt_consumer, MltDeviceCapture * self, mlt_frame frame_ptr)
{
}
-MltDeviceCapture::MltDeviceCapture(QString profile, VideoPreviewContainer *surface, QWidget *parent) :
- AbstractRender("capture", parent),
+MltDeviceCapture::MltDeviceCapture(QString profile, VideoSurface *surface, QWidget *parent) :
+ AbstractRender(Kdenlive::RecordMonitor, parent),
doCapture(0),
sendFrameForAnalysis(false),
- analyseAudio(KdenliveSettings::monitor_audio()),
processingImage(false),
m_mltConsumer(NULL),
m_mltProducer(NULL),
m_showFrameEvent(NULL),
m_droppedFrames(0),
m_livePreview(KdenliveSettings::enable_recording_preview()),
- m_captureDisplayWidget(surface),
m_winid((int) surface->winId())
{
- if (profile.isEmpty()) profile = KdenliveSettings::current_profile();
+ m_captureDisplayWidget = surface;
+ analyseAudio = KdenliveSettings::monitor_audio();
+ if (profile.isEmpty())
+ profile = KdenliveSettings::current_profile();
buildConsumer(profile);
connect(this, SIGNAL(unblockPreview()), this, SLOT(slotPreparePreview()));
m_droppedFramesTimer.setSingleShot(false);
//m_mltConsumer->set("real_time", 0);
}
+void MltDeviceCapture::pause()
+{
+ if (m_mltConsumer) {
+ m_mltConsumer->set("refresh", 0);
+ //m_mltProducer->set_speed(0.0);
+ m_mltConsumer->purge();
+ }
+}
+
void MltDeviceCapture::stop()
{
m_droppedFramesTimer.stop();
bool isPlaylist = false;
- disconnect(this, SIGNAL(imageReady(QImage)), this, SIGNAL(frameUpdated(QImage)));
- m_captureDisplayWidget->stop();
+ //disconnect(this, SIGNAL(imageReady(QImage)), this, SIGNAL(frameUpdated(QImage)));
+ //m_captureDisplayWidget->stop();
if (m_showFrameEvent) delete m_showFrameEvent;
m_showFrameEvent = NULL;
if (m_mltConsumer) {
m_mltConsumer->set("refresh", 0);
- m_mltConsumer->stop();
+ m_mltConsumer->purge();
+ m_mltConsumer->stop();
//if (!m_mltConsumer->is_stopped()) m_mltConsumer->stop();
}
if (m_mltProducer) {
}
-void MltDeviceCapture::doRefresh()
+void MltDeviceCapture::slotDoRefresh()
{
- if (m_mltConsumer) m_mltConsumer->set("refresh", 1);
+ QMutexLocker locker(&m_mutex);
+ if (!m_mltProducer)
+ return;
+ if (m_mltConsumer) {
+ if (m_mltConsumer->is_stopped()) m_mltConsumer->start();
+ m_mltConsumer->purge();
+ m_mltConsumer->set("refresh", 1);
+ }
}
int width = 0;
int height = 0;
const uchar* image = frame.get_image(format, width, height);
- QImage qimage(width, height, QImage::Format_ARGB32);
+ QImage qimage(width, height, QImage::Format_RGB888);
+ //QImage qimage(width, height, QImage::Format_ARGB32_Premultiplied);
memcpy(qimage.bits(), image, width * height * 3);
- emit frameUpdated(qimage.rgbSwapped());
+ emit frameUpdated(qimage);
}
void MltDeviceCapture::showFrame(Mlt::Frame& frame)
return 0;
}
m_droppedFramesTimer.start();
- connect(this, SIGNAL(imageReady(QImage)), this, SIGNAL(frameUpdated(QImage)));
+ //connect(this, SIGNAL(imageReady(QImage)), this, SIGNAL(frameUpdated(QImage)));
return 1;
}
//memcpy(image.bits(), data, width * height * 3);
QImage image((uchar *)data, width, height, QImage::Format_RGB888);
- m_captureDisplayWidget->setImage(image);
+ //m_captureDisplayWidget->setImage(image);
//TEST: is it better to process frame conversion ouside MLT???
/*
renderProps->set("mlt_service", "avformat");
renderProps->set("target", path.toUtf8().constData());
renderProps->set("real_time", -KdenliveSettings::mltthreads());
- renderProps->set("terminate_on_pause", 0);
+ //renderProps->set("terminate_on_pause", 0);
renderProps->set("mlt_profile", m_activeProfile.toUtf8().constData());
- QStringList paramList = params.split(" ", QString::SkipEmptyParts);
+ QStringList paramList = params.split(' ', QString::SkipEmptyParts);
char *tmp2;
- for (int i = 0; i < paramList.count(); i++) {
- tmp = qstrdup(paramList.at(i).section("=", 0, 0).toUtf8().constData());
- QString value = paramList.at(i).section("=", 1, 1);
+ for (int i = 0; i < paramList.count(); ++i) {
+ tmp = qstrdup(paramList.at(i).section('=', 0, 0).toUtf8().constData());
+ QString value = paramList.at(i).section('=', 1, 1);
if (value == "%threads") value = QString::number(QThread::idealThreadCount());
tmp2 = qstrdup(value.toUtf8().constData());
renderProps->set(tmp, tmp2);
}
- tmp = qstrdup(playlist.toUtf8().constData());
if (xmlPlaylist) {
// create an xml producer
- m_mltProducer = new Mlt::Producer(*m_mltProfile, "xml-string", tmp);
+ m_mltProducer = new Mlt::Producer(*m_mltProfile, "xml-string", playlist.toUtf8().constData());
}
else {
// create a producer based on mltproducer parameter
- m_mltProducer = new Mlt::Producer(*m_mltProfile, tmp);
+ m_mltProducer = new Mlt::Producer(*m_mltProfile, playlist.toUtf8().constData());
}
- delete[] tmp;
if (m_mltProducer == NULL || !m_mltProducer->is_valid()) {
kDebug()<<"//// ERROR CREATRING PROD";
+ if (m_mltConsumer) {
+ delete m_mltConsumer;
+ m_mltConsumer = NULL;
+ }
+ if (m_mltProducer) {
+ delete m_mltProducer;
+ m_mltProducer = NULL;
+ }
return false;
}
//delete clip;
}
-void MltDeviceCapture::setOverlayEffect(const QString &tag, QStringList parameters)
+void MltDeviceCapture::setOverlayEffect(const QString &tag, const QStringList ¶meters)
{
if (m_mltProducer == NULL || !m_mltProducer->is_valid()) return;
Mlt::Service service(m_mltProducer->parent().get_service());
delete[] tmp;
if (filter && filter->is_valid()) {
for (int j = 0; j < parameters.count(); j++) {
- filter->set(parameters.at(j).section("=", 0, 0).toUtf8().constData(), parameters.at(j).section("=", 1, 1).toUtf8().constData());
+ filter->set(parameters.at(j).section('=', 0, 0).toUtf8().constData(), parameters.at(j).section('=', 1, 1).toUtf8().constData());
}
trackService.attach(*filter);
}
rgb_ptr += 3;
}
//emit imageReady(image);
- m_captureDisplayWidget->setImage(image);
+ //m_captureDisplayWidget->setImage(image);
emit unblockPreview();
//processingImage = false;
}
}
+
+#include "mltdevicecapture.moc"