Ejemplo n.º 1
0
QHash <ProjectClip *, AbstractClipJob *> FilterJob::prepareJob(QList <ProjectClip*> clips, QStringList parameters)
{
    QHash <ProjectClip *, AbstractClipJob *> jobs;
    QStringList sources;
    for (int i = 0; i < clips.count(); i++) {
        sources << clips.at(i)->url().toLocalFile();
    }
    QString filterName = parameters.first();
    if (filterName == QLatin1String("framebuffer")) {
        QMap <QString, QString> producerParams = QMap <QString, QString> ();
        QMap <QString, QString> filterParams = QMap <QString, QString> ();
        QMap <QString, QString> consumerParams = QMap <QString, QString> ();
        QMap <QString, QString> extraParams = QMap <QString, QString> ();
        producerParams.insert(QStringLiteral("in"), QStringLiteral("0"));
        producerParams.insert(QStringLiteral("out"), QStringLiteral("-1"));
        extraParams.insert(QStringLiteral("projecttreefilter"), QStringLiteral("1"));
        extraParams.insert(QStringLiteral("producer_profile"), QStringLiteral("1"));
        for (int i = 0; i < clips.count(); i++) {
            QString prodstring = QString("framebuffer:" + sources.at(i) + "?-1");
            producerParams.insert(QStringLiteral("producer"), prodstring);
            consumerParams.insert(QStringLiteral("consumer"), "xml:" + sources.at(i) + ".mlt");
            ProjectClip *clip = clips.at(i);
            MeltJob *job = new MeltJob(clip->clipType(), clip->clipId(), producerParams, filterParams, consumerParams, extraParams);
            job->description = i18n("Reverse clip");
            job->setAddClipToProject(true);
            jobs.insert(clip, job);
        }
        return jobs;
    }
    if (filterName == QLatin1String("motion_est")) {
        // Show config dialog
        QPointer<QDialog> d = new QDialog(QApplication::activeWindow());
        Ui::SceneCutDialog_UI ui;
        ui.setupUi(d);
        // Set  up categories
        for (int i = 0; i < 5; ++i) {
            ui.marker_type->insertItem(i, i18n("Category %1", i));
            ui.marker_type->setItemData(i, CommentedTime::markerColor(i), Qt::DecorationRole);
        }
        ui.marker_type->setCurrentIndex(KdenliveSettings::default_marker_type());
        if (d->exec() != QDialog::Accepted) {
            delete d;
            return jobs;
        }
        // Autosplit filter
        QMap <QString, QString> producerParams = QMap <QString, QString> ();
        QMap <QString, QString> filterParams = QMap <QString, QString> ();
        QMap <QString, QString> consumerParams = QMap <QString, QString> ();
        
        // Producer params
        // None

        // Filter params, use a smaller region of the image to speed up operation
        // In fact, it's faster to rescale whole image than using part of it (bounding=\"25%x25%:15%x15\")
        filterParams.insert(QStringLiteral("filter"), filterName);
        filterParams.insert(QStringLiteral("shot_change_list"), QStringLiteral("0"));
        filterParams.insert(QStringLiteral("denoise"), QStringLiteral("0"));
        
        // Consumer
        consumerParams.insert(QStringLiteral("consumer"), QStringLiteral("null"));
        consumerParams.insert(QStringLiteral("all"), QStringLiteral("1"));
        consumerParams.insert(QStringLiteral("terminate_on_pause"), QStringLiteral("1"));
        consumerParams.insert(QStringLiteral("real_time"), QStringLiteral("-1"));
        // We just want to find scene change, set all mathods to the fastests
        consumerParams.insert(QStringLiteral("rescale"), QStringLiteral("nearest"));
        consumerParams.insert(QStringLiteral("deinterlace_method"), QStringLiteral("onefield"));
        consumerParams.insert(QStringLiteral("top_field_first"), QStringLiteral("-1"));
        
        // Extra
        QMap <QString, QString> extraParams;
        extraParams.insert(QStringLiteral("key"), QStringLiteral("shot_change_list"));
        extraParams.insert(QStringLiteral("projecttreefilter"), QStringLiteral("1"));
        QString keyword(QStringLiteral("%count"));
        extraParams.insert(QStringLiteral("resultmessage"), i18n("Found %1 scenes.", keyword));
        extraParams.insert(QStringLiteral("resize_profile"), QStringLiteral("160"));
        if (ui.store_data->isChecked()) {
            // We want to save result as clip metadata
            extraParams.insert(QStringLiteral("storedata"), QStringLiteral("1"));
        }
        if (ui.zone_only->isChecked()) {
            // We want to analyze only clip zone
            extraParams.insert(QStringLiteral("zoneonly"), QStringLiteral("1"));
        }
        if (ui.add_markers->isChecked()) {
            // We want to create markers
            extraParams.insert(QStringLiteral("addmarkers"), QString::number(ui.marker_type->currentIndex()));
            extraParams.insert(QStringLiteral("label"), i18n("Scene "));
        }
        if (ui.cut_scenes->isChecked()) {
            // We want to cut scenes
            extraParams.insert(QStringLiteral("cutscenes"), QStringLiteral("1"));
        }
        delete d;
        
        for (int i = 0; i < clips.count(); i++) {
            // Set clip specific infos

            // in and out
            int in = 0;
            int out = -1;
            ProjectClip *clip = clips.at(i);
            if (extraParams.contains(QStringLiteral("zoneonly"))) {
                // Analyse clip zone only, remove in / out and replace with zone
                QPoint zone = clip->zone();
                in = zone.x();
                out = zone.y();
            }
            producerParams.insert(QStringLiteral("in"), QString::number(in));
            producerParams.insert(QStringLiteral("out"), QString::number(out));
            producerParams.insert(QStringLiteral("producer"), sources.at(i));
            
            // Destination
            // Since this job is only doing analysis, we have a null consumer and no destination
            MeltJob *job = new MeltJob(clip->clipType(), clip->clipId(), producerParams, filterParams, consumerParams, extraParams);
            job->description = i18n("Auto split");
            jobs.insert(clip, job);
        }
        return jobs;
    }
    if (filterName == QLatin1String("vidstab")) {
        // vidstab 
        QPointer<ClipStabilize> d = new ClipStabilize(sources, filterName);
        if (d->exec() == QDialog::Accepted) {
            QMap <QString, QString> producerParams = d->producerParams();
            QMap <QString, QString> filterParams = d->filterParams();
            QMap <QString, QString> consumerParams = d->consumerParams();
            QMap <QString, QString> extraParams;
            extraParams.insert(QStringLiteral("producer_profile"), QStringLiteral("1"));
            QString destination = d->destination();
            QUrl trffile;
            for (int i = 0; i < clips.count(); i++) {
                // Set clip specific infos

                // in and out
                int in = 0;
                int out = -1;
                ProjectClip *clip = clips.at(i);
                if (extraParams.contains(QStringLiteral("zoneonly"))) {
                    // Analyse clip zone only, remove in / out and replace with zone
                    QPoint zone = clip->zone();
                    in = zone.x();
                    out = zone.y();
                }
                producerParams.insert(QStringLiteral("in"), QString::number(in));
                producerParams.insert(QStringLiteral("out"), QString::number(out));
                producerParams.insert(QStringLiteral("producer"), sources.at(i));

                // Consumer
                QString consumerName = consumerParams.value(QStringLiteral("consumer"));
                if (clips.count() == 1) {
                    // We only have one clip, destination points to the final url
                    consumerParams.insert(QStringLiteral("consumer"), consumerName + ':' + destination);
                    trffile = QUrl::fromLocalFile(destination + ".trf");
                } else {
                    // Filter several clips, destination points to a folder
                    QString mltfile = destination + clip->url().fileName() + ".mlt";
                    consumerParams.insert(QStringLiteral("consumer"), consumerName + ':' + mltfile);
                    trffile = QUrl::fromLocalFile(mltfile + ".trf");
                }
                // Append a 'filename' parameter for saving vidstab data
                filterParams.insert(QStringLiteral("filename"), trffile.path());
                MeltJob *job = new MeltJob(clip->clipType(), clip->clipId(), producerParams, filterParams, consumerParams, extraParams);
                job->setAddClipToProject(d->autoAddClip());
                job->description = d->desc();
                jobs.insert(clip, job);
            }
        }
        delete d;
        return jobs;
    }
    return jobs;
}