Skip to content

Commit

Permalink
TOOLS: Improve GUI for Ogg encoding options
Browse files Browse the repository at this point in the history
This makes it possible to encode using a target quality instead of
target bitrate and also makes min and max bitrates optionals.
This fixes bug #3092367.
  • Loading branch information
criezy committed Apr 6, 2011
1 parent cf8d020 commit 79ebea9
Show file tree
Hide file tree
Showing 8 changed files with 155 additions and 52 deletions.
1 change: 1 addition & 0 deletions NEWS
Expand Up @@ -2,6 +2,7 @@ For a more comprehensive changelog for the latest experimental SVN code, see:
http://scummvm.svn.sourceforge.net/viewvc/scummvm/tools/trunk/?view=log

1.3.0 (????-??-??)
- Fix bug #3092367: "TOOLS: Improve GUI for Ogg encoding options".

1.2.0 (2010-10-15)
- Add extract_fascination_cd tool for extracting STK archives from a mode1/2048
Expand Down
11 changes: 11 additions & 0 deletions compress.cpp
Expand Up @@ -892,6 +892,9 @@ void CompressionTool::setOggQuality(const std::string& arg) {

if (oggparms.quality < -1.f || oggparms.quality > 10.f)
throw ToolException("Quality out of bounds (-q), must be between -1 and 10.");

// Also unset nominal bitrate so that quality is used
oggparms.nominalBitr = -1;
}

void CompressionTool::setOggMinBitrate(const std::string& arg) {
Expand Down Expand Up @@ -924,6 +927,14 @@ void CompressionTool::setOggMaxBitrate(const std::string& arg) {
throw ToolException("Maximum bitrate out of bounds (-M), must be between 8 and 160.");
}

void CompressionTool::unsetOggMinBitrate() {
oggparms.minBitr = -1;
}

void CompressionTool::unsetOggMaxBitrate() {
oggparms.maxBitr = -1;
}

bool CompressionTool::processMp3Parms() {
while (!_arguments.empty()) {
std::string arg = _arguments.front();
Expand Down
3 changes: 3 additions & 0 deletions compress.h
Expand Up @@ -113,6 +113,9 @@ class CompressionTool : public Tool {
void setOggMinBitrate(const std::string&);
void setOggAvgBitrate(const std::string&);
void setOggMaxBitrate(const std::string&);
void unsetOggMinBitrate();
void unsetOggMaxBitrate();


public:
bool processMp3Parms();
Expand Down
9 changes: 6 additions & 3 deletions gui/configuration.cpp
Expand Up @@ -52,11 +52,12 @@ Configuration::Configuration() {
flacCompressionLevel = wxT("8");
flacBlockSize = wxT("1152");

// flac params
// ogg params
useOggQuality = true;
oggQuality = wxT("3");
oggMinBitrate = wxT("24");
oggMinBitrate = wxT("None");
oggAvgBitrate = wxT("24");
oggMaxBitrate = wxT("64");
oggMaxBitrate = wxT("None");

}

Expand All @@ -82,6 +83,7 @@ void Configuration::load() {
filecnf->Read(wxT("flacBlockSize"), &flacBlockSize, flacBlockSize);

// flac params
filecnf->Read(wxT("useOggQuality"), &useOggQuality, useOggQuality);
filecnf->Read(wxT("oggQuality"), &oggQuality, oggQuality);
filecnf->Read(wxT("oggMinBitrate"), &oggMinBitrate, oggMinBitrate);
filecnf->Read(wxT("oggAvgBitrate"), &oggAvgBitrate, oggAvgBitrate);
Expand Down Expand Up @@ -111,6 +113,7 @@ void Configuration::save(bool all) {
filecnf->Write(wxT("flacBlockSize"), flacBlockSize);

// flac params
filecnf->Write(wxT("useOggQuality"), useOggQuality);
filecnf->Write(wxT("oggQuality"), oggQuality);
filecnf->Write(wxT("oggMinBitrate"), oggMinBitrate);
filecnf->Write(wxT("oggAvgBitrate"), oggAvgBitrate);
Expand Down
1 change: 1 addition & 0 deletions gui/configuration.h
Expand Up @@ -104,6 +104,7 @@ struct Configuration {
wxString flacBlockSize;

// flac
bool useOggQuality;
wxString oggQuality;
wxString oggMinBitrate;
wxString oggAvgBitrate;
Expand Down
16 changes: 12 additions & 4 deletions gui/gui_tools.cpp
Expand Up @@ -164,10 +164,18 @@ void ToolGUI::run(const Configuration &conf) const {
compression->setFlacBlockSize ( (const char *)conf.flacBlockSize.mb_str() );

// vorbis
compression->setOggQuality ( (const char *)conf.oggQuality.mb_str() );
compression->setOggMinBitrate ( (const char *)conf.oggMinBitrate.mb_str() );
compression->setOggAvgBitrate ( (const char *)conf.oggAvgBitrate.mb_str() );
compression->setOggMaxBitrate ( (const char *)conf.oggMaxBitrate.mb_str() );
if (conf.useOggQuality)
compression->setOggQuality ( (const char *)conf.oggQuality.mb_str() );
else
compression->setOggAvgBitrate ( (const char *)conf.oggAvgBitrate.mb_str() );
if (conf.oggMinBitrate == wxT("None"))
compression->unsetOggMinBitrate();
else
compression->setOggMinBitrate ( (const char *)conf.oggMinBitrate.mb_str() );
if (conf.oggMaxBitrate == wxT("None"))
compression->unsetOggMaxBitrate();
else
compression->setOggMaxBitrate ( (const char *)conf.oggMaxBitrate.mb_str() );
}

_backend->run();
Expand Down
147 changes: 102 additions & 45 deletions gui/pages.cpp
Expand Up @@ -1146,86 +1146,143 @@ ChooseAudioOptionsVorbisPage::ChooseAudioOptionsVorbisPage(Configuration &config

wxWindow *ChooseAudioOptionsVorbisPage::CreatePanel(wxWindow *parent) {
wxWindow *panel = WizardPage::CreatePanel(parent);



wxSizer *sizer = new wxBoxSizer(wxVERTICAL);

/* Vorbis mode params
" -b <rate> <rate> is the nominal bitrate (default:unset)\n" \
" -m <rate> <rate> is the minimum bitrate (default:unset)\n" \
" -M <rate> <rate> is the maximum bitrate (default:unset)\n" \
" -q <value> specifies the value (0 - 10) of VBR quality (10=best) (default:" oggqualDef_str ")\n" \
" --silent the output of oggenc is hidden (default:disabled)\n" \
*/


// Grid
_gridSizer = new wxFlexGridSizer(5, 2, 10, 25);
_gridSizer->AddGrowableCol(1);


// Compression target type
_gridSizer->Add(new wxStaticText(panel, wxID_ANY, wxT("Target Type:")));

wxRadioButton *qualityButton = new wxRadioButton(
panel, wxID_ANY, wxT("Quality Factor"),
wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator, wxT("Quality"));

wxSizer *radioSizer = new wxBoxSizer(wxHORIZONTAL);
radioSizer->Add(qualityButton);

wxRadioButton *bitrateButton = new wxRadioButton(
panel, wxID_ANY, wxT("Nominal Bitrate"),
wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator, wxT("Bitrate"));
radioSizer->Add(bitrateButton);

_gridSizer->Add(radioSizer, wxSizerFlags().Expand());


// Quality
const int possibleQualityCount = 11;
wxString possibleQualities[possibleQualityCount + 1];
for (int i = 0; i <= possibleQualityCount; ++i) {
possibleQualities[i] << i;
}

_qualityFactorLabel = new wxStaticText(panel, wxID_ANY, wxT("Quality:"));
_gridSizer->Add(_qualityFactorLabel);

_qualityFactor = new wxChoice(
panel, wxID_ANY, wxDefaultPosition, wxDefaultSize,
possibleQualityCount, possibleQualities, 0, wxDefaultValidator, wxT("QualityFactor"));
_gridSizer->Add(_qualityFactor, wxSizerFlags().Expand().Border(wxRIGHT, 100));

wxFlexGridSizer *sizer = new wxFlexGridSizer(4, 2, 10, 25);
sizer->AddGrowableCol(1);

// Bitrates
const int possibleBitrateCount = 160 / 8;
wxString possibleBitrates[possibleBitrateCount + 1];
for (int i = 0; i <= possibleBitrateCount; ++i) {
wxString possibleBitrates[possibleBitrateCount];
wxString possibleMinMaxBitrates[possibleBitrateCount + 1];
possibleMinMaxBitrates[0] = wxT("None");
for (int i = 0; i < possibleBitrateCount; ++i) {
possibleBitrates[i] << (i+1)*8;
possibleMinMaxBitrates[i+1] << (i+1)*8;
}

_nominalBitrateLabel = new wxStaticText(panel, wxID_ANY, wxT("Nominal Bitrate:"));
_gridSizer->Add(_nominalBitrateLabel);

sizer->Add(new wxStaticText(panel, wxID_ANY, wxT("Minimum Bitrate:")));
_nominalBitrate = new wxChoice(
panel, wxID_ANY, wxDefaultPosition, wxDefaultSize,
possibleBitrateCount, possibleBitrates, 0, wxDefaultValidator, wxT("NominalBitrate"));
_gridSizer->Add(_nominalBitrate, wxSizerFlags().Expand().Border(wxRIGHT, 100));

wxChoice *MinBitrate = new wxChoice(
panel, wxID_ANY, wxDefaultPosition, wxDefaultSize,
possibleBitrateCount, possibleBitrates, 0, wxDefaultValidator, wxT("MinimumBitrate"));
sizer->Add(MinBitrate, wxSizerFlags().Expand().Border(wxRIGHT, 100));


sizer->Add(new wxStaticText(panel, wxID_ANY, wxT("Nominal Bitrate:")));

wxChoice *AvgBitrate = new wxChoice(
panel, wxID_ANY, wxDefaultPosition, wxDefaultSize,
possibleBitrateCount, possibleBitrates, 0, wxDefaultValidator, wxT("NominalBitrate"));
sizer->Add(AvgBitrate, wxSizerFlags().Expand().Border(wxRIGHT, 100));


sizer->Add(new wxStaticText(panel, wxID_ANY, wxT("Maximum Bitrate:")));
_gridSizer->Add(new wxStaticText(panel, wxID_ANY, wxT("Minimum Bitrate:")));

wxChoice *MinBitrate = new wxChoice(
panel, wxID_ANY, wxDefaultPosition, wxDefaultSize,
possibleBitrateCount+1, possibleMinMaxBitrates, 0, wxDefaultValidator, wxT("MinimumBitrate"));
_gridSizer->Add(MinBitrate, wxSizerFlags().Expand().Border(wxRIGHT, 100));


_gridSizer->Add(new wxStaticText(panel, wxID_ANY, wxT("Maximum Bitrate:")));

wxChoice *MaxBitrate = new wxChoice(
panel, wxID_ANY, wxDefaultPosition, wxDefaultSize,
possibleBitrateCount, possibleBitrates, 0, wxDefaultValidator, wxT("MaximumBitrate"));
sizer->Add(MaxBitrate, wxSizerFlags().Expand().Border(wxRIGHT, 100));
panel, wxID_ANY, wxDefaultPosition, wxDefaultSize,
possibleBitrateCount+1, possibleMinMaxBitrates, 0, wxDefaultValidator, wxT("MaximumBitrate"));
_gridSizer->Add(MaxBitrate, wxSizerFlags().Expand().Border(wxRIGHT, 100));


// Quality
const int possibleQualityCount = 11;
wxString possibleQualities[possibleQualityCount + 1];
for (int i = 0; i <= possibleQualityCount; ++i) {
possibleQualities[i] << i;
}
qualityButton->Connect(wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler(ChooseAudioOptionsVorbisPage::onChangeTargetType), NULL, this);
bitrateButton->Connect(wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler(ChooseAudioOptionsVorbisPage::onChangeTargetType), NULL, this);

sizer->Add(new wxStaticText(panel, wxID_ANY, wxT("Quality:")));

wxChoice *quality = new wxChoice(
panel, wxID_ANY, wxDefaultPosition, wxDefaultSize,
possibleQualityCount, possibleQualities, 0, wxDefaultValidator, wxT("Quality"));
sizer->Add(quality, wxSizerFlags().Expand().Border(wxRIGHT, 100));

// Finish the window
sizer->Add(_gridSizer, wxSizerFlags().Expand());
SetAlignedSizer(panel, sizer);


// Load settings
MinBitrate->SetStringSelection(_configuration.oggMinBitrate);
AvgBitrate->SetStringSelection(_configuration.oggAvgBitrate);
MaxBitrate->SetStringSelection(_configuration.oggMaxBitrate);
quality ->SetStringSelection(_configuration.oggQuality);
_qualityFactor->SetStringSelection(_configuration.oggQuality);
_nominalBitrate->SetStringSelection(_configuration.oggAvgBitrate);
if (_configuration.useOggQuality)
qualityButton->SetValue(true);
else
bitrateButton->SetValue(true);

updateFields(panel);

return panel;
}

void ChooseAudioOptionsVorbisPage::save(wxWindow *panel) {
wxChoice *minBitrate = static_cast<wxChoice *>(panel->FindWindowByName(wxT("MinimumBitrate")));
wxChoice *avgBitrate = static_cast<wxChoice *>(panel->FindWindowByName(wxT("NominalBitrate")));
wxChoice *maxBitrate = static_cast<wxChoice *>(panel->FindWindowByName(wxT("MaximumBitrate")));
wxChoice *quality = static_cast<wxChoice *>(panel->FindWindowByName(wxT("Quality")));
wxRadioButton *quality = static_cast<wxRadioButton *>(panel->FindWindowByName(wxT("Quality")));
wxChoice *minBitrate = static_cast<wxChoice *>(panel->FindWindowByName(wxT("MinimumBitrate")));
wxChoice *maxBitrate = static_cast<wxChoice *>(panel->FindWindowByName(wxT("MaximumBitrate")));

_configuration.useOggQuality = quality->GetValue();
_configuration.oggMinBitrate = minBitrate->GetStringSelection();
_configuration.oggAvgBitrate = avgBitrate->GetStringSelection();
_configuration.oggAvgBitrate = _nominalBitrate->GetStringSelection();
_configuration.oggMaxBitrate = maxBitrate->GetStringSelection();
_configuration.oggQuality = quality ->GetStringSelection();
_configuration.oggQuality = _qualityFactor->GetStringSelection();
}

void ChooseAudioOptionsVorbisPage::updateFields(wxWindow *panel) {
wxRadioButton *quality = static_cast<wxRadioButton *>(panel->FindWindowByName(wxT("Quality")));

bool isQualitySelected = quality->GetValue();
_gridSizer->Show(_qualityFactor, isQualitySelected);
_gridSizer->Show(_qualityFactorLabel, isQualitySelected);
_gridSizer->Show(_nominalBitrate, !isQualitySelected);
_gridSizer->Show(_nominalBitrateLabel, !isQualitySelected);

_gridSizer->Layout();
}

void ChooseAudioOptionsVorbisPage::onChangeTargetType(wxCommandEvent &evt) {
wxRadioButton *btn = static_cast<wxRadioButton *>(evt.GetEventObject());
wxWindow *parent = btn->GetParent();
updateFields(parent);
}

void ChooseAudioOptionsVorbisPage::onNext(wxWindow *panel) {
Expand Down
19 changes: 19 additions & 0 deletions gui/pages.h
Expand Up @@ -366,6 +366,25 @@ class ChooseAudioOptionsVorbisPage : public WizardPage {
void onNext(wxWindow *panel);

void save(wxWindow *panel);

/**
* Handles clicks on the radio buttons for Quality / Nominal bitrate
*/
void onChangeTargetType(wxCommandEvent &evt);

/**
* Enables/Disables the different fields depending on ABR/VBR setting
*
* @param panel The panel to operate on
*/
void updateFields(wxWindow *panel);

private:
wxFlexGridSizer* _gridSizer;
wxStaticText* _qualityFactorLabel;
wxChoice* _qualityFactor;
wxStaticText* _nominalBitrateLabel;
wxChoice* _nominalBitrate;
};


Expand Down

1 comment on commit 79ebea9

@fingolfin
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good job :)

Please sign in to comment.