]> git.sesse.net Git - kdenlive/commitdiff
Turn Stabilize filter in to a clip job
authorJean-Baptiste Mardelle <jb@kdenlive.org>
Sun, 22 Jan 2012 14:39:12 +0000 (15:39 +0100)
committerJean-Baptiste Mardelle <jb@kdenlive.org>
Sun, 22 Jan 2012 14:39:12 +0000 (15:39 +0100)
14 files changed:
effects/sox_gain.xml
src/clipstabilize.cpp
src/clipstabilize.h
src/mainwindow.cpp
src/mainwindow.h
src/projectlist.cpp
src/projectlist.h
src/projecttree/abstractclipjob.cpp
src/projecttree/abstractclipjob.h
src/projecttree/cutclipjob.cpp
src/projecttree/meltjob.cpp
src/projecttree/meltjob.h
src/widgets/clipstabilize_ui.ui
src/widgets/cutjobdialog_ui.ui

index 4a0e5adb4cae45384b27dd8121e3ddc3c7a4b68d..d40552b5242a1a4c0a6ead625972c7e270088bcb 100644 (file)
@@ -6,7 +6,7 @@
        <parameter type="double" name="gain" max="50" min="-50" default="5.00" decimals="2">
                <name>Gain</name>
        </parameter>
-       <parameter type="filterjob" filtertag="sox:analysis" filterparams="" consumer="null" consumerparams="video_off=1 all=1" wantedproperties="gain" finalfilter="sox_gain">
+       <parameter type="filterjob" filtertag="sox:analysis" filterparams="" consumer="null" consumerparams="video_off=1 all=1 terminate_on_pause=1" wantedproperties="gain" finalfilter="sox_gain">
                <name>Normalize</name>
        </parameter>
 </effect>
index 6e0122ced3a761d613b9d38f89ec0e634b878e92..cc741b20590e00c81e9a6f2d52205eccac666344 100644 (file)
 #include <QSlider>
 #include <KFileDialog>
 
-ClipStabilize::ClipStabilize(KUrl::List urls, const QString &params, Mlt::Filter* filter,QWidget * parent) :
-        QDialog(parent), m_profile(NULL),m_consumer(NULL),m_playlist(NULL),m_urls(urls),m_duration(0),m_filter(filter),vbox(NULL)
+ClipStabilize::ClipStabilize(const QString &dest, int count, const QString &filterName,QWidget * parent) :
+        QDialog(parent), 
+        m_filtername(filterName),
+        m_count(count),
+        vbox(NULL)
 {
     setFont(KGlobalSettings::toolBarFont());
     setupUi(this);
-    if (filter) setAttribute(Qt::WA_DeleteOnClose);
-    log_text->setHidden(true);
     setWindowTitle(i18n("Stabilize Clip"));
-    auto_add->setText(i18np("Add clip to project", "Add clips to project", m_urls.count()));
-    m_profile = new Mlt::Profile(KdenliveSettings::current_profile().toUtf8().constData());
-    filtername = params;
-
+    auto_add->setText(i18np("Add clip to project", "Add clips to project", count));
 
     QPalette p = palette();
     KColorScheme scheme(p.currentColorGroup(), KColorScheme::View, KSharedConfig::openConfig(KdenliveSettings::colortheme()));
@@ -62,40 +60,25 @@ ClipStabilize::ClipStabilize(KUrl::List urls, const QString &params, Mlt::Filter
             .arg(dark_bg.name()).arg(selected_bg.name()).arg(hover_bg.name()).arg(light_bg.name()));
     setStyleSheet(stylesheet);
 
-    if (m_urls.count() == 1) {
-        QString fileName = m_urls.at(0).path(); //.section('.', 0, -1);
-        QString newFile = fileName.append(".mlt");
+    if (m_count == 1) {
+        QString newFile = dest;
+        newFile.append(".mlt");
         KUrl dest(newFile);
-        source_url->setUrl(m_urls.at(0));
         dest_url->setMode(KFile::File);
-        dest_url->setUrl(dest);
+        dest_url->setUrl(KUrl(newFile));
         dest_url->fileDialog()->setOperationMode(KFileDialog::Saving);
-        urls_list->setHidden(true);
-        connect(source_url, SIGNAL(textChanged(const QString &)), this, SLOT(slotUpdateParams()));
     } else {
-        label_source->setHidden(true);
-        source_url->setHidden(true);
         label_dest->setText(i18n("Destination folder"));
         dest_url->setMode(KFile::Directory);
-        dest_url->setUrl(KUrl(m_urls.at(0).directory()));
+        dest_url->setUrl(KUrl(dest));
         dest_url->fileDialog()->setOperationMode(KFileDialog::Saving);
-        for (int i = 0; i < m_urls.count(); i++)
-            urls_list->addItem(m_urls.at(i).path());
     }
-    if (!params.isEmpty()) {
-        label_profile->setHidden(true);
-        profile_list->setHidden(true);
-        //ffmpeg_params->setPlainText(params.simplified());
-        /*if (!description.isEmpty()) {
-            transcode_info->setText(description);
-        } else transcode_info->setHidden(true);*/
-    } 
 
-    if (filtername=="videostab"){
+    if (m_filtername=="videostab"){
         QStringList ls;
         ls << "shutterangle,type,int,value,0,min,0,max,100,tooltip,Angle that Images could be maximum rotated";
         fillParameters(ls);
-    }else if (filtername=="videostab2"){
+    }else if (m_filtername=="videostab2"){
         QStringList ls;
         ls << "accuracy,type,int,value,4,min,1,max,10,tooltip,Accuracy of Shakiness detection";
         ls << "shakiness,type,int,value,4,min,1,max,10,tooltip,How shaky is the Video";
@@ -115,11 +98,8 @@ ClipStabilize::ClipStabilize(KUrl::List urls, const QString &params, Mlt::Filter
         fillParameters(ls);
 
     }
-    connect(button_start, SIGNAL(clicked()), this, SLOT(slotStartStabilize()));
-    connect(buttonBox,SIGNAL(rejected()), this, SLOT(slotAbortStabilize()));
 
-    m_timer=new QTimer(this);
-    connect(m_timer, SIGNAL(timeout()), this, SLOT(slotShowStabilizeInfo()));
+    //connect(buttonBox,SIGNAL(rejected()), this, SLOT(slotAbortStabilize()));
 
     vbox=new QVBoxLayout(optionsbox);
     QHashIterator<QString,QHash<QString,QString> > hi(m_ui_params);
@@ -152,19 +132,49 @@ ClipStabilize::~ClipStabilize()
     /*if (m_stabilizeProcess.state() != QProcess::NotRunning) {
         m_stabilizeProcess.close();
     }*/
-    if (m_stabilizeRun.isRunning()){
-        if (m_consumer){
-            m_consumer->stop();
-        }
-        m_stabilizeRun.waitForFinished();
+}
+
+QStringList ClipStabilize::params()
+{
+    //we must return a stringlist with:
+    // producerparams << filtername << filterparams << consumer << consumerparams
+    QStringList params;
+    // producer params
+    params << QString();
+    // filter
+    params << m_filtername;
+    QStringList filterparamsList;
+    QHashIterator <QString,QHash<QString,QString> > it(m_ui_params);
+    while (it.hasNext()){
+        it.next();
+        filterparamsList << it.key() + "=" + it.value().value("value");
     }
-    if (m_profile) free (m_profile);
-    if (m_consumer) free (m_consumer);
-    if (m_playlist) free (m_playlist);
+    params << filterparamsList.join(" ");
+    
+    // consumer
+    params << "xml";
+    // consumer params
+    QString title = i18n("Stabilised");
+    params << QString("all=1 title=\"%1\"").arg(title);
+    return params;
+}
+
+QString ClipStabilize::destination() const
+{
+    if (m_count == 1)
+        return dest_url->url().path();
+    else
+        return dest_url->url().directory(KUrl::AppendTrailingSlash);
+}
+
+QString ClipStabilize::desc() const
+{
+    return i18n("Stabilize clip");
 }
 
 void ClipStabilize::slotStartStabilize()
 {
+    /*
     if (m_consumer && !m_consumer->is_stopped()) {
         return;
     }
@@ -213,76 +223,10 @@ void ClipStabilize::slotStartStabilize()
             button_start->setEnabled(false);
         }
     }
-
-}
-
-void ClipStabilize::slotRunStabilize()
-{
-    if (m_consumer)
-    {
-        m_consumer->run();
-    }
-}
-
-void ClipStabilize::slotAbortStabilize()
-{
-    if (m_consumer)
-    {
-        m_timer->stop();
-        m_consumer->stop();
-        slotStabilizeFinished(false);
-    }
-}
-
-void ClipStabilize::slotShowStabilizeInfo()
-{
-    if (m_playlist){
-        job_progress->setValue((int) (100.0 * m_consumer->position()/m_playlist->get_out() ));
-        if (m_consumer->position()==m_playlist->get_out()){
-            m_timer->stop();
-            slotStabilizeFinished(true);
-        }
-    }
+*/
 }
 
-void ClipStabilize::slotStabilizeFinished(bool success)
-{
-    buttonBox->button(QDialogButtonBox::Abort)->setText(i18n("Close"));
-    button_start->setEnabled(true);
-    m_duration = 0;
-    if (m_stabilizeRun.isRunning()){
-        if (m_consumer){
-            m_consumer->stop();
-        }
-        m_stabilizeRun.waitForFinished();
-    }
-
-    if (success) {
-        log_text->setHtml(log_text->toPlainText() + "<br /><b>" + i18n("Stabilize finished."));
-        if (auto_add->isChecked()) {
-            KUrl url;
-            if (urls_list->count() > 0) {
-                url = KUrl(dest_url->url().path(KUrl::AddTrailingSlash) + source_url->url().fileName()+".mlt");
-            } else url = dest_url->url();
-            emit addClip(url);
-        }
-        if (urls_list->count() > 0 && m_urls.count() > 0) {
-            slotStartStabilize();
-            return;
-        } else if (auto_close->isChecked()) accept();
-    } else {
-        log_text->setHtml(log_text->toPlainText() + "<br /><b>" + i18n("Stabilizing FAILED!"));
-    }
-    if (m_playlist){
-        free(m_playlist);
-        m_playlist=NULL;
-    }
-    if (m_consumer){
-        free(m_consumer);
-        m_consumer=NULL;
-    }
 
-}
 
 void ClipStabilize::slotUpdateParams()
 {
index 3fe0600d765d08201108e46e89cf847b88fdbf4b..269c0c4be39ca4fb40f3553ed510fdd0eef7db2d 100644 (file)
@@ -42,30 +42,25 @@ class ClipStabilize : public QDialog, public Ui::ClipStabilize_UI
     Q_OBJECT
 
 public:
-    ClipStabilize(KUrl::List urls, const QString &params, Mlt::Filter* filter = NULL,QWidget * parent = 0);
+    ClipStabilize(const QString &dest, int count, const QString &filterName,QWidget * parent = 0);
     ~ClipStabilize();
     /** @brief Should the generated clip be added to current project. */
     bool autoAddClip() const;
+    /** @brief Return the filter parameters. */
+    QStringList params();
+    /** @brief Return the destination file or folder. */
+    QString destination() const;
+    /** @brief Return the job description. */
+    QString desc() const;
 
 
 private slots:
-    void slotShowStabilizeInfo();
     void slotStartStabilize();
-    void slotStabilizeFinished(bool success);
-    void slotRunStabilize();
-    void slotAbortStabilize();
     void slotUpdateParams();
 
 private:
-    QFuture<void> m_stabilizeRun;
-    QString filtername;
-    Mlt::Profile *m_profile;
-    Mlt::Consumer *m_consumer;
-    Mlt::Playlist *m_playlist;
-    KUrl::List m_urls;
-    int m_duration;
-    Mlt::Filter* m_filter;
-    QTimer *m_timer;
+    QString m_filtername;
+    int m_count;
     QHash<QString,QHash<QString,QString> > m_ui_params;
     QVBoxLayout *vbox;
     void fillParameters(QStringList);
index 084ec2c30becdca1bd43eee7a4b760ea255b4d5e..bfeab9c585ed333ecbbca7b466146a3b320ccf94 100644 (file)
@@ -54,7 +54,6 @@
 #include "interfaces.h"
 #include "config-kdenlive.h"
 #include "cliptranscode.h"
-#include "clipstabilize.h"
 #include "ui_templateclip_ui.h"
 #include "colorscopes/vectorscope.h"
 #include "colorscopes/waveform.h"
@@ -3890,27 +3889,33 @@ void MainWindow::loadTranscoders()
     }
 }
 
-void MainWindow::slotStabilize(KUrl::List urls)
+void MainWindow::slotStabilize()
 {
     QString condition,filtername;
+    QStringList ids;
 
-    if (urls.isEmpty()) {
-        QAction *action = qobject_cast<QAction *>(sender());
-       if (action){
-            filtername=action->data().toString();
-            urls = m_projectList->getConditionalUrls(condition);
-       }
+    // Stablize selected clips
+    QAction *action = qobject_cast<QAction *>(sender());
+    if (action){
+        filtername=action->data().toString();
     }
-    if (urls.isEmpty()) {
+    m_projectList->startClipFilterJob(filtername, condition);
+    /*
+    if (ids.isEmpty()) {
         m_messageLabel->setMessage(i18n("No clip to transcode"), ErrorMessage);
         return;
     }
-       Mlt::Profile profile;
-       Mlt::Filter filter(profile,filtername.toUtf8().data());
-       ClipStabilize *d=new ClipStabilize(urls,filtername,&filter);
-       connect(d, SIGNAL(addClip(KUrl)), this, SLOT(slotAddProjectClip(KUrl)));
-       d->show();
-
+    QString destination;
+    ProjectItem *item = m_projectList->getClipById(ids.at(0));
+    if (ids.count() == 1) {
+        
+    }
+    ClipStabilize *d = new ClipStabilize(destination, ids.count(), filtername);
+    //connect(d, SIGNAL(addClip(KUrl)), this, SLOT(slotAddProjectClip(KUrl)));
+    if (d->exec() == QDialog::Accepted) {
+        m_projectList->slotStabilizeClipJob(ids, d->autoAddClip(), d->params(), d->desc());
+    }
+    delete d;*/
 }
 
 void MainWindow::slotTranscode(KUrl::List urls)
@@ -3924,8 +3929,7 @@ void MainWindow::slotTranscode(KUrl::List urls)
         params = data.at(0);
         if (data.count() > 1) desc = data.at(1);
         if (data.count() > 3) condition = data.at(3);
-        QStringList ids = m_projectList->getConditionalIds(condition);
-        m_projectList->slotTranscodeClipJob(ids, params, desc);
+        m_projectList->slotTranscodeClipJob(condition, params, desc);
         return;
     }
     if (urls.isEmpty()) {
index 15332c572871a315c6e518019aee21757ddd8f6f..4444ef341b6a1f5b85f2a526eaa142f01f7d4d68 100644 (file)
@@ -482,7 +482,7 @@ private slots:
     void slotShowTimeline(bool show);
     void slotMaximizeCurrent(bool show);
     void slotTranscode(KUrl::List urls = KUrl::List());
-    void slotStabilize(KUrl::List urls = KUrl::List());
+    void slotStabilize();
     void slotTranscodeClip();
     /** @brief Archive project: creates a copy of the project file with all clips in a new folder. */
     void slotArchiveProject();
index fd462810c549e6515a73c29b9782aea11e749dd0..f525823512197fda4e3fd37b7db6bbd9a9f1a56e 100644 (file)
@@ -36,6 +36,7 @@
 #include "projectlistview.h"
 #include "timecodedisplay.h"
 #include "profilesdialog.h"
+#include "clipstabilize.h"
 #include "commands/editclipcommand.h"
 #include "commands/editclipcutcommand.h"
 #include "commands/editfoldercommand.h"
@@ -2730,13 +2731,16 @@ void ProjectList::slotCutClipJob(const QString &id, QPoint zone)
     slotCheckJobProcess();
 }
 
-void ProjectList::slotTranscodeClipJob(QStringList ids, QString params, QString desc)
+void ProjectList::slotTranscodeClipJob(const QString &condition, QString params, QString desc)
 {
     QStringList existingFiles;
+    QStringList ids = getConditionalIds(condition);
+    QStringList destinations;
     foreach(const QString &id, ids) {
         ProjectItem *item = getItemById(id);
         if (!item) continue;
         QString newFile = params.section(' ', -1).replace("%1", item->clipUrl().path());
+        destinations << newFile;
         if (QFile::exists(newFile)) existingFiles << newFile;
     }
     if (!existingFiles.isEmpty()) {
@@ -2747,30 +2751,36 @@ void ProjectList::slotTranscodeClipJob(QStringList ids, QString params, QString
     Ui::CutJobDialog_UI ui;
     ui.setupUi(d);
     d->setWindowTitle(i18n("Transcoding"));
-    ui.destination_label->setVisible(false);
     ui.extra_params->setMaximumHeight(QFontMetrics(font()).lineSpacing() * 5);
-    ui.file_url->setVisible(false);
+    if (ids.count() == 1) {
+        ui.file_url->setUrl(KUrl(destinations.first()));
+    }
+    else {
+        ui.destination_label->setVisible(false);
+        ui.file_url->setVisible(false);
+    }
     ui.extra_params->setVisible(false);
+    d->adjustSize();
     ui.button_more->setIcon(KIcon("configure"));
     ui.add_clip->setChecked(KdenliveSettings::add_clip_cut());
-    ui.extra_params->setPlainText(params.simplified());
+    ui.extra_params->setPlainText(params.simplified().section(" ", 0, -2));
     QString mess = desc;
     mess.append(" " + i18np("(%1 clip)", "(%1 clips)", ids.count()));
     ui.info_label->setText(mess);
-    d->adjustSize();
     if (d->exec() != QDialog::Accepted) {
         delete d;
         return;
     }
     params = ui.extra_params->toPlainText().simplified();
     KdenliveSettings::setAdd_clip_cut(ui.add_clip->isChecked());
-    delete d;
     
     foreach(const QString &id, ids) {
         ProjectItem *item = getItemById(id);
         if (!item || !item->referencedClip()) continue;
         QString src = item->clipUrl().path();
-        QString dest = params.section(' ', -1).replace("%1", src);
+        QString dest;
+        if (ids.count() > 1) dest = params.section(' ', -1).replace("%1", src);
+        else dest = ui.file_url->url().path();
         QStringList jobParams;
         jobParams << dest << src << QString() << QString();
         double clipFps = item->referencedClip()->getProperty("fps").toDouble();
@@ -2779,7 +2789,7 @@ void ProjectList::slotTranscodeClipJob(QStringList ids, QString params, QString
         QString duration = QString::number(max);
         jobParams << duration;
         jobParams << QString::number(KdenliveSettings::add_clip_cut());
-        jobParams << params.section(' ', 0, -2);
+        jobParams << params;
         CutClipJob *job = new CutClipJob(item->clipType(), id, jobParams);
         if (job->isExclusive() && hasPendingJob(item, job->jobType)) {
             delete job;
@@ -2788,12 +2798,11 @@ void ProjectList::slotTranscodeClipJob(QStringList ids, QString params, QString
         m_jobList.append(job);
         setJobStatus(item, job->jobType, JOBWAITING, 0, job->statusMessage());
     }
+    delete d;
     slotCheckJobProcess();
     
 }
 
-
-
 void ProjectList::slotCheckJobProcess()
 {        
     if (!m_jobThreads.futures().isEmpty()) {
@@ -2896,7 +2905,7 @@ void ProjectList::slotProcessJobs()
             emit updateJobStatus(job->clipId(), job->jobType, JOBDONE);
             //TODO: replace with more generic clip replacement framework
             if (job->jobType == PROXYJOB) emit gotProxy(job->clipId());
-            if (job->addClipToProject) {
+            if (job->addClipToProject()) {
                 emit addClip(destination, QString(), QString());
             }
         } else if (job->jobStatus == JOBCRASHED || job->jobStatus == JOBABORTED) {
@@ -3303,7 +3312,8 @@ void ProjectList::slotStartFilterJob(ItemInfo info, const QString&id, const QStr
     if (!item) return;
     QStringList jobParams;
     jobParams << QString::number(info.cropStart.frames(m_fps)) << QString::number((info.cropStart + info.cropDuration).frames(m_fps));
-    jobParams << filterName << filterParams << consumer << consumerParams << properties << QString::number(info.startPos.frames(m_fps)) << QString::number(info.track) << finalFilterName;
+    jobParams << QString() << filterName << filterParams << consumer << consumerParams << properties << QString::number(info.startPos.frames(m_fps)) << QString::number(info.track) << finalFilterName;
+    kDebug()<<"// JPB PARAMS:"<<jobParams;
     MeltJob *job = new MeltJob(item->clipType(), id, jobParams);
     if (job->isExclusive() && hasPendingJob(item, job->jobType)) {
         delete job;
@@ -3314,6 +3324,69 @@ void ProjectList::slotStartFilterJob(ItemInfo info, const QString&id, const QStr
     slotCheckJobProcess();
 }
 
+void ProjectList::startClipFilterJob(const QString &filterName, const QString &condition)
+{
+    QStringList ids = getConditionalIds(condition);
+    QString destination;
+    ProjectItem *item = getItemById(ids.at(0));
+    if (!item) {
+        emit displayMessage(i18n("Cannot find clip to process filter %1", filterName), -2);
+        return;
+    }
+    if (ids.count() == 1) {
+        destination = item->clipUrl().path();
+    }
+    else {
+        destination = item->clipUrl().directory();
+    }
+    ClipStabilize *d = new ClipStabilize(destination, ids.count(), filterName);
+    if (d->exec() == QDialog::Accepted) {
+        processClipJob(ids, d->destination(), d->autoAddClip(), d->params(), d->desc());
+    }
+    delete d;
+}
+
+void ProjectList::processClipJob(QStringList ids, const QString&destination, bool autoAdd, QStringList jobParams, const QString &description)
+{
+    QStringList preParams;
+    // in and out
+    preParams << QString::number(0) << QString::number(-1);
+    // producer params
+    preParams << jobParams.takeFirst();
+    // filter name
+    preParams << jobParams.takeFirst();
+    // filter params
+    preParams << jobParams.takeFirst();
+    // consumer
+    QString consumer = jobParams.takeFirst();
+    
+    foreach(const QString&id, ids) {
+        ProjectItem *item = getItemById(id);
+        if (!item) continue;
+        if (ids.count() == 1) {
+            consumer += ":" + destination;
+        }
+        else {
+            consumer += ":" + destination + item->clipUrl().fileName() + ".mlt";
+        }
+        preParams << consumer << jobParams;
+        
+        MeltJob *job = new MeltJob(item->clipType(), id, preParams);
+        if (autoAdd) {
+            job->setAddClipToProject(true);
+            kDebug()<<"// ADDING TRUE";
+        }
+        else kDebug()<<"// ADDING FALSE!!!";
+        if (job->isExclusive() && hasPendingJob(item, job->jobType)) {
+            delete job;
+            return;
+        }
+        m_jobList.append(job);
+        setJobStatus(item, job->jobType, JOBWAITING, 0, job->statusMessage());
+    }
+    slotCheckJobProcess();
+}
+
 void ProjectList::slotPrepareJobsMenu()
 {
     ProjectItem *item;
index 1f491e936eaad1524a2e6c3641c65cb2c04c8fc8..bd04931dcb23227b251672ac937a85db1898d84e 100644 (file)
@@ -257,9 +257,12 @@ public:
     void clearSelection();
     /** @brief Print required overlays over clip thumb (proxy, stabilized,...). */
     void processThumbOverlays(ProjectItem *item, QPixmap &pix);
+    /** @brief Start an MLT process job. */
+    void startClipFilterJob(const QString &filterName, const QString &condition);
+    /** @brief Set current document for the project tree. */
+    void setDocument(KdenliveDoc *doc);
 
 public slots:
-    void setDocument(KdenliveDoc *doc);
     void updateAllClips(bool displayRatioChanged, bool fpsChanged, QStringList brokenClips);
     void slotReplyGetImage(const QString &clipId, const QImage &img);
     void slotReplyGetImage(const QString &clipId, const QString &name, int width, int height);
@@ -297,9 +300,11 @@ public slots:
     void slotDeleteProxy(const QString proxyPath);
     /** @brief Start a hard cut clip job. */
     void slotCutClipJob(const QString &id, QPoint zone);
-    void slotTranscodeClipJob(QStringList ids, QString params, QString desc);
+    /** @brief Start transcoding selected clips. */
+    void slotTranscodeClipJob(const QString &condition, QString params, QString desc);
     /** @brief Start an MLT process job. */
     void slotStartFilterJob(ItemInfo, const QString&,const QString&,const QString&,const QString&,const QString&,const QString&,const QString&);
+    
 
 private:
     ProjectListView *m_listView;
@@ -390,6 +395,8 @@ private:
     void discardJobs(const QString &id, JOBTYPE type = NOJOBTYPE);
     /** @brief Get the list of job names for current clip. */
     QStringList getPendingJobs(const QString &id);
+    /** @brief Start an MLT process job. */
+    void processClipJob(QStringList ids, const QString&destination, bool autoAdd, QStringList jobParams, const QString &description);
 
 private slots:
     void slotClipSelected();
index cc3be060d26c14a80c09adf5c505fd286f4fc6ef..b1721f80784176c3f24fbfcbb92bd8a15731f639 100644 (file)
@@ -31,9 +31,9 @@ AbstractClipJob::AbstractClipJob(JOBTYPE type, CLIPTYPE cType, const QString &id
         clipType(cType),
         jobType(type),
         jobStatus(NOJOB),
-        m_clipId(id),
-        addClipToProject(false),
         replaceClip(false),
+        m_clipId(id),
+        m_addClipToProject(false),
         m_jobProcess(NULL)
 {
 }
@@ -42,6 +42,17 @@ AbstractClipJob::~AbstractClipJob()
 {
 }
 
+
+bool AbstractClipJob::addClipToProject() const
+{
+    return m_addClipToProject;
+}
+
+void AbstractClipJob::setAddClipToProject(bool add)
+{
+    m_addClipToProject = add;
+}
+
 void AbstractClipJob::setStatus(CLIPJOBSTATUS status)
 {
     jobStatus = status;
index 29dc5762ae23769b1b7763837c67810f39fd78e1..6123b3e975d04a01a1aaf222181eb7729974cde8 100644 (file)
@@ -37,9 +37,7 @@ public:
     CLIPTYPE clipType;
     JOBTYPE jobType;
     CLIPJOBSTATUS jobStatus;
-    QString m_clipId;
     QString description;
-    bool addClipToProject;
     bool replaceClip;
     const QString clipId() const;
     const QString errorMessage() const;
@@ -52,10 +50,14 @@ public:
     virtual const QString statusMessage();
     /** @brief Returns true if only one instance of this job can be run on a clip. */
     virtual bool isExclusive();
+    bool addClipToProject() const;
+    void setAddClipToProject(bool add);
     
 protected:
+    QString m_clipId;
     QString m_errorMessage;
     QString m_logDetails;
+    bool m_addClipToProject;
     QProcess *m_jobProcess;
     
 signals:
index 24e6cee0252c8026e475627dcd98cdf975c2915b..b13f5bae3bbbbcea0f84c3c1420fd8cb97ee85b2 100644 (file)
@@ -39,7 +39,7 @@ CutClipJob::CutClipJob(CLIPTYPE cType, const QString &id, QStringList parameters
         description = i18n("Cut clip");
     }
     m_jobDuration = parameters.at(4).toInt();
-    addClipToProject = parameters.at(5).toInt();
+    m_addClipToProject = parameters.at(5).toInt();
     replaceClip = false;
     if (parameters.count() == 7) m_cutExtraParams = parameters.at(6).simplified();
 }
index 97fe61690150d94d56f4a467b2c00a4afa3c320b..01fe9972ba09571c8b2d5cf89da74cafc2b0e02b 100644 (file)
@@ -43,6 +43,8 @@ MeltJob::MeltJob(CLIPTYPE cType, const QString &id, QStringList parameters) : Ab
     jobStatus = JOBWAITING;
     m_params = parameters;
     description = i18n("Process clip");
+    QString consum = m_params.at(5);
+    if (consum.contains(":")) m_dest = consum.section(":", 1);
 }
 
 void MeltJob::setProducer(Mlt::Producer *producer)
@@ -59,38 +61,67 @@ void MeltJob::startJob()
     }
     int in = m_params.takeFirst().toInt();
     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();
+    kDebug()<<"consumer: "<<consumer;
+    if (consumer.contains(":")) m_dest = consumer.section(":", 1);
     QString consumerParams = m_params.takeFirst();
-    QString properties = m_params.takeFirst();
-    int startPos = m_params.takeFirst().toInt();
-    int track = m_params.takeFirst().toInt();
+    
+    // optional params
+    QString properties;
+    if (!m_params.isEmpty()) properties = m_params.takeFirst();
+    int startPos = -1;
+    if (!m_params.isEmpty()) startPos = m_params.takeFirst().toInt();
+    int track = -1;
+    if (!m_params.isEmpty()) track = m_params.takeFirst().toInt();
     QString finalFilter;
     if (!m_params.isEmpty()) finalFilter = m_params.takeFirst();
     else finalFilter = filter;
 
-    if (out <= in) {
+    if (out != -1 && out <= in) {
         m_errorMessage.append(i18n("Clip zone undefined (%1 - %2).", in, out));
         setStatus(JOBCRASHED);
         return;
     }
-    Mlt::Producer *prod = m_producer->cut(in, out);
+    
     m_profile = m_producer->profile();
-    m_consumer = new Mlt::Consumer(*m_profile, consumer.toUtf8().constData());
+
+    Mlt::Producer *prod;
+    if (out == -1) {
+        QString url = QString::fromUtf8(m_producer->get("resource"));
+        prod = new Mlt::Producer(*m_profile,  url.toUtf8().constData());
+    }
+    else 
+        prod = m_producer->cut(in, out);
+    QStringList list = producerParams.split(' ', QString::SkipEmptyParts);
+    foreach(QString data, list) {
+        if (data.contains('=')) {
+            prod->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", -1 );
+    //m_consumer->set("terminate_on_pause", 1 );
+    //m_consumer->set("eof", "pause" );
+    m_consumer->set("real_time", -KdenliveSettings::mltthreads() );
 
-    QStringList list = consumerParams.split(' ', QString::SkipEmptyParts);
+    list = consumerParams.split(' ', QString::SkipEmptyParts);
     foreach(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());
         }
     }
@@ -99,14 +130,17 @@ void MeltJob::startJob()
     list = filterParams.split(' ', QString::SkipEmptyParts);
     foreach(QString data, list) {
         if (data.contains('=')) {
+            kDebug()<<"// filter p: "<<data;
             mltFilter.set(data.section('=', 0, 0).toUtf8().constData(), data.section('=', 1, 1).toUtf8().constData());
         }
     }
-    prod->attach(mltFilter);
+    Mlt::Playlist playlist;
+    playlist.append(*prod);
     m_length = prod->get_length();
-    m_consumer->connect(*prod);
+    m_consumer->connect(playlist);
     prod->set_speed(0);
     prod->seek(0);
+    prod->attach(mltFilter);
     m_showFrameEvent = m_consumer->listen("consumer-frame-show", this, (mlt_listener) consumer_frame_render);
     m_consumer->start();
     prod->set_speed(1);
@@ -135,7 +169,7 @@ MeltJob::~MeltJob()
 
 const QString MeltJob::destination() const
 {
-    return QString();
+    return m_dest;
 }
 
 stringMap MeltJob::cancelProperties()
index d2aba6feeae63346ae05ba9b643791954ca06ec5..040e9ef468d29b9f45af4485f209ba14e27de4b9 100644 (file)
@@ -55,6 +55,7 @@ private:
     Mlt::Consumer *m_consumer;
     Mlt::Event *m_showFrameEvent;
     QStringList m_params;
+    QString m_dest;
     int m_length;
 };
 
index 5aca677274d70c46141fc3cfb1bb35f7fff7bd4a..7510b0e5fcb77307a9043d442389606b7679210d 100644 (file)
@@ -6,8 +6,8 @@
    <rect>
     <x>0</x>
     <y>0</y>
-    <width>291</width>
-    <height>450</height>
+    <width>290</width>
+    <height>198</height>
    </rect>
   </property>
   <property name="windowTitle">
   </property>
   <layout class="QGridLayout" name="gridLayout">
    <item row="0" column="0">
-    <widget class="QLabel" name="label_source">
-     <property name="text">
-      <string>Source</string>
-     </property>
-    </widget>
-   </item>
-   <item row="0" column="1" colspan="2">
-    <widget class="KUrlRequester" name="source_url"/>
-   </item>
-   <item row="1" column="0">
     <widget class="QLabel" name="label_dest">
      <property name="text">
       <string>Destination</string>
      </property>
     </widget>
    </item>
-   <item row="1" column="1" colspan="2">
+   <item row="0" column="1" colspan="2">
     <widget class="KUrlRequester" name="dest_url"/>
    </item>
-   <item row="5" column="0" colspan="3">
+   <item row="1" column="0" colspan="3">
     <widget class="QLabel" name="label_3">
      <property name="text">
       <string>Options</string>
      </property>
     </widget>
    </item>
-   <item row="6" column="0" colspan="3">
-    <widget class="QWidget" name="optionsbox">
+   <item row="2" column="0" colspan="3">
+    <widget class="QWidget" name="optionsbox" native="true">
      <property name="sizePolicy">
       <sizepolicy hsizetype="Expanding" vsizetype="Maximum">
        <horstretch>0</horstretch>
      </property>
     </widget>
    </item>
-   <item row="7" column="0">
-    <widget class="QLabel" name="label_4">
-     <property name="text">
-      <string>Job status</string>
-     </property>
-    </widget>
-   </item>
-   <item row="8" column="0" colspan="3">
-    <widget class="QTextEdit" name="log_text">
-     <property name="sizePolicy">
-      <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
-       <horstretch>0</horstretch>
-       <verstretch>0</verstretch>
-      </sizepolicy>
-     </property>
-     <property name="readOnly">
-      <bool>true</bool>
-     </property>
-    </widget>
-   </item>
-   <item row="11" column="2">
+   <item row="5" column="2">
     <widget class="QDialogButtonBox" name="buttonBox">
      <property name="orientation">
       <enum>Qt::Horizontal</enum>
      </property>
      <property name="standardButtons">
-      <set>QDialogButtonBox::Abort</set>
-     </property>
-    </widget>
-   </item>
-   <item row="11" column="0">
-    <widget class="QPushButton" name="button_start">
-     <property name="text">
-      <string>Start</string>
+      <set>QDialogButtonBox::Abort|QDialogButtonBox::Ok</set>
      </property>
     </widget>
    </item>
-   <item row="9" column="0" colspan="2">
+   <item row="3" column="0" colspan="2">
     <widget class="QCheckBox" name="auto_add">
      <property name="text">
       <string>Add clip to project</string>
      </property>
     </widget>
    </item>
-   <item row="9" column="2">
-    <widget class="QCheckBox" name="auto_close">
-     <property name="text">
-      <string>Close after stabilizing</string>
-     </property>
-     <property name="checked">
-      <bool>true</bool>
-     </property>
-    </widget>
-   </item>
-   <item row="11" column="1">
+   <item row="5" column="0" colspan="2">
     <spacer name="horizontalSpacer">
      <property name="orientation">
       <enum>Qt::Horizontal</enum>
      </property>
     </spacer>
    </item>
-   <item row="3" column="0">
-    <widget class="QLabel" name="label_profile">
-     <property name="text">
-      <string>Profile</string>
-     </property>
-    </widget>
-   </item>
-   <item row="3" column="1" colspan="2">
-    <widget class="KComboBox" name="profile_list"/>
-   </item>
-   <item row="2" column="0" colspan="3">
-    <widget class="QListWidget" name="urls_list">
-     <property name="alternatingRowColors">
-      <bool>true</bool>
-     </property>
-    </widget>
-   </item>
-   <item row="4" column="0" colspan="3">
-    <widget class="QLabel" name="transcode_info">
-     <property name="frameShape">
-      <enum>QFrame::StyledPanel</enum>
-     </property>
-     <property name="frameShadow">
-      <enum>QFrame::Raised</enum>
-     </property>
-    </widget>
-   </item>
-   <item row="7" column="1" colspan="2">
-    <widget class="QProgressBar" name="job_progress">
-     <property name="value">
-      <number>0</number>
-     </property>
-    </widget>
-   </item>
   </layout>
  </widget>
  <customwidgets>
-  <customwidget>
-   <class>KComboBox</class>
-   <extends>QComboBox</extends>
-   <header>kcombobox.h</header>
-  </customwidget>
   <customwidget>
    <class>KUrlRequester</class>
    <extends>QFrame</extends>
index 407dd44929be8836c59ebaca841b06659623ed69..3652fbc8fa96823bcc7a662900259b509ab4e58f 100644 (file)
@@ -6,8 +6,8 @@
    <rect>
     <x>0</x>
     <y>0</y>
-    <width>247</width>
-    <height>198</height>
+    <width>382</width>
+    <height>199</height>
    </rect>
   </property>
   <property name="windowTitle">