diff --git a/app/dialog/export/export.cpp b/app/dialog/export/export.cpp index 9a81c11bc..7f73d2780 100644 --- a/app/dialog/export/export.cpp +++ b/app/dialog/export/export.cpp @@ -11,8 +11,9 @@ #include "ui/icons/icons.h" -ExportDialog::ExportDialog(QWidget *parent) : +ExportDialog::ExportDialog(ViewerOutput *viewer_node, QWidget *parent) : QDialog(parent), + viewer_node_(viewer_node), previously_selected_format_(0) { QHBoxLayout* layout = new QHBoxLayout(this); @@ -124,6 +125,17 @@ ExportDialog::ExportDialog(QWidget *parent) : // Set defaults format_combobox_->setCurrentIndex(kFormatMPEG4); + video_tab_->width_slider()->SetValue(viewer_node_->video_params().width()); + video_tab_->height_slider()->SetValue(viewer_node_->video_params().height()); + video_tab_->set_frame_rate(viewer_node_->video_params().time_base().flipped()); + audio_tab_->set_sample_rate(viewer_node_->audio_params().sample_rate()); + audio_tab_->set_channel_layout(viewer_node_->audio_params().channel_layout()); + + video_aspect_ratio_ = static_cast(viewer_node_->video_params().width()) / static_cast(viewer_node_->video_params().height()); + + connect(video_tab_->width_slider(), SIGNAL(ValueChanged(int64_t)), this, SLOT(ResolutionChanged())); + connect(video_tab_->height_slider(), SIGNAL(ValueChanged(int64_t)), this, SLOT(ResolutionChanged())); + connect(video_tab_->maintain_aspect_checkbox(), SIGNAL(toggled(bool)), this, SLOT(ResolutionChanged())); } void ExportDialog::BrowseFilename() @@ -171,6 +183,24 @@ void ExportDialog::FormatChanged(int index) } } +void ExportDialog::ResolutionChanged() +{ + if (video_tab_->maintain_aspect_checkbox()->isChecked()) { + // Keep aspect ratio maintained + if (sender() == video_tab_->height_slider()) { + video_tab_->width_slider()->SetValue(qRound(static_cast(video_tab_->height_slider()->GetValue()) * video_aspect_ratio_)); + } else { + // This catches both the width slider changing and the maintain aspect ratio checkbox changing + video_tab_->height_slider()->SetValue(qRound(static_cast(video_tab_->width_slider()->GetValue()) / video_aspect_ratio_)); + } + } else { + double current_ratio = static_cast(video_tab_->width_slider()->GetValue()) / static_cast(video_tab_->height_slider()->GetValue()); + + // Enable scaling method combobox only if width/height are not equal to sequence size + video_tab_->scaling_method_combobox()->setEnabled(!qFuzzyCompare(current_ratio, video_aspect_ratio_)); + } +} + void ExportDialog::SetUpFormats() { // Set up codecs @@ -206,8 +236,8 @@ void ExportDialog::SetUpFormats() case kCodecAAC: codecs_.append(ExportCodec(tr("AAC"), "aac")); break; - case kCodecPCMS16LE: - codecs_.append(ExportCodec(tr("PCM (Signed 16-Bit Little Endian)"), "pcms16le")); + case kCodecPCM: + codecs_.append(ExportCodec(tr("PCM (Uncompressed)"), "pcm")); break; case kCodecCount: break; @@ -218,19 +248,19 @@ void ExportDialog::SetUpFormats() for (int i=0;i(i)) { case kFormatDNxHD: - formats_.append(ExportFormat(tr("DNxHD"), "mxf", {kCodecDNxHD}, {kCodecPCMS16LE})); + formats_.append(ExportFormat(tr("DNxHD"), "mxf", {kCodecDNxHD}, {kCodecPCM})); break; case kFormatMatroska: - formats_.append(ExportFormat(tr("Matroska Video"), "mkv", {kCodecH264, kCodecH265}, {kCodecAAC, kCodecMP2, kCodecMP3, kCodecPCMS16LE})); + formats_.append(ExportFormat(tr("Matroska Video"), "mkv", {kCodecH264, kCodecH265}, {kCodecAAC, kCodecMP2, kCodecMP3, kCodecPCM})); break; case kFormatMPEG4: - formats_.append(ExportFormat(tr("MPEG-4 Video"), "mp4", {kCodecH264, kCodecH265}, {kCodecAAC, kCodecMP2, kCodecMP3, kCodecPCMS16LE})); + formats_.append(ExportFormat(tr("MPEG-4 Video"), "mp4", {kCodecH264, kCodecH265}, {kCodecAAC, kCodecMP2, kCodecMP3, kCodecPCM})); break; case kFormatOpenEXR: formats_.append(ExportFormat(tr("OpenEXR"), "exr", {kCodecOpenEXR}, {})); break; case kFormatQuickTime: - formats_.append(ExportFormat(tr("QuickTime"), "mov", {kCodecH264, kCodecH265, kCodecProRes}, {kCodecAAC, kCodecMP2, kCodecMP3, kCodecPCMS16LE})); + formats_.append(ExportFormat(tr("QuickTime"), "mov", {kCodecH264, kCodecH265, kCodecProRes}, {kCodecAAC, kCodecMP2, kCodecMP3, kCodecPCM})); break; case kFormatPNG: formats_.append(ExportFormat(tr("PNG"), "png", {kCodecPNG}, {})); diff --git a/app/dialog/export/export.h b/app/dialog/export/export.h index 2cfe058c1..de7883e11 100644 --- a/app/dialog/export/export.h +++ b/app/dialog/export/export.h @@ -15,13 +15,15 @@ class ExportDialog : public QDialog { Q_OBJECT public: - ExportDialog(QWidget* parent = nullptr); + ExportDialog(ViewerOutput* viewer_node, QWidget* parent = nullptr); private: void SetUpFormats(); void LoadPresets(); void SetDefaultFilename(); + ViewerOutput* viewer_node_; + QList formats_; int previously_selected_format_; @@ -34,6 +36,8 @@ private: ExportVideoTab* video_tab_; ExportAudioTab* audio_tab_; + double video_aspect_ratio_; + enum Format { kFormatDNxHD, kFormatMatroska, @@ -58,7 +62,7 @@ private: kCodecMP2, kCodecMP3, kCodecAAC, - kCodecPCMS16LE, + kCodecPCM, kCodecCount }; @@ -68,6 +72,8 @@ private slots: void FormatChanged(int index); + void ResolutionChanged(); + }; #endif // EXPORTDIALOG_H diff --git a/app/dialog/export/exportaudiotab.cpp b/app/dialog/export/exportaudiotab.cpp index d35e52725..4e54d7851 100644 --- a/app/dialog/export/exportaudiotab.cpp +++ b/app/dialog/export/exportaudiotab.cpp @@ -25,8 +25,8 @@ ExportAudioTab::ExportAudioTab(QWidget* parent) : layout->addWidget(new QLabel(tr("Sample Rate:")), row, 0); sample_rate_combobox_ = new QComboBox(); - QList sample_rates = Core::SupportedSampleRates(); - foreach (const int& sr, sample_rates) { + sample_rates_ = Core::SupportedSampleRates(); + foreach (const int& sr, sample_rates_) { sample_rate_combobox_->addItem(Core::SampleRateToString(sr)); } layout->addWidget(sample_rate_combobox_, row, 1); @@ -34,7 +34,13 @@ ExportAudioTab::ExportAudioTab(QWidget* parent) : row++; layout->addWidget(new QLabel(tr("Channel Layout:")), row, 0); - layout->addWidget(new QComboBox(), row, 1); + + channel_layout_combobox_ = new QComboBox(); + channel_layouts_ = Core::SupportedChannelLayouts(); + foreach (const uint64_t& layout, channel_layouts_) { + channel_layout_combobox_->addItem(Core::ChannelLayoutToString(layout)); + } + layout->addWidget(channel_layout_combobox_, row, 1); row++; @@ -53,3 +59,13 @@ QComboBox *ExportAudioTab::sample_rate_combobox() const { return sample_rate_combobox_; } + +void ExportAudioTab::set_sample_rate(int rate) +{ + sample_rate_combobox_->setCurrentIndex(sample_rates_.indexOf(rate)); +} + +void ExportAudioTab::set_channel_layout(uint64_t layout) +{ + channel_layout_combobox_->setCurrentIndex(channel_layouts_.indexOf(layout)); +} diff --git a/app/dialog/export/exportaudiotab.h b/app/dialog/export/exportaudiotab.h index 3b9c19b1b..027316c07 100644 --- a/app/dialog/export/exportaudiotab.h +++ b/app/dialog/export/exportaudiotab.h @@ -12,9 +12,16 @@ public: QComboBox* codec_combobox() const; QComboBox* sample_rate_combobox() const; + void set_sample_rate(int rate); + void set_channel_layout(uint64_t layout); + private: QComboBox* codec_combobox_; QComboBox* sample_rate_combobox_; + QComboBox* channel_layout_combobox_; + + QList sample_rates_; + QList channel_layouts_; }; #endif // EXPORTAUDIOTAB_H diff --git a/app/dialog/export/exportvideotab.cpp b/app/dialog/export/exportvideotab.cpp index ff3baf5a1..2fb6cc319 100644 --- a/app/dialog/export/exportvideotab.cpp +++ b/app/dialog/export/exportvideotab.cpp @@ -6,8 +6,6 @@ #include #include "core.h" -#include "common/rational.h" -#include "widget/slider/integerslider.h" ExportVideoTab::ExportVideoTab(QWidget *parent) : QWidget(parent) @@ -16,10 +14,10 @@ ExportVideoTab::ExportVideoTab(QWidget *parent) : outer_layout->addWidget(SetupResolutionSection()); - outer_layout->addWidget(SetupColorSection()); - outer_layout->addWidget(SetupCodecSection()); + outer_layout->addWidget(SetupColorSection()); + outer_layout->addStretch(); } @@ -28,6 +26,31 @@ QComboBox *ExportVideoTab::codec_combobox() const return codec_combobox_; } +IntegerSlider *ExportVideoTab::width_slider() const +{ + return width_slider_; +} + +IntegerSlider *ExportVideoTab::height_slider() const +{ + return height_slider_; +} + +QCheckBox *ExportVideoTab::maintain_aspect_checkbox() const +{ + return maintain_aspect_checkbox_; +} + +QComboBox *ExportVideoTab::scaling_method_combobox() const +{ + return scaling_method_combobox_; +} + +void ExportVideoTab::set_frame_rate(const rational &frame_rate) +{ + frame_rate_combobox_->setCurrentIndex(frame_rates_.indexOf(frame_rate)); +} + QWidget* ExportVideoTab::SetupResolutionSection() { int row = 0; @@ -39,33 +62,42 @@ QWidget* ExportVideoTab::SetupResolutionSection() layout->addWidget(new QLabel(tr("Width:")), row, 0); - IntegerSlider* width_slider = new IntegerSlider(); - layout->addWidget(width_slider, row, 1); + width_slider_ = new IntegerSlider(); + layout->addWidget(width_slider_, row, 1); row++; layout->addWidget(new QLabel(tr("Height:")), row, 0); - IntegerSlider* height_slider = new IntegerSlider(); - layout->addWidget(height_slider, row, 1); + height_slider_ = new IntegerSlider(); + layout->addWidget(height_slider_, row, 1); row++; layout->addWidget(new QLabel(tr("Maintain Aspect Ratio:")), row, 0); - layout->addWidget(new QCheckBox(), row, 1); + + maintain_aspect_checkbox_ = new QCheckBox(); + maintain_aspect_checkbox_->setChecked(true); + layout->addWidget(maintain_aspect_checkbox_, row, 1); row++; layout->addWidget(new QLabel(tr("Scaling Method:")), row, 0); - layout->addWidget(new QComboBox(), row, 1); + + scaling_method_combobox_ = new QComboBox(); + scaling_method_combobox_->setEnabled(false); + scaling_method_combobox_->addItem(tr("Fit")); + scaling_method_combobox_->addItem(tr("Stretch")); + scaling_method_combobox_->addItem(tr("Crop")); + layout->addWidget(scaling_method_combobox_, row, 1); row++; layout->addWidget(new QLabel(tr("Frame Rate:")), row, 0); frame_rate_combobox_ = new QComboBox(); - QList frame_rates = Core::SupportedFrameRates(); - foreach (const rational& fr, frame_rates) { + frame_rates_ = Core::SupportedFrameRates(); + foreach (const rational& fr, frame_rates_) { frame_rate_combobox_->addItem(Core::FrameRateToString(fr)); } diff --git a/app/dialog/export/exportvideotab.h b/app/dialog/export/exportvideotab.h index 59d80b508..bbdff87a6 100644 --- a/app/dialog/export/exportvideotab.h +++ b/app/dialog/export/exportvideotab.h @@ -1,16 +1,28 @@ #ifndef EXPORTVIDEOTAB_H #define EXPORTVIDEOTAB_H +#include #include #include +#include "common/rational.h" +#include "widget/slider/integerslider.h" + class ExportVideoTab : public QWidget { + Q_OBJECT public: ExportVideoTab(QWidget* parent = nullptr); QComboBox* codec_combobox() const; + IntegerSlider* width_slider() const; + IntegerSlider* height_slider() const; + QCheckBox* maintain_aspect_checkbox() const; + QComboBox* scaling_method_combobox() const; + + void set_frame_rate(const rational& frame_rate); + private: QWidget* SetupResolutionSection(); QWidget* SetupColorSection(); @@ -18,6 +30,14 @@ private: QComboBox* codec_combobox_; QComboBox* frame_rate_combobox_; + QCheckBox* maintain_aspect_checkbox_; + QComboBox* scaling_method_combobox_; + + IntegerSlider* width_slider_; + IntegerSlider* height_slider_; + + QList frame_rates_; + }; #endif // EXPORTVIDEOTAB_H