]> git.sesse.net Git - kdenlive/commitdiff
Fix crash when changing project profile
authorJean-Baptiste Mardelle <jb@kdenlive.org>
Sun, 29 May 2011 21:30:42 +0000 (21:30 +0000)
committerJean-Baptiste Mardelle <jb@kdenlive.org>
Sun, 29 May 2011 21:30:42 +0000 (21:30 +0000)
svn path=/trunk/kdenlive/; revision=5619

12 files changed:
src/clipmanager.cpp
src/clipmanager.h
src/docclipbase.cpp
src/docclipbase.h
src/kdenlivedoc.cpp
src/kdenlivedoc.h
src/mainwindow.cpp
src/mltdevicecapture.cpp
src/projectlist.cpp
src/projectlist.h
src/renderer.cpp
src/renderer.h

index c81526904d23fb2134ada69c7cb8b22d5885f8ec..d234abb20704bf1e72111198511302a1326ba686 100644 (file)
@@ -233,24 +233,23 @@ void ClipManager::clearUnusedProducers()
     }
 }
 
-void ClipManager::resetProducersList(const QList <Mlt::Producer *> prods)
+void ClipManager::resetProducersList(const QList <Mlt::Producer *> prods, bool displayRatioChanged)
 {
     for (int i = 0; i < m_clipList.count(); i++) {
         if (m_clipList.at(i)->numReferences() > 0) {
-            m_clipList.at(i)->clearProducers();
+            m_clipList.at(i)->deleteProducers(true);
         }
     }
     QString id;
     for (int i = 0; i < prods.count(); i++) {
         id = prods.at(i)->get("id");
-        kDebug() << "// // // REPLACE CLIP: " << id;
         if (id.contains('_')) id = id.section('_', 0, 0);
         DocClipBase *clip = getClipById(id);
         if (clip) {
             clip->setProducer(prods.at(i));
         }
     }
-    emit checkAllClips();
+    emit checkAllClips(displayRatioChanged);
 }
 
 void ClipManager::slotAddClipList(const KUrl::List urls, const QString group, const QString &groupId)
index 1fcfa6c6f3dbb450ad62d58b213f878455ee65ec..b96abf06ca8720cae18a471f9b3590a07c4fd605 100644 (file)
@@ -95,7 +95,7 @@ Q_OBJECT public:
     void askForAudioThumb(const QString &id);
     QString projectFolder() const;
     void clearUnusedProducers();
-    void resetProducersList(const QList <Mlt::Producer *> prods);
+    void resetProducersList(const QList <Mlt::Producer *> prods, bool displayRatioChanged);
     void addFolder(const QString&, const QString&);
     void deleteFolder(const QString&);
     void clear();
@@ -135,7 +135,7 @@ signals:
     void modifiedClip(const QString &);
     void missingClip(const QString &);
     void availableClip(const QString &);
-    void checkAllClips();
+    void checkAllClips(bool displayRatioChanged);
 };
 
 #endif
index 50300cc4a26d4c0fe13db2796f9c56ce86122c8a..fc4c12c078109a44f44041693cca814d4f1eaa61 100644 (file)
@@ -429,14 +429,8 @@ QString DocClipBase::markerComment(GenTime t)
     return QString();
 }
 
-void DocClipBase::clearProducers()
-{
-    m_baseTrackProducers.clear();
-}
-
 void DocClipBase::deleteProducers(bool clearThumbCreator)
 {
-    kDebug() << "// CLIP KILL PRODS ct: " << m_baseTrackProducers.count();
     if (clearThumbCreator && m_thumbProd) m_thumbProd->clearProducer();
     /*kDebug()<<"// CLIP KILL PRODS ct: "<<m_baseTrackProducers.count();
     int max = m_baseTrackProducers.count();
index 1be1b0a466a0d6fb0e5d685d47eb084a15f3a701..6debdef711d4662e53b8d4fc53fe3734ff58aa5e 100644 (file)
@@ -181,7 +181,6 @@ Q_OBJECT public:
     const char *producerProperty(const char *name) const;
     void setProducerProperty(const char *name, const char *data);
     void resetProducerProperty(const char *name);
-    void clearProducers();
     void deleteProducers(bool clearThumbCreator = true);
 
     /** Set default play zone for clip monitor */
index e44135b992d9b8c35b7b1f3f1a18c90e6d5b9c78..0d00dacf291ba28bedf9093daa63c81de52d6d15 100644 (file)
@@ -838,10 +838,10 @@ void KdenliveDoc::setRenderer(Render *render) {
     emit progressInfo(QString(), -1);
 }*/
 
-void KdenliveDoc::checkProjectClips()
+void KdenliveDoc::checkProjectClips(bool displayRatioChanged)
 {
     if (m_render == NULL) return;
-    m_clipManager->resetProducersList(m_render->producersList());
+    m_clipManager->resetProducersList(m_render->producersList(), displayRatioChanged);
 }
 
 Render *KdenliveDoc::renderer()
index 5577a9f4fde8bef216887dbff92e29056a391343..806bb4f2798d3c5dbb13027187a20b2b7474b11d 100644 (file)
@@ -214,7 +214,7 @@ public slots:
     /** @brief Sets the document as modified or up to date.
      * @param mod (optional) true if the document has to be saved */
     void setModified(bool mod = true);
-    void checkProjectClips();
+    void checkProjectClips(bool displayRatioChanged = false);
 
 private slots:
     void slotAutoSave();
index d94135d1a1c73c339ca1fee0659e5d22b93da45b..85e5707fe858db0ee43ffdc50fafbaa664ca8c53 100644 (file)
@@ -2247,8 +2247,6 @@ void MainWindow::slotEditProjectSettings()
 
 void MainWindow::slotUpdateProjectProfile(const QString &profile)
 {
-    double dar = m_activeDocument->dar();
-
     // Recreate the stopmotion widget if profile changes
     if (m_stopmotion) {
         delete m_stopmotion;
@@ -2271,8 +2269,6 @@ void MainWindow::slotUpdateProjectProfile(const QString &profile)
     m_projectList->updateProjectFormat(m_activeDocument->timecode());
     if (m_renderWidget) m_renderWidget->setProfile(m_activeDocument->mltProfile());
     m_timelineArea->setTabText(m_timelineArea->currentIndex(), m_activeDocument->description());
-    //m_activeDocument->clipManager()->resetProducersList(m_projectMonitor->render->producersList());
-    if (dar != m_activeDocument->dar()) m_projectList->reloadClipThumbnails();
     if (updateFps) m_activeTimeline->updateProjectFps();
     m_activeDocument->setModified(true);
     m_commandStack->activeStack()->clear();
@@ -2387,7 +2383,7 @@ void MainWindow::connectDocument(TrackView *trackView, KdenliveDoc *doc)   //cha
             disconnect(m_projectList, SIGNAL(projectModified()), m_activeDocument, SLOT(setModified()));
             disconnect(m_projectList, SIGNAL(updateProfile(const QString &)), this, SLOT(slotUpdateProjectProfile(const QString &)));
 
-            disconnect(m_projectMonitor->render, SIGNAL(refreshDocumentProducers()), m_activeDocument, SLOT(checkProjectClips()));
+            disconnect(m_projectMonitor->render, SIGNAL(refreshDocumentProducers(bool)), m_activeDocument, SLOT(checkProjectClips(bool)));
 
             disconnect(m_activeDocument, SIGNAL(guidesUpdated()), this, SLOT(slotGuidesUpdated()));
             disconnect(m_activeDocument, SIGNAL(addProjectClip(DocClipBase *, bool)), m_projectList, SLOT(slotAddClip(DocClipBase *, bool)));
@@ -2463,7 +2459,7 @@ void MainWindow::connectDocument(TrackView *trackView, KdenliveDoc *doc)   //cha
     connect(m_projectMonitor, SIGNAL(zoneUpdated(QPoint)), doc, SLOT(setModified()));
     connect(m_clipMonitor, SIGNAL(zoneUpdated(QPoint)), doc, SLOT(setModified()));
     connect(m_projectMonitor, SIGNAL(durationChanged(int)), trackView, SLOT(setDuration(int)));
-    connect(m_projectMonitor->render, SIGNAL(refreshDocumentProducers()), doc, SLOT(checkProjectClips()));
+    connect(m_projectMonitor->render, SIGNAL(refreshDocumentProducers(bool)), doc, SLOT(checkProjectClips(bool)));
 
     connect(doc, SIGNAL(addProjectClip(DocClipBase *, bool)), m_projectList, SLOT(slotAddClip(DocClipBase *, bool)));
     connect(doc, SIGNAL(resetProjectList()), m_projectList, SLOT(slotResetProjectList()));
index 99a697917249ab35da6a194d0d30a42d0e5eb514..22b4ab5b8ed900154cdc5ca1c2e603a28c0f390b 100644 (file)
@@ -208,7 +208,6 @@ void MltDeviceCapture::stop()
                         if (trackPlaylist.get_clip(i)) mlt_producer_close(trackPlaylist.get_clip(i)->get_parent());
                     }
                     mlt_playlist_close(trackPlaylist.get_playlist());
-                    //trackPlaylist.clear();
                 }
             }
             delete field;
index 375a1c2c488f5261a0325fe2089f70946920eb52..1678b3150cf6c2c9a9fca5f5588ae353dea167cd 100644 (file)
@@ -1122,10 +1122,9 @@ void ProjectList::slotUpdateClip(const QString &id)
     monitorItemEditing(true);
 }
 
-void ProjectList::updateAllClips()
+void ProjectList::updateAllClips(bool displayRatioChanged)
 {
     m_listView->setSortingEnabled(false);
-    kDebug() << "// UPDATE ALL CLPY";
 
     QTreeWidgetItemIterator it(m_listView);
     DocClipBase *clip;
@@ -1135,7 +1134,7 @@ void ProjectList::updateAllClips()
         if ((*it)->type() == PROJECTSUBCLIPTYPE) {
             // subitem
             SubProjectItem *sub = static_cast <SubProjectItem *>(*it);
-            if (sub->data(0, Qt::DecorationRole).isNull()) {
+            if (displayRatioChanged || sub->data(0, Qt::DecorationRole).isNull()) {
                 item = static_cast <ProjectItem *>((*it)->parent());
                 requestClipThumbnail(item->clipId() + '#' + QString::number(sub->zone().x()));
             }
@@ -1154,7 +1153,7 @@ void ProjectList::updateAllClips()
                 else if (!clip->isPlaceHolder())
                     item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsDropEnabled);
             } else {
-                if (item->data(0, Qt::DecorationRole).isNull())
+                if (displayRatioChanged || item->data(0, Qt::DecorationRole).isNull())
                     requestClipThumbnail(clip->getId());
                 if (item->data(0, DurationRole).toString().isEmpty()) {
                     item->changeDuration(item->referencedClip()->producer()->get_playtime());
@@ -1170,8 +1169,9 @@ void ProjectList::updateAllClips()
     if (m_listView->isEnabled())
         monitorItemEditing(true);
     m_listView->setSortingEnabled(true);
-    if (m_infoQueue.isEmpty())
-        slotProcessNextThumbnail();
+    if (m_infoQueue.isEmpty()) {
+       slotProcessNextThumbnail();
+    }
 }
 
 // static
@@ -1453,7 +1453,7 @@ void ProjectList::setDocument(KdenliveDoc *doc)
     connect(m_doc->clipManager(), SIGNAL(modifiedClip(const QString &)), this, SLOT(slotModifiedClip(const QString &)));
     connect(m_doc->clipManager(), SIGNAL(missingClip(const QString &)), this, SLOT(slotMissingClip(const QString &)));
     connect(m_doc->clipManager(), SIGNAL(availableClip(const QString &)), this, SLOT(slotAvailableClip(const QString &)));
-    connect(m_doc->clipManager(), SIGNAL(checkAllClips()), this, SLOT(updateAllClips()));
+    connect(m_doc->clipManager(), SIGNAL(checkAllClips(bool)), this, SLOT(updateAllClips(bool)));
 }
 
 QList <DocClipBase*> ProjectList::documentClipList() const
@@ -1497,21 +1497,6 @@ void ProjectList::slotCheckForEmptyQueue()
     }
 }
 
-void ProjectList::reloadClipThumbnails()
-{
-    m_thumbnailQueue.clear();
-    QTreeWidgetItemIterator it(m_listView);
-    while (*it) {
-        if ((*it)->type() != PROJECTCLIPTYPE) {
-            // subitem
-            ++it;
-            continue;
-        }
-        m_thumbnailQueue << ((ProjectItem *)(*it))->clipId();
-        ++it;
-    }
-    QTimer::singleShot(300, this, SLOT(slotProcessNextThumbnail()));
-}
 
 void ProjectList::requestClipThumbnail(const QString id)
 {
@@ -1540,8 +1525,9 @@ void ProjectList::slotRefreshClipThumbnail(const QString &clipId, bool update)
     QTreeWidgetItem *item = getAnyItemById(clipId);
     if (item)
         slotRefreshClipThumbnail(item, update);
-    else
+    else {
         slotProcessNextThumbnail();
+    }
 }
 
 void ProjectList::slotRefreshClipThumbnail(QTreeWidgetItem *it, bool update)
@@ -1588,7 +1574,6 @@ void ProjectList::slotRefreshClipThumbnail(QTreeWidgetItem *it, bool update)
         }
         if (update)
             emit projectModified();
-
         slotProcessNextThumbnail();
     }
 }
index 96214097ab8030b543799a454f79a2e41a43b680..7a9344cce789438df3128c0f2ccd45b1a4d86df7 100644 (file)
@@ -183,7 +183,6 @@ public:
     void setupGeneratorMenu(QMenu *addMenu, QMenu *transcodeMenu, QMenu *inTimelineMenu);
     QString currentClipUrl() const;
     KUrl::List getConditionalUrls(const QString &condition) const;
-    void reloadClipThumbnails();
     QDomDocument generateTemplateXml(QString data, const QString &replaceString);
     void cleanup();
     void trashUnusedClips();
@@ -217,7 +216,7 @@ public:
 
 public slots:
     void setDocument(KdenliveDoc *doc);
-    void updateAllClips();
+    void updateAllClips(bool displayRatioChanged);
     void slotReplyGetImage(const QString &clipId, const QPixmap &pix);
     void slotReplyGetFileProperties(const QString &clipId, Mlt::Producer *producer, const QMap < QString, QString > &properties, const QMap < QString, QString > &metadata, bool replace, bool selectClip);
     void slotAddClip(DocClipBase *clip, bool getProperties);
index e6324a1f4d01a3201271f9a41557c1f0a67d5044..b9fb11580c9fd6c3681b56af30ba3b74d4bf5b3d 100644 (file)
@@ -282,6 +282,7 @@ Mlt::Producer *Render::invalidProducer(const QString &id)
 
 int Render::resetProfile(const QString profileName)
 {
+    QString scene = sceneList();
     if (m_mltConsumer) {
         if (m_externalConsumer == KdenliveSettings::external_display()) {
             if (KdenliveSettings::external_display() && m_activeProfile == profileName) return 1;
@@ -302,9 +303,9 @@ int Render::resetProfile(const QString profileName)
         delete m_mltConsumer;
         m_mltConsumer = NULL;
     }
-    QString scene = sceneList();
     int pos = 0;
     double current_fps = m_mltProfile->fps();
+    double current_dar = m_mltProfile->dar();
     delete m_blackClip;
     m_blackClip = NULL;
 
@@ -326,6 +327,7 @@ int Render::resetProfile(const QString profileName)
     m_mltProducer = NULL;
     buildConsumer(profileName);
     double new_fps = m_mltProfile->fps();
+    double new_dar = m_mltProfile->dar();
     if (current_fps != new_fps) {
         // fps changed, we must update the scenelist positions
         scene = updateSceneListFps(current_fps, new_fps, scene);
@@ -333,7 +335,7 @@ int Render::resetProfile(const QString profileName)
     //kDebug() << "//RESET WITHSCENE: " << scene;
     setSceneList(scene, pos);
     // producers have changed (different profile), so reset them...
-    emit refreshDocumentProducers();
+    emit refreshDocumentProducers(new_dar != current_dar);
     /*Mlt::Producer *producer = new Mlt::Producer(*m_mltProfile , "xml-string", scene.toUtf8().constData());
     m_mltProducer = producer;
     m_blackClip = new Mlt::Producer(*m_mltProfile , "colour", "black");
@@ -1017,6 +1019,7 @@ int Render::setSceneList(QString playlist, int position)
                 resource = mlt_properties_get(properties, "mlt_service");
             }
 
+
             for (int trackNb = tractor.count() - 1; trackNb >= 0; --trackNb) {
                 Mlt::Producer trackProducer(tractor.track(trackNb));
                 Mlt::Playlist trackPlaylist((mlt_playlist) trackProducer.get_service());
@@ -3847,12 +3850,12 @@ const QList <Mlt::Producer *> Render::producersList()
         delete tt;
         Mlt::Playlist trackPlaylist((mlt_playlist) trackProducer.get_service());
         int clipNb = trackPlaylist.count();
-        //kDebug() << "// PARSING SCENE TRACK: " << t << ", CLIPS: " << clipNb;
         for (int i = 0; i < clipNb; i++) {
             Mlt::Producer *c = trackPlaylist.get_clip(i);
             Mlt::Producer *nprod = new Mlt::Producer(c->get_parent());
             if (nprod) {
-                if (!nprod->is_blank() && !ids.contains(nprod->get("id"))) {
+                QString prodId = nprod->get("id");
+                if (!prodId.startsWith("slowmotion") && !prodId.isEmpty() && !nprod->is_blank() && !ids.contains(prodId)) {
                     ids.append(nprod->get("id"));
                     prods.append(nprod);
                 } else delete nprod;
index 2d0a2189f389fae649e827934785a71ecfdccb5b..b3abe536984bcc3bdae2a381789d0f2327075d11 100644 (file)
@@ -356,7 +356,7 @@ signals:
      *  @param durationError Should be set to true if the proxy failed because it has not same length as original clip
      */
     void removeInvalidProxy(const QString &id, bool durationError);
-    void refreshDocumentProducers();
+    void refreshDocumentProducers(bool displayRatioChanged);
 
     /** @brief A frame's image has to be shown.
      *