diff --git a/app/dialog/export/export.cpp b/app/dialog/export/export.cpp index 586995152..940878581 100644 --- a/app/dialog/export/export.cpp +++ b/app/dialog/export/export.cpp @@ -187,7 +187,18 @@ void ExportDialog::accept() video_tab_->CurrentOCIOView(), video_tab_->CurrentOCIOLook()); - OpenGLExporter* exporter = new OpenGLExporter(viewer_node_, video_render_params, transform, color_processor); + // Set up encoder + EncodingParams encoding_params; + encoding_params.SetFilename(filename_edit_->text()); // FIXME: Validate extension + + const ExportCodec& video_codec = codecs_.at(video_tab_->codec_combobox()->currentData().toInt()); + encoding_params.EnableVideo(VideoRenderingParams(dest_width, dest_height, video_tab_->frame_rate().flipped(), olive::PIX_FMT_RGBA32F, olive::kOnline), + video_codec.id()); + + + EncoderPtr encoder = Encoder::CreateFromID("ffmpeg", encoding_params); + + OpenGLExporter* exporter = new OpenGLExporter(viewer_node_, video_render_params, transform, color_processor, encoder); connect(exporter, &Exporter::ExportEnded, this, &ExportDialog::ExporterIsDone); connect(exporter, &Exporter::ProgressChanged, progress_bar_, &QProgressBar::setValue); diff --git a/app/render/backend/exporter.cpp b/app/render/backend/exporter.cpp index e28b5a294..80416311a 100644 --- a/app/render/backend/exporter.cpp +++ b/app/render/backend/exporter.cpp @@ -3,13 +3,14 @@ #include "render/colormanager.h" #include "render/pixelservice.h" -Exporter::Exporter(ViewerOutput* viewer, const VideoRenderingParams& params, const QMatrix4x4 &transform, ColorProcessorPtr color_processor, QObject* parent) : +Exporter::Exporter(ViewerOutput* viewer, const VideoRenderingParams& params, const QMatrix4x4 &transform, ColorProcessorPtr color_processor, EncoderPtr encoder, QObject* parent) : QObject(parent), video_backend_(nullptr), audio_backend_(nullptr), viewer_node_(viewer), params_(params), color_processor_(color_processor), + encoder_(encoder), export_status_(false), export_msg_(tr("Export hasn't started yet")) { @@ -45,11 +46,13 @@ void Exporter::StartExporting() // Connect to renderers connect(video_backend_, SIGNAL(CachedFrameReady(const rational&, QVariant)), this, SLOT(FrameRendered(const rational&, QVariant))); - connect(video_backend_, SIGNAL(CachedTimeReady(const rational&)), this, SLOT(TimeRendered(const rational&))); // Create renderers waiting_for_frame_ = 0; + // Open encoder + encoder_->Open(); + // Invalidate caches video_backend_->InvalidateCache(0, viewer_node_->Length()); //viewer_node_->InvalidateCache(0, viewer_node_->Length(), viewer_node_->samples_input()); @@ -64,12 +67,14 @@ void Exporter::ExportSucceeded() { Cleanup(); - delete video_backend_; - delete audio_backend_; + video_backend_->deleteLater(); + audio_backend_->deleteLater(); export_status_ = true; export_msg_ = tr("Export succeeded"); + encoder_->Close(); + emit ExportEnded(); } @@ -80,8 +85,6 @@ void Exporter::ExportFailed() void Exporter::FrameRendered(const rational &time, QVariant value) { - qDebug() << "Retrieved frame" << time.toDouble() << "- waiting for frame" << waiting_for_frame_.toDouble(); - if (time == waiting_for_frame_) { bool get_cached = false; @@ -106,26 +109,24 @@ void Exporter::FrameRendered(const rational &time, QVariant value) // Convert color space color_processor_->ConvertFrame(frame); + // Set frame timestamp + frame->set_timestamp(waiting_for_frame_); + // Encode (may require re-associating alpha?) + encoder_->Write(frame); waiting_for_frame_ += viewer_node_->video_params().time_base(); // Calculate progress int progress = qRound(100.0 * (waiting_for_frame_.toDouble() / viewer_node_->Length().toDouble())); - qDebug() << "Hello progress" << progress; emit ProgressChanged(progress); } while (cached_frames_.contains(waiting_for_frame_)); + + if (waiting_for_frame_ > viewer_node_->Length()) { + ExportSucceeded(); + } } else { cached_frames_.insert(time, value); } - - /*if (time == viewer_node_->Length()) { - ExportSucceeded(); - }*/ -} - -void Exporter::TimeRendered(const rational &time) -{ - qDebug() << "Retrieved time rendered!" << time.toDouble(); } diff --git a/app/render/backend/exporter.h b/app/render/backend/exporter.h index 276735f26..1215c5e62 100644 --- a/app/render/backend/exporter.h +++ b/app/render/backend/exporter.h @@ -5,6 +5,7 @@ #include #include +#include "codec/encoder.h" #include "node/output/viewer/viewer.h" #include "render/backend/audiorenderbackend.h" #include "render/backend/videorenderbackend.h" @@ -14,7 +15,12 @@ class Exporter : public QObject { Q_OBJECT public: - Exporter(ViewerOutput* viewer, const VideoRenderingParams& params, const QMatrix4x4& transform, ColorProcessorPtr color_processor, QObject* parent = nullptr); + Exporter(ViewerOutput* viewer, + const VideoRenderingParams& params, + const QMatrix4x4& transform, + ColorProcessorPtr color_processor, + EncoderPtr encoder, + QObject* parent = nullptr); bool GetExportStatus() const; const QString& GetExportError() const; @@ -48,9 +54,6 @@ protected: // Export transform QMatrix4x4 transform_; - // Copied graph - NodeGraph copied_graph_; - private: void ExportSucceeded(); @@ -58,6 +61,8 @@ private: ColorProcessorPtr color_processor_; + EncoderPtr encoder_; + bool export_status_; QString export_msg_; @@ -68,7 +73,6 @@ private: private slots: void FrameRendered(const rational& time, QVariant value); - void TimeRendered(const rational& time); };