Change the way the flags are interpreted for MP3 compression. The main impact is that now minimum and maximum bitrates are undefined by default and not passed to lame if they are not defined explicitly. They can also be used for both ABR and VBR now.

Also improved the GUI tools MP3 option page. When switching between ABR and VBR only the relevant options remain visible. The page has not been changed to allow use of minimum and maximum bitrates for ABR though (and they are still always used for VBR). So the user does not have as much flexibility with MP3 options when using the GUI tools than he has with the CLI version.

svn-id: r48974
This commit is contained in:
Thierry Crozat
2010-05-08 22:42:29 +00:00
parent 95e91f2d32
commit 38c17b4c76
6 changed files with 142 additions and 122 deletions
+64 -45
View File
@@ -42,8 +42,8 @@
#endif
struct lameparams {
uint32 minBitr;
uint32 maxBitr;
int32 minBitr;
int32 maxBitr;
uint32 targetBitr;
bool abr;
uint32 algqual;
@@ -72,7 +72,7 @@ struct rawtype {
uint8 bitsPerSample;
};
lameparams encparms = { minBitrDef, maxBitrDef, targetBitrDef, false, algqualDef, vbrqualDef, 0, "lame" };
lameparams lameparms = { -1, -1, 32, false, algqualDef, vbrqualDef, 0, "lame" };
oggencparams oggparms = { -1, -1, -1, (float)oggqualDef, 0 };
flaccparams flacparms = { flacCompressDef, flacBlocksizeDef, false, false };
rawtype rawAudioType = { false, false, 8 };
@@ -125,7 +125,7 @@ void CompressionTool::encodeAudio(const char *inname, bool rawInput, int rawSamp
char *tmp = fbuf;
if (compmode == AUDIO_MP3) {
tmp += sprintf(tmp, "%s -t ", encparms.lamePath.c_str());
tmp += sprintf(tmp, "%s -t ", lameparms.lamePath.c_str());
if (rawInput) {
tmp += sprintf(tmp, "-r ");
tmp += sprintf(tmp, "--bitwidth %d ", rawAudioType.bitsPerSample);
@@ -140,12 +140,15 @@ void CompressionTool::encodeAudio(const char *inname, bool rawInput, int rawSamp
tmp += sprintf(tmp, "-s %d ", rawSamplerate);
}
if (encparms.abr)
tmp += sprintf(tmp, "--abr %d ", encparms.targetBitr);
else {
tmp += sprintf(tmp, "--vbr-new -b %d ", encparms.minBitr);
tmp += sprintf(tmp, "-B %d ", encparms.maxBitr);
}
if (lameparms.abr)
tmp += sprintf(tmp, "--abr %d ", lameparms.targetBitr);
else
tmp += sprintf(tmp, "--vbr-new -V %d ", lameparms.vbrqual);
if (lameparms.minBitr != -1)
tmp += sprintf(tmp, "-b %d ", lameparms.minBitr);
if (lameparms.maxBitr != -1)
tmp += sprintf(tmp, "-B %d ", lameparms.maxBitr);
/* Explicitly specify a target sample rate, to work around a bug (?)
* in newer lame versions (>= 3.95) which causes it to malfunction
@@ -158,12 +161,11 @@ void CompressionTool::encodeAudio(const char *inname, bool rawInput, int rawSamp
tmp += sprintf(tmp, "--resample %d ", map2MP3Frequency(97 * rawSamplerate / 100));
}
if (encparms.silent) {
if (lameparms.silent) {
tmp += sprintf(tmp, " --silent ");
}
tmp += sprintf(tmp, "-q %d ", encparms.algqual);
tmp += sprintf(tmp, "-V %d ", encparms.vbrqual);
tmp += sprintf(tmp, "-q %d ", lameparms.algqual);
tmp += sprintf(tmp, "\"%s\" \"%s\" ", inname, outname);
@@ -778,62 +780,74 @@ void CompressionTool::extractAndEncodeVOC(const char *outName, Common::File &inp
// mp3 settings
void CompressionTool::setMp3LamePath(const std::string& arg) {
encparms.lamePath = arg;
lameparms.lamePath = arg;
}
void CompressionTool::setMp3CompressionType(const std::string& arg) {
encparms.abr = (arg == "ABR");
lameparms.abr = (arg == "ABR");
}
void CompressionTool::setMp3MpegQuality(const std::string& arg) {
encparms.algqual = atoi(arg.c_str());
lameparms.algqual = atoi(arg.c_str());
if (encparms.algqual == 0 && arg != "0")
if (lameparms.algqual == 0 && arg != "0")
throw ToolException("Quality (-q) must be a number.");
if (encparms.algqual > 9)
if (lameparms.algqual > 9)
throw ToolException("Quality (-q) out of bounds, must be between 0 and 9.");
}
void CompressionTool::setMp3ABRBitrate(const std::string& arg) {
encparms.minBitr = atoi(arg.c_str());
void CompressionTool::setMp3TargetBitrate(const std::string& arg) {
lameparms.minBitr = atoi(arg.c_str());
if (encparms.targetBitr == 0 && arg != "0")
if (lameparms.targetBitr == 0 && arg != "0")
throw ToolException("Minimum bitrate (-b) must be a number.");
if (encparms.targetBitr < 8 || encparms.targetBitr > 160)
if (lameparms.targetBitr < 8 || lameparms.targetBitr > 160)
throw ToolException("Minimum bitrate out of bounds (-b), must be between 8 and 160.");
}
void CompressionTool::setMp3VBRMinBitrate(const std::string& arg) {
encparms.minBitr = atoi(arg.c_str());
void CompressionTool::setMp3MinBitrate(const std::string& arg) {
lameparms.minBitr = atoi(arg.c_str());
if (encparms.minBitr == 0 && arg != "0")
if (lameparms.minBitr == 0 && arg != "0")
throw ToolException("Minimum bitrate (-b) must be a number.");
if ((encparms.minBitr % 8) != 0)
encparms.maxBitr -= encparms.minBitr % 8;
if ((lameparms.minBitr % 8) != 0)
lameparms.minBitr -= lameparms.minBitr % 8;
if (lameparms.minBitr > 64 && (lameparms.minBitr % 16) != 0)
lameparms.minBitr -= lameparms.minBitr % 16;
if (encparms.minBitr < 8 || encparms.minBitr > 160)
if (lameparms.minBitr < 8 || lameparms.minBitr > 160)
throw ToolException("Minimum bitrate out of bounds (-b), must be between 8 and 160.");
}
void CompressionTool::setMp3VBRMaxBitrate(const std::string& arg) {
encparms.maxBitr = atoi(arg.c_str());
void CompressionTool::setMp3MaxBitrate(const std::string& arg) {
lameparms.maxBitr = atoi(arg.c_str());
if (encparms.maxBitr == 0 && arg != "0")
if (lameparms.maxBitr == 0 && arg != "0")
throw ToolException("Maximum bitrate (-B) must be a number.");
if ((encparms.maxBitr % 8) != 0)
encparms.maxBitr -= encparms.maxBitr % 8;
if ((lameparms.maxBitr % 8) != 0)
lameparms.maxBitr -= lameparms.maxBitr % 8;
if (lameparms.maxBitr > 64 && (lameparms.maxBitr % 16) != 0)
lameparms.maxBitr -= lameparms.maxBitr % 16;
if (encparms.maxBitr < 8 || encparms.maxBitr > 160)
if (lameparms.maxBitr < 8 || lameparms.maxBitr > 160)
throw ToolException("Maximum bitrate out of bounds (-B), must be between 8 and 160.");
}
void CompressionTool::unsetMp3MinBitrate() {
lameparms.minBitr = -1;
}
void CompressionTool::unsetMp3MaxBitrate() {
lameparms.maxBitr = -1;
}
void CompressionTool::setMp3VBRQuality(const std::string& arg) {
encparms.vbrqual = atoi(arg.c_str());
if (encparms.vbrqual > 9)
lameparms.vbrqual = atoi(arg.c_str());
if (lameparms.vbrqual > 9)
throw ToolException("Quality (-q) out of bounds, must be between 0 and 9.");
}
@@ -903,9 +917,14 @@ bool CompressionTool::processMp3Parms() {
_arguments.pop_front();
if (arg == "--vbr") {
encparms.abr = 0;
lameparms.abr = 0;
} else if (arg == "--abr") {
encparms.abr = 1;
if (_arguments.empty())
throw ToolException("Could not parse command line options, expected target bitrate after --abr");
lameparms.abr = 1;
setMp3TargetBitrate(_arguments.front());
_arguments.pop_front();
} else if (arg == "--lame-path") {
if (_arguments.empty())
throw ToolException("Could not parse command line options, expected value after --lame-path");
@@ -915,13 +934,13 @@ bool CompressionTool::processMp3Parms() {
} else if (arg == "-b") {
if (_arguments.empty())
throw ToolException("Could not parse command line options, expected value after -b");
setMp3VBRMinBitrate(_arguments.front());
setMp3MinBitrate(_arguments.front());
_arguments.pop_front();
} else if (arg == "-B") {
if (_arguments.empty())
throw ToolException("Could not parse command line options, expected value after -B");
setMp3VBRMaxBitrate(_arguments.front());
setMp3MaxBitrate(_arguments.front());
_arguments.pop_front();
} else if (arg == "-V") {
@@ -937,7 +956,7 @@ bool CompressionTool::processMp3Parms() {
_arguments.pop_front();
} else if (arg == "--silent") {
encparms.silent = 1;
lameparms.silent = 1;
} else {
_arguments.push_front(arg); //put back the non-audio argument we popped.
break;
@@ -1115,11 +1134,11 @@ std::string CompressionTool::getHelp() const {
if (_supportedFormats & AUDIO_MP3) {
os << "\nMP3 mode params:\n";
os << " --lame-path <path> Path to the lame excutable to use (default: lame)\n";
os << " -b <rate> <rate> is the target bitrate(ABR)/minimal bitrate(VBR) (default:" << targetBitrDef << " for ABR and " << minBitrDef << " for VBR)\n";
os << " -B <rate> <rate> is the maximum VBR bitrate (default:" << maxBitrDef << ")\n";
os << " --lame-path <path> Path to the lame excutable to use (default:lame)\n";
os << " -b <rate> <rate> is the minimal bitrate (default:unset)\n";
os << " -B <rate> <rate> is the maximum bitrate (default:unset)\n";
os << " --vbr LAME uses the VBR mode (default)\n";
os << " --abr LAME uses the ABR mode\n";
os << " --abr <rate> LAME uses the ABR mode with the given target bitrate\n";
os << " -V <value> specifies the value (0 - 9) of VBR quality (0=best) (default:" << vbrqualDef << ")\n";
os << " -q <value> specifies the MPEG algorithm quality (0-9; 0=best) (default:" << algqualDef << ")\n";
os << " --silent the output of LAME is hidden (default:disabled)\n";