diff --git a/app/dialog/export/export.cpp b/app/dialog/export/export.cpp index 60f6d1c89..18d8da4ee 100644 --- a/app/dialog/export/export.cpp +++ b/app/dialog/export/export.cpp @@ -4,7 +4,7 @@ #include #include #include -#include +#include #include #include #include @@ -12,6 +12,7 @@ #include "project/item/sequence/sequence.h" #include "project/project.h" +#include "render/backend/opengl/openglexporter.h" #include "ui/icons/icons.h" ExportDialog::ExportDialog(ViewerOutput *viewer_node, QWidget *parent) : @@ -83,7 +84,8 @@ ExportDialog::ExportDialog(ViewerOutput *viewer_node, QWidget *parent) : QTabWidget* preferences_tabs = new QTabWidget(); QScrollArea* video_area = new QScrollArea(); - video_tab_ = new ExportVideoTab(static_cast(viewer_node_->parent())->project()->color_manager()); + color_manager_ = static_cast(viewer_node_->parent())->project()->color_manager(); + video_tab_ = new ExportVideoTab(color_manager_); video_area->setWidgetResizable(true); video_area->setWidget(video_tab_); preferences_tabs->addTab(video_area, tr("Video")); @@ -96,10 +98,10 @@ ExportDialog::ExportDialog(ViewerOutput *viewer_node, QWidget *parent) : row++; - QProgressBar* progress_bar = new QProgressBar(); - progress_bar->setEnabled(false); - progress_bar->setValue(0); - preferences_layout->addWidget(progress_bar, row, 0, 1, 4); + progress_bar_ = new QProgressBar(); + progress_bar_->setEnabled(false); + progress_bar_->setValue(0); + preferences_layout->addWidget(progress_bar_, row, 0, 1, 4); row++; @@ -160,7 +162,38 @@ ExportDialog::ExportDialog(ViewerOutput *viewer_node, QWidget *parent) : // Update renderer // FIXME: This is going to be VERY slow since it will need to hash every single frame. It would be better to have a // the renderer save the map as some sort of file that this can load. - viewer_node_->InvalidateCache(0, viewer_node_->Length(), viewer_node_->texture_input()); + preview_viewer_->video_renderer()->InvalidateCache(0, viewer_node_->Length()); +} + +void ExportDialog::accept() +{ + int source_width = viewer_node_->video_params().width(); + int source_height = viewer_node_->video_params().height(); + int dest_width = video_tab_->width_slider()->GetValue(); + int dest_height = video_tab_->height_slider()->GetValue(); + + QMatrix4x4 transform = GenerateMatrix(static_cast(video_tab_->scaling_method_combobox()->currentData().toInt()), + source_width, + source_height, + dest_width, + dest_height); + + // FIXME: Hardcoded pixel format + //VideoRenderingParams video_render_params(dest_width, dest_height, 0, olive::PIX_FMT_RGBA32F, olive::kOnline); + VideoRenderingParams video_render_params(dest_width, dest_height, 0, olive::PIX_FMT_RGBA16F, olive::kOffline, 2); + + ColorProcessorPtr color_processor = ColorProcessor::Create(color_manager_->GetConfig(), + OCIO::ROLE_SCENE_LINEAR, + video_tab_->CurrentOCIODisplay(), + video_tab_->CurrentOCIOView(), + video_tab_->CurrentOCIOLook()); + + OpenGLExporter* exporter = new OpenGLExporter(viewer_node_, video_render_params, transform, color_processor); + + connect(exporter, &Exporter::ExportEnded, this, &ExportDialog::ExporterIsDone); + connect(exporter, &Exporter::ProgressChanged, progress_bar_, &QProgressBar::setValue); + + QMetaObject::invokeMethod(exporter, "StartExporting", Qt::QueuedConnection); } void ExportDialog::BrowseFilename() @@ -355,3 +388,20 @@ void ExportDialog::UpdateViewerDimensions() video_tab_->width_slider()->GetValue(), video_tab_->height_slider()->GetValue())); } + +void ExportDialog::ExporterIsDone() +{ + Exporter* exporter = static_cast(sender()); + + if (exporter->GetExportStatus()) { + QMessageBox::information(this, + tr("Export Status"), + tr("Export completed successfully!"), + QMessageBox::Ok); + } else { + QMessageBox::critical(this, + tr("Export Status"), + tr("Export failed: %1").arg(exporter->GetExportError()), + QMessageBox::Ok); + } +} diff --git a/app/dialog/export/export.h b/app/dialog/export/export.h index bc4eacd09..ad99fdef4 100644 --- a/app/dialog/export/export.h +++ b/app/dialog/export/export.h @@ -4,6 +4,7 @@ #include #include #include +#include #include "exportaudiotab.h" #include "exportcodec.h" @@ -17,6 +18,9 @@ class ExportDialog : public QDialog public: ExportDialog(ViewerOutput* viewer_node, QWidget* parent = nullptr); +public slots: + virtual void accept() override; + private: void SetUpFormats(); void LoadPresets(); @@ -40,6 +44,10 @@ private: double video_aspect_ratio_; + ColorManager* color_manager_; + + QProgressBar* progress_bar_; + enum Format { kFormatDNxHD, kFormatMatroska, @@ -80,6 +88,8 @@ private slots: void UpdateViewerDimensions(); + void ExporterIsDone(); + }; #endif // EXPORTDIALOG_H