X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fmltdevicecapture.cpp;h=c94f896dd2707840e243a43acfd3037407b0d7d7;hb=56aee6aedeeed3efd10ada8fe3c229eddc01ef05;hp=aebcf41c549e9c3abfbfb8f4db494a19fb776921;hpb=79cb3b67ab057892daa877733ee41f8ae474985d;p=kdenlive diff --git a/src/mltdevicecapture.cpp b/src/mltdevicecapture.cpp index aebcf41c..c94f896d 100644 --- a/src/mltdevicecapture.cpp +++ b/src/mltdevicecapture.cpp @@ -19,13 +19,14 @@ #include "mltdevicecapture.h" #include "kdenlivesettings.h" #include "definitions.h" +#include "widgets/videosurface.h" #include #include #include #include -#include +#include #include #include @@ -33,6 +34,7 @@ #include #include #include +#include #include #include @@ -48,12 +50,12 @@ static void consumer_gl_frame_show(mlt_consumer, MltDeviceCapture * self, mlt_fr 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) { @@ -76,11 +78,10 @@ static void rec_consumer_frame_preview(mlt_consumer, MltDeviceCapture * self, ml } -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), @@ -88,10 +89,12 @@ MltDeviceCapture::MltDeviceCapture(QString profile, VideoPreviewContainer *surfa 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); @@ -163,19 +166,29 @@ void MltDeviceCapture::buildConsumer(const QString &profileName) //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) { @@ -215,9 +228,16 @@ void MltDeviceCapture::stop() } -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); + } } @@ -239,9 +259,10 @@ void MltDeviceCapture::emitFrameUpdated(Mlt::Frame& frame) 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) @@ -308,7 +329,7 @@ bool MltDeviceCapture::slotStartPreview(const QString &producer, bool xmlFormat) 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; } @@ -343,7 +364,7 @@ void MltDeviceCapture::gotCapturedFrame(Mlt::Frame& frame) //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??? /* @@ -433,15 +454,15 @@ bool MltDeviceCapture::slotStartCapture(const QString ¶ms, const QString &pa 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); @@ -502,19 +523,25 @@ bool MltDeviceCapture::slotStartCapture(const QString ¶ms, const QString &pa } - 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; } @@ -588,7 +615,7 @@ void MltDeviceCapture::setOverlay(const QString &path) //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()); @@ -626,7 +653,7 @@ void MltDeviceCapture::setOverlayEffect(const QString &tag, QStringList paramete 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); } @@ -731,7 +758,7 @@ void MltDeviceCapture::uyvy2rgb(unsigned char *yuv_buffer, int width, int height rgb_ptr += 3; } //emit imageReady(image); - m_captureDisplayWidget->setImage(image); + //m_captureDisplayWidget->setImage(image); emit unblockPreview(); //processingImage = false; } @@ -747,3 +774,5 @@ void MltDeviceCapture::slotAllowPreview() } + +#include "mltdevicecapture.moc"