X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fmltdevicecapture.cpp;h=7998aa2d4e83499baba0b25912a8684f7d79d439;hb=40871a54f9a9e06f0a97800e9e0048acefdbde18;hp=914ce5ae52fa60256984bf1521e2911c6ded822f;hpb=0871a6e39f765e4bdd043bcd04d2c34ed0f3a250;p=kdenlive diff --git a/src/mltdevicecapture.cpp b/src/mltdevicecapture.cpp index 914ce5ae..7998aa2d 100644 --- a/src/mltdevicecapture.cpp +++ b/src/mltdevicecapture.cpp @@ -83,15 +83,15 @@ MltDeviceCapture::MltDeviceCapture(QString profile, VideoPreviewContainer *surfa AbstractRender("capture", parent), doCapture(0), sendFrameForAnalysis(false), + analyseAudio(KdenliveSettings::monitor_audio()), + processingImage(false), m_mltConsumer(NULL), m_mltProducer(NULL), m_mltProfile(NULL), m_droppedFrames(0), m_livePreview(KdenliveSettings::recording_preview()), m_captureDisplayWidget(surface), - m_winid((int) surface->winId()), - analyseAudio(KdenliveSettings::monitor_audio()), - processingImage(false) + m_winid((int) surface->winId()) { if (profile.isEmpty()) profile = KdenliveSettings::current_profile(); buildConsumer(profile); @@ -114,7 +114,7 @@ void MltDeviceCapture::buildConsumer(const QString &profileName) char *tmp = qstrdup(m_activeProfile.toUtf8().constData()); setenv("MLT_PROFILE", tmp, 1); m_mltProfile = new Mlt::Profile(tmp); - m_mltProfile->get_profile()->is_explicit = 1; + m_mltProfile->set_explicit(true); delete[] tmp; QString videoDriver = KdenliveSettings::videodrivername(); @@ -166,6 +166,7 @@ void MltDeviceCapture::stop() bool isPlaylist = false; disconnect(this, SIGNAL(imageReady(QImage)), this, SIGNAL(frameUpdated(QImage))); m_captureDisplayWidget->stop(); + if (m_mltConsumer) { m_mltConsumer->set("refresh", 0); m_mltConsumer->stop(); @@ -195,20 +196,6 @@ void MltDeviceCapture::stop() mlt_type = mlt_properties_get(properties, "mlt_type"); resource = mlt_properties_get(properties, "mlt_service"); } - for (int trackNb = tractor.count() - 1; trackNb >= 0; --trackNb) { - Mlt::Producer trackProducer(tractor.track(trackNb)); - Mlt::Playlist trackPlaylist((mlt_playlist) trackProducer.get_service()); - if (trackPlaylist.type() == playlist_type) { - for (int i = 0; i < trackPlaylist.count();i++) { - // We need to manually decrease the ref count and close the producer, otherwise - // the video4linux device stays open, seems like a bug in MLT that is not cleaning properly - mlt_properties props = MLT_PRODUCER_PROPERTIES(trackPlaylist.get_clip(i)->get_parent()); - while (mlt_properties_ref_count(props) > 0) mlt_properties_dec_ref(props); - if (trackPlaylist.get_clip(i)) mlt_producer_close(trackPlaylist.get_clip(i)->get_parent()); - } - mlt_playlist_close(trackPlaylist.get_playlist()); - } - } delete field; field = NULL; } @@ -331,16 +318,15 @@ void MltDeviceCapture::gotCapturedFrame(Mlt::Frame& frame) m_frameCount++; if (m_livePreview == 2) return; if (m_livePreview == 0 && (m_frameCount % 10 > 0)) return; - mlt_image_format format = mlt_image_rgb24a; + mlt_image_format format = mlt_image_rgb24; int width = 0; int height = 0; - //QImage image(width, height, QImage::Format_ARGB32_Premultiplied); uint8_t *data = frame.get_image(format, width, height, 0); - QImage image((uchar *)data, width, height, QImage::Format_ARGB32_Premultiplied); - - /*uchar *buffer = frame.get_image(format, width, height); - memcpy(image.bits(), buffer, width * height * 4);*/ - m_captureDisplayWidget->setImage(image.rgbSwapped()); + //QImage image(width, height, QImage::Format_RGB888); + //memcpy(image.bits(), data, width * height * 3); + QImage image((uchar *)data, width, height, QImage::Format_RGB888); + + m_captureDisplayWidget->setImage(image); //TEST: is it better to process frame conversion ouside MLT??? /* @@ -373,7 +359,7 @@ void MltDeviceCapture::saveFrame(Mlt::Frame& frame) Mlt::Producer trackProducer(tractor.track(0)); trackProducer.set("hide", 0); - qimage.rgbSwapped().save(m_capturePath); + qimage.save(m_capturePath); emit frameSaved(m_capturePath); m_capturePath.clear(); } @@ -409,7 +395,7 @@ bool MltDeviceCapture::slotStartCapture(const QString ¶ms, const QString &pa kDebug()<<"-- CREATING CAP: "<set("real_time", KdenliveSettings::mltthreads()); + m_mltConsumer->set("real_time", -KdenliveSettings::mltthreads()); delete[] tmp; QStringList paramList = params.split(" ", QString::SkipEmptyParts); @@ -507,7 +493,7 @@ void MltDeviceCapture::setOverlay(const QString &path) Mlt::Field *field = tractor.field(); Mlt::Transition *transition = new Mlt::Transition(*m_mltProfile, "composite"); transition->set_in_and_out(0, 0); - transition->set("geometry", "0,0:100%x100%:70"); + transition->set("geometry", "0/0:100%x100%:70"); transition->set("fill", 1); transition->set("operator", "and"); transition->set("a_track", 0);