From b94d740d404a3528c7d93a5ea2c734d9a092d78a Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Mardelle Date: Mon, 31 Dec 2012 03:02:56 +0100 Subject: [PATCH] Fix issues with OpenGL aspect ration / corruption and DVD wizard monitor --- src/abstractmonitor.cpp | 2 +- src/dvdwizard.cpp | 11 ++- src/dvdwizard.h | 1 + src/dvdwizardchapters.cpp | 43 ++++++---- src/dvdwizardchapters.h | 2 + src/dvdwizardvob.cpp | 1 + src/dvdwizardvob.h | 3 + src/mainwindow.cpp | 1 + src/monitor.cpp | 23 +++++- src/monitor.h | 1 + src/scopes/scopemanager.cpp | 2 + src/titlewidget.cpp | 2 +- src/videoglwidget.cpp | 15 +++- src/videoglwidget.h | 2 +- src/widgets/dvdwizardchapters_ui.ui | 121 ++++++++++++++++------------ src/widgets/monitor_ui.ui | 45 +++-------- 16 files changed, 167 insertions(+), 108 deletions(-) diff --git a/src/abstractmonitor.cpp b/src/abstractmonitor.cpp index b1b3875c..9f108832 100644 --- a/src/abstractmonitor.cpp +++ b/src/abstractmonitor.cpp @@ -71,7 +71,7 @@ VideoContainer::VideoContainer(AbstractMonitor* monitor, QWidget *parent) : setFrameShape(QFrame::NoFrame); setFocusPolicy(Qt::ClickFocus); //setEnabled(false); - setContentsMargins(0, 0, 0, 0); + setContentsMargins(2, 2, 2, 2); setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding); } diff --git a/src/dvdwizard.cpp b/src/dvdwizard.cpp index 6af065e5..eb0b87fb 100644 --- a/src/dvdwizard.cpp +++ b/src/dvdwizard.cpp @@ -51,12 +51,13 @@ DvdWizard::DvdWizard(MonitorManager *manager, const QString &url, QWidget *paren m_pageVob = new DvdWizardVob(this); m_pageVob->setTitle(i18n("Select Files For Your DVD")); addPage(m_pageVob); - if (!url.isEmpty()) m_pageVob->setUrl(url); - m_pageChapters = new DvdWizardChapters(manager, m_pageVob->dvdFormat(), this); m_pageChapters->setTitle(i18n("DVD Chapters")); addPage(m_pageChapters); + + if (!url.isEmpty()) m_pageVob->setUrl(url); + connect(m_pageVob, SIGNAL(prepareMonitor()), this, SLOT(slotprepareMonitor())); @@ -154,6 +155,7 @@ void DvdWizard::slotPageChanged(int page) m_pageVob->updateChapters(m_pageChapters->chaptersData()); } else if (page == 1) { m_pageChapters->setVobFiles(m_pageVob->dvdFormat(), m_pageVob->selectedUrls(), m_pageVob->durations(), m_pageVob->chapters()); + setTitleFormat(Qt::PlainText); } else if (page == 2) { m_pageChapters->stopMonitor(); m_pageVob->updateChapters(m_pageChapters->chaptersData()); @@ -162,7 +164,10 @@ void DvdWizard::slotPageChanged(int page) } } - +void DvdWizard::slotprepareMonitor() +{ + m_pageChapters->createMonitor(m_pageVob->dvdFormat()); +} void DvdWizard::generateDvd() { diff --git a/src/dvdwizard.h b/src/dvdwizard.h index b1f2e25b..2aa6a554 100644 --- a/src/dvdwizard.h +++ b/src/dvdwizard.h @@ -91,6 +91,7 @@ private slots: void slotShowRenderInfo(); void slotShowIsoInfo(); void slotProcessMenuStatus(int, QProcess::ExitStatus status); + void slotprepareMonitor(); }; #endif diff --git a/src/dvdwizardchapters.cpp b/src/dvdwizardchapters.cpp index 12dee110..d95da170 100644 --- a/src/dvdwizardchapters.cpp +++ b/src/dvdwizardchapters.cpp @@ -40,15 +40,13 @@ DvdWizardChapters::DvdWizardChapters(MonitorManager *manager, DVDFORMAT format, if (m_format == PAL || m_format == PAL_WIDE) m_tc.setFormat(25); else m_tc.setFormat(30000.0 / 1001); - show(); - setVobFiles(format, QStringList(), QStringList(), QStringList()); - //m_view.monitor_frame->setVisible(false); } DvdWizardChapters::~DvdWizardChapters() { if (m_monitor) { + m_manager->removeMonitor(m_monitor); m_monitor->stop(); delete m_monitor; } @@ -66,6 +64,11 @@ void DvdWizardChapters::stopMonitor() if (m_monitor) m_monitor->stop(); } +void DvdWizardChapters::refreshMonitor() +{ + if (m_monitor) m_monitor->refreshMonitor(); +} + void DvdWizardChapters::slotUpdateChaptersList() { m_monitor->slotOpenFile(m_view.vob_list->currentText()); @@ -134,6 +137,21 @@ void DvdWizardChapters::slotGoToChapter() if (m_view.chapters_list->currentItem()) m_monitor->setTimePos(m_tc.reformatSeparators(m_view.chapters_list->currentItem()->text())); } +void DvdWizardChapters::createMonitor(DVDFORMAT format) +{ + QString profile = DvdWizardVob::getDvdProfile(format); + if (m_monitor == NULL) { + m_monitor = new Monitor(Kdenlive::dvdMonitor, m_manager, profile, this); + //m_monitor->start(); + QVBoxLayout *vbox = new QVBoxLayout; + vbox->addWidget(m_monitor); + m_view.video_frame->setLayout(vbox); + m_monitor->setSizePolicy(QSizePolicy ( QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding)); + m_manager->appendMonitor(m_monitor); + vbox->insertWidget(0, m_monitor, 10); + } +} + void DvdWizardChapters::setVobFiles(DVDFORMAT format, const QStringList &movies, const QStringList &durations, const QStringList &chapters) { m_format = format; @@ -143,17 +161,9 @@ void DvdWizardChapters::setVobFiles(DVDFORMAT format, const QStringList &movies, } else { m_tc.setFormat(30000.0 / 1001); } - if (m_monitor == NULL) { - m_monitor = new Monitor(Kdenlive::dvdMonitor, m_manager, profile, this); - //m_monitor->start(); - /*QVBoxLayout *vbox = new QVBoxLayout; - vbox->addWidget(m_monitor); - m_view.monitor_frame->setLayout(vbox);*/ - QVBoxLayout *lay = static_cast (layout()); - m_monitor->setSizePolicy(QSizePolicy ( QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding)); - lay->insertWidget(0, m_monitor, 10); - } else m_monitor->resetProfile(profile); - m_manager->activateMonitor(Kdenlive::dvdMonitor); + + if (m_monitor == NULL) createMonitor(format); + m_monitor->setCustomProfile(profile, m_tc); m_view.vob_list->blockSignals(true); m_view.vob_list->clear(); @@ -163,6 +173,11 @@ void DvdWizardChapters::setVobFiles(DVDFORMAT format, const QStringList &movies, } m_view.vob_list->blockSignals(false); slotUpdateChaptersList(); + setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding); + adjustSize(); + updateGeometry(); + m_manager->activateMonitor(Kdenlive::dvdMonitor); + m_monitor->refreshMonitor(); } QMap DvdWizardChapters::chaptersData() const diff --git a/src/dvdwizardchapters.h b/src/dvdwizardchapters.h index 245755d9..adc4cc3e 100644 --- a/src/dvdwizardchapters.h +++ b/src/dvdwizardchapters.h @@ -47,6 +47,8 @@ public: QDomElement toXml() const; QMap chaptersData() const; void stopMonitor(); + void refreshMonitor(); + void createMonitor(DVDFORMAT format); private: Ui::DvdWizardChapters_UI m_view; diff --git a/src/dvdwizardvob.cpp b/src/dvdwizardvob.cpp index cce398d5..655d086e 100644 --- a/src/dvdwizardvob.cpp +++ b/src/dvdwizardvob.cpp @@ -284,6 +284,7 @@ void DvdWizardVob::slotAddVobFile(KUrl url, const QString &chapters, bool checkF slotCheckVobList(); slotCheckProfiles(); } + emit prepareMonitor(); } void DvdWizardVob::slotDeleteVobFile() diff --git a/src/dvdwizardvob.h b/src/dvdwizardvob.h index d45847b9..b35fb459 100644 --- a/src/dvdwizardvob.h +++ b/src/dvdwizardvob.h @@ -143,6 +143,9 @@ private slots: void slotItemDown(); void slotTranscodeFiles(); void slotTranscodedClip(KUrl, KUrl); + +signals: + void prepareMonitor(); }; #endif diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index c41f2ed9..cdda0689 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -3907,6 +3907,7 @@ void MainWindow::slotDvdWizard(const QString &url) QPointer w = new DvdWizard(m_monitorManager, url, this); w->exec(); delete w; + m_monitorManager->activateMonitor(Kdenlive::clipMonitor); } void MainWindow::slotShowTimeline(bool show) diff --git a/src/monitor.cpp b/src/monitor.cpp index aa3076b8..a35ff711 100644 --- a/src/monitor.cpp +++ b/src/monitor.cpp @@ -58,6 +58,9 @@ Monitor::Monitor(Kdenlive::MONITORID id, MonitorManager *manager, QString profil m_effectWidget(NULL), m_selectedClip(NULL), m_loopClipTransition(true), +#ifdef USE_OPENGL + m_glWidget(NULL), +#endif m_editMarker(NULL) { QVBoxLayout *layout = new QVBoxLayout; @@ -226,7 +229,6 @@ QWidget *Monitor::container() bool Monitor::createOpenGlWidget(QWidget *parent, const QString profile) { render = new Render(id(), 0, profile, this); - kDebug()<<"+++++++++++++\nCREATED OPENGL WIDG\n++++++++++++++"; m_glWidget = new VideoGLWidget(parent); if (m_glWidget == NULL) { // Creation failed, we are in trouble... @@ -769,6 +771,9 @@ void Monitor::stop() void Monitor::start() { if (!isVisible() || !isActive()) return; +#ifdef USE_OPENGL + if (m_glWidget) m_glWidget->activateMonitor(); +#endif if (render) render->startConsumer(); } @@ -904,6 +909,19 @@ void Monitor::slotSaveZone() //render->setSceneList(doc, 0); } +void Monitor::setCustomProfile(const QString &profile, Timecode tc) +{ + m_timePos->updateTimeCode(tc); + if (render == NULL) return; + if (!render->hasProfile(profile)) { + slotActivateMonitor(); + render->resetProfile(profile); +#ifdef USE_OPENGL + if (m_glWidget) m_glWidget->setImageAspectRatio(render->dar()); +#endif + } +} + void Monitor::resetProfile(const QString &profile) { m_timePos->updateTimeCode(m_monitorManager->timecode()); @@ -911,6 +929,9 @@ void Monitor::resetProfile(const QString &profile) if (!render->hasProfile(profile)) { slotActivateMonitor(); render->resetProfile(profile); +#ifdef USE_OPENGL + if (m_glWidget) m_glWidget->setImageAspectRatio(render->dar()); +#endif } if (m_effectWidget) m_effectWidget->resetProfile(render); diff --git a/src/monitor.h b/src/monitor.h index d01f5b9f..84a8b9b3 100644 --- a/src/monitor.h +++ b/src/monitor.h @@ -75,6 +75,7 @@ public: Render *render; AbstractRender *abstractRender(); void resetProfile(const QString &profile); + void setCustomProfile(const QString &profile, Timecode tc); void resetSize(); void pause(); void unpause(); diff --git a/src/scopes/scopemanager.cpp b/src/scopes/scopemanager.cpp index 283dc341..5782927f 100644 --- a/src/scopes/scopemanager.cpp +++ b/src/scopes/scopemanager.cpp @@ -202,6 +202,8 @@ void ScopeManager::slotUpdateActiveRenderer() } m_lastConnectedRenderer = m_monitorManager->activeRenderer(); + // DVD monitor shouldn't be monitored or will cause crash on deletion + if (m_monitorManager->isActive(Kdenlive::dvdMonitor)) m_lastConnectedRenderer = NULL; // Connect new renderer if (m_lastConnectedRenderer != NULL) { diff --git a/src/titlewidget.cpp b/src/titlewidget.cpp index b769fdf6..6346a92c 100644 --- a/src/titlewidget.cpp +++ b/src/titlewidget.cpp @@ -447,7 +447,7 @@ TitleWidget::TitleWidget(KUrl url, Timecode tc, QString projectTitlePath, Render m_titledocument.setScene(m_scene, m_frameWidth, m_frameHeight); connect(m_scene, SIGNAL(changed(QList)), this, SLOT(slotChanged())); connect(font_size, SIGNAL(valueChanged(int)), m_scene, SLOT(slotUpdateFontSize(int))); - + // a gradient background /*QRadialGradient *gradient = new QRadialGradient(0, 0, 10); gradient->setSpread(QGradient::ReflectSpread); diff --git a/src/videoglwidget.cpp b/src/videoglwidget.cpp index 9595ef25..eff90f6e 100644 --- a/src/videoglwidget.cpp +++ b/src/videoglwidget.cpp @@ -19,7 +19,7 @@ VideoGLWidget::VideoGLWidget(QWidget *parent) , m_texture(0) , m_display_ratio(4.0 / 3.0) , m_backgroundColor(Qt::gray) -{ +{ setAttribute(Qt::WA_PaintOnScreen); setAttribute(Qt::WA_OpaquePaintEvent); } @@ -59,7 +59,6 @@ void VideoGLWidget::resizeEvent(QResizeEvent* event) } void VideoGLWidget::resizeGL(int width, int height) { - double this_aspect = (double) width / height; // Special case optimisation to negate odd effect of sample aspect ratio @@ -87,6 +86,17 @@ void VideoGLWidget::resizeGL(int width, int height) glClear(GL_COLOR_BUFFER_BIT); } +void VideoGLWidget::activateMonitor() +{ + makeCurrent(); + glViewport(0, 0, width(), height()); + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + gluOrtho2D(0, width(), height(), 0); + glMatrixMode(GL_MODELVIEW); + glClear(GL_COLOR_BUFFER_BIT); +} + void VideoGLWidget::paintGL() { if (m_texture) { @@ -112,7 +122,6 @@ void VideoGLWidget::showImage(QImage image) { m_image_width = image.width(); m_image_height = image.height(); - makeCurrent(); if (m_texture) glDeleteTextures(1, &m_texture); diff --git a/src/videoglwidget.h b/src/videoglwidget.h index 0eef4c8a..8a243ddc 100644 --- a/src/videoglwidget.h +++ b/src/videoglwidget.h @@ -11,7 +11,7 @@ class VideoGLWidget : public QGLWidget public: VideoGLWidget(QWidget *parent = 0); ~VideoGLWidget(); - + void activateMonitor(); QSize minimumSizeHint() const; QSize sizeHint() const; void setImageAspectRatio(double ratio) { diff --git a/src/widgets/dvdwizardchapters_ui.ui b/src/widgets/dvdwizardchapters_ui.ui index 20234d44..68c8ee8e 100644 --- a/src/widgets/dvdwizardchapters_ui.ui +++ b/src/widgets/dvdwizardchapters_ui.ui @@ -6,74 +6,91 @@ 0 0 - 247 - 182 + 322 + 238 - - - -1 - + 0 - - - - - - Movie file - - - - - - - - - + - + 0 0 + + + 16777215 + 150 + + true - - - - - - Add chapter - - - - - - - Remove chapter - - - - - - - Qt::Horizontal - - - - 79 - 22 - - - - - + + + + Add chapter + + + + + + + Movie file + + + + + + + Qt::Horizontal + + + + 80 + 13 + + + + + + + + Remove chapter + + + + + + + + 0 + 0 + + + + + 0 + 100 + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + diff --git a/src/widgets/monitor_ui.ui b/src/widgets/monitor_ui.ui index 72e043b0..e43077ee 100644 --- a/src/widgets/monitor_ui.ui +++ b/src/widgets/monitor_ui.ui @@ -17,38 +17,7 @@ 0 - - - - - 0 - 0 - - - - QFrame::NoFrame - - - QFrame::Plain - - - 0 - - - - - - - NoAntialias - - - - 0 - - - - @@ -73,7 +42,19 @@ - + + + + + NoAntialias + + + + 0 + + + + -- 2.39.2