From: Jean-Baptiste Mardelle Date: Mon, 1 Sep 2008 22:50:33 +0000 (+0000) Subject: Fix several crashes on document opening, some more work to come. X-Git-Url: https://git.sesse.net/?a=commitdiff_plain;h=80208154dae6d08e918a6c9f91209f510aa4b183;p=kdenlive Fix several crashes on document opening, some more work to come. svn path=/branches/KDE4/; revision=2389 --- diff --git a/src/kdenlivedoc.cpp b/src/kdenlivedoc.cpp index 0dfdfb22..f15abe9b 100644 --- a/src/kdenlivedoc.cpp +++ b/src/kdenlivedoc.cpp @@ -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(); diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index e248910a..ef652389 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -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 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())); diff --git a/src/monitor.cpp b/src/monitor.cpp index 9e6a8b08..70a92ead 100644 --- a/src/monitor.cpp +++ b/src/monitor.cpp @@ -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); diff --git a/src/renderer.cpp b/src/renderer.cpp index 253a5545..4642fb2c 100644 --- a/src/renderer.cpp +++ b/src/renderer.cpp @@ -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)); diff --git a/src/renderer.h b/src/renderer.h index 9e6c92d7..1dc03e46 100644 --- a/src/renderer.h +++ b/src/renderer.h @@ -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;