]> git.sesse.net Git - kdenlive/blobdiff - src/renderer.cpp
Round corners in project tree thumbnails
[kdenlive] / src / renderer.cpp
index 51670b58118d0e16a4a3131f7b337dd36564b34e..482384d8d3af9a5a6692a0468b014f0deaad3fe9 100644 (file)
@@ -128,7 +128,7 @@ Render::Render(Kdenlive::MONITORID rendererName, int winid, QString profile, QWi
     m_mltConsumer->connect(*m_mltProducer);
     m_mltProducer->set_speed(0.0);
     m_refreshTimer.setSingleShot(true);
-    m_refreshTimer.setInterval(70);
+    m_refreshTimer.setInterval(100);
     connect(&m_refreshTimer, SIGNAL(timeout()), this, SLOT(refresh()));
     connect(this, SIGNAL(multiStreamFound(const QString &,QList<int>,QList<int>,stringMap)), this, SLOT(slotMultiStreamProducerFound(const QString &,QList<int>,QList<int>,stringMap)));
 }
@@ -538,7 +538,8 @@ void Render::slotSplitView(bool doit)
                 transition->set("mlt_service", "composite");
                 transition->set("a_track", 0);
                 transition->set("b_track", i);
-                transition->set("distort", 1);
+                transition->set("distort", 0);
+               transition->set("aligned", 0);
                 transition->set("internal_added", "200");
                 QString geometry;
                 switch (screen) {
@@ -676,7 +677,6 @@ void Render::processFileProperties()
         KUrl url(path);
         Mlt::Producer *producer = NULL;
         CLIPTYPE type = (CLIPTYPE)info.xml.attribute("type").toInt();
-
         if (type == COLOR) {
             producer = new Mlt::Producer(*m_mltProfile, 0, ("colour:" + info.xml.attribute("colour")).toUtf8().constData());
         } else if (type == TEXT) {
@@ -684,15 +684,23 @@ void Render::processFileProperties()
             if (producer && producer->is_valid() && info.xml.hasAttribute("xmldata"))
                 producer->set("xmldata", info.xml.attribute("xmldata").toUtf8().constData());
         } else if (url.isEmpty()) {
+           //WARNING: when is this case used? Not sure it is working.. JBM/
             QDomDocument doc;
             QDomElement mlt = doc.createElement("mlt");
             QDomElement play = doc.createElement("playlist");
+           play.setAttribute("id", "playlist0");
             doc.appendChild(mlt);
             mlt.appendChild(play);
             play.appendChild(doc.importNode(info.xml, true));
+           QDomElement tractor = doc.createElement("tractor");
+           tractor.setAttribute("id", "tractor0");
+           QDomElement track = doc.createElement("track");
+           track.setAttribute("producer", "playlist0");
+           tractor.appendChild(track);
+           mlt.appendChild(tractor);
             producer = new Mlt::Producer(*m_mltProfile, "xml-string", doc.toString().toUtf8().constData());
         } else {
-            producer = new Mlt::Producer(*m_mltProfile, path.toUtf8().constData());
+           producer = new Mlt::Producer(*m_mltProfile, path.toUtf8().constData());
         }
 
         if (producer == NULL || producer->is_blank() || !producer->is_valid()) {
@@ -777,12 +785,12 @@ void Render::processFileProperties()
         if (type == COLOR || type == TEXT || type == IMAGE || type == SLIDESHOW) {
             int length;
             if (info.xml.hasAttribute("length")) {
-                if (clipOut > 0) duration = clipOut + 1;
                 length = info.xml.attribute("length").toInt();
                 clipOut = length - 1;
             }
             else length = info.xml.attribute("out").toInt() - info.xml.attribute("in").toInt();
             producer->set("length", length);
+           duration = length;
         }
 
         if (clipOut > 0) producer->set_in_and_out(info.xml.attribute("in").toInt(), clipOut);
@@ -818,7 +826,6 @@ void Render::processFileProperties()
         char property[200];
 
         if (frameNumber > 0) producer->seek(frameNumber);
-
         duration = duration > 0 ? duration : producer->get_playtime();
         filePropertyMap["duration"] = QString::number(duration);
         //kDebug() << "///////  PRODUCER: " << url.path() << " IS: " << producer->get_playtime();
@@ -871,13 +878,17 @@ void Render::processFileProperties()
 
        int vindex = -1;
        const QString mltService = producer->get("mlt_service");
-       
        if (mltService == "xml" || mltService == "consumer") {
-           // MLT playlist
-           mlt_profile prof = producer->get_profile();
-           filePropertyMap["progressive"] = QString::number(prof->progressive);
-           filePropertyMap["colorspace"] = QString::number(prof->colorspace);
-           filePropertyMap["fps"] = QString::number(mlt_profile_fps(prof));
+           // MLT playlist, create producer with blank profile to get real profile info
+           // TODO: is there an easier way to get this info (original source clip profile) from MLT?
+           Mlt::Profile *original_profile = new Mlt::Profile();
+           Mlt::Producer *tmpProd = new Mlt::Producer(*original_profile, path.toUtf8().constData());
+           filePropertyMap["progressive"] = QString::number(original_profile->progressive());
+           filePropertyMap["colorspace"] = QString::number(original_profile->colorspace());
+           filePropertyMap["fps"] = QString::number(original_profile->fps());
+           filePropertyMap["aspect_ratio"] = QString::number(original_profile->sar());
+           delete tmpProd;
+           delete original_profile;
        }
        else if (mltService == "avformat") {
            // Get frame rate
@@ -922,10 +933,10 @@ void Render::processFileProperties()
             filePropertyMap["frame_size"] = QString::number(frame->get_int("width")) + 'x' + QString::number(frame->get_int("height"));
             filePropertyMap["frequency"] = QString::number(frame->get_int("frequency"));
             filePropertyMap["channels"] = QString::number(frame->get_int("channels"));
-            filePropertyMap["aspect_ratio"] = frame->get("aspect_ratio");
+            if (!filePropertyMap.contains("aspect_ratio")) filePropertyMap["aspect_ratio"] = frame->get("aspect_ratio");
 
             if (frame->get_int("test_image") == 0) {
-                if (url.path().endsWith(".mlt") || url.path().endsWith(".westley") || url.path().endsWith(".kdenlive")) {
+                if (mltService == "xml" || mltService == "consumer") {
                     filePropertyMap["type"] = "playlist";
                     metadataPropertyMap["comment"] = QString::fromUtf8(producer->get("title"));
                 } else if (frame->get_int("test_audio") == 0)
@@ -1107,9 +1118,38 @@ int Render::setProducer(Mlt::Producer *producer, int position)
     emit stopped();
     if (position == -1 && producer->get("id") == currentId) position = consumerPosition;
     if (position != -1) producer->seek(position);
+    m_fps = producer->get_fps();
     int volume = KdenliveSettings::volume();
+    if (producer->get_int("_audioclip") == 1) {
+       // This is an audio only clip, create fake multitrack to apply audiowave filter
+       Mlt::Tractor *tractor = new Mlt::Tractor();
+       Mlt::Producer *color= new Mlt::Producer(*m_mltProfile, "color:red");
+       color->set_in_and_out(0, producer->get_out());
+       tractor->set_track(*producer, 0);
+       tractor->set_track(*color, 1);
+
+       Mlt::Consumer xmlConsumer(*m_mltProfile, "xml:audio_hack");
+       if (!xmlConsumer.is_valid()) return -1;
+       xmlConsumer.set("terminate_on_pause", 1);
+       xmlConsumer.connect(tractor->parent());
+       xmlConsumer.run();
+       delete tractor;
+       delete color;
+       delete producer;
+       QString playlist = QString::fromUtf8(xmlConsumer.get("audio_hack"));
+       
+       Mlt::Producer *result = new Mlt::Producer(*m_mltProfile, "xml-string", playlist.toUtf8().constData());
+       Mlt::Filter *filter = new Mlt::Filter(*m_mltProfile, "audiowave");
+       result->attach(*filter);
+       tractor = new Mlt::Tractor();
+       tractor->set_track(*result, 0);
+       delete result;
+       delete filter;
+       producer = &(tractor->parent());
+       m_mltConsumer->connect(*producer);
+    }
+    
     producer->set("meta.volume", (double)volume / 100);
-    m_fps = producer->get_fps();
     blockSignals(false);
     m_mltConsumer->connect(*producer);
 
@@ -1224,7 +1264,6 @@ int Render::setSceneList(QString playlist, int position)
 
     blockSignals(true);
     m_locale = QLocale();
-
     m_mltProducer = new Mlt::Producer(*m_mltProfile, "xml-string", playlist.toUtf8().constData());
     if (!m_mltProducer || !m_mltProducer->is_valid()) {
         kDebug() << " WARNING - - - - -INVALID PLAYLIST: " << playlist.toUtf8().constData();
@@ -1614,7 +1653,7 @@ void Render::refresh()
         return;
     if (m_mltConsumer) {
         if (m_mltConsumer->is_stopped()) m_mltConsumer->start();
-        m_mltConsumer->purge();
+        //m_mltConsumer->purge();
         m_mltConsumer->set("refresh", 1);
     }
 }
@@ -1666,13 +1705,6 @@ void Render::emitFrameUpdated(Mlt::Frame& frame)
     const uchar* image = frame.get_image(format, width, height);
     QImage qimage(width, height, QImage::Format_ARGB32_Premultiplied);
     memcpy(qimage.scanLine(0), image, width * height * 4);
-
-    /*mlt_image_format format = mlt_image_rgb24;
-    int width = 0;
-    int height = 0;
-    const uchar* image = frame.get_image(format, width, height);
-    QImage qimage(width, height, QImage::Format_RGB888);
-    memcpy(qimage.bits(), image, width * height * 3);*/
     emit frameUpdated(qimage.rgbSwapped());
 }
 
@@ -4109,6 +4141,7 @@ const QList <Mlt::Producer *> Render::producersList()
         Mlt::Producer trackProducer(tt);
         delete tt;
         Mlt::Playlist trackPlaylist((mlt_playlist) trackProducer.get_service());
+       if (!trackPlaylist.is_valid()) continue;
         int clipNb = trackPlaylist.count();
         for (int i = 0; i < clipNb; i++) {
             Mlt::Producer *c = trackPlaylist.get_clip(i);
@@ -4141,6 +4174,7 @@ void Render::fillSlowMotionProducers()
         Mlt::Producer trackProducer(tt);
         delete tt;
         Mlt::Playlist trackPlaylist((mlt_playlist) trackProducer.get_service());
+       if (!trackPlaylist.is_valid()) continue;
         int clipNb = trackPlaylist.count();
         for (int i = 0; i < clipNb; i++) {
             Mlt::Producer *c = trackPlaylist.get_clip(i);
@@ -4511,7 +4545,22 @@ bool Render::getBlackMagicOutputDeviceList(KComboBox *devicelist)
 }
 
 void Render::slotMultiStreamProducerFound(const QString path, QList<int> audio_list, QList<int> video_list, stringMap data)
-{
+{ 
+    if (KdenliveSettings::automultistreams()) {
+       for (int i = 1; i < video_list.count(); i++) {
+           int vindex = video_list.at(i);
+           int aindex = 0;
+           if (i <= audio_list.count() -1) {
+               aindex = audio_list.at(i);
+           }
+           data.insert("video_index", QString::number(vindex));
+           data.insert("audio_index", QString::number(aindex));
+           data.insert("bypassDuplicate", "1");
+           emit addClip(KUrl(path), data);
+       }
+       return;
+    }
+    
     int width = 60.0 * m_mltProfile->dar();
     int swidth = 60.0 * m_mltProfile->width() / m_mltProfile->height();
     if (width % 2 == 1) width++;
@@ -4531,13 +4580,12 @@ void Render::slotMultiStreamProducerFound(const QString path, QList<int> audio_l
     for (int j = 1; j < video_list.count(); j++) {
        Mlt::Producer multiprod(* m_mltProfile, path.toUtf8().constData());
        multiprod.set("video_index", video_list.at(j));
-       kDebug()<<"// LOADING: "<<j<<" = "<<video_list.at(j);
        QImage thumb = KThumb::getFrame(&multiprod, 0, swidth, width, 60);
        QGroupBox *streamFrame = new QGroupBox(i18n("Video stream %1", video_list.at(j)), content);
        streamFrame->setProperty("vindex", video_list.at(j));
        groupList << streamFrame;
        streamFrame->setCheckable(true);
-       streamFrame->setChecked(false);
+       streamFrame->setChecked(true);
        QVBoxLayout *vh = new QVBoxLayout( streamFrame );
        QLabel *iconLabel = new QLabel(content);
        iconLabel->setPixmap(QPixmap::fromImage(thumb));
@@ -4548,7 +4596,7 @@ void Render::slotMultiStreamProducerFound(const QString path, QList<int> audio_l
                cb->addItem(i18n("Audio stream %1", audio_list.at(k)), audio_list.at(k));
            }
            comboList << cb;
-           cb->setCurrentIndex(j);
+           cb->setCurrentIndex(qMin(j, audio_list.count() - 1));
            vh->addWidget(cb);
        }
        vbox->addWidget(streamFrame);