]> git.sesse.net Git - kdenlive/commitdiff
Fix several crashes on document opening, some more work to come.
authorJean-Baptiste Mardelle <jb@kdenlive.org>
Mon, 1 Sep 2008 22:50:33 +0000 (22:50 +0000)
committerJean-Baptiste Mardelle <jb@kdenlive.org>
Mon, 1 Sep 2008 22:50:33 +0000 (22:50 +0000)
svn path=/branches/KDE4/; revision=2389

src/kdenlivedoc.cpp
src/mainwindow.cpp
src/monitor.cpp
src/renderer.cpp
src/renderer.h

index 0dfdfb224b872e32babdefea2a31f19914f2878d..f15abe9ba55237187c7f66952355ec4bf68dfed4 100644 (file)
@@ -535,6 +535,7 @@ QUndoStack *KdenliveDoc::commandStack() {
 }
 
 void KdenliveDoc::setRenderer(Render *render) {
+    if (m_render) return;
     m_render = render;
     emit progressInfo(i18n("Loading playlist..."), 0);
     qApp->processEvents();
index e248910aedff57e4e1aaa73886890d5eaae0ec2e..ef6523894ea17a0d6c95b1575f48ede0485e4cfd 100644 (file)
@@ -913,7 +913,7 @@ void MainWindow::doOpenFile(const KUrl &url, KAutoSaveFile *stale) {
     m_timelineArea->setTabToolTip(m_timelineArea->currentIndex(), doc->url().path());
     if (m_timelineArea->count() > 1) m_timelineArea->setTabBarHidden(false);
     slotGotProgressInfo(QString(), -1);
-    m_projectMonitor->refreshMonitor(true);
+    //m_projectMonitor->refreshMonitor(true);
 }
 
 void MainWindow::recoverFiles(QList<KAutoSaveFile *> staleFiles) {
@@ -1171,8 +1171,6 @@ void MainWindow::connectDocument(TrackView *trackView, KdenliveDoc *doc) { //cha
     KdenliveSettings::setProject_display_ratio(doc->dar());
     doc->updateAllProjectClips();
 
-    if (m_commandStack->isClean()) kDebug() << "////////////  UNDO STACK IS CLEAN";
-    else  kDebug() << "////////////  UNDO STACK IS NOT CLEAN*******************";
 
     //m_overView->setScene(trackView->projectScene());
     //m_overView->scale(m_overView->width() / trackView->duration(), m_overView->height() / (50 * trackView->tracksNumber()));
index 9e6a8b083e2c5553c71404893d361e0737cfa0eb..70a92ead039dcfd4b857d9e59b1471c562f60e67 100644 (file)
@@ -356,7 +356,7 @@ void Monitor::slotSetXml(DocClipBase *clip, const int position) {
     if (render == NULL) return;
     if (!m_isActive) m_monitorManager->activateMonitor(m_name);
     if (!clip) return;
-    if (clip != m_currentClip || m_currentClip->producer() == NULL) {
+    if (clip != m_currentClip && clip->producer() != NULL) {
         m_currentClip = clip;
         render->setProducer(clip->producer(), position);
         //m_ruler->slotNewValue(0);
index 253a5545edd4427efbfac528cd4c69c19fe53466..4642fb2c94d9eac97785b3c2752943ddffd4965e 100644 (file)
@@ -65,7 +65,7 @@ static void consumer_frame_show(mlt_consumer, Render * self, mlt_frame frame_ptr
     }
 }
 
-Render::Render(const QString & rendererName, int winid, int extid, QWidget *parent): QObject(parent), m_name(rendererName), m_mltConsumer(NULL), m_mltProducer(NULL), m_mltTextProducer(NULL), m_winid(-1), m_framePosition(0), m_generateScenelist(false), m_isBlocked(true), m_blackClip(NULL), m_isSplitView(false) {
+Render::Render(const QString & rendererName, int winid, int extid, QWidget *parent): QObject(parent), m_name(rendererName), m_mltConsumer(NULL), m_mltProducer(NULL), m_mltTextProducer(NULL), m_winid(winid), m_externalwinid(extid),  m_framePosition(0), m_isBlocked(true), m_blackClip(NULL), m_isSplitView(false) {
     kDebug() << "//////////  USING PROFILE: " << (char*)KdenliveSettings::current_profile().toUtf8().data();
     refreshTimer = new QTimer(this);
     connect(refreshTimer, SIGNAL(timeout()), this, SLOT(refresh()));
@@ -78,8 +78,6 @@ Render::Render(const QString & rendererName, int winid, int extid, QWidget *pare
     m_osdProfile =   KStandardDirs::locate("data", "kdenlive/profiles/metadata.properties");
     buildConsumer();
 
-    m_externalwinid = extid;
-    m_winid = winid;
     Mlt::Producer *producer = new Mlt::Producer(*m_mltProfile , "colour", "black");
     m_mltProducer = producer;
     if (m_blackClip) delete m_blackClip;
@@ -667,12 +665,12 @@ void Render::initSceneList() {
 /** Create the producer from the Westley QDomDocument */
 void Render::setProducer(Mlt::Producer *producer, int position) {
     if (m_winid == -1) return;
-    m_generateScenelist = true;
 
     if (m_mltConsumer) {
         m_mltConsumer->stop();
     } else return;
 
+    m_isBlocked = true;
     if (m_mltProducer) {
         m_mltProducer->set_speed(0);
         delete m_mltProducer;
@@ -689,7 +687,7 @@ void Render::setProducer(Mlt::Producer *producer, int position) {
         m_mltProducer->seek(position);
         emit rendererPosition(position);
     }
-    m_generateScenelist = false;
+    m_isBlocked = false;
 }
 
 
@@ -702,18 +700,10 @@ void Render::setSceneList(QDomDocument list, int position) {
 /** Create the producer from the Westley QDomDocument */
 void Render::setSceneList(QString playlist, int position) {
     if (m_winid == -1) return;
-    m_generateScenelist = true;
+    m_isBlocked = true;
 
     kWarning() << "//////  RENDER, SET SCENE LIST: " << playlist;
 
-
-    /*
-        if (!clip.is_valid()) {
-     kWarning()<<" ++++ WARNING, UNABLE TO CREATE MLT PRODUCER";
-     m_generateScenelist = false;
-     return;
-        }*/
-
     if (m_mltConsumer) {
         m_mltConsumer->stop();
         //m_mltConsumer->set("refresh", 0);
@@ -764,10 +754,12 @@ void Render::setSceneList(QString playlist, int position) {
     kDebug() << "// NEW SCENE LIST DURATION SET TO: " << m_mltProducer->get_playtime();
     connectPlaylist();
     if (position != 0) {
-        m_mltProducer->seek(position);
-        emit rendererPosition(position);
+       //TODO: seek to correct place after opening project. 
+       //      Needs to be done from another place since it crashes here.
+        //m_mltProducer->seek(position);
+        //emit rendererPosition(position);
     }
-    m_generateScenelist = false;
+    m_isBlocked = false;
 
 }
 
@@ -901,7 +893,7 @@ void Render::start() {
         return;
     }
 
-    if (m_mltConsumer->is_stopped()) {
+    if (m_mltConsumer && m_mltConsumer->is_stopped()) {
         kDebug() << "-----  MONITOR: " << m_name << " WAS STOPPED";
         if (m_mltConsumer->start() == -1) {
             KMessageBox::error(qApp->activeWindow(), i18n("Could not create the video preview window.\nThere is something wrong with your Kdenlive install or your driver settings, please fix it."));
@@ -937,15 +929,17 @@ void Render::stop() {
         kDebug() << "/////////////   RENDER STOPPED: " << m_name;
         m_isBlocked = true;
         m_mltConsumer->set("refresh", 0);
-        m_mltConsumer->stop();
+       m_mltConsumer->stop();
+        // delete m_mltConsumer;
+       // m_mltConsumer = NULL;
     }
     kDebug() << "/////////////   RENDER STOP2-------";
     m_isBlocked = true;
 
     if (m_mltProducer) {
         m_mltProducer->set_speed(0.0);
-        m_mltProducer->set("out", m_mltProducer->get_length() - 1);
-        kDebug() << m_mltProducer->get_length();
+        //m_mltProducer->set("out", m_mltProducer->get_length() - 1);
+        //kDebug() << m_mltProducer->get_length();
     }
     kDebug() << "/////////////   RENDER STOP3-------";
 }
@@ -961,7 +955,7 @@ void Render::stop(const GenTime & startTime) {
 }
 
 void Render::switchPlay() {
-    if (!m_mltProducer)
+    if (!m_mltProducer || !m_mltConsumer)
         return;
     if (m_mltProducer->get_speed() == 0.0) {
         //m_isBlocked = false;
@@ -1051,7 +1045,7 @@ void Render::askForRefresh() {
 
 void Render::doRefresh() {
     // Use a Timer so that we don't refresh too much
-    m_mltConsumer->set("refresh", 1);
+    if (!m_isBlocked && m_mltConsumer) m_mltConsumer->set("refresh", 1);
 }
 
 void Render::refresh() {
@@ -1091,7 +1085,6 @@ const QString & Render::rendererName() const {
 
 
 void Render::emitFrameNumber(double position) {
-    //if (m_generateScenelist) return;
     m_framePosition = position;
     emit rendererPosition((int) position);
     //if (qApp->activeWindow()) QApplication::postEvent(qApp->activeWindow(), new PositionChangeEvent( GenTime((int) position, m_fps), m_monitorId));
@@ -1099,7 +1092,7 @@ void Render::emitFrameNumber(double position) {
 
 void Render::emitConsumerStopped() {
     // This is used to know when the playing stopped
-    if (m_mltProducer && !m_generateScenelist) {
+    if (m_mltProducer) {
         double pos = m_mltProducer->position();
         emit rendererStopped((int) pos);
         //if (qApp->activeWindow()) QApplication::postEvent(qApp->activeWindow(), new PositionChangeEvent(GenTime((int) pos, m_fps), m_monitorId + 100));
index 9e6c92d73705ab8ceaf5008a97b9d1bc0d6d5284..1dc03e46a957bee013ba6869cb40b7692e447be3 100644 (file)
@@ -189,7 +189,6 @@ private:   // Private attributes & methods
     double m_framePosition;
     double m_fps;
     uint m_monitorId;
-    bool m_generateScenelist;
     /** true when monitor is in split view (several tracks at the same time) */
     bool m_isSplitView;