Mlt::Producer* Video4LinuxWidget::newProducer(Mlt::Profile& profile) { if (!profile.is_explicit()) { Mlt::Profile ntscProfile("dv_ntsc"); Mlt::Profile palProfile("dv_pal"); if (ui->v4lWidthSpinBox->value() == ntscProfile.width() && ui->v4lHeightSpinBox->value() == ntscProfile.height()) { profile.set_sample_aspect(ntscProfile.sample_aspect_num(), ntscProfile.sample_aspect_den()); profile.set_progressive(ntscProfile.progressive()); profile.set_colorspace(ntscProfile.colorspace()); profile.set_frame_rate(ntscProfile.frame_rate_num(), ntscProfile.frame_rate_den()); } else if (ui->v4lWidthSpinBox->value() == palProfile.width() && ui->v4lHeightSpinBox->value() == palProfile.height()) { profile.set_sample_aspect(palProfile.sample_aspect_num(), palProfile.sample_aspect_den()); profile.set_progressive(palProfile.progressive()); profile.set_colorspace(palProfile.colorspace()); profile.set_frame_rate(palProfile.frame_rate_num(), palProfile.frame_rate_den()); } else { profile.set_width(ui->v4lWidthSpinBox->value()); profile.set_height(ui->v4lHeightSpinBox->value()); profile.set_sample_aspect(1, 1); profile.set_progressive(1); profile.set_colorspace(601); profile.set_frame_rate(ui->v4lFramerateSpinBox->value() * 10000, 10000); } } Mlt::Producer* p = new Mlt::Producer(profile, URL().toLatin1().constData()); if (!p->is_valid()) { delete p; p = new Mlt::Producer(profile, "color:"); p->set("resource1", QString("video4linux2:%1") .arg(ui->v4lLineEdit->text()).toLatin1().constData()); p->set("error", 1); } else if (m_audioWidget) { Mlt::Producer* audio = dynamic_cast<AbstractProducerWidget*>(m_audioWidget)->newProducer(profile); Mlt::Tractor* tractor = new Mlt::Tractor; tractor->set("_profile", profile.get_profile(), 0); tractor->set_track(*p, 0); delete p; tractor->set_track(*audio, 1); delete audio; p = new Mlt::Producer(tractor->get_producer()); delete tractor; p->set("resource1", QString("video4linux2:%1") .arg(ui->v4lLineEdit->text()).toLatin1().constData()); } p->set("device", ui->v4lLineEdit->text().toLatin1().constData()); p->set("width", ui->v4lWidthSpinBox->value()); p->set("height", ui->v4lHeightSpinBox->value()); if (ui->v4lFramerateSpinBox->value() > 0) p->set("framerate", ui->v4lFramerateSpinBox->value()); p->set("standard", ui->v4lStandardCombo->currentText().toLatin1().constData()); p->set("channel", ui->v4lChannelSpinBox->value()); p->set("audio_ix", ui->v4lAudioComboBox->currentIndex()); p->set("force_seekable", 0); p->set(kBackgroundCaptureProperty, 1); p->set(kShotcutCaptionProperty, "Video4Linux"); return p; }
void MeltJob::startJob() { if (m_url.isEmpty()) { m_errorMessage.append(i18n("No producer for this clip.")); setStatus(JOBCRASHED); return; } int in = m_params.takeFirst().toInt(); if (in > 0 && !m_extra.contains("offset")) m_extra.insert("offset", QString::number(in)); int out = m_params.takeFirst().toInt(); QString producerParams =m_params.takeFirst(); QString filter = m_params.takeFirst(); QString filterParams = m_params.takeFirst(); QString consumer = m_params.takeFirst(); if (consumer.contains(':')) m_dest = consumer.section(':', 1); QString consumerParams = m_params.takeFirst(); // optional params int startPos = -1; if (!m_params.isEmpty()) startPos = m_params.takeFirst().toInt(); int track = -1; if (!m_params.isEmpty()) track = m_params.takeFirst().toInt(); if (!m_extra.contains("finalfilter")) m_extra.insert("finalfilter", filter); if (out != -1 && out <= in) { m_errorMessage.append(i18n("Clip zone undefined (%1 - %2).", in, out)); setStatus(JOBCRASHED); return; } if (m_extra.contains("producer_profile")) { m_profile = new Mlt::Profile; m_profile->set_explicit(false); } else { m_profile = new Mlt::Profile(KdenliveSettings::current_profile().toUtf8().constData()); } if (m_extra.contains("resize_profile")) { m_profile->set_height(m_extra.value("resize_profile").toInt()); m_profile->set_width(m_profile->height() * m_profile->sar()); } if (out == -1) { m_producer = new Mlt::Producer(*m_profile, m_url.toUtf8().constData()); if (m_producer) m_length = m_producer->get_length(); } else { Mlt::Producer *tmp = new Mlt::Producer(*m_profile, m_url.toUtf8().constData()); if (tmp) m_producer = tmp->cut(in, out); delete tmp; if (m_producer) m_length = m_producer->get_playtime(); } if (!m_producer || !m_producer->is_valid()) { // Clip was removed or something went wrong, Notify user? //m_errorMessage.append(i18n("Invalid clip")); setStatus(JOBCRASHED); return; } if (m_extra.contains("producer_profile")) { m_profile->from_producer(*m_producer); m_profile->set_explicit(true); } QStringList list = producerParams.split(' ', QString::SkipEmptyParts); foreach(const QString &data, list) { if (data.contains('=')) { m_producer->set(data.section('=', 0, 0).toUtf8().constData(), data.section('=', 1, 1).toUtf8().constData()); } } if (consumer.contains(":")) { m_consumer = new Mlt::Consumer(*m_profile, consumer.section(':', 0, 0).toUtf8().constData(), consumer.section(':', 1).toUtf8().constData()); } else { m_consumer = new Mlt::Consumer(*m_profile, consumer.toUtf8().constData()); } if (!m_consumer || !m_consumer->is_valid()) { m_errorMessage.append(i18n("Cannot create consumer %1.", consumer)); setStatus(JOBCRASHED); return; } //m_consumer->set("terminate_on_pause", 1 ); //m_consumer->set("eof", "pause" ); m_consumer->set("real_time", -KdenliveSettings::mltthreads() ); list = consumerParams.split(' ', QString::SkipEmptyParts); foreach(const QString &data, list) { if (data.contains('=')) { kDebug()<<"// filter con: "<<data; m_consumer->set(data.section('=', 0, 0).toUtf8().constData(), data.section('=', 1, 1).toUtf8().constData()); } } m_filter = new Mlt::Filter(*m_profile, filter.toUtf8().data()); if (!m_filter || !m_filter->is_valid()) { m_errorMessage = i18n("Filter %1 crashed", filter); setStatus(JOBCRASHED); return; } list = filterParams.split(' ', QString::SkipEmptyParts); foreach(const QString &data, list) { if (data.contains('=')) { kDebug()<<"// filter p: "<<data; m_filter->set(data.section('=', 0, 0).toUtf8().constData(), data.section('=', 1, 1).toUtf8().constData()); } } Mlt::Tractor tractor; Mlt::Playlist playlist; playlist.append(*m_producer); tractor.set_track(playlist, 0); m_consumer->connect(tractor); m_producer->set_speed(0); m_producer->seek(0); m_producer->attach(*m_filter); m_showFrameEvent = m_consumer->listen("consumer-frame-show", this, (mlt_listener) consumer_frame_render); m_producer->set_speed(1); m_consumer->run(); QMap <QString, QString> jobResults; if (m_jobStatus != JOBABORTED && m_extra.contains("key")) { QString result = m_filter->get(m_extra.value("key").toUtf8().constData()); jobResults.insert(m_extra.value("key"), result); } if (!jobResults.isEmpty() && m_jobStatus != JOBABORTED) { emit gotFilterJobResults(m_clipId, startPos, track, jobResults, m_extra); } if (m_jobStatus == JOBABORTED || m_jobStatus == JOBWORKING) m_jobStatus = JOBDONE; }
Mlt::Producer *DirectShowVideoWidget::producer(Mlt::Profile& profile) { #if 0 if (!profile.is_explicit()) { Mlt::Profile ntscProfile("dv_ntsc"); Mlt::Profile palProfile("dv_pal"); if (ui->v4lWidthSpinBox->value() == ntscProfile.width() && ui->v4lHeightSpinBox->value() == ntscProfile.height()) { profile.set_sample_aspect(ntscProfile.sample_aspect_num(), ntscProfile.sample_aspect_den()); profile.set_progressive(ntscProfile.progressive()); profile.set_colorspace(ntscProfile.colorspace()); profile.set_frame_rate(ntscProfile.frame_rate_num(), ntscProfile.frame_rate_den()); } else if (ui->v4lWidthSpinBox->value() == palProfile.width() && ui->v4lHeightSpinBox->value() == palProfile.height()) { profile.set_sample_aspect(palProfile.sample_aspect_num(), palProfile.sample_aspect_den()); profile.set_progressive(palProfile.progressive()); profile.set_colorspace(palProfile.colorspace()); profile.set_frame_rate(palProfile.frame_rate_num(), palProfile.frame_rate_den()); } else { profile.set_width(ui->v4lWidthSpinBox->value()); profile.set_height(ui->v4lHeightSpinBox->value()); profile.set_sample_aspect(1, 1); profile.set_progressive(1); profile.set_colorspace(601); profile.set_frame_rate(ui->v4lFramerateSpinBox->value() * 10000, 10000); } } #endif Mlt::Producer* p = 0; if (ui->videoCombo->currentIndex() > 0) { p = new Mlt::Producer(profile, QString("dshow:video=%1") .arg(ui->videoCombo->currentText()) .toLatin1().constData()); } if (ui->audioCombo->currentIndex() > 0) { Mlt::Producer* audio = new Mlt::Producer(profile, QString("dshow:audio=%1").arg(ui->audioCombo->currentText()) .toLatin1().constData()); if (p && p->is_valid() && audio->is_valid()) { Mlt::Tractor* tractor = new Mlt::Tractor; tractor->set("_profile", profile.get_profile(), 0); tractor->set("resource", p->get("resource")); tractor->set("resource2", audio->get("resource")); tractor->set_track(*p, 0); delete p; tractor->set_track(*audio, 1); delete audio; p = tractor; } else { p = audio; } } if (!p || !p->is_valid()) { delete p; p = new Mlt::Producer(profile, "color:"); if (ui->videoCombo->currentIndex() > 0) { p->set("resource", QString("dshow:video=%1") .arg(ui->videoCombo->currentText()) .toLatin1().constData()); } if (ui->audioCombo->currentIndex() > 0) { QString resource = QString("dshow:audio=%1").arg(ui->audioCombo->currentText()); if (ui->videoCombo->currentIndex() > 0) { p->set("resource2", resource.toLatin1().constData()); } else { p->set("resource", resource.toLatin1().constData()); } } p->set("error", 1); } p->set("force_seekable", 0); return p; }