From 79ebea97c51e9eb4959797d39cb875775ec59150 Mon Sep 17 00:00:00 2001 From: Thierry Crozat Date: Wed, 6 Apr 2011 18:23:21 +0100 Subject: [PATCH] TOOLS: Improve GUI for Ogg encoding options 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. --- NEWS | 1 + compress.cpp | 11 +++ compress.h | 3 + gui/configuration.cpp | 9 ++- gui/configuration.h | 1 + gui/gui_tools.cpp | 16 +++-- gui/pages.cpp | 153 +++++++++++++++++++++++++++++------------- gui/pages.h | 19 ++++++ 8 files changed, 158 insertions(+), 55 deletions(-) diff --git a/NEWS b/NEWS index 8adaa973..2085ad12 100644 --- a/NEWS +++ b/NEWS @@ -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 diff --git a/compress.cpp b/compress.cpp index 59cb9d37..ac9c84a6 100644 --- a/compress.cpp +++ b/compress.cpp @@ -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) { @@ -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(); diff --git a/compress.h b/compress.h index b2d8b45f..abc89d32 100644 --- a/compress.h +++ b/compress.h @@ -113,6 +113,9 @@ public: void setOggMinBitrate(const std::string&); void setOggAvgBitrate(const std::string&); void setOggMaxBitrate(const std::string&); + void unsetOggMinBitrate(); + void unsetOggMaxBitrate(); + public: bool processMp3Parms(); diff --git a/gui/configuration.cpp b/gui/configuration.cpp index 991a1290..ccc7a1e0 100644 --- a/gui/configuration.cpp +++ b/gui/configuration.cpp @@ -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"); } @@ -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); @@ -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); diff --git a/gui/configuration.h b/gui/configuration.h index 319e21bd..9b419153 100644 --- a/gui/configuration.h +++ b/gui/configuration.h @@ -104,6 +104,7 @@ struct Configuration { wxString flacBlockSize; // flac + bool useOggQuality; wxString oggQuality; wxString oggMinBitrate; wxString oggAvgBitrate; diff --git a/gui/gui_tools.cpp b/gui/gui_tools.cpp index 7a60c69a..26214fd1 100644 --- a/gui/gui_tools.cpp +++ b/gui/gui_tools.cpp @@ -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(); diff --git a/gui/pages.cpp b/gui/pages.cpp index 3fbbe78e..53dcfa17 100644 --- a/gui/pages.cpp +++ b/gui/pages.cpp @@ -1146,8 +1146,9 @@ ChooseAudioOptionsVorbisPage::ChooseAudioOptionsVorbisPage(Configuration &config wxWindow *ChooseAudioOptionsVorbisPage::CreatePanel(wxWindow *parent) { wxWindow *panel = WizardPage::CreatePanel(parent); - - + + wxSizer *sizer = new wxBoxSizer(wxVERTICAL); + /* Vorbis mode params " -b is the nominal bitrate (default:unset)\n" \ " -m is the minimum bitrate (default:unset)\n" \ @@ -1155,39 +1156,30 @@ wxWindow *ChooseAudioOptionsVorbisPage::CreatePanel(wxWindow *parent) { " -q 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()); - 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) { - possibleBitrates[i] << (i+1)*8; - } - - sizer->Add(new wxStaticText(panel, wxID_ANY, wxT("Minimum Bitrate:"))); - - 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:"))); - - wxChoice *MaxBitrate = new wxChoice( - panel, wxID_ANY, wxDefaultPosition, wxDefaultSize, - possibleBitrateCount, possibleBitrates, 0, wxDefaultValidator, wxT("MaximumBitrate")); - sizer->Add(MaxBitrate, wxSizerFlags().Expand().Border(wxRIGHT, 100)); // Quality const int possibleQualityCount = 11; @@ -1195,37 +1187,102 @@ wxWindow *ChooseAudioOptionsVorbisPage::CreatePanel(wxWindow *parent) { 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)); - 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)); + // Bitrates + const int possibleBitrateCount = 160 / 8; + 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); + + _nominalBitrate = new wxChoice( + panel, wxID_ANY, wxDefaultPosition, wxDefaultSize, + possibleBitrateCount, possibleBitrates, 0, wxDefaultValidator, wxT("NominalBitrate")); + _gridSizer->Add(_nominalBitrate, wxSizerFlags().Expand().Border(wxRIGHT, 100)); + + + _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+1, possibleMinMaxBitrates, 0, wxDefaultValidator, wxT("MaximumBitrate")); + _gridSizer->Add(MaxBitrate, wxSizerFlags().Expand().Border(wxRIGHT, 100)); + + + qualityButton->Connect(wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler(ChooseAudioOptionsVorbisPage::onChangeTargetType), NULL, this); + bitrateButton->Connect(wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler(ChooseAudioOptionsVorbisPage::onChangeTargetType), NULL, this); + // 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(panel->FindWindowByName(wxT("MinimumBitrate"))); - wxChoice *avgBitrate = static_cast(panel->FindWindowByName(wxT("NominalBitrate"))); - wxChoice *maxBitrate = static_cast(panel->FindWindowByName(wxT("MaximumBitrate"))); - wxChoice *quality = static_cast(panel->FindWindowByName(wxT("Quality"))); + wxRadioButton *quality = static_cast(panel->FindWindowByName(wxT("Quality"))); + wxChoice *minBitrate = static_cast(panel->FindWindowByName(wxT("MinimumBitrate"))); + wxChoice *maxBitrate = static_cast(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(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(evt.GetEventObject()); + wxWindow *parent = btn->GetParent(); + updateFields(parent); } void ChooseAudioOptionsVorbisPage::onNext(wxWindow *panel) { diff --git a/gui/pages.h b/gui/pages.h index 3620dd6f..2f49a8d9 100644 --- a/gui/pages.h +++ b/gui/pages.h @@ -366,6 +366,25 @@ public: 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; };