sequence: made divider a sequence parameter rather than a viewer parameter

Doing this makes the preview resolution an explicit project setting rather
than a temporary UI setting. This will allow more consistency when caching.
This commit is contained in:
itsmattkc
2020-06-08 14:41:35 +10:00
parent ee3fa529cb
commit 430561e2ac
81 changed files with 549 additions and 508 deletions
+6 -3
View File
@@ -114,10 +114,13 @@ void SequenceDialog::accept()
// Generate video and audio parameter structs from data
VideoParams video_params = VideoParams(parameter_tab_->GetSelectedVideoWidth(),
parameter_tab_->GetSelectedVideoHeight(),
video_time_base);
video_time_base,
parameter_tab_->GetSelectedPreviewFormat(),
parameter_tab_->GetSelectedPreviewResolution());
AudioParams audio_params = AudioParams(audio_sample_rate,
channels);
channels,
SampleFormat::kInternalFormat);
if (make_undoable_) {
@@ -141,7 +144,7 @@ void SequenceDialog::accept()
SequenceDialog::SequenceParamCommand::SequenceParamCommand(Sequence* s,
const VideoParams& video_params,
const AudioParams& audio_params,
const AudioParams &audio_params,
const QString& name,
QUndoCommand* parent) :
UndoCommand(parent),
@@ -14,37 +14,63 @@ SequenceDialogParameterTab::SequenceDialogParameterTab(Sequence* sequence, QWidg
{
QVBoxLayout* layout = new QVBoxLayout(this);
int row = 0;
// Set up video section
QGroupBox* video_group = new QGroupBox();
video_group->setTitle(tr("Video"));
QGridLayout* video_layout = new QGridLayout(video_group);
video_layout->addWidget(new QLabel(tr("Width:")), 0, 0);
video_width_field_ = new QSpinBox();
video_width_field_->setMaximum(99999);
video_layout->addWidget(video_width_field_, 0, 1);
video_layout->addWidget(new QLabel(tr("Height:")), 1, 0);
video_height_field_ = new QSpinBox();
video_height_field_->setMaximum(99999);
video_layout->addWidget(video_height_field_, 1, 1);
video_layout->addWidget(new QLabel(tr("Frame Rate:")), 2, 0);
video_layout->addWidget(new QLabel(tr("Width:")), row, 0);
video_width_field_ = new IntegerSlider();
video_width_field_->SetMinimum(1);
video_width_field_->SetMaximum(99999);
connect(video_width_field_, &IntegerSlider::ValueChanged, this, &SequenceDialogParameterTab::UpdatePreviewResolutionLabel);
video_layout->addWidget(video_width_field_, row, 1);
row++;
video_layout->addWidget(new QLabel(tr("Height:")), row, 0);
video_height_field_ = new IntegerSlider();
video_height_field_->SetMinimum(1);
video_height_field_->SetMaximum(99999);
connect(video_height_field_, &IntegerSlider::ValueChanged, this, &SequenceDialogParameterTab::UpdatePreviewResolutionLabel);
video_layout->addWidget(video_height_field_, row, 1);
row++;
video_layout->addWidget(new QLabel(tr("Frame Rate:")), row, 0);
video_frame_rate_field_ = new QComboBox();
video_layout->addWidget(video_frame_rate_field_, 2, 1);
video_layout->addWidget(video_frame_rate_field_, row, 1);
layout->addWidget(video_group);
row = 0;
// Set up audio section
QGroupBox* audio_group = new QGroupBox();
audio_group->setTitle(tr("Audio"));
QGridLayout* audio_layout = new QGridLayout(audio_group);
audio_layout->addWidget(new QLabel(tr("Sample Rate:")), 0, 0);
audio_layout->addWidget(new QLabel(tr("Sample Rate:")), row, 0);
audio_sample_rate_field_ = new QComboBox();
// FIXME: No sample rate made
audio_layout->addWidget(audio_sample_rate_field_, 0, 1);
audio_layout->addWidget(new QLabel(tr("Channels:")), 1, 0);
audio_layout->addWidget(audio_sample_rate_field_, row, 1);
row++;
audio_layout->addWidget(new QLabel(tr("Channels:")), row, 0);
audio_channels_field_ = new QComboBox();
// FIXME: No channels made
audio_layout->addWidget(audio_channels_field_, 1, 1);
audio_layout->addWidget(audio_channels_field_, row, 1);
layout->addWidget(audio_group);
row = 0;
// Set up preview section
QGroupBox* preview_group = new QGroupBox();
preview_group->setTitle(tr("Preview"));
QGridLayout* preview_layout = new QGridLayout(preview_group);
preview_layout->addWidget(new QLabel(tr("Resolution:")), row, 0);
preview_resolution_field_ = new QComboBox();
preview_layout->addWidget(preview_resolution_field_, row, 1);
preview_resolution_label_ = new QLabel();
preview_layout->addWidget(preview_resolution_label_, row, 2);
row++;
preview_layout->addWidget(new QLabel(tr("Format:")), row, 0);
preview_format_field_ = new QComboBox();
preview_layout->addWidget(preview_format_field_, row, 1, 1, 2);
layout->addWidget(preview_group);
// Set up available frame rates
frame_rate_list_ = Core::SupportedFrameRates();
foreach (const rational& fr, frame_rate_list_) {
@@ -63,9 +89,38 @@ SequenceDialogParameterTab::SequenceDialogParameterTab(Sequence* sequence, QWidg
audio_channels_field_->addItem(Core::ChannelLayoutToString(ch_layout), QVariant::fromValue(ch_layout));
}
// Set up preview dividers
divider_list_ = {1, 2, 3, 4, 6, 8, 12, 16};
foreach (int d, divider_list_) {
QString name;
if (d == 1) {
name = tr("Full");
} else {
name = tr("1/%1").arg(d);
}
preview_resolution_field_->addItem(name);
}
connect(preview_resolution_field_, static_cast<void(QComboBox::*)(int)>(&QComboBox::currentIndexChanged),
this, &SequenceDialogParameterTab::UpdatePreviewResolutionLabel);
// Set up preview formats
for (int i=0;i<PixelFormat::PIX_FMT_COUNT;i++) {
PixelFormat::Format pix_fmt = static_cast<PixelFormat::Format>(i);
// We always render with an alpha channel internally
if (PixelFormat::FormatHasAlphaChannel(pix_fmt)
&& PixelFormat::FormatIsFloat(pix_fmt)) {
preview_format_field_->addItem(PixelFormat::GetName(pix_fmt));
preview_format_list_.append(pix_fmt);
}
}
// Set values based on input sequence
video_width_field_->setValue(sequence->video_params().width());
video_height_field_->setValue(sequence->video_params().height());
video_width_field_->SetValue(sequence->video_params().width());
video_height_field_->SetValue(sequence->video_params().height());
int frame_rate_index = frame_rate_list_.indexOf(sequence->video_params().time_base().flipped());
video_frame_rate_field_->setCurrentIndex(frame_rate_index);
@@ -80,21 +135,27 @@ SequenceDialogParameterTab::SequenceDialogParameterTab(Sequence* sequence, QWidg
}
}
preview_resolution_field_->setCurrentIndex(divider_list_.indexOf(sequence->video_params().divider()));
preview_format_field_->setCurrentIndex(preview_format_list_.indexOf(sequence->video_params().format()));
layout->addStretch();
QPushButton* save_preset_btn = new QPushButton(tr("Save Preset"));
connect(save_preset_btn, &QPushButton::clicked, this, &SequenceDialogParameterTab::SavePresetClicked);
layout->addWidget(save_preset_btn);
UpdatePreviewResolutionLabel();
}
int SequenceDialogParameterTab::GetSelectedVideoWidth() const
{
return video_width_field_->value();
return video_width_field_->GetValue();
}
int SequenceDialogParameterTab::GetSelectedVideoHeight() const
{
return video_height_field_->value();
return video_height_field_->GetValue();
}
const rational &SequenceDialogParameterTab::GetSelectedVideoFrameRate() const
@@ -112,23 +173,48 @@ uint64_t SequenceDialogParameterTab::GetSelectedAudioChannelLayout() const
return audio_channels_field_->currentData().toULongLong();
}
int SequenceDialogParameterTab::GetSelectedPreviewResolution() const
{
return divider_list_.at(preview_resolution_field_->currentIndex());
}
PixelFormat::Format SequenceDialogParameterTab::GetSelectedPreviewFormat() const
{
return preview_format_list_.at(preview_format_field_->currentIndex());
}
void SequenceDialogParameterTab::PresetChanged(const SequencePreset &preset)
{
video_width_field_->setValue(preset.width);
video_height_field_->setValue(preset.height);
video_width_field_->SetValue(preset.width);
video_height_field_->SetValue(preset.height);
video_frame_rate_field_->setCurrentIndex(frame_rate_list_.indexOf(preset.frame_rate));
audio_sample_rate_field_->setCurrentIndex(sample_rate_list_.indexOf(preset.sample_rate));
audio_channels_field_->setCurrentIndex(channel_layout_list_.indexOf(preset.channel_layout));
preview_resolution_field_->setCurrentIndex(divider_list_.indexOf(preset.preview_divider));
preview_format_field_->setCurrentIndex(preview_format_list_.indexOf(preset.preview_format));
}
void SequenceDialogParameterTab::SavePresetClicked()
{
emit SaveParametersAsPreset({QString(),
video_width_field_->value(),
video_height_field_->value(),
static_cast<int>(video_width_field_->GetValue()),
static_cast<int>(video_height_field_->GetValue()),
frame_rate_list_.at(video_frame_rate_field_->currentIndex()),
sample_rate_list_.at(audio_sample_rate_field_->currentIndex()),
channel_layout_list_.at(audio_channels_field_->currentIndex())});
channel_layout_list_.at(audio_channels_field_->currentIndex()),
divider_list_.at(preview_resolution_field_->currentIndex()),
preview_format_list_.at(preview_format_field_->currentIndex())});
}
void SequenceDialogParameterTab::UpdatePreviewResolutionLabel()
{
VideoParams test_param(video_width_field_->GetValue(),
video_height_field_->GetValue(),
PixelFormat::PIX_FMT_INVALID,
divider_list_.at(preview_resolution_field_->currentIndex()));
preview_resolution_label_->setText(tr("(%1x%2)").arg(QString::number(test_param.effective_width()),
QString::number(test_param.effective_height())));
}
OLIVE_NAMESPACE_EXIT
@@ -7,6 +7,7 @@
#include "project/item/sequence/sequence.h"
#include "sequencepreset.h"
#include "widget/slider/integerslider.h"
OLIVE_NAMESPACE_ENTER
@@ -26,6 +27,10 @@ public:
uint64_t GetSelectedAudioChannelLayout() const;
int GetSelectedPreviewResolution() const;
PixelFormat::Format GetSelectedPreviewFormat() const;
public slots:
void PresetChanged(const SequencePreset& preset);
@@ -33,9 +38,9 @@ signals:
void SaveParametersAsPreset(const SequencePreset& preset);
private:
QSpinBox* video_width_field_;
IntegerSlider* video_width_field_;
QSpinBox* video_height_field_;
IntegerSlider* video_height_field_;
QComboBox* video_frame_rate_field_;
@@ -43,15 +48,27 @@ private:
QComboBox* audio_channels_field_;
QComboBox* preview_resolution_field_;
QLabel* preview_resolution_label_;
QComboBox* preview_format_field_;
QList<rational> frame_rate_list_;
QList<int> sample_rate_list_;
QList<uint64_t> channel_layout_list_;
QList<int> divider_list_;
QList<PixelFormat::Format> preview_format_list_;
private slots:
void SavePresetClicked();
void UpdatePreviewResolutionLabel();
};
OLIVE_NAMESPACE_EXIT
+34 -14
View File
@@ -40,12 +40,12 @@ SequenceDialogPresetTab::SequenceDialogPresetTab(QWidget* parent) :
preset_tree_->addTopLevelItem(my_presets_folder_);
// Add presets
preset_tree_->addTopLevelItem(CreateHDPresetFolder(tr("4K UHD"), 3840, 2160));
preset_tree_->addTopLevelItem(CreateHDPresetFolder(tr("1080p"), 1920, 1080));
preset_tree_->addTopLevelItem(CreateHDPresetFolder(tr("720p"), 1280, 720));
preset_tree_->addTopLevelItem(CreateHDPresetFolder(tr("4K UHD"), 3840, 2160, 6));
preset_tree_->addTopLevelItem(CreateHDPresetFolder(tr("1080p"), 1920, 1080, 3));
preset_tree_->addTopLevelItem(CreateHDPresetFolder(tr("720p"), 1280, 720, 2));
preset_tree_->addTopLevelItem(CreateSDPresetFolder(tr("NTSC"), 720, 480, rational(30000, 1001)));
preset_tree_->addTopLevelItem(CreateSDPresetFolder(tr("PAL"), 720, 576, rational(25, 1)));
preset_tree_->addTopLevelItem(CreateSDPresetFolder(tr("NTSC"), 720, 480, rational(30000, 1001), 1));
preset_tree_->addTopLevelItem(CreateSDPresetFolder(tr("PAL"), 720, 576, rational(25, 1), 1));
// Load custom presets
QFile preset_file(GetCustomPresetFilename());
@@ -71,6 +71,10 @@ SequenceDialogPresetTab::SequenceDialogPresetTab(QWidget* parent) :
p.sample_rate = reader.readElementText().toInt();
} else if (reader.name() == QStringLiteral("chlayout")) {
p.channel_layout = reader.readElementText().toULongLong();
} else if (reader.name() == QStringLiteral("divider")) {
p.preview_divider = reader.readElementText().toInt();
} else if (reader.name() == QStringLiteral("format")) {
p.preview_format = static_cast<PixelFormat::Format>(reader.readElementText().toInt());
} else {
reader.skipCurrentElement();
}
@@ -111,6 +115,8 @@ SequenceDialogPresetTab::~SequenceDialogPresetTab()
writer.writeTextElement(QStringLiteral("framerate"), p.frame_rate.toString());
writer.writeTextElement(QStringLiteral("samplerate"), QString::number(p.sample_rate));
writer.writeTextElement(QStringLiteral("chlayout"), QString::number(p.channel_layout));
writer.writeTextElement(QStringLiteral("divider"), QString::number(p.preview_divider));
writer.writeTextElement(QStringLiteral("format"), QString::number(p.preview_format));
writer.writeEndElement(); // preset
}
@@ -170,7 +176,7 @@ QTreeWidgetItem* SequenceDialogPresetTab::CreateFolder(const QString &name)
return folder;
}
QTreeWidgetItem *SequenceDialogPresetTab::CreateHDPresetFolder(const QString &name, int width, int height)
QTreeWidgetItem *SequenceDialogPresetTab::CreateHDPresetFolder(const QString &name, int width, int height, int divider)
{
QTreeWidgetItem* parent = CreateFolder(name);
AddItem(parent, {tr("%1 23.976 FPS").arg(name),
@@ -178,35 +184,45 @@ QTreeWidgetItem *SequenceDialogPresetTab::CreateHDPresetFolder(const QString &na
height,
rational(24000, 1001),
48000,
AV_CH_LAYOUT_STEREO});
AV_CH_LAYOUT_STEREO,
divider,
PixelFormat::PIX_FMT_RGBA16F});
AddItem(parent, {tr("%1 25 FPS").arg(name),
width,
height,
rational(25, 1),
48000,
AV_CH_LAYOUT_STEREO});
AV_CH_LAYOUT_STEREO,
divider,
PixelFormat::PIX_FMT_RGBA16F});
AddItem(parent, {tr("%1 29.97 FPS").arg(name),
width,
height,
rational(30000, 1001),
48000,
AV_CH_LAYOUT_STEREO});
AV_CH_LAYOUT_STEREO,
divider,
PixelFormat::PIX_FMT_RGBA16F});
AddItem(parent, {tr("%1 50 FPS").arg(name),
width,
height,
rational(50, 1),
48000,
AV_CH_LAYOUT_STEREO});
AV_CH_LAYOUT_STEREO,
divider,
PixelFormat::PIX_FMT_RGBA16F});
AddItem(parent, {tr("%1 59.94 FPS").arg(name),
width,
height,
rational(60000, 1001),
48000,
AV_CH_LAYOUT_STEREO});
AV_CH_LAYOUT_STEREO,
divider,
PixelFormat::PIX_FMT_RGBA16F});
return parent;
}
QTreeWidgetItem *SequenceDialogPresetTab::CreateSDPresetFolder(const QString &name, int width, int height, const rational& frame_rate)
QTreeWidgetItem *SequenceDialogPresetTab::CreateSDPresetFolder(const QString &name, int width, int height, const rational& frame_rate, int divider)
{
QTreeWidgetItem* parent = CreateFolder(name);
preset_tree_->addTopLevelItem(parent);
@@ -215,13 +231,17 @@ QTreeWidgetItem *SequenceDialogPresetTab::CreateSDPresetFolder(const QString &na
height,
frame_rate,
48000,
AV_CH_LAYOUT_STEREO});
AV_CH_LAYOUT_STEREO,
divider,
PixelFormat::PIX_FMT_RGBA16F});
AddItem(parent, {tr("%1 Widescreen").arg(name),
width,
height,
frame_rate,
48000,
AV_CH_LAYOUT_STEREO});
AV_CH_LAYOUT_STEREO,
divider,
PixelFormat::PIX_FMT_RGBA16F});
return parent;
}
@@ -28,9 +28,9 @@ signals:
private:
QTreeWidgetItem *CreateFolder(const QString& name);
QTreeWidgetItem *CreateHDPresetFolder(const QString& name, int width, int height);
QTreeWidgetItem *CreateHDPresetFolder(const QString& name, int width, int height, int divider);
QTreeWidgetItem *CreateSDPresetFolder(const QString& name, int width, int height, const rational &frame_rate);
QTreeWidgetItem *CreateSDPresetFolder(const QString& name, int width, int height, const rational &frame_rate, int divider);
QString GetPresetName(QString start);
+3
View File
@@ -2,6 +2,7 @@
#define SEQUENCEPARAM_H
#include "common/rational.h"
#include "render/pixelformat.h"
OLIVE_NAMESPACE_ENTER
@@ -12,6 +13,8 @@ struct SequencePreset {
rational frame_rate;
int sample_rate;
uint64_t channel_layout;
int preview_divider;
PixelFormat::Format preview_format;
};
OLIVE_NAMESPACE_EXIT