Updated Web Updater binary. Now takes an additional "Checksum" argument.
[LameXP.git] / src / Registry_Encoder.cpp
blob00f9371ac8541650f0398b073cb6d8862ec6771c
1 ///////////////////////////////////////////////////////////////////////////////
2 // LameXP - Audio Encoder Front-End
3 // Copyright (C) 2004-2015 LoRd_MuldeR <MuldeR2@GMX.de>
4 //
5 // This program is free software; you can redistribute it and/or modify
6 // it under the terms of the GNU General Public License as published by
7 // the Free Software Foundation; either version 2 of the License, or
8 // (at your option) any later version, but always including the *additional*
9 // restrictions defined in the "License.txt" file.
11 // This program is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 // GNU General Public License for more details.
16 // You should have received a copy of the GNU General Public License along
17 // with this program; if not, write to the Free Software Foundation, Inc.,
18 // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
20 // http://www.gnu.org/licenses/gpl-2.0.txt
21 ///////////////////////////////////////////////////////////////////////////////
23 #include "Registry_Encoder.h"
25 #include "Global.h"
26 #include "Model_Settings.h"
27 #include "Encoder_AAC.h"
28 #include "Encoder_AAC_FHG.h"
29 #include "Encoder_AAC_FDK.h"
30 #include "Encoder_AAC_QAAC.h"
31 #include "Encoder_AC3.h"
32 #include "Encoder_DCA.h"
33 #include "Encoder_FLAC.h"
34 #include "Encoder_MP3.h"
35 #include "Encoder_Vorbis.h"
36 #include "Encoder_Opus.h"
37 #include "Encoder_MAC.h"
38 #include "Encoder_Wave.h"
40 #define IS_VBR(RC_MODE) ((RC_MODE) == SettingsModel::VBRMode)
41 #define IS_ABR(RC_MODE) ((RC_MODE) == SettingsModel::ABRMode)
42 #define IS_CBR(RC_MODE) ((RC_MODE) == SettingsModel::CBRMode)
44 ////////////////////////////////////////////////////////////
45 // Create encoder instance
46 ////////////////////////////////////////////////////////////
48 AbstractEncoder *EncoderRegistry::createInstance(const int encoderId, const SettingsModel *settings, bool *nativeResampling)
50 int rcMode = -1;
51 AbstractEncoder *encoder = NULL;
52 *nativeResampling = false;
54 //Create new encoder instance and apply encoder-specific settings
55 switch(encoderId)
57 /*-------- MP3Encoder /*--------*/
58 case SettingsModel::MP3Encoder:
60 MP3Encoder *mp3Encoder = new MP3Encoder();
61 mp3Encoder->setAlgoQuality(settings->lameAlgoQuality());
62 if(settings->bitrateManagementEnabled())
64 mp3Encoder->setBitrateLimits(settings->bitrateManagementMinRate(), settings->bitrateManagementMaxRate());
66 if(settings->samplingRate() > 0)
68 mp3Encoder->setSamplingRate(SettingsModel::samplingRates[settings->samplingRate()]);
69 *nativeResampling = true;
71 mp3Encoder->setChannelMode(settings->lameChannelMode());
72 encoder = mp3Encoder;
74 break;
75 /*-------- VorbisEncoder /*--------*/
76 case SettingsModel::VorbisEncoder:
78 VorbisEncoder *vorbisEncoder = new VorbisEncoder();
79 if(settings->bitrateManagementEnabled())
81 vorbisEncoder->setBitrateLimits(settings->bitrateManagementMinRate(), settings->bitrateManagementMaxRate());
83 if(settings->samplingRate() > 0)
85 vorbisEncoder->setSamplingRate(SettingsModel::samplingRates[settings->samplingRate()]);
86 *nativeResampling = true;
88 encoder = vorbisEncoder;
90 break;
91 /*-------- AACEncoder /*--------*/
92 case SettingsModel::AACEncoder:
94 switch(getAacEncoder())
96 case SettingsModel::AAC_ENCODER_QAAC:
98 QAACEncoder *aacEncoder = new QAACEncoder();
99 aacEncoder->setProfile(settings->aacEncProfile());
100 encoder = aacEncoder;
102 break;
103 case SettingsModel::AAC_ENCODER_FHG:
105 FHGAACEncoder *aacEncoder = new FHGAACEncoder();
106 aacEncoder->setProfile(settings->aacEncProfile());
107 encoder = aacEncoder;
109 break;
110 case SettingsModel::AAC_ENCODER_FDK:
112 FDKAACEncoder *aacEncoder = new FDKAACEncoder();
113 aacEncoder->setProfile(settings->aacEncProfile());
114 encoder = aacEncoder;
116 break;
117 case SettingsModel::AAC_ENCODER_NERO:
119 AACEncoder *aacEncoder = new AACEncoder();
120 aacEncoder->setEnable2Pass(settings->neroAACEnable2Pass());
121 aacEncoder->setProfile(settings->aacEncProfile());
122 encoder = aacEncoder;
124 break;
125 default:
126 MUTILS_THROW("makeEncoder(): Unknown AAC encoder specified!");
127 break;
130 break;
131 /*-------- AC3Encoder /*--------*/
132 case SettingsModel::AC3Encoder:
134 AC3Encoder *ac3Encoder = new AC3Encoder();
135 ac3Encoder->setAudioCodingMode(settings->aftenAudioCodingMode());
136 ac3Encoder->setDynamicRangeCompression(settings->aftenDynamicRangeCompression());
137 ac3Encoder->setExponentSearchSize(settings->aftenExponentSearchSize());
138 ac3Encoder->setFastBitAllocation(settings->aftenFastBitAllocation());
139 encoder = ac3Encoder;
141 break;
142 /*-------- FLACEncoder /*--------*/
143 case SettingsModel::FLACEncoder:
145 FLACEncoder *flacEncoder = new FLACEncoder();
146 encoder = flacEncoder;
148 break;
149 /*-------- OpusEncoder --------*/
150 case SettingsModel::OpusEncoder:
152 OpusEncoder *opusEncoder = new OpusEncoder();
153 opusEncoder->setOptimizeFor(settings->opusOptimizeFor());
154 opusEncoder->setEncodeComplexity(settings->opusComplexity());
155 opusEncoder->setFrameSize(settings->opusFramesize());
156 encoder = opusEncoder;
158 break;
159 /*-------- DCAEncoder --------*/
160 case SettingsModel::DCAEncoder:
162 DCAEncoder *dcaEncoder = new DCAEncoder();
163 encoder = dcaEncoder;
165 break;
166 /*-------- MACEncoder --------*/
167 case SettingsModel::MACEncoder:
169 MACEncoder *macEncoder = new MACEncoder();
170 encoder = macEncoder;
172 break;
173 /*-------- PCMEncoder --------*/
174 case SettingsModel::PCMEncoder:
176 WaveEncoder *waveEncoder = new WaveEncoder();
177 encoder = waveEncoder;
179 break;
180 /*-------- default --------*/
181 default:
182 MUTILS_THROW("Unsupported encoder!");
185 //Sanity checking
186 if(!encoder)
188 MUTILS_THROW("No encoder instance has been assigend!");
191 //Apply common settings
192 encoder->setRCMode(rcMode = loadEncoderMode(settings, encoderId));
193 encoder->setCustomParams(loadEncoderCustomParams(settings, encoderId));
194 encoder->setBitrate(loadEncoderValue(settings, encoderId, rcMode));
196 return encoder;
199 ////////////////////////////////////////////////////////////
200 // Get encoder info
201 ////////////////////////////////////////////////////////////
203 const AbstractEncoderInfo *EncoderRegistry::getEncoderInfo(const int encoderId)
205 const AbstractEncoderInfo *info = NULL;
207 switch(encoderId)
209 case SettingsModel::MP3Encoder: info = MP3Encoder ::getEncoderInfo(); break;
210 case SettingsModel::VorbisEncoder: info = VorbisEncoder::getEncoderInfo(); break;
211 case SettingsModel::AC3Encoder: info = AC3Encoder ::getEncoderInfo(); break;
212 case SettingsModel::FLACEncoder: info = FLACEncoder ::getEncoderInfo(); break;
213 case SettingsModel::OpusEncoder: info = OpusEncoder ::getEncoderInfo(); break;
214 case SettingsModel::DCAEncoder: info = DCAEncoder ::getEncoderInfo(); break;
215 case SettingsModel::MACEncoder: info = MACEncoder ::getEncoderInfo(); break;
216 case SettingsModel::PCMEncoder: info = WaveEncoder ::getEncoderInfo(); break;
217 case SettingsModel::AACEncoder:
218 switch(getAacEncoder())
220 case SettingsModel::AAC_ENCODER_QAAC: info = QAACEncoder ::getEncoderInfo(); break;
221 case SettingsModel::AAC_ENCODER_FHG: info = FHGAACEncoder::getEncoderInfo(); break;
222 case SettingsModel::AAC_ENCODER_FDK: info = FDKAACEncoder::getEncoderInfo(); break;
223 case SettingsModel::AAC_ENCODER_NERO: info = AACEncoder ::getEncoderInfo(); break;
224 default: MUTILS_THROW("Unknown AAC encoder specified!");
226 break;
227 default: MUTILS_THROW("Unsupported encoder!");
230 //Sanity checking
231 if(!info)
233 MUTILS_THROW("No encoder instance has been assigend!");
236 return info;
239 ////////////////////////////////////////////////////////////
240 // Load/store encoder RC mode
241 ////////////////////////////////////////////////////////////
243 #define STORE_MODE(ENCODER_ID, RC_MODE) do \
245 settings->compressionRCMode##ENCODER_ID(RC_MODE); \
247 while(0)
249 #define LOAD_MODE(RC_MODE, ENCODER_ID) do \
251 (RC_MODE) = settings->compressionRCMode##ENCODER_ID(); \
253 while(0)
255 void EncoderRegistry::saveEncoderMode(SettingsModel *settings, const int encoderId, const int rcMode)
257 //Sanity checking
258 if((rcMode < SettingsModel::VBRMode) || (rcMode > SettingsModel::CBRMode))
260 MUTILS_THROW("Unknown rate-control mode!");
263 //Store the encoder bitrate/quality value
264 switch(encoderId)
266 case SettingsModel::MP3Encoder: STORE_MODE(LAME, rcMode); break;
267 case SettingsModel::VorbisEncoder: STORE_MODE(OggEnc, rcMode); break;
268 case SettingsModel::AACEncoder: STORE_MODE(AacEnc, rcMode); break;
269 case SettingsModel::AC3Encoder: STORE_MODE(Aften, rcMode); break;
270 case SettingsModel::FLACEncoder: STORE_MODE(FLAC, rcMode); break;
271 case SettingsModel::OpusEncoder: STORE_MODE(OpusEnc, rcMode); break;
272 case SettingsModel::DCAEncoder: STORE_MODE(DcaEnc, rcMode); break;
273 case SettingsModel::MACEncoder: STORE_MODE(MacEnc, rcMode); break;
274 case SettingsModel::PCMEncoder: STORE_MODE(Wave, rcMode); break;
275 default: MUTILS_THROW("Unsupported encoder!");
279 int EncoderRegistry::loadEncoderMode(const SettingsModel *settings, const int encoderId)
281 int rcMode = -1;
283 //Store the encoder bitrate/quality value
284 switch(encoderId)
286 case SettingsModel::MP3Encoder: LOAD_MODE(rcMode, LAME); break;
287 case SettingsModel::VorbisEncoder: LOAD_MODE(rcMode, OggEnc); break;
288 case SettingsModel::AACEncoder: LOAD_MODE(rcMode, AacEnc); break;
289 case SettingsModel::AC3Encoder: LOAD_MODE(rcMode, Aften); break;
290 case SettingsModel::FLACEncoder: LOAD_MODE(rcMode, FLAC); break;
291 case SettingsModel::OpusEncoder: LOAD_MODE(rcMode, OpusEnc); break;
292 case SettingsModel::DCAEncoder: LOAD_MODE(rcMode, DcaEnc); break;
293 case SettingsModel::MACEncoder: LOAD_MODE(rcMode, MacEnc); break;
294 case SettingsModel::PCMEncoder: LOAD_MODE(rcMode, Wave); break;
295 default: MUTILS_THROW("Unsupported encoder!");
298 return rcMode;
301 ////////////////////////////////////////////////////////////
302 // Load/store encoder bitrate/quality value
303 ////////////////////////////////////////////////////////////
305 #define STORE_VALUE(ENCODER_ID, RC_MODE, VALUE) do \
307 if(IS_VBR(RC_MODE)) settings->compressionVbrQuality##ENCODER_ID(VALUE); \
308 if(IS_ABR(RC_MODE)) settings->compressionAbrBitrate##ENCODER_ID(VALUE); \
309 if(IS_CBR(RC_MODE)) settings->compressionCbrBitrate##ENCODER_ID(VALUE); \
311 while(0)
313 #define LOAD_VALUE(VALUE, ENCODER_ID, RC_MODE) do \
315 if(IS_VBR(RC_MODE)) (VALUE) = settings->compressionVbrQuality##ENCODER_ID(); \
316 if(IS_ABR(RC_MODE)) (VALUE) = settings->compressionAbrBitrate##ENCODER_ID(); \
317 if(IS_CBR(RC_MODE)) (VALUE) = settings->compressionCbrBitrate##ENCODER_ID(); \
319 while(0)
321 void EncoderRegistry::saveEncoderValue(SettingsModel *settings, const int encoderId, const int rcMode, const int value)
323 //Sanity checking
324 if((rcMode < SettingsModel::VBRMode) || (rcMode > SettingsModel::CBRMode))
326 MUTILS_THROW("Unknown rate-control mode!");
329 //Store the encoder bitrate/quality value
330 switch(encoderId)
332 case SettingsModel::MP3Encoder: STORE_VALUE(LAME, rcMode, value); break;
333 case SettingsModel::VorbisEncoder: STORE_VALUE(OggEnc, rcMode, value); break;
334 case SettingsModel::AACEncoder: STORE_VALUE(AacEnc, rcMode, value); break;
335 case SettingsModel::AC3Encoder: STORE_VALUE(Aften, rcMode, value); break;
336 case SettingsModel::FLACEncoder: STORE_VALUE(FLAC, rcMode, value); break;
337 case SettingsModel::OpusEncoder: STORE_VALUE(OpusEnc, rcMode, value); break;
338 case SettingsModel::DCAEncoder: STORE_VALUE(DcaEnc, rcMode, value); break;
339 case SettingsModel::MACEncoder: STORE_VALUE(MacEnc, rcMode, value); break;
340 case SettingsModel::PCMEncoder: STORE_VALUE(Wave, rcMode, value); break;
341 default: MUTILS_THROW("Unsupported encoder!");
345 int EncoderRegistry::loadEncoderValue(const SettingsModel *settings, const int encoderId, const int rcMode)
347 int value = INT_MAX;
349 //Sanity checking
350 if((rcMode < SettingsModel::VBRMode) || (rcMode > SettingsModel::CBRMode))
352 MUTILS_THROW("Unknown rate-control mode!");
355 //Load the encoder bitrate/quality value
356 switch(encoderId)
358 case SettingsModel::MP3Encoder: LOAD_VALUE(value, LAME, rcMode); break;
359 case SettingsModel::VorbisEncoder: LOAD_VALUE(value, OggEnc, rcMode); break;
360 case SettingsModel::AACEncoder: LOAD_VALUE(value, AacEnc, rcMode); break;
361 case SettingsModel::AC3Encoder: LOAD_VALUE(value, Aften, rcMode); break;
362 case SettingsModel::FLACEncoder: LOAD_VALUE(value, FLAC, rcMode); break;
363 case SettingsModel::OpusEncoder: LOAD_VALUE(value, OpusEnc, rcMode); break;
364 case SettingsModel::DCAEncoder: LOAD_VALUE(value, DcaEnc, rcMode); break;
365 case SettingsModel::MACEncoder: LOAD_VALUE(value, MacEnc, rcMode); break;
366 case SettingsModel::PCMEncoder: LOAD_VALUE(value, Wave, rcMode); break;
367 default: MUTILS_THROW("Unsupported encoder!");
370 return value;
373 ////////////////////////////////////////////////////////////
374 // Load/store encoder custom parameters
375 ////////////////////////////////////////////////////////////
377 #define STORE_PARAMS(ENCODER_ID, PARAMS) do \
379 settings->customParameters##ENCODER_ID(PARAMS); \
381 while(0)
383 #define LOAD_PARAMS(PARAMS, ENCODER_ID) do \
385 (PARAMS) = settings->customParameters##ENCODER_ID(); \
387 while(0)
389 void EncoderRegistry::saveEncoderCustomParams(SettingsModel *settings, const int encoderId, const QString &params)
391 //Store the encoder bitrate/quality value
392 switch(encoderId)
394 case SettingsModel::MP3Encoder: STORE_PARAMS(LAME, params.trimmed()); break;
395 case SettingsModel::VorbisEncoder: STORE_PARAMS(OggEnc, params.trimmed()); break;
396 case SettingsModel::AACEncoder: STORE_PARAMS(AacEnc, params.trimmed()); break;
397 case SettingsModel::AC3Encoder: STORE_PARAMS(Aften, params.trimmed()); break;
398 case SettingsModel::FLACEncoder: STORE_PARAMS(FLAC, params.trimmed()); break;
399 case SettingsModel::OpusEncoder: STORE_PARAMS(OpusEnc, params.trimmed()); break;
400 case SettingsModel::DCAEncoder: STORE_PARAMS(DcaEnc, params.trimmed()); break;
401 case SettingsModel::MACEncoder: STORE_PARAMS(MacEnc, params.trimmed()); break;
402 case SettingsModel::PCMEncoder: STORE_PARAMS(Wave, params.trimmed()); break;
403 default: MUTILS_THROW("Unsupported encoder!");
407 QString EncoderRegistry::loadEncoderCustomParams(const SettingsModel *settings, const int encoderId)
409 QString params;
411 //Load the encoder bitrate/quality value
412 switch(encoderId)
414 case SettingsModel::MP3Encoder: LOAD_PARAMS(params, LAME); break;
415 case SettingsModel::VorbisEncoder: LOAD_PARAMS(params, OggEnc); break;
416 case SettingsModel::AACEncoder: LOAD_PARAMS(params, AacEnc); break;
417 case SettingsModel::AC3Encoder: LOAD_PARAMS(params, Aften); break;
418 case SettingsModel::FLACEncoder: LOAD_PARAMS(params, FLAC); break;
419 case SettingsModel::OpusEncoder: LOAD_PARAMS(params, OpusEnc); break;
420 case SettingsModel::DCAEncoder: LOAD_PARAMS(params, DcaEnc); break;
421 case SettingsModel::MACEncoder: LOAD_PARAMS(params, MacEnc); break;
422 case SettingsModel::PCMEncoder: LOAD_PARAMS(params, Wave); break;
423 default: MUTILS_THROW("Unsupported encoder!");
426 return params;
429 ////////////////////////////////////////////////////////////
430 // Reset encoder settings
431 ////////////////////////////////////////////////////////////
433 #define RESET_SETTING(OBJ,NAME) do \
435 (OBJ)->NAME((OBJ)->NAME##Default()); \
437 while(0)
439 void EncoderRegistry::resetAllEncoders(SettingsModel *settings)
441 RESET_SETTING(settings, compressionAbrBitrateAacEnc);
442 RESET_SETTING(settings, compressionAbrBitrateAften);
443 RESET_SETTING(settings, compressionAbrBitrateDcaEnc);
444 RESET_SETTING(settings, compressionAbrBitrateFLAC);
445 RESET_SETTING(settings, compressionAbrBitrateLAME);
446 RESET_SETTING(settings, compressionAbrBitrateMacEnc);
447 RESET_SETTING(settings, compressionAbrBitrateOggEnc);
448 RESET_SETTING(settings, compressionAbrBitrateOpusEnc);
449 RESET_SETTING(settings, compressionAbrBitrateWave);
451 RESET_SETTING(settings, compressionCbrBitrateAacEnc);
452 RESET_SETTING(settings, compressionCbrBitrateAften);
453 RESET_SETTING(settings, compressionCbrBitrateDcaEnc);
454 RESET_SETTING(settings, compressionCbrBitrateFLAC);
455 RESET_SETTING(settings, compressionCbrBitrateLAME);
456 RESET_SETTING(settings, compressionCbrBitrateMacEnc);
457 RESET_SETTING(settings, compressionCbrBitrateOggEnc);
458 RESET_SETTING(settings, compressionCbrBitrateOpusEnc);
459 RESET_SETTING(settings, compressionCbrBitrateWave);
461 RESET_SETTING(settings, compressionRCModeAacEnc);
462 RESET_SETTING(settings, compressionRCModeAften);
463 RESET_SETTING(settings, compressionRCModeDcaEnc);
464 RESET_SETTING(settings, compressionRCModeFLAC);
465 RESET_SETTING(settings, compressionRCModeLAME);
466 RESET_SETTING(settings, compressionRCModeMacEnc);
467 RESET_SETTING(settings, compressionRCModeOggEnc);
468 RESET_SETTING(settings, compressionRCModeOpusEnc);
469 RESET_SETTING(settings, compressionRCModeWave);
471 RESET_SETTING(settings, compressionVbrQualityAacEnc);
472 RESET_SETTING(settings, compressionVbrQualityAften);
473 RESET_SETTING(settings, compressionVbrQualityDcaEnc);
474 RESET_SETTING(settings, compressionVbrQualityFLAC);
475 RESET_SETTING(settings, compressionVbrQualityLAME);
476 RESET_SETTING(settings, compressionVbrQualityMacEnc);
477 RESET_SETTING(settings, compressionVbrQualityOggEnc);
478 RESET_SETTING(settings, compressionVbrQualityOpusEnc);
479 RESET_SETTING(settings, compressionVbrQualityWave);
482 ////////////////////////////////////////////////////////////
483 // Get File Extensions
484 ////////////////////////////////////////////////////////////
486 QStringList EncoderRegistry::getOutputFileExtensions(void)
488 QStringList list;
489 for(int encoderId = SettingsModel::MP3Encoder; encoderId < SettingsModel::ENCODER_COUNT; encoderId++)
491 if((encoderId == SettingsModel::AACEncoder) && (getAacEncoder() == SettingsModel::AAC_ENCODER_NONE))
493 continue;
495 list << QString::fromLatin1(getEncoderInfo(encoderId)->extension());
497 return list;
500 ////////////////////////////////////////////////////////////
501 // Static Functions
502 ////////////////////////////////////////////////////////////
504 int EncoderRegistry::getAacEncoder(void)
506 if(lamexp_tools_check("qaac.exe") && lamexp_tools_check("libsoxr.dll") && lamexp_tools_check("libsoxconvolver.dll"))
508 return SettingsModel::AAC_ENCODER_QAAC;
510 else if(lamexp_tools_check("qaac64.exe") && lamexp_tools_check("libsoxr64.dll") && lamexp_tools_check("libsoxconvolver64.dll"))
512 return SettingsModel::AAC_ENCODER_QAAC;
514 else if(lamexp_tools_check("fdkaac.exe"))
516 return SettingsModel::AAC_ENCODER_FDK;
518 else if(lamexp_tools_check("fhgaacenc.exe") && lamexp_tools_check("enc_fhgaac.dll") && lamexp_tools_check("nsutil.dll") && lamexp_tools_check("libmp4v2.dll"))
520 return SettingsModel::AAC_ENCODER_FHG;
522 else if(lamexp_tools_check("neroAacEnc.exe") && lamexp_tools_check("neroAacDec.exe") && lamexp_tools_check("neroAacTag.exe"))
524 return SettingsModel::AAC_ENCODER_NERO;
526 else
528 return SettingsModel::AAC_ENCODER_NONE;