void SlowmoRenderer_sV::load(QString filename) throw(Error) { if (m_project != NULL) { delete m_project; m_project = NULL; } QString warning; try { Project_sV *proj = XmlProjectRW_sV::loadProject(QString(filename), &warning); if (warning.length() > 0) { std::cout << warning.toStdString() << std::endl; } m_project = proj; RenderTask_sV *task = new RenderTask_sV(m_project); m_project->replaceRenderTask(task); task->renderPreferences().setFps(24); task->setTimeRange(m_start, m_end); task->setQtConnectionType(Qt::AutoConnection); bool b = true; b &= connect(m_project->renderTask(), SIGNAL(signalNewTask(QString,int)), this, SLOT(slotTaskSize(QString,int))); b &= connect(m_project->renderTask(), SIGNAL(signalTaskProgress(int)), this, SLOT(slotProgressInfo(int))); b &= connect(m_project->renderTask(), SIGNAL(signalRenderingAborted(QString)), this, SLOT(slotFinished(QString))); b &= connect(m_project->renderTask(), SIGNAL(signalRenderingFinished(QString)), this, SLOT(slotFinished(QString))); b &= connect(m_project->renderTask(), SIGNAL(signalRenderingStopped(QString)), this, SLOT(slotFinished(QString))); Q_ASSERT(b); } catch (Error_sV &err) { throw Error(err.message().toStdString()); } }
void MainWindow::slotShowRenderDialog() { if (m_project->renderTask() != NULL) { disconnect(SIGNAL(signalRendererContinue()), m_project->renderTask()); } RenderingDialog renderingDialog(m_project, this); if (renderingDialog.exec() == QDialog::Accepted) { RenderTask_sV *task = renderingDialog.buildTask(); if (task != 0) { task->moveToThread(&m_rendererThread); if (m_project->renderTask() != NULL) { disconnect(SIGNAL(signalRendererContinue()), m_project->renderTask()); } //m_project->replaceRenderTask(task); if (m_renderProgressDialog == NULL) { m_renderProgressDialog = new ProgressDialog(this); m_renderProgressDialog->setWindowTitle(tr("Rendering progress")); } else { m_renderProgressDialog->disconnect(); } connect(task, SIGNAL(signalNewTask(QString,int)), m_renderProgressDialog, SLOT(slotNextTask(QString,int))); connect(task, SIGNAL(signalItemDesc(QString)), m_renderProgressDialog, SLOT(slotTaskItemDescription(QString))); connect(task, SIGNAL(signalTaskProgress(int)), m_renderProgressDialog, SLOT(slotTaskProgress(int))); connect(task, SIGNAL(signalRenderingFinished(QString)), m_renderProgressDialog, SLOT(slotAllTasksFinished(QString))); connect(task, SIGNAL(signalRenderingAborted(QString)), this, SLOT(slotRenderingAborted(QString))); connect(task, SIGNAL(signalRenderingAborted(QString)), m_renderProgressDialog, SLOT(close())); connect(task, SIGNAL(signalRenderingStopped(QString)), m_renderProgressDialog, SLOT(slotAborted(QString))); connect(m_renderProgressDialog, SIGNAL(signalAbortTask()), task, SLOT(slotStopRendering())); //connect(this, SIGNAL(signalRendererContinue()), task, SLOT(slotContinueRendering()), Qt::UniqueConnection); connect(task, SIGNAL(workFlowRequested()), &m_rendererThread, SLOT(start())); connect(&m_rendererThread, SIGNAL(started()), task, SLOT(slotContinueRendering())); connect(task, SIGNAL(signalRenderingFinished(QString)), &m_rendererThread, SLOT(quit())); // done another way ?! connect(task, SIGNAL(signalRenderingFinished(QString)), task, SLOT(deleteLater())); //connect(&m_rendererThread, &QThread::finished, task, &QObject::deleteLater); // let's start m_rendererThread.wait(); // If the thread is not running, this will immediately return. m_renderProgressDialog->show(); //emit signalRendererContinue(); //m_rendererThread.exec (); m_rendererThread.start(); task->requestWork(); } } else { QMessageBox(QMessageBox::Warning, tr("Aborted"), tr("Aborted by user"), QMessageBox::Ok).exec(); } }
RenderTask_sV* RenderingDialog::buildTask() { if (slotValidate()) { slotSaveSettings(); ProjectPreferences_sV *prefs = m_project->preferences(); const QString imagesOutputDir = ui->imagesOutputDir->text(); const QString imagesFilenamePattern = ui->imagesFilenamePattern->text(); RenderTask_sV *task = new RenderTask_sV(m_project); task->renderPreferences().setFps(prefs->renderFPS()); task->renderPreferences().size = prefs->renderFrameSize(); task->renderPreferences().interpolation = prefs->renderInterpolationType(); task->renderPreferences().motionblur = prefs->renderMotionblurType(); if (ui->radioImages->isChecked()) { ImagesRenderTarget_sV *renderTarget = new ImagesRenderTarget_sV(task); renderTarget->setFilenamePattern(imagesFilenamePattern); renderTarget->setTargetDir(imagesOutputDir); task->setRenderTarget(renderTarget); } else if (ui->radioVideo->isChecked()) { VideoRenderTarget_sV *renderTarget = new VideoRenderTarget_sV(task); renderTarget->setTargetFile(ui->videoOutputFile->text()); renderTarget->setVcodec(ui->vcodec->text()); task->setRenderTarget(renderTarget); } else { qDebug() << "Render target is neither images nor video. Not implemented?"; Q_ASSERT(false); } if (ui->radioTagSection->isChecked()) { bool b; qreal start = ui->cbStartTag->itemData(ui->cbStartTag->currentIndex()).toFloat(&b); Q_ASSERT(b); qreal end = ui->cbEndTag->itemData(ui->cbEndTag->currentIndex()).toFloat(&b); Q_ASSERT(b); qDebug() << QString("Rendering tag section from %1 (%2) to %3 (%4)") .arg(ui->cbStartTag->currentText()) .arg(start).arg(ui->cbEndTag->currentText()).arg(end); Q_ASSERT(start <= end); task->setTimeRange(start, end); } else if (ui->radioSection->isChecked()) { qDebug() << QString("Rendering time section from %1 to %3") .arg(ui->cbStartTag->currentText()) .arg(ui->cbEndTag->currentText()); task->setTimeRange(ui->timeStart->text(), ui->timeEnd->text()); } QString mode; if (ui->radioFullProject->isChecked()) { mode = "full"; } else if (ui->radioSection->isChecked()) { mode = "time"; m_project->preferences()->renderStartTime() = ui->timeStart->text(); m_project->preferences()->renderEndTime() = ui->timeEnd->text(); } else if (ui->radioTagSection->isChecked()) { mode = "tags"; m_project->preferences()->renderStartTag() = ui->cbStartTag->currentText(); m_project->preferences()->renderEndTag() = ui->cbEndTag->currentText(); } else { qDebug() << "No section mode selected?"; Q_ASSERT(false); } return task; } else { return NULL; } }
RenderTask_sV* RenderingDialog::buildTask() { if (!slotValidate()) { return NULL; } slotSaveSettings(); ProjectPreferences_sV *prefs = m_project->preferences(); const QString imagesOutputDir = ui->imagesOutputDir->text(); const QString imagesFilenamePattern = ui->imagesFilenamePattern->text(); RenderTask_sV *task = new RenderTask_sV(m_project); task->renderPreferences().setFps(prefs->renderFPS()); task->renderPreferences().size = prefs->renderFrameSize(); task->renderPreferences().interpolation = prefs->renderInterpolationType(); task->renderPreferences().motionblur = prefs->renderMotionblurType(); if (ui->radioImages->isChecked()) { ImagesRenderTarget_sV *renderTarget = new ImagesRenderTarget_sV(task); renderTarget->setFilenamePattern(imagesFilenamePattern); renderTarget->setTargetDir(imagesOutputDir); task->setRenderTarget(renderTarget); } else if (ui->radioVideo->isChecked()) { #ifdef USE_FFMPEG #if 0 newVideoRenderTarget *renderTarget = new newVideoRenderTarget(task); #else exportVideoRenderTarget *renderTarget = new exportVideoRenderTarget(task); #endif const bool use_qt = ui->use_qt->isChecked(); if (!use_qt) { qDebug() << "using classical FFMPEG"; renderTarget->setQT(0); } #else #warning "should not use this" VideoRenderTarget_sV *renderTarget = new VideoRenderTarget_sV(task); #endif // check if file exist QFile filetest(ui->videoOutputFile->text()); if (filetest.exists()) { int r = QMessageBox::warning(this, tr("slowmoUI"), tr("The file already exist.\n" "Do you want to overwrite it ?"), QMessageBox::Yes | QMessageBox::No); if (r == QMessageBox::Yes) { filetest.remove(); } else { //TODO: maybe should delete task ? return 0; } } renderTarget->setTargetFile(ui->videoOutputFile->text()); renderTarget->setVcodec(ui->vcodec->text()); task->setRenderTarget(renderTarget); } else { qDebug() << "Render target is neither images nor video. Not implemented?"; Q_ASSERT(false); } if (ui->radioTagSection->isChecked()) { bool b; qreal start = ui->cbStartTag->itemData(ui->cbStartTag->currentIndex()).toFloat(&b); Q_ASSERT(b); qreal end = ui->cbEndTag->itemData(ui->cbEndTag->currentIndex()).toFloat(&b); Q_ASSERT(b); qDebug() << QString("Rendering tag section from %1 (%2) to %3 (%4)") .arg(ui->cbStartTag->currentText()) .arg(start).arg(ui->cbEndTag->currentText()).arg(end); Q_ASSERT(start <= end); task->setTimeRange(start, end); } else if (ui->radioSection->isChecked()) { qDebug() << QString("Rendering time section from %1 to %3") .arg(ui->cbStartTag->currentText()) .arg(ui->cbEndTag->currentText()); task->setTimeRange(ui->timeStart->text(), ui->timeEnd->text()); } QString mode; if (ui->radioFullProject->isChecked()) { mode = "full"; } else if (ui->radioSection->isChecked()) { mode = "time"; m_project->preferences()->renderStartTime() = ui->timeStart->text(); m_project->preferences()->renderEndTime() = ui->timeEnd->text(); } else if (ui->radioTagSection->isChecked()) { mode = "tags"; m_project->preferences()->renderStartTag() = ui->cbStartTag->currentText(); m_project->preferences()->renderEndTag() = ui->cbEndTag->currentText(); } else { qDebug() << "No section mode selected?"; Q_ASSERT(false); } // set optical flow parameters QSettings settings; QString flow_method = settings.value("preferences/flowMethod", "OpenCV-CPU").toString(); if (flow_method == "V3D") { AbstractFlowSource_sV *flow_algo = m_project->flowSource(); flow_algo->setLambda(prefs->flowV3DLambda()); } else if (flow_method == "OpenCV-CPU" || flow_method == "OpenCV-OCL") { int algo_index = ui->opticalFlowAlgo->currentIndex(); qDebug() << "algo index is " << algo_index; FlowSourceOpenCV_sV *flow_algo = (FlowSourceOpenCV_sV *)m_project->flowSource(); switch (algo_index) { case 0: flow_algo->setupOpticalFlow( ui->FarnLevels->value(), ui->FarnWin->value(), ui->FarnPoly->value(), ui->FarnPyr->value(), ui->FarnPolyN->value() ); break; case 1: flow_algo->setupTVL1( ui->TVLtau->value(), ui->TVLlambda->value(), ui->TVLnscales->value(), ui->TVLwarps->value(), ui->TVLiterations->value(), ui->TVLepsilon->value() ); break; default: qDebug() << "no algo defined"; } } else { throw Error_sV("Unsupported Flow method"); } return task; }