]> git.sesse.net Git - kdenlive/commitdiff
stabilize with default params first
authorMarco Gittler <marco@gitma.de>
Sun, 20 Nov 2011 17:22:51 +0000 (18:22 +0100)
committerMarco Gittler <marco@gitma.de>
Sun, 20 Nov 2011 17:22:51 +0000 (18:22 +0100)
src/clipstabilize.cpp
src/clipstabilize.h
src/widgets/clipstabilize_ui.ui

index 5c6db9cddbde9462d5d592ebbadaf9c3d66e60d4..4ec8c27c69880c082c14f89261c8ec2fde821b7a 100644 (file)
 #include "kdenlivesettings.h"
 #include <KGlobalSettings>
 #include <KMessageBox>
+#include <QtConcurrentRun>
+#include <QTimer>
 #include <KFileDialog>
 
 
 ClipStabilize::ClipStabilize(KUrl::List urls, const QString &params, QWidget * parent) :
-        QDialog(parent), m_urls(urls), m_duration(0)
+        QDialog(parent), m_urls(urls), m_duration(0),m_profile(NULL),m_consumer(NULL),m_playlist(NULL)
 {
     setFont(KGlobalSettings::toolBarFont());
     setupUi(this);
@@ -38,12 +40,12 @@ ClipStabilize::ClipStabilize(KUrl::List urls, const QString &params, QWidget * p
     log_text->setHidden(true);
     setWindowTitle(i18n("Stabilize Clip"));
     auto_add->setText(i18np("Add clip to project", "Add clips to project", m_urls.count()));
-       profile=Mlt::Profile(KdenliveSettings::current_profile().toUtf8().constData());
+       m_profile = new Mlt::Profile(KdenliveSettings::current_profile().toUtf8().constData());
        filtername=params;
 
     if (m_urls.count() == 1) {
         QString fileName = m_urls.at(0).path(); //.section('.', 0, -1);
-        QString newFile = params.section(' ', -1).replace("%1", fileName);
+        QString newFile = fileName.append(".mlt");
         KUrl dest(newFile);
         source_url->setUrl(m_urls.at(0));
         dest_url->setMode(KFile::File);
@@ -64,31 +66,34 @@ ClipStabilize::ClipStabilize(KUrl::List urls, const QString &params, QWidget * p
     if (!params.isEmpty()) {
         label_profile->setHidden(true);
         profile_list->setHidden(true);
-        ffmpeg_params->setPlainText(params.simplified());
+        //ffmpeg_params->setPlainText(params.simplified());
         /*if (!description.isEmpty()) {
             transcode_info->setText(description);
         } else transcode_info->setHidden(true);*/
     } 
 
     connect(button_start, SIGNAL(clicked()), this, SLOT(slotStartStabilize()));
+       connect(buttonBox,SIGNAL(rejected()), this, SLOT(slotAbortStabilize()));
 
-    m_stabilizeProcess.setProcessChannelMode(QProcess::MergedChannels);
-    connect(&m_stabilizeProcess, SIGNAL(readyReadStandardOutput()), this, SLOT(slotShowStabilizeInfo()));
-    connect(&m_stabilizeProcess, SIGNAL(finished(int, QProcess::ExitStatus)), this, SLOT(slotStabilizeFinished(int, QProcess::ExitStatus)));
+       m_timer=new QTimer(this);
+       connect(m_timer, SIGNAL(timeout()), this, SLOT(slotShowStabilizeInfo()));
 
     adjustSize();
 }
 
 ClipStabilize::~ClipStabilize()
 {
-    if (m_stabilizeProcess.state() != QProcess::NotRunning) {
+    /*if (m_stabilizeProcess.state() != QProcess::NotRunning) {
         m_stabilizeProcess.close();
-    }
+    }*/
+       if (m_profile) free (m_profile);
+       if (m_consumer) free (m_consumer);
+       if (m_playlist) free (m_playlist);
 }
 
 void ClipStabilize::slotStartStabilize()
 {
-    if (m_stabilizeProcess.state() != QProcess::NotRunning) {
+    if (m_consumer && !m_consumer->is_stopped()) {
         return;
     }
     m_duration = 0;
@@ -97,118 +102,95 @@ void ClipStabilize::slotStartStabilize()
     QString params = ffmpeg_params->toPlainText().simplified();
     if (urls_list->count() > 0) {
         source_url->setUrl(m_urls.takeFirst());
-        destination = dest_url->url().path(KUrl::AddTrailingSlash) + source_url->url().fileName();
+        destination = dest_url->url().path();
         QList<QListWidgetItem *> matching = urls_list->findItems(source_url->url().path(), Qt::MatchExactly);
         if (matching.count() > 0) {
             matching.at(0)->setFlags(Qt::ItemIsSelectable);
             urls_list->setCurrentItem(matching.at(0));
         }
     } else {
-        destination = dest_url->url().path().section('.', 0, -2);
+        destination = dest_url->url().path();
     }
-    QString extension = params.section("%1", 1, 1).section(' ', 0, 0);
     QString s_url = source_url->url().path();
 
-    parameters << "-i" << s_url;
-    if (QFile::exists(destination + extension)) {
-        if (KMessageBox::questionYesNo(this, i18n("File %1 already exists.\nDo you want to overwrite it?", destination + extension)) == KMessageBox::No) return;
-        parameters << "-y";
+    if (QFile::exists(destination)) {
+        if (KMessageBox::questionYesNo(this, i18n("File %1 already exists.\nDo you want to overwrite it?", destination )) == KMessageBox::No) return;
     }
-    foreach(QString s, params.split(' '))
-    parameters << s.replace("%1", destination);
     buttonBox->button(QDialogButtonBox::Abort)->setText(i18n("Abort"));
 
-    //kDebug() << "/// FFMPEG ARGS: " << parameters;
+       if (m_profile){
+               qDebug() << m_profile->description();
+               m_playlist= new Mlt::Playlist;
+               Mlt::Filter filter(*m_profile,filtername.toUtf8().data());
+               Mlt::Producer p(*m_profile,s_url.toUtf8().data());
+               m_playlist->append(p);
+               m_playlist->attach(filter);
+               //m_producer->set("out",20);
+               m_consumer= new Mlt::Consumer(*m_profile,"xml",destination.toUtf8().data());
+               m_consumer->set("all","1");
+               m_consumer->set("real_time","-2");
+               m_consumer->connect(*m_playlist);
+               QtConcurrent::run(this, &ClipStabilize::slotRunStabilize);
+               button_start->setEnabled(false);
+       }
+
+}
 
-       Mlt::Producer producer(profile,s_url.toUtf8().data());
-       Mlt::Filter filter(profile,filtername.toUtf8().data());
-       producer.attach(filter);
-       Mlt::Consumer xmlout(profile,"xml");
-       xmlout.connect(producer);
-       xmlout.run();
-    //m_stabilizeProcess.start("ffmpeg", parameters);
-    button_start->setEnabled(false);
+void ClipStabilize::slotRunStabilize()
+{
+       if (m_consumer)
+       {
+               m_timer->start(500);
+               m_consumer->run();
+       }
+}
 
+void ClipStabilize::slotAbortStabilize()
+{
+       if (m_consumer)
+       {
+               m_timer->stop();
+               m_consumer->stop();
+               slotStabilizeFinished(false);
+       }
 }
 
 void ClipStabilize::slotShowStabilizeInfo()
 {
-    QString log = QString(m_stabilizeProcess.readAll());
-    int progress;
-    if (m_duration == 0) {
-        if (log.contains("Duration:")) {
-            QString data = log.section("Duration:", 1, 1).section(',', 0, 0).simplified();
-            QStringList numbers = data.split(':');
-            m_duration = numbers.at(0).toInt() * 3600 + numbers.at(1).toInt() * 60 + numbers.at(2).toDouble();
-            log_text->setHidden(true);
-            job_progress->setHidden(false);
-        }
-        else {
-            log_text->setHidden(false);
-            job_progress->setHidden(true);
-        }
-    }
-    else if (log.contains("time=")) {
-        QString time = log.section("time=", 1, 1).simplified().section(' ', 0, 0);
-        if (time.contains(':')) {
-            QStringList numbers = time.split(':');
-            progress = numbers.at(0).toInt() * 3600 + numbers.at(1).toInt() * 60 + numbers.at(2).toDouble();
-        }
-        else progress = (int) time.toDouble();
-        kDebug()<<"// PROGRESS: "<<progress<<", "<<m_duration;
-        job_progress->setValue((int) (100.0 * progress / m_duration));
-    }
-    //kDebug() << "//LOG: " << log;
-    log_text->setPlainText(log);
+       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(int exitCode, QProcess::ExitStatus exitStatus)
+void ClipStabilize::slotStabilizeFinished(bool success)
 {
     buttonBox->button(QDialogButtonBox::Abort)->setText(i18n("Close"));
     button_start->setEnabled(true);
     m_duration = 0;
 
-    if (exitCode == 0 && exitStatus == QProcess::NormalExit) {
-        log_text->setHtml(log_text->toPlainText() + "<br /><b>" + i18n("Transcoding finished."));
+    if (success) {
+        log_text->setHtml(log_text->toPlainText() + "<br /><b>" + i18n("Stabilize finished."));
         if (auto_add->isChecked()) {
             KUrl url;
             if (urls_list->count() > 0) {
-                QString params = ffmpeg_params->toPlainText().simplified();
-                QString extension = params.section("%1", 1, 1).section(' ', 0, 0);
-                url = KUrl(dest_url->url().path(KUrl::AddTrailingSlash) + source_url->url().fileName() + extension);
+                url = KUrl(dest_url->url());
             } else url = dest_url->url();
             emit addClip(url);
         }
         if (urls_list->count() > 0 && m_urls.count() > 0) {
-            m_stabilizeProcess.close();
             slotStartStabilize();
             return;
         } else if (auto_close->isChecked()) accept();
     } else {
-        log_text->setHtml(log_text->toPlainText() + "<br /><b>" + i18n("Transcoding FAILED!"));
+        log_text->setHtml(log_text->toPlainText() + "<br /><b>" + i18n("Stabilizing FAILED!"));
     }
 
-    m_stabilizeProcess.close();
 }
 
-void ClipStabilize::slotUpdateParams(int ix)
-{
-    QString fileName = source_url->url().path();
-    if (ix != -1) {
-        QString params = profile_list->itemData(ix).toString();
-        ffmpeg_params->setPlainText(params.simplified());
-        QString desc = profile_list->itemData(ix, Qt::UserRole + 1).toString();
-        if (!desc.isEmpty()) {
-            transcode_info->setText(desc);
-            transcode_info->setHidden(false);
-        } else transcode_info->setHidden(true);
-    }
-    if (urls_list->count() == 0) {
-        QString newFile = ffmpeg_params->toPlainText().simplified().section(' ', -1).replace("%1", fileName);
-        dest_url->setUrl(KUrl(newFile));
-    }
-
-}
 
 #include "clipstabilize.moc"
 
index 5b0105de8d82745ac23a70514b543dc109dcbe40..0b29dc6688ebc26290464e8d122bcdde540a123b 100644 (file)
 #include "ui_clipstabilize_ui.h"
 
 #include <KUrl>
-#include <mlt++/Mlt.h>
 #include <QProcess>
+class QTimer;
+namespace Mlt{
+       class Profile;
+       class Playlist;
+       class Consumer;
+};
 
 class ClipStabilize : public QDialog, public Ui::ClipStabilize_UI
 {
@@ -41,15 +46,18 @@ public:
 private slots:
     void slotShowStabilizeInfo();
     void slotStartStabilize();
-    void slotStabilizeFinished(int exitCode, QProcess::ExitStatus exitStatus);
-    void slotUpdateParams(int ix = -1);
+    void slotStabilizeFinished(bool success);
+       void slotRunStabilize();
+       void slotAbortStabilize();
 
 private:
-    QProcess m_stabilizeProcess;
        QString filtername;
-       Mlt::Profile profile;
+       Mlt::Profile *m_profile;
+       Mlt::Consumer *m_consumer;
+       Mlt::Playlist *m_playlist;
     KUrl::List m_urls;
     int m_duration;
+       QTimer *m_timer;
 
 signals:
     void addClip(KUrl url);
index 93fae014ad2e978177fdb4d6de77a3e54c37d595..b7a7aecf95f78689afe5d270128adbc6847c1d06 100644 (file)
@@ -37,7 +37,7 @@
    <item row="5" column="0" colspan="3">
     <widget class="QLabel" name="label_3">
      <property name="text">
-      <string>FFmpeg parameters</string>
+      <string>Options</string>
      </property>
     </widget>
    </item>
@@ -98,7 +98,7 @@
    <item row="9" column="2">
     <widget class="QCheckBox" name="auto_close">
      <property name="text">
-      <string>Close after transcode</string>
+      <string>Close after stabilizing</string>
      </property>
      <property name="checked">
       <bool>true</bool>
   <connection>
    <sender>buttonBox</sender>
    <signal>accepted()</signal>
-   <receiver>ClipTranscode_UI</receiver>
+   <receiver>ClipStabilize_UI</receiver>
    <slot>accept()</slot>
    <hints>
     <hint type="sourcelabel">
   <connection>
    <sender>buttonBox</sender>
    <signal>rejected()</signal>
-   <receiver>ClipTranscode_UI</receiver>
+   <receiver>ClipStabilize_UI</receiver>
    <slot>reject()</slot>
    <hints>
     <hint type="sourcelabel">