Added experimental(!) support for FhgAacEnc. Replaces the Nero AAC encoder, if available.

This commit is contained in:
LoRd_MuldeR 2011-08-19 15:27:58 +02:00
parent 12828f386e
commit 84883ab519
11 changed files with 587 additions and 239 deletions

View File

@ -131,11 +131,13 @@ copy "$(QTDIR)\plugins\imageformats\q????d4.dll" "$(TargetDir)imageformats\"
<FloatingPointModel>Fast</FloatingPointModel> <FloatingPointModel>Fast</FloatingPointModel>
<PrecompiledHeader>NotUsing</PrecompiledHeader> <PrecompiledHeader>NotUsing</PrecompiledHeader>
<WarningLevel>Level3</WarningLevel> <WarningLevel>Level3</WarningLevel>
<DebugInformationFormat>
</DebugInformationFormat>
<CreateHotpatchableImage>false</CreateHotpatchableImage> <CreateHotpatchableImage>false</CreateHotpatchableImage>
<MultiProcessorCompilation>true</MultiProcessorCompilation> <MultiProcessorCompilation>true</MultiProcessorCompilation>
<OpenMPSupport>false</OpenMPSupport> <OpenMPSupport>false</OpenMPSupport>
<DebugInformationFormat>
</DebugInformationFormat>
<TreatWarningAsError>true</TreatWarningAsError>
<CompileAsManaged>false</CompileAsManaged>
</ClCompile> </ClCompile>
<Link> <Link>
<AdditionalOptions>"/MANIFESTDEPENDENCY:type=%27win32%27 name=%27Microsoft.Windows.Common-Controls%27 version=%276.0.0.0%27 publicKeyToken=%276595b64144ccf1df%27 language=%27*%27 processorArchitecture=%27*%27" %(AdditionalOptions)</AdditionalOptions> <AdditionalOptions>"/MANIFESTDEPENDENCY:type=%27win32%27 name=%27Microsoft.Windows.Common-Controls%27 version=%276.0.0.0%27 publicKeyToken=%276595b64144ccf1df%27 language=%27*%27 processorArchitecture=%27*%27" %(AdditionalOptions)</AdditionalOptions>
@ -157,6 +159,11 @@ copy "$(QTDIR)\plugins\imageformats\q????d4.dll" "$(TargetDir)imageformats\"
<TargetMachine>MachineX86</TargetMachine> <TargetMachine>MachineX86</TargetMachine>
<MinimumRequiredVersion>5.0</MinimumRequiredVersion> <MinimumRequiredVersion>5.0</MinimumRequiredVersion>
<EntryPointSymbol>lamexp_crt_startup</EntryPointSymbol> <EntryPointSymbol>lamexp_crt_startup</EntryPointSymbol>
<MapFileName>
</MapFileName>
<TreatLinkerWarningAsErrors>true</TreatLinkerWarningAsErrors>
<CreateHotPatchableImage>
</CreateHotPatchableImage>
</Link> </Link>
<PostBuildEvent> <PostBuildEvent>
<Message>Copy plugin DLL%27s</Message> <Message>Copy plugin DLL%27s</Message>
@ -196,11 +203,12 @@ del "$(TargetDir)imageformats\q???d4.dll"
<FloatingPointModel>Fast</FloatingPointModel> <FloatingPointModel>Fast</FloatingPointModel>
<PrecompiledHeader>NotUsing</PrecompiledHeader> <PrecompiledHeader>NotUsing</PrecompiledHeader>
<WarningLevel>Level3</WarningLevel> <WarningLevel>Level3</WarningLevel>
<DebugInformationFormat> <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
</DebugInformationFormat>
<CreateHotpatchableImage>false</CreateHotpatchableImage> <CreateHotpatchableImage>false</CreateHotpatchableImage>
<MultiProcessorCompilation>true</MultiProcessorCompilation> <MultiProcessorCompilation>true</MultiProcessorCompilation>
<OpenMPSupport>false</OpenMPSupport> <OpenMPSupport>false</OpenMPSupport>
<CompileAsManaged>false</CompileAsManaged>
<TreatWarningAsError>true</TreatWarningAsError>
</ClCompile> </ClCompile>
<Link> <Link>
<AdditionalOptions>"/MANIFESTDEPENDENCY:type=%27win32%27 name=%27Microsoft.Windows.Common-Controls%27 version=%276.0.0.0%27 publicKeyToken=%276595b64144ccf1df%27 language=%27*%27 processorArchitecture=%27*%27" %(AdditionalOptions)</AdditionalOptions> <AdditionalOptions>"/MANIFESTDEPENDENCY:type=%27win32%27 name=%27Microsoft.Windows.Common-Controls%27 version=%276.0.0.0%27 publicKeyToken=%276595b64144ccf1df%27 language=%27*%27 processorArchitecture=%27*%27" %(AdditionalOptions)</AdditionalOptions>
@ -208,10 +216,10 @@ del "$(TargetDir)imageformats\q???d4.dll"
<ShowProgress>LinkVerboseLib</ShowProgress> <ShowProgress>LinkVerboseLib</ShowProgress>
<AdditionalLibraryDirectories>$(SolutionDir)\etc\Prerequisites\qt4_static\lib;$(SolutionDir)\etc\Prerequisites\qt4_static\plugins\imageformats;$(SolutionDir)\etc\Prerequisites\EncodePointer\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> <AdditionalLibraryDirectories>$(SolutionDir)\etc\Prerequisites\qt4_static\lib;$(SolutionDir)\etc\Prerequisites\qt4_static\plugins\imageformats;$(SolutionDir)\etc\Prerequisites\EncodePointer\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<IgnoreSpecificDefaultLibraries>%(IgnoreSpecificDefaultLibraries)</IgnoreSpecificDefaultLibraries> <IgnoreSpecificDefaultLibraries>%(IgnoreSpecificDefaultLibraries)</IgnoreSpecificDefaultLibraries>
<GenerateDebugInformation>false</GenerateDebugInformation> <GenerateDebugInformation>true</GenerateDebugInformation>
<AssemblyDebug> <AssemblyDebug>
</AssemblyDebug> </AssemblyDebug>
<MapExports>false</MapExports> <MapExports>true</MapExports>
<SubSystem>Windows</SubSystem> <SubSystem>Windows</SubSystem>
<OptimizeReferences>true</OptimizeReferences> <OptimizeReferences>true</OptimizeReferences>
<EnableCOMDATFolding>true</EnableCOMDATFolding> <EnableCOMDATFolding>true</EnableCOMDATFolding>
@ -220,6 +228,10 @@ del "$(TargetDir)imageformats\q???d4.dll"
<TargetMachine>MachineX86</TargetMachine> <TargetMachine>MachineX86</TargetMachine>
<MinimumRequiredVersion>5.0</MinimumRequiredVersion> <MinimumRequiredVersion>5.0</MinimumRequiredVersion>
<EntryPointSymbol>lamexp_crt_startup</EntryPointSymbol> <EntryPointSymbol>lamexp_crt_startup</EntryPointSymbol>
<GenerateMapFile>true</GenerateMapFile>
<MapFileName>
</MapFileName>
<TreatLinkerWarningAsErrors>true</TreatLinkerWarningAsErrors>
</Link> </Link>
<PostBuildEvent> <PostBuildEvent>
<Command> <Command>
@ -258,6 +270,7 @@ del "$(TargetDir)imageformats\q???d4.dll"
<ClCompile Include="src\Dialog_Update.cpp" /> <ClCompile Include="src\Dialog_Update.cpp" />
<ClCompile Include="src\Dialog_WorkingBanner.cpp" /> <ClCompile Include="src\Dialog_WorkingBanner.cpp" />
<ClCompile Include="src\Encoder_AAC.cpp" /> <ClCompile Include="src\Encoder_AAC.cpp" />
<ClCompile Include="src\Encoder_AAC_FHG.cpp" />
<ClCompile Include="src\Encoder_Abstract.cpp" /> <ClCompile Include="src\Encoder_Abstract.cpp" />
<ClCompile Include="src\Encoder_AC3.cpp" /> <ClCompile Include="src\Encoder_AC3.cpp" />
<ClCompile Include="src\Encoder_FLAC.cpp" /> <ClCompile Include="src\Encoder_FLAC.cpp" />
@ -305,6 +318,7 @@ del "$(TargetDir)imageformats\q???d4.dll"
<ClCompile Include="tmp\MOC_Dialog_Update.cpp" /> <ClCompile Include="tmp\MOC_Dialog_Update.cpp" />
<ClCompile Include="tmp\MOC_Dialog_WorkingBanner.cpp" /> <ClCompile Include="tmp\MOC_Dialog_WorkingBanner.cpp" />
<ClCompile Include="tmp\MOC_Encoder_AAC.cpp" /> <ClCompile Include="tmp\MOC_Encoder_AAC.cpp" />
<ClCompile Include="tmp\MOC_Encoder_AAC_FHG.cpp" />
<ClCompile Include="tmp\MOC_Encoder_Abstract.cpp" /> <ClCompile Include="tmp\MOC_Encoder_Abstract.cpp" />
<ClCompile Include="tmp\MOC_Encoder_AC3.cpp" /> <ClCompile Include="tmp\MOC_Encoder_AC3.cpp" />
<ClCompile Include="tmp\MOC_Encoder_FLAC.cpp" /> <ClCompile Include="tmp\MOC_Encoder_FLAC.cpp" />
@ -382,6 +396,17 @@ del "$(TargetDir)imageformats\q???d4.dll"
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)tmp\MOC_%(Filename).cpp;%(Outputs)</Outputs> <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)tmp\MOC_%(Filename).cpp;%(Outputs)</Outputs>
</CustomBuild> </CustomBuild>
<ClInclude Include="src\Decoder_Avisynth.h" /> <ClInclude Include="src\Decoder_Avisynth.h" />
<CustomBuild Include="src\Encoder_AAC_FHG.h">
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" -o "$(SolutionDir)tmp\MOC_%(Filename).cpp" "%(FullPath)"</Command>
<Command Condition="'$(Configuration)|$(Platform)'=='Release_Static|Win32'">"$(QTDIR)\bin\moc.exe" -o "$(SolutionDir)tmp\MOC_%(Filename).cpp" "%(FullPath)"</Command>
<Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">"$(QTDIR)\bin\moc.exe" -o "$(SolutionDir)tmp\MOC_%(Filename).cpp" "%(FullPath)"</Command>
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">MOC "$(SolutionDir)tmp\MOC_%(Filename).cpp"</Message>
<Message Condition="'$(Configuration)|$(Platform)'=='Release_Static|Win32'">MOC "$(SolutionDir)tmp\MOC_%(Filename).cpp"</Message>
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">MOC "$(SolutionDir)tmp\MOC_%(Filename).cpp"</Message>
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)tmp\MOC_%(Filename).cpp;%(Outputs)</Outputs>
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release_Static|Win32'">$(SolutionDir)tmp\MOC_%(Filename).cpp;%(Outputs)</Outputs>
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)tmp\MOC_%(Filename).cpp;%(Outputs)</Outputs>
</CustomBuild>
<ClInclude Include="tmp\UIC_CueSheetImport.h" /> <ClInclude Include="tmp\UIC_CueSheetImport.h" />
<ClInclude Include="tmp\UIC_DropBox.h" /> <ClInclude Include="tmp\UIC_DropBox.h" />
<ClInclude Include="tmp\UIC_LogViewDialog.h" /> <ClInclude Include="tmp\UIC_LogViewDialog.h" />

View File

@ -310,6 +310,12 @@
<ClCompile Include="src\Decoder_Avisynth.cpp"> <ClCompile Include="src\Decoder_Avisynth.cpp">
<Filter>Source Files\Decoders</Filter> <Filter>Source Files\Decoders</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="src\Encoder_AAC_FHG.cpp">
<Filter>Source Files\Encoders</Filter>
</ClCompile>
<ClCompile Include="tmp\MOC_Encoder_AAC_FHG.cpp">
<Filter>Generated Files\MOC</Filter>
</ClCompile>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClInclude Include="src\Config.h"> <ClInclude Include="src\Config.h">
@ -584,6 +590,9 @@
<CustomBuild Include="src\Thread_CueSplitter.h"> <CustomBuild Include="src\Thread_CueSplitter.h">
<Filter>Header Files\Threads</Filter> <Filter>Header Files\Threads</Filter>
</CustomBuild> </CustomBuild>
<CustomBuild Include="src\Encoder_AAC_FHG.h">
<Filter>Header Files\Encoders</Filter>
</CustomBuild>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<None Include="res\MainIcon.ico" /> <None Include="res\MainIcon.ico" />

File diff suppressed because it is too large Load Diff

View File

@ -29,8 +29,8 @@
#define VER_LAMEXP_MINOR_HI 0 #define VER_LAMEXP_MINOR_HI 0
#define VER_LAMEXP_MINOR_LO 3 #define VER_LAMEXP_MINOR_LO 3
#define VER_LAMEXP_TYPE Alpha #define VER_LAMEXP_TYPE Alpha
#define VER_LAMEXP_PATCH 12 #define VER_LAMEXP_PATCH 13
#define VER_LAMEXP_BUILD 648 #define VER_LAMEXP_BUILD 652
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
// Tools versions // Tools versions

View File

@ -86,6 +86,7 @@ MainWindow::MainWindow(FileListModel *fileListModel, AudioFileModel *metaInfo, S
m_metaData(metaInfo), m_metaData(metaInfo),
m_settings(settingsModel), m_settings(settingsModel),
m_neroEncoderAvailable(lamexp_check_tool("neroAacEnc.exe") && lamexp_check_tool("neroAacDec.exe") && lamexp_check_tool("neroAacTag.exe")), m_neroEncoderAvailable(lamexp_check_tool("neroAacEnc.exe") && lamexp_check_tool("neroAacDec.exe") && lamexp_check_tool("neroAacTag.exe")),
m_fhgEncoderAvailable(lamexp_check_tool("fhgaacenc.exe") && lamexp_check_tool("enc_fhgaac.dll") && lamexp_check_tool("nsutil.dll") && lamexp_check_tool("libmp4v2.dll")),
m_accepted(false), m_accepted(false),
m_firstTimeShown(true), m_firstTimeShown(true),
m_OutputFolderViewInitialized(false) m_OutputFolderViewInitialized(false)
@ -200,10 +201,10 @@ MainWindow::MainWindow(FileListModel *fileListModel, AudioFileModel *metaInfo, S
m_modeButtonGroup->addButton(radioButtonModeQuality, SettingsModel::VBRMode); m_modeButtonGroup->addButton(radioButtonModeQuality, SettingsModel::VBRMode);
m_modeButtonGroup->addButton(radioButtonModeAverageBitrate, SettingsModel::ABRMode); m_modeButtonGroup->addButton(radioButtonModeAverageBitrate, SettingsModel::ABRMode);
m_modeButtonGroup->addButton(radioButtonConstBitrate, SettingsModel::CBRMode); m_modeButtonGroup->addButton(radioButtonConstBitrate, SettingsModel::CBRMode);
radioButtonEncoderAAC->setEnabled(m_neroEncoderAvailable); radioButtonEncoderAAC->setEnabled(m_neroEncoderAvailable || m_fhgEncoderAvailable);
radioButtonEncoderMP3->setChecked(m_settings->compressionEncoder() == SettingsModel::MP3Encoder); radioButtonEncoderMP3->setChecked(m_settings->compressionEncoder() == SettingsModel::MP3Encoder);
radioButtonEncoderVorbis->setChecked(m_settings->compressionEncoder() == SettingsModel::VorbisEncoder); radioButtonEncoderVorbis->setChecked(m_settings->compressionEncoder() == SettingsModel::VorbisEncoder);
radioButtonEncoderAAC->setChecked((m_settings->compressionEncoder() == SettingsModel::AACEncoder) && m_neroEncoderAvailable); radioButtonEncoderAAC->setChecked((m_settings->compressionEncoder() == SettingsModel::AACEncoder) && (m_neroEncoderAvailable || m_fhgEncoderAvailable));
radioButtonEncoderAC3->setChecked(m_settings->compressionEncoder() == SettingsModel::AC3Encoder); radioButtonEncoderAC3->setChecked(m_settings->compressionEncoder() == SettingsModel::AC3Encoder);
radioButtonEncoderFLAC->setChecked(m_settings->compressionEncoder() == SettingsModel::FLACEncoder); radioButtonEncoderFLAC->setChecked(m_settings->compressionEncoder() == SettingsModel::FLACEncoder);
radioButtonEncoderPCM->setChecked(m_settings->compressionEncoder() == SettingsModel::PCMEncoder); radioButtonEncoderPCM->setChecked(m_settings->compressionEncoder() == SettingsModel::PCMEncoder);
@ -988,7 +989,7 @@ void MainWindow::windowShown(void)
} }
else else
{ {
if(m_settings->neroAacNotificationsEnabled()) if(m_settings->neroAacNotificationsEnabled() && (!m_fhgEncoderAvailable))
{ {
QString appPath = QDir(QCoreApplication::applicationDirPath()).canonicalPath(); QString appPath = QDir(QCoreApplication::applicationDirPath()).canonicalPath();
if(appPath.isEmpty()) appPath = QCoreApplication::applicationDirPath(); if(appPath.isEmpty()) appPath = QCoreApplication::applicationDirPath();
@ -1006,32 +1007,6 @@ void MainWindow::windowShown(void)
} }
} }
} }
//Check for WMA support
//if(m_settings->wmaDecoderNotificationsEnabled())
//{
// if(!lamexp_check_tool("wmawav.exe"))
// {
// QString messageText;
// messageText += QString("<nobr>%1</nobr><br>").arg(tr("LameXP has detected that the WMA File Decoder component is not currently installed on your system.").replace("-", "&minus;"));
// messageText += QString("<nobr>%1</nobr><br><br>").arg(tr("You won't be able to process WMA files as input unless the WMA File Decoder component is installed!").replace("-", "&minus;"));
// messageText += QString("<nobr>%1</nobr>").arg(tr("Do you want to download and install the WMA File Decoder component now?").replace("-", "&minus;"));
// int result = QMessageBox::information(this, tr("WMA Decoder Missing"), messageText, tr("Download && Install"), tr("Don't Show Again"), tr("Postpone"));
// if(result == 0)
// {
// if(installWMADecoder())
// {
// QApplication::quit();
// return;
// }
// }
// else if(result == 1)
// {
// m_settings->wmaDecoderNotificationsEnabled(false);
// actionDisableWmaDecoderNotifications->setChecked(!m_settings->wmaDecoderNotificationsEnabled());
// }
// }
//}
//Add files from the command-line //Add files from the command-line
for(int i = 0; i < arguments.count() - 1; i++) for(int i = 0; i < arguments.count() - 1; i++)

View File

@ -154,6 +154,7 @@ private:
bool m_OutputFolderViewInitialized; bool m_OutputFolderViewInitialized;
const bool m_neroEncoderAvailable; const bool m_neroEncoderAvailable;
const bool m_fhgEncoderAvailable;
WorkingBanner *m_banner; WorkingBanner *m_banner;
QStringList *m_delayedFileList; QStringList *m_delayedFileList;

View File

@ -32,6 +32,7 @@
#include "Encoder_MP3.h" #include "Encoder_MP3.h"
#include "Encoder_Vorbis.h" #include "Encoder_Vorbis.h"
#include "Encoder_AAC.h" #include "Encoder_AAC.h"
#include "Encoder_AAC_FHG.h"
#include "Encoder_AC3.h" #include "Encoder_AC3.h"
#include "Encoder_FLAC.h" #include "Encoder_FLAC.h"
#include "Encoder_Wave.h" #include "Encoder_Wave.h"
@ -595,13 +596,24 @@ void ProcessingDialog::startNextJob(void)
break; break;
case SettingsModel::AACEncoder: case SettingsModel::AACEncoder:
{ {
AACEncoder *aacEncoder = new AACEncoder(); if(lamexp_lookup_tool("fhgaacenc.exe").isEmpty() || lamexp_lookup_tool("enc_fhgaac.dll").isEmpty())
aacEncoder->setBitrate(m_settings->compressionBitrate()); {
aacEncoder->setRCMode(m_settings->compressionRCMode()); AACEncoder *aacEncoder = new AACEncoder();
aacEncoder->setEnable2Pass(m_settings->neroAACEnable2Pass()); aacEncoder->setBitrate(m_settings->compressionBitrate());
aacEncoder->setProfile(m_settings->neroAACProfile()); aacEncoder->setRCMode(m_settings->compressionRCMode());
aacEncoder->setCustomParams(m_settings->customParametersNeroAAC()); aacEncoder->setEnable2Pass(m_settings->neroAACEnable2Pass());
encoder = aacEncoder; aacEncoder->setProfile(m_settings->neroAACProfile());
aacEncoder->setCustomParams(m_settings->customParametersNeroAAC());
encoder = aacEncoder;
}
else
{
FHGAACEncoder *aacEncoder = new FHGAACEncoder();
aacEncoder->setBitrate(m_settings->compressionBitrate());
aacEncoder->setRCMode(m_settings->compressionRCMode());
aacEncoder->setProfile(m_settings->neroAACProfile());
encoder = aacEncoder;
}
} }
break; break;
case SettingsModel::AC3Encoder: case SettingsModel::AC3Encoder:

176
src/Encoder_AAC_FHG.cpp Normal file
View File

@ -0,0 +1,176 @@
///////////////////////////////////////////////////////////////////////////////
// LameXP - Audio Encoder Front-End
// Copyright (C) 2004-2011 LoRd_MuldeR <MuldeR2@GMX.de>
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License along
// with this program; if not, write to the Free Software Foundation, Inc.,
// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
//
// http://www.gnu.org/licenses/gpl-2.0.txt
///////////////////////////////////////////////////////////////////////////////
#include "Encoder_AAC_FHG.h"
#include "Global.h"
#include "Model_Settings.h"
#include <QProcess>
#include <QDir>
#define max(a,b) (((a) > (b)) ? (a) : (b))
#define min(a,b) (((a) < (b)) ? (a) : (b))
FHGAACEncoder::FHGAACEncoder(void)
:
m_binary_enc(lamexp_lookup_tool("fhgaacenc.exe")),
m_binary_dll(lamexp_lookup_tool("enc_fhgaac.dll"))
{
if(m_binary_enc.isEmpty() || m_binary_dll.isEmpty())
{
throw "Error initializing FhgAacEnc. Tool 'fhgaacenc.exe' is not registred!";
}
m_configProfile = 0;
}
FHGAACEncoder::~FHGAACEncoder(void)
{
}
bool FHGAACEncoder::encode(const QString &sourceFile, const AudioFileModel &metaInfo, const QString &outputFile, volatile bool *abortFlag)
{
QProcess process;
QStringList args;
switch(m_configRCMode)
{
case SettingsModel::VBRMode:
args << "--vbr" << QString::number(max(1, min(5, m_configBitrate)));
break;
case SettingsModel::CBRMode:
args << "--cbr" << QString::number(max(32, min(500, (m_configBitrate * 8))));
break;
case SettingsModel::ABRMode:
qWarning("FhgAacEnc does not support ABR mode -> failure!");
emit messageLogged("\nTHIS ENCODER DOES NOT SUPPORT AN \"ABR\" MODE !!!");
return false;
break;
default:
throw "Bad rate-control mode!";
break;
}
switch(m_configProfile)
{
case 1:
args << "--profile" << "lc"; //Forces use of LC AAC profile
break;
case 2:
args << "--profile" << "he"; //Forces use of HE AAC profile
break;
case 3:
args << "--profile" << "hev2"; //Forces use of HEv2 AAC profile
break;
}
args << "--dll" << m_binary_dll;
args << QDir::toNativeSeparators(sourceFile);
args << QDir::toNativeSeparators(outputFile);
if(!startProcess(process, m_binary_enc, args))
{
return false;
}
bool bTimeout = false;
bool bAborted = false;
QRegExp regExp("Progress:\\s*(\\d+)%");
while(process.state() != QProcess::NotRunning)
{
if(*abortFlag)
{
process.kill();
bAborted = true;
emit messageLogged("\nABORTED BY USER !!!");
break;
}
process.waitForReadyRead(m_processTimeoutInterval);
if(!process.bytesAvailable() && process.state() == QProcess::Running)
{
process.kill();
qWarning("FhgAacEnc process timed out <-- killing!");
emit messageLogged("\nPROCESS TIMEOUT !!!");
bTimeout = true;
break;
}
while(process.bytesAvailable() > 0)
{
QByteArray line = process.readLine();
QString text = QString::fromUtf8(line.constData()).simplified();
if(regExp.lastIndexIn(text) >= 0)
{
bool ok = false;
int progress = regExp.cap(1).toInt(&ok);
if(ok) emit statusUpdated(progress);
}
else if(!text.isEmpty())
{
emit messageLogged(text);
}
}
}
process.waitForFinished();
if(process.state() != QProcess::NotRunning)
{
process.kill();
process.waitForFinished(-1);
}
emit statusUpdated(100);
emit messageLogged(QString().sprintf("\nExited with code: 0x%04X", process.exitCode()));
if(bTimeout || bAborted || process.exitStatus() != QProcess::NormalExit)
{
return false;
}
return true;
}
QString FHGAACEncoder::extension(void)
{
return "mp4";
}
bool FHGAACEncoder::isFormatSupported(const QString &containerType, const QString &containerProfile, const QString &formatType, const QString &formatProfile, const QString &formatVersion)
{
if(containerType.compare("Wave", Qt::CaseInsensitive) == 0)
{
if(formatType.compare("PCM", Qt::CaseInsensitive) == 0)
{
return true;
}
}
return false;
}
void FHGAACEncoder::setProfile(int profile)
{
m_configProfile = profile;
}

47
src/Encoder_AAC_FHG.h Normal file
View File

@ -0,0 +1,47 @@
///////////////////////////////////////////////////////////////////////////////
// LameXP - Audio Encoder Front-End
// Copyright (C) 2004-2011 LoRd_MuldeR <MuldeR2@GMX.de>
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License along
// with this program; if not, write to the Free Software Foundation, Inc.,
// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
//
// http://www.gnu.org/licenses/gpl-2.0.txt
///////////////////////////////////////////////////////////////////////////////
#pragma once
#include "Encoder_Abstract.h"
#include <QObject>
class FHGAACEncoder : public AbstractEncoder
{
Q_OBJECT
public:
FHGAACEncoder(void);
~FHGAACEncoder(void);
virtual bool encode(const QString &sourceFile, const AudioFileModel &metaInfo, const QString &outputFile, volatile bool *abortFlag);
virtual bool isFormatSupported(const QString &containerType, const QString &containerProfile, const QString &formatType, const QString &formatProfile, const QString &formatVersion);
virtual QString extension(void);
//Advanced options
virtual void setProfile(int profile);
private:
const QString m_binary_enc;
const QString m_binary_dll;
int m_configProfile;
};

View File

@ -233,9 +233,12 @@ void InitializationThread::run()
//Register all translations //Register all translations
initTranslations(); initTranslations();
//Look for Nero encoder //Look for Nero AAC encoder
initNeroAac(); initNeroAac();
//Look for FHG AAC encoder
initFhgAac();
delay(); delay();
m_bSuccess = true; m_bSuccess = true;
} }
@ -410,6 +413,105 @@ void InitializationThread::initNeroAac(void)
} }
} }
void InitializationThread::initFhgAac(void)
{
const QString appPath = QDir(QCoreApplication::applicationDirPath()).canonicalPath();
QFileInfo fhgFileInfo[4];
fhgFileInfo[0] = QFileInfo(QString("%1/fhgaacenc.exe").arg(appPath));
fhgFileInfo[1] = QFileInfo(QString("%1/enc_fhgaac.dll").arg(appPath));
fhgFileInfo[2] = QFileInfo(QString("%1/nsutil.dll").arg(appPath));
fhgFileInfo[3] = QFileInfo(QString("%1/libmp4v2.dll").arg(appPath));
bool fhgFilesFound = true;
for(int i = 0; i < 4; i++) { if(!fhgFileInfo[i].exists()) fhgFilesFound = false; }
//Lock the FhgAacEnc binaries
if(!fhgFilesFound)
{
qDebug("FhgAacEnc binaries not found -> FhgAacEnc support will be disabled!\n");
return;
}
qDebug("Found FhgAacEnc executable:\n%s\n", fhgFileInfo[0].canonicalFilePath().toUtf8().constData());
qDebug("Found FhgAacEnc enclibrary:\n%s\n", fhgFileInfo[1].canonicalFilePath().toUtf8().constData());
LockedFile *fhgBin[4];
for(int i = 0; i < 4; i++) fhgBin[i] = NULL;
try
{
for(int i = 0; i < 4; i++)
{
fhgBin[i] = new LockedFile(fhgFileInfo[i].canonicalFilePath());
}
}
catch(...)
{
for(int i = 0; i < 4; i++) LAMEXP_DELETE(fhgBin[i]);
qWarning("Failed to get excluive lock to FhgAacEnc binary -> FhgAacEnc support will be disabled!");
return;
}
QProcess process;
process.setProcessChannelMode(QProcess::MergedChannels);
process.setReadChannel(QProcess::StandardOutput);
process.start(fhgFileInfo[0].canonicalFilePath(), QStringList() << "--version");
if(!process.waitForStarted())
{
qWarning("FhgAacEnc process failed to create!");
qWarning("Error message: \"%s\"\n", process.errorString().toLatin1().constData());
process.kill();
process.waitForFinished(-1);
for(int i = 0; i < 4; i++) LAMEXP_DELETE(fhgBin[i]);
return;
}
QRegExp fhgAacEncSig("fhgaacenc version (\\d+) by tmkk", Qt::CaseInsensitive);
unsigned int fhgVersion = 0;
while(process.state() != QProcess::NotRunning)
{
process.waitForReadyRead();
if(!process.bytesAvailable() && process.state() == QProcess::Running)
{
qWarning("FhgAacEnc process time out -> killing!");
process.kill();
process.waitForFinished(-1);
for(int i = 0; i < 4; i++) LAMEXP_DELETE(fhgBin[i]);
return;
}
while(process.bytesAvailable() > 0)
{
QString line = QString::fromUtf8(process.readLine().constData()).simplified();
if(fhgAacEncSig.lastIndexIn(line) >= 0)
{
bool ok = false;
unsigned int temp = fhgAacEncSig.cap(1).toUInt(&ok);
if(ok) fhgVersion = temp;
}
}
}
if(!(fhgVersion > 0))
{
qWarning("FhgAacEnc version couldn't be determined -> FhgAacEnc support will be disabled!");
for(int i = 0; i < 4; i++) LAMEXP_DELETE(fhgBin[i]);
return;
}
else if(fhgVersion < 20110819)
{
qWarning("FhgAacEnc version is too much outdated -> FhgAacEnc support will be disabled!");
for(int i = 0; i < 4; i++) LAMEXP_DELETE(fhgBin[i]);
return;
}
for(int i = 0; i < 4; i++)
{
lamexp_register_tool(fhgFileInfo[i].fileName(), fhgBin[i], fhgVersion);
}
}
//void InitializationThread::initWmaDec(void) //void InitializationThread::initWmaDec(void)
//{ //{

View File

@ -42,6 +42,7 @@ private:
void delay(void); void delay(void);
void initTranslations(void); void initTranslations(void);
void initNeroAac(void); void initNeroAac(void);
void initFhgAac(void);
bool m_bSuccess; bool m_bSuccess;
lamexp_cpu_t m_cpuFeatures; lamexp_cpu_t m_cpuFeatures;