}
//TODO: connect record monitor to audio scopes
- /*
+
if (self->analyseAudio) {
self->showAudio(frame);
}
- */
+
}
AbstractRender("capture", parent),
doCapture(0),
sendFrameForAnalysis(false),
+ analyseAudio(KdenliveSettings::monitor_audio()),
+ processingImage(false),
m_mltConsumer(NULL),
m_mltProducer(NULL),
m_mltProfile(NULL),
+ m_showFrameEvent(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);
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();
m_mltConsumer = new Mlt::Consumer(*m_mltProfile, "sdl_audio");
m_mltConsumer->set("preview_off", 1);
m_mltConsumer->set("preview_format", mlt_image_rgb24);
- m_mltConsumer->listen("consumer-frame-show", this, (mlt_listener) consumer_gl_frame_show);
+ m_showFrameEvent = m_mltConsumer->listen("consumer-frame-show", this, (mlt_listener) consumer_gl_frame_show);
} else {
m_mltConsumer = new Mlt::Consumer(*m_mltProfile, "sdl_preview");
m_mltConsumer->set("window_id", m_winid);
- m_mltConsumer->listen("consumer-frame-show", this, (mlt_listener) rec_consumer_frame_preview);
+ m_showFrameEvent = m_mltConsumer->listen("consumer-frame-show", this, (mlt_listener) rec_consumer_frame_preview);
}
//m_mltConsumer->set("resize", 1);
//m_mltConsumer->set("terminate_on_pause", 1);
bool isPlaylist = false;
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();
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;
}
// So the vector is of size samples*channels.
QVector<int16_t> sampleVector(samples*num_channels);
memcpy(sampleVector.data(), data, samples*num_channels*sizeof(int16_t));
-
if (samples > 0) {
emit audioSamplesSignal(sampleVector, freq, num_channels, samples);
}
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();
}
kDebug()<<"-- CREATING CAP: "<<params<<", PATH: "<<path;
tmp = qstrdup(QString("avformat:" + path).toUtf8().constData());
m_mltConsumer = new Mlt::Consumer(*m_mltProfile, tmp);
- m_mltConsumer->set("real_time", KdenliveSettings::mltthreads());
+ m_mltConsumer->set("real_time", -KdenliveSettings::mltthreads());
delete[] tmp;
QStringList paramList = params.split(" ", QString::SkipEmptyParts);
return false;
}
- // FIXME: the event object returned by the listen gets leaked...
- m_mltConsumer->listen("consumer-frame-render", this, (mlt_listener) rec_consumer_frame_show);
+ if (m_livePreview < 2) m_showFrameEvent = m_mltConsumer->listen("consumer-frame-render", this, (mlt_listener) rec_consumer_frame_show);
tmp = qstrdup(playlist.toUtf8().constData());
if (xmlPlaylist) {
// create an xml producer
m_mltConsumer->connect(*m_mltProducer);
if (m_mltConsumer->start() == -1) {
+ if (m_showFrameEvent) delete m_showFrameEvent;
+ m_showFrameEvent = NULL;
delete m_mltConsumer;
m_mltConsumer = NULL;
return 0;
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);
//delete clip;
}
-void MltDeviceCapture::setOverlayEffect(const QString tag, QStringList parameters)
+void MltDeviceCapture::setOverlayEffect(const QString &tag, QStringList parameters)
{
if (m_mltProducer == NULL || !m_mltProducer->is_valid()) return;
Mlt::Service service(m_mltProducer->parent().get_service());