From ce42388d689bdd7a9e7bfbc7bb4474e292ded813 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Thu, 30 Apr 2020 17:19:43 +1000 Subject: [PATCH] export: allow users to override the thread count --- app/codec/encoder.cpp | 19 +++++++-- app/codec/encoder.h | 11 +++-- app/codec/ffmpeg/ffmpegencoder.cpp | 10 ++++- app/dialog/export/CMakeLists.txt | 2 + app/dialog/export/codec/h264section.cpp | 10 ++--- app/dialog/export/export.cpp | 2 + .../export/exportadvancedvideodialog.cpp | 42 +++++++++++++++++++ app/dialog/export/exportadvancedvideodialog.h | 27 ++++++++++++ app/dialog/export/exportvideotab.cpp | 27 +++++++++++- app/dialog/export/exportvideotab.h | 6 +++ 10 files changed, 141 insertions(+), 15 deletions(-) create mode 100644 app/dialog/export/exportadvancedvideodialog.cpp create mode 100644 app/dialog/export/exportadvancedvideodialog.h diff --git a/app/codec/encoder.cpp b/app/codec/encoder.cpp index 26ef71989..c9cd17350 100644 --- a/app/codec/encoder.cpp +++ b/app/codec/encoder.cpp @@ -40,6 +40,7 @@ EncodingParams::EncodingParams() : video_bit_rate_(0), video_max_bit_rate_(0), video_buffer_size_(0), + video_threads_(0), audio_enabled_(false) { } @@ -63,26 +64,31 @@ void EncodingParams::EnableAudio(const AudioRenderingParams &audio_params, const audio_codec_ = acodec; } -void EncodingParams::SetVideoOption(const QString &key, const QString &value) +void EncodingParams::set_video_option(const QString &key, const QString &value) { video_opts_.insert(key, value); } -void EncodingParams::SetVideoBitRate(const int64_t &rate) +void EncodingParams::set_video_bit_rate(const int64_t &rate) { video_bit_rate_ = rate; } -void EncodingParams::SetVideoMaxBitRate(const int64_t &rate) +void EncodingParams::set_video_max_bit_rate(const int64_t &rate) { video_max_bit_rate_ = rate; } -void EncodingParams::SetVideoBufferSize(const int64_t &sz) +void EncodingParams::set_video_buffer_size(const int64_t &sz) { video_buffer_size_ = sz; } +void EncodingParams::set_video_threads(const int &threads) +{ + video_threads_ = threads; +} + const QString &EncodingParams::filename() const { return filename_; @@ -123,6 +129,11 @@ const int64_t &EncodingParams::video_buffer_size() const return video_buffer_size_; } +const int &EncodingParams::video_threads() const +{ + return video_threads_; +} + bool EncodingParams::audio_enabled() const { return audio_enabled_; diff --git a/app/codec/encoder.h b/app/codec/encoder.h index 198697991..05ce58760 100644 --- a/app/codec/encoder.h +++ b/app/codec/encoder.h @@ -43,10 +43,11 @@ public: void EnableVideo(const VideoRenderingParams& video_params, const QString& vcodec); void EnableAudio(const AudioRenderingParams& audio_params, const QString& acodec); - void SetVideoOption(const QString& key, const QString& value); - void SetVideoBitRate(const int64_t& rate); - void SetVideoMaxBitRate(const int64_t& rate); - void SetVideoBufferSize(const int64_t& sz); + void set_video_option(const QString& key, const QString& value); + void set_video_bit_rate(const int64_t& rate); + void set_video_max_bit_rate(const int64_t& rate); + void set_video_buffer_size(const int64_t& sz); + void set_video_threads(const int& threads); const QString& filename() const; @@ -57,6 +58,7 @@ public: const int64_t& video_bit_rate() const; const int64_t& video_max_bit_rate() const; const int64_t& video_buffer_size() const; + const int& video_threads() const; bool audio_enabled() const; const QString& audio_codec() const; @@ -75,6 +77,7 @@ private: int64_t video_bit_rate_; int64_t video_max_bit_rate_; int64_t video_buffer_size_; + int video_threads_; bool audio_enabled_; QString audio_codec_; diff --git a/app/codec/ffmpeg/ffmpegencoder.cpp b/app/codec/ffmpeg/ffmpegencoder.cpp index 24c753acd..b99f071c7 100644 --- a/app/codec/ffmpeg/ffmpegencoder.cpp +++ b/app/codec/ffmpeg/ffmpegencoder.cpp @@ -468,7 +468,15 @@ bool FFmpegEncoder::SetupCodecContext(AVStream* stream, AVCodecContext* codec_ct } AVDictionary* codec_opts = nullptr; - av_dict_set(&codec_opts, "threads", "auto", 0); + + // Set thread count + if (params().video_threads() == 0) { + av_dict_set(&codec_opts, "threads", "auto", 0); + } else { + char thread_val[10]; + sprintf_s(thread_val, 10, "%d", params().video_threads()); + av_dict_set(&codec_opts, "threads", thread_val, 0); + } // Try to open encoder error_code = avcodec_open2(codec_ctx, codec, &codec_opts); diff --git a/app/dialog/export/CMakeLists.txt b/app/dialog/export/CMakeLists.txt index 4a592ff21..b1ef3ae2c 100644 --- a/app/dialog/export/CMakeLists.txt +++ b/app/dialog/export/CMakeLists.txt @@ -20,6 +20,8 @@ set(OLIVE_SOURCES ${OLIVE_SOURCES} dialog/export/export.h dialog/export/export.cpp + dialog/export/exportadvancedvideodialog.h + dialog/export/exportadvancedvideodialog.cpp dialog/export/exportaudiotab.h dialog/export/exportaudiotab.cpp dialog/export/exportcodec.h diff --git a/app/dialog/export/codec/h264section.cpp b/app/dialog/export/codec/h264section.cpp index 8d64647a2..42833f665 100644 --- a/app/dialog/export/codec/h264section.cpp +++ b/app/dialog/export/codec/h264section.cpp @@ -78,7 +78,7 @@ void H264Section::AddOpts(EncodingParams *params) if (method == kConstantRateFactor) { // Simply set CRF value - params->SetVideoOption(QStringLiteral("crf"), QString::number(crf_section_->GetValue())); + params->set_video_option(QStringLiteral("crf"), QString::number(crf_section_->GetValue())); } else { @@ -95,11 +95,11 @@ void H264Section::AddOpts(EncodingParams *params) } // Disable CRF encoding - params->SetVideoOption(QStringLiteral("crf"), QStringLiteral("-1")); + params->set_video_option(QStringLiteral("crf"), QStringLiteral("-1")); - params->SetVideoBitRate(target_rate); - params->SetVideoMaxBitRate(max_rate); - params->SetVideoBufferSize(2000000); + params->set_video_bit_rate(target_rate); + params->set_video_max_bit_rate(max_rate); + params->set_video_buffer_size(2000000); } } diff --git a/app/dialog/export/export.cpp b/app/dialog/export/export.cpp index 81b7f845b..bf1b083eb 100644 --- a/app/dialog/export/export.cpp +++ b/app/dialog/export/export.cpp @@ -531,6 +531,8 @@ ExportParams ExportDialog::GenerateParams() const params.EnableVideo(video_render_params, video_codec.id()); + params.set_video_threads(video_tab_->threads()); + video_tab_->GetCodecSection()->AddOpts(¶ms); params.set_color_transform(video_tab_->CurrentOCIOColorSpace()); diff --git a/app/dialog/export/exportadvancedvideodialog.cpp b/app/dialog/export/exportadvancedvideodialog.cpp new file mode 100644 index 000000000..bbaba2ee6 --- /dev/null +++ b/app/dialog/export/exportadvancedvideodialog.cpp @@ -0,0 +1,42 @@ +#include "exportadvancedvideodialog.h" + +#include +#include +#include + +OLIVE_NAMESPACE_ENTER + +ExportAdvancedVideoDialog::ExportAdvancedVideoDialog(QWidget *parent) : + QDialog(parent) +{ + setWindowTitle(tr("Advanced")); + + QGridLayout* layout = new QGridLayout(this); + + int row = 0; + + layout->addWidget(new QLabel(tr("Threads:")), row, 0); + + thread_slider_ = new IntegerSlider(); + thread_slider_->SetMinimum(0); + layout->addWidget(thread_slider_, row, 1); + + row++; + + QDialogButtonBox* buttons = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel); + connect(buttons, &QDialogButtonBox::accepted, this, &ExportAdvancedVideoDialog::accept); + connect(buttons, &QDialogButtonBox::rejected, this, &ExportAdvancedVideoDialog::reject); + layout->addWidget(buttons, row, 0, 1, 2); +} + +int ExportAdvancedVideoDialog::threads() const +{ + return static_cast(thread_slider_->GetValue()); +} + +void ExportAdvancedVideoDialog::set_threads(int t) +{ + thread_slider_->SetValue(t); +} + +OLIVE_NAMESPACE_EXIT diff --git a/app/dialog/export/exportadvancedvideodialog.h b/app/dialog/export/exportadvancedvideodialog.h new file mode 100644 index 000000000..81b2c524f --- /dev/null +++ b/app/dialog/export/exportadvancedvideodialog.h @@ -0,0 +1,27 @@ +#ifndef EXPORTADVANCEDVIDEODIALOG_H +#define EXPORTADVANCEDVIDEODIALOG_H + +#include + +#include "render/backend/exportparams.h" +#include "widget/slider/integerslider.h" + +OLIVE_NAMESPACE_ENTER + +class ExportAdvancedVideoDialog : public QDialog +{ + Q_OBJECT +public: + ExportAdvancedVideoDialog(QWidget* parent = nullptr); + + int threads() const; + void set_threads(int t); + +private: + IntegerSlider* thread_slider_; + +}; + +OLIVE_NAMESPACE_EXIT + +#endif // EXPORTADVANCEDVIDEODIALOG_H diff --git a/app/dialog/export/exportvideotab.cpp b/app/dialog/export/exportvideotab.cpp index 352d86910..ae4acfca7 100644 --- a/app/dialog/export/exportvideotab.cpp +++ b/app/dialog/export/exportvideotab.cpp @@ -24,8 +24,10 @@ #include #include #include +#include #include "core.h" +#include "exportadvancedvideodialog.h" #include "render/backend/exportparams.h" #include "render/colormanager.h" @@ -33,7 +35,8 @@ OLIVE_NAMESPACE_ENTER ExportVideoTab::ExportVideoTab(ColorManager* color_manager, QWidget *parent) : QWidget(parent), - color_manager_(color_manager) + color_manager_(color_manager), + threads_(0) { QVBoxLayout* outer_layout = new QVBoxLayout(this); @@ -106,6 +109,11 @@ H264Section *ExportVideoTab::h264_section() const return h264_section_; } +const int &ExportVideoTab::threads() const +{ + return threads_; +} + QWidget* ExportVideoTab::SetupResolutionSection() { int row = 0; @@ -196,6 +204,12 @@ QWidget *ExportVideoTab::SetupCodecSection() h264_section_ = new H264Section(); codec_stack_->addWidget(h264_section_); + row++; + + QPushButton* advanced_btn = new QPushButton(tr("Advanced")); + connect(advanced_btn, &QPushButton::clicked, this, &ExportVideoTab::OpenAdvancedDialog); + codec_layout->addWidget(advanced_btn, row, 1); + return codec_group; } @@ -204,4 +218,15 @@ void ExportVideoTab::MaintainAspectRatioChanged(bool val) scaling_method_combobox_->setEnabled(!val); } +void ExportVideoTab::OpenAdvancedDialog() +{ + ExportAdvancedVideoDialog d(this); + + d.set_threads(threads_); + + if (d.exec() == QDialog::Accepted) { + threads_ = d.threads(); + } +} + OLIVE_NAMESPACE_EXIT diff --git a/app/dialog/export/exportvideotab.h b/app/dialog/export/exportvideotab.h index 1332f14a5..7ad0c72d6 100644 --- a/app/dialog/export/exportvideotab.h +++ b/app/dialog/export/exportvideotab.h @@ -57,6 +57,8 @@ public: ImageSection* image_section() const; H264Section* h264_section() const; + const int& threads() const; + signals: void ColorSpaceChanged(const QString& colorspace); @@ -83,9 +85,13 @@ private: ColorManager* color_manager_; + int threads_; + private slots: void MaintainAspectRatioChanged(bool val); + void OpenAdvancedDialog(); + }; OLIVE_NAMESPACE_EXIT