mirror of
https://github.com/nu774/fdkaac.git
synced 2025-06-05 23:29:14 +02:00
Compare commits
35 Commits
Author | SHA1 | Date | |
---|---|---|---|
cdfb81d7c6 | |||
4ec1422bd9 | |||
53fe239bf6 | |||
347e995cfc | |||
9d65d3b3bf | |||
fdf5c2f251 | |||
ef17c9436e | |||
c0919b049a | |||
353e4fcd7a | |||
130e249ebf | |||
65ee26fb61 | |||
f2f9c1b4bb | |||
836367a7fe | |||
ca65cffdd3 | |||
36424b121c | |||
2329b4b1eb | |||
4c963ef139 | |||
3f7b6abd20 | |||
4571d9d76a | |||
4682fe4961 | |||
c37edc6051 | |||
07c06b4c3e | |||
4242ad726f | |||
c8cc3fb57e | |||
622e065bd8 | |||
cf200f9563 | |||
fd2a1e77b3 | |||
17799e39b9 | |||
19a6b7f10c | |||
80b476bad9 | |||
e403976bf6 | |||
4080ab21e6 | |||
be991a6abe | |||
4c9167c1cb | |||
c77dae004d |
52
ChangeLog
52
ChangeLog
@ -1,6 +1,54 @@
|
||||
2016-08-26 nu774 <honeycomb77@gmail.com>
|
||||
|
||||
* update ChangeLog [HEAD -> master]
|
||||
|
||||
* bump [origin/master]
|
||||
|
||||
* Ticket #23: quit supporting MPEG-2 AOT
|
||||
|
||||
2016-08-25 nu774 <honeycomb77@gmail.com>
|
||||
|
||||
* fix libfdkaac encoder version check for SBR_RATIO availability
|
||||
|
||||
* Use our SBR signaling implementation on old libfdkaac
|
||||
|
||||
2015-10-10 nu774 <honeycomb77@gmail.com>
|
||||
|
||||
* improve MSVC project
|
||||
|
||||
2015-09-21 nu774 <honeycomb77@gmail.com>
|
||||
|
||||
* fix indents
|
||||
|
||||
* update compat layer, mainly for MSVC14 issue
|
||||
|
||||
2015-07-22 nu774 <honeycomb77@gmail.com>
|
||||
|
||||
* add platformtoolset in vcxproj
|
||||
|
||||
* fix build issue on MSVC14
|
||||
|
||||
2015-06-12 nu774 <honeycomb77@gmail.com>
|
||||
|
||||
* remove an unused variable decl
|
||||
|
||||
* remove an unused variable decl
|
||||
|
||||
* m4af: move internal struct m4af_itmf_entry_t from header
|
||||
|
||||
2015-02-14 nu774 <honeycomb77@gmail.com>
|
||||
|
||||
* update ChangeLog
|
||||
|
||||
* bump version [v0.6.2]
|
||||
|
||||
* take stco->co64 switch due to mdat relocation into account on finalizing m4a
|
||||
|
||||
* fix incorrect iTunSMPB written when interrupted by signals
|
||||
|
||||
2014-09-13 nu774 <honeycomb77@gmail.com>
|
||||
|
||||
* update ChangeLog [HEAD]
|
||||
* update ChangeLog
|
||||
|
||||
* bump version [v0.6.1]
|
||||
|
||||
@ -10,7 +58,7 @@
|
||||
|
||||
2014-08-17 nu774 <honeycomb77@gmail.com>
|
||||
|
||||
* update INSTALL [origin/master]
|
||||
* update INSTALL
|
||||
|
||||
* add m4 macros
|
||||
|
||||
|
@ -1,83 +1,80 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<ItemGroup Label="ProjectConfigurations">
|
||||
<ProjectConfiguration Include="Debug|Win32">
|
||||
<Configuration>Debug</Configuration>
|
||||
<Platform>Win32</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Debug|x64">
|
||||
<Configuration>Debug</Configuration>
|
||||
<Platform>x64</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Release|Win32">
|
||||
<Configuration>Release</Configuration>
|
||||
<Platform>Win32</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Release|x64">
|
||||
<Configuration>Release</Configuration>
|
||||
<Platform>x64</Platform>
|
||||
</ProjectConfiguration>
|
||||
</ItemGroup>
|
||||
<PropertyGroup Label="Globals">
|
||||
<ProjectGuid>{D7D4B982-8B16-4A10-8B1C-9527BD789709}</ProjectGuid>
|
||||
<Keyword>Win32Proj</Keyword>
|
||||
<RootNamespace>fdkaac</RootNamespace>
|
||||
<RootNamespace>fdk-aac</RootNamespace>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup>
|
||||
<PlatformToolset Condition="'$(PlatformToolset)' == '' and '$(MSBuildToolsVersion)' == '16.0'">v142</PlatformToolset>
|
||||
<PlatformToolset Condition="'$(PlatformToolset)' == '' and '$(MSBuildToolsVersion)' == '15.0'">v141_xp</PlatformToolset>
|
||||
<PlatformToolset Condition="'$(PlatformToolset)' == '' and '$(MSBuildToolsVersion)' == '14.0'">v140_xp</PlatformToolset>
|
||||
<PlatformToolset Condition="'$(PlatformToolset)' == '' and '$(MSBuildToolsVersion)' == '12.0'">v120_xp</PlatformToolset>
|
||||
<PlatformToolset Condition="'$(PlatformToolset)' == '' and '$(MSBuildToolsVersion)' == '11.0'">v110_xp</PlatformToolset>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup>
|
||||
<IntDir>fdk-aac\$(Platform)\$(Configuration)</IntDir>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
||||
<PropertyGroup Label="Configuration">
|
||||
<ConfigurationType>StaticLibrary</ConfigurationType>
|
||||
<UseDebugLibraries>true</UseDebugLibraries>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
||||
<ConfigurationType>StaticLibrary</ConfigurationType>
|
||||
<PropertyGroup Condition="'$(Configuration)'=='Debug'" Label="Configuration">
|
||||
<UseDebugLibraries>true</UseDebugLibraries>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)'=='Release'" Label="Configuration">
|
||||
<UseDebugLibraries>false</UseDebugLibraries>
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||
<ImportGroup Label="ExtensionSettings">
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<ImportGroup Label="PropertySheets">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<PropertyGroup Label="UserMacros" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<IntDir>$(Configuration)Lib\</IntDir>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<IntDir>$(Configuration)Lib\</IntDir>
|
||||
</PropertyGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<ItemDefinitionGroup>
|
||||
<ClCompile>
|
||||
<PrecompiledHeader>NotUsing</PrecompiledHeader>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<Optimization>Disabled</Optimization>
|
||||
<PreprocessorDefinitions>WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<AdditionalIncludeDirectories>../fdk-aac/libaacenc/include;../fdk-aac/libFDK/include;../fdk-aac/libMpegTPEnc/include;../fdk-aac/libPCMutils/include;../fdk-aac/libSBRenc/include;../fdk-aac/libSYS/include</AdditionalIncludeDirectories>
|
||||
<StringPooling>true</StringPooling>
|
||||
<PreprocessorDefinitions>WIN32;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<AdditionalIncludeDirectories>../fdk-aac/libaacenc/include;../fdk-aac/libFDK/include;../fdk-aac/libMpegTPEnc/include;../fdk-aac/libPCMutils/include;../fdk-aac/libSACenc/include;../fdk-aac/libSBRenc/include;../fdk-aac/libSYS/include</AdditionalIncludeDirectories>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>Windows</SubSystem>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)'=='Debug'">
|
||||
<ClCompile>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<PrecompiledHeader>NotUsing</PrecompiledHeader>
|
||||
<Optimization>MaxSpeed</Optimization>
|
||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||
<PreprocessorDefinitions>WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<AdditionalIncludeDirectories>../fdk-aac/libaacenc/include;../fdk-aac/libFDK/include;../fdk-aac/libMpegTPEnc/include;../fdk-aac/libPCMutils/include;../fdk-aac/libSBRenc/include;../fdk-aac/libSYS/include</AdditionalIncludeDirectories>
|
||||
<StringPooling>true</StringPooling>
|
||||
<Optimization>Disabled</Optimization>
|
||||
</ClCompile>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)'=='Release'">
|
||||
<ClCompile>
|
||||
<Optimization>MaxSpeed</Optimization>
|
||||
<AdditionalOptions>/Qvec-report:1 %(AdditionalOptions)</AdditionalOptions>
|
||||
</ClCompile>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Platform)'=='x64'">
|
||||
<ClCompile>
|
||||
<PreprocessorDefinitions>__x86_64__;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>Windows</SubSystem>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||
<OptimizeReferences>true</OptimizeReferences>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="..\fdk-aac\libAACenc\src\aacenc.cpp" />
|
||||
<ClCompile Include="..\fdk-aac\libAACenc\src\aacenc_hcr.cpp" />
|
||||
<ClCompile Include="..\fdk-aac\libAACenc\src\aacenc_lib.cpp" />
|
||||
<ClCompile Include="..\fdk-aac\libAACenc\src\aacenc_pns.cpp" />
|
||||
<ClCompile Include="..\fdk-aac\libAACenc\src\aacEnc_ram.cpp" />
|
||||
@ -97,6 +94,7 @@
|
||||
<ClCompile Include="..\fdk-aac\libAACenc\src\line_pe.cpp" />
|
||||
<ClCompile Include="..\fdk-aac\libAACenc\src\metadata_compressor.cpp" />
|
||||
<ClCompile Include="..\fdk-aac\libAACenc\src\metadata_main.cpp" />
|
||||
<ClCompile Include="..\fdk-aac\libAACenc\src\mps_main.cpp" />
|
||||
<ClCompile Include="..\fdk-aac\libAACenc\src\ms_stereo.cpp" />
|
||||
<ClCompile Include="..\fdk-aac\libAACenc\src\noisedet.cpp" />
|
||||
<ClCompile Include="..\fdk-aac\libAACenc\src\pnsparam.cpp" />
|
||||
@ -115,6 +113,8 @@
|
||||
<ClCompile Include="..\fdk-aac\libFDK\src\FDK_core.cpp" />
|
||||
<ClCompile Include="..\fdk-aac\libFDK\src\FDK_crc.cpp" />
|
||||
<ClCompile Include="..\fdk-aac\libFDK\src\FDK_hybrid.cpp" />
|
||||
<ClCompile Include="..\fdk-aac\libFDK\src\FDK_lpc.cpp" />
|
||||
<ClCompile Include="..\fdk-aac\libFDK\src\FDK_matrixCalloc.cpp" />
|
||||
<ClCompile Include="..\fdk-aac\libFDK\src\FDK_tools_rom.cpp" />
|
||||
<ClCompile Include="..\fdk-aac\libFDK\src\FDK_trigFcts.cpp" />
|
||||
<ClCompile Include="..\fdk-aac\libFDK\src\fft.cpp" />
|
||||
@ -128,7 +128,20 @@
|
||||
<ClCompile Include="..\fdk-aac\libMpegTPEnc\src\tpenc_asc.cpp" />
|
||||
<ClCompile Include="..\fdk-aac\libMpegTPEnc\src\tpenc_latm.cpp" />
|
||||
<ClCompile Include="..\fdk-aac\libMpegTPEnc\src\tpenc_lib.cpp" />
|
||||
<ClCompile Include="..\fdk-aac\libPCMutils\src\pcmutils_lib.cpp" />
|
||||
<ClCompile Include="..\fdk-aac\libPCMutils\src\pcm_utils.cpp" />
|
||||
<ClCompile Include="..\fdk-aac\libSACenc\src\sacenc_bitstream.cpp" />
|
||||
<ClCompile Include="..\fdk-aac\libSACenc\src\sacenc_delay.cpp" />
|
||||
<ClCompile Include="..\fdk-aac\libSACenc\src\sacenc_dmx_tdom_enh.cpp" />
|
||||
<ClCompile Include="..\fdk-aac\libSACenc\src\sacenc_filter.cpp" />
|
||||
<ClCompile Include="..\fdk-aac\libSACenc\src\sacenc_framewindowing.cpp" />
|
||||
<ClCompile Include="..\fdk-aac\libSACenc\src\sacenc_huff_tab.cpp" />
|
||||
<ClCompile Include="..\fdk-aac\libSACenc\src\sacenc_lib.cpp" />
|
||||
<ClCompile Include="..\fdk-aac\libSACenc\src\sacenc_nlc_enc.cpp" />
|
||||
<ClCompile Include="..\fdk-aac\libSACenc\src\sacenc_onsetdetect.cpp" />
|
||||
<ClCompile Include="..\fdk-aac\libSACenc\src\sacenc_paramextract.cpp" />
|
||||
<ClCompile Include="..\fdk-aac\libSACenc\src\sacenc_staticgain.cpp" />
|
||||
<ClCompile Include="..\fdk-aac\libSACenc\src\sacenc_tree.cpp" />
|
||||
<ClCompile Include="..\fdk-aac\libSACenc\src\sacenc_vectorfunctions.cpp" />
|
||||
<ClCompile Include="..\fdk-aac\libSBRenc\src\bit_sbr.cpp" />
|
||||
<ClCompile Include="..\fdk-aac\libSBRenc\src\code_env.cpp" />
|
||||
<ClCompile Include="..\fdk-aac\libSBRenc\src\env_bit.cpp" />
|
||||
@ -142,19 +155,18 @@
|
||||
<ClCompile Include="..\fdk-aac\libSBRenc\src\ps_main.cpp" />
|
||||
<ClCompile Include="..\fdk-aac\libSBRenc\src\resampler.cpp" />
|
||||
<ClCompile Include="..\fdk-aac\libSBRenc\src\sbrenc_freq_sca.cpp" />
|
||||
<ClCompile Include="..\fdk-aac\libSBRenc\src\sbrenc_ram.cpp" />
|
||||
<ClCompile Include="..\fdk-aac\libSBRenc\src\sbrenc_rom.cpp" />
|
||||
<ClCompile Include="..\fdk-aac\libSBRenc\src\sbr_encoder.cpp" />
|
||||
<ClCompile Include="..\fdk-aac\libSBRenc\src\sbr_misc.cpp" />
|
||||
<ClCompile Include="..\fdk-aac\libSBRenc\src\sbr_ram.cpp" />
|
||||
<ClCompile Include="..\fdk-aac\libSBRenc\src\sbr_rom.cpp" />
|
||||
<ClCompile Include="..\fdk-aac\libSBRenc\src\ton_corr.cpp" />
|
||||
<ClCompile Include="..\fdk-aac\libSBRenc\src\tran_det.cpp" />
|
||||
<ClCompile Include="..\fdk-aac\libSYS\src\conv_string.cpp" />
|
||||
<ClCompile Include="..\fdk-aac\libSYS\src\genericStds.cpp" />
|
||||
<ClCompile Include="..\fdk-aac\libSYS\src\syslib_channelMapDescr.cpp" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="..\fdk-aac\libAACenc\include\aacenc_lib.h" />
|
||||
<ClInclude Include="..\fdk-aac\libAACenc\src\aacenc.h" />
|
||||
<ClInclude Include="..\fdk-aac\libAACenc\src\aacenc_hcr.h" />
|
||||
<ClInclude Include="..\fdk-aac\libAACenc\src\aacenc_pns.h" />
|
||||
<ClInclude Include="..\fdk-aac\libAACenc\src\aacEnc_ram.h" />
|
||||
<ClInclude Include="..\fdk-aac\libAACenc\src\aacEnc_rom.h" />
|
||||
|
@ -1,4 +1,4 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<ItemGroup>
|
||||
<Filter Include="Source Files">
|
||||
@ -18,9 +18,6 @@
|
||||
<ClCompile Include="..\fdk-aac\libAACenc\src\aacenc.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\fdk-aac\libAACenc\src\aacenc_hcr.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\fdk-aac\libAACenc\src\aacenc_lib.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
@ -171,9 +168,6 @@
|
||||
<ClCompile Include="..\fdk-aac\libMpegTPEnc\src\tpenc_lib.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\fdk-aac\libPCMutils\src\pcmutils_lib.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\fdk-aac\libSBRenc\src\bit_sbr.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
@ -219,22 +213,73 @@
|
||||
<ClCompile Include="..\fdk-aac\libSBRenc\src\sbr_misc.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\fdk-aac\libSBRenc\src\sbr_ram.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\fdk-aac\libSBRenc\src\sbr_rom.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\fdk-aac\libSBRenc\src\ton_corr.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\fdk-aac\libSBRenc\src\tran_det.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\fdk-aac\libSYS\src\conv_string.cpp">
|
||||
<ClCompile Include="..\fdk-aac\libSYS\src\genericStds.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\fdk-aac\libSYS\src\genericStds.cpp">
|
||||
<ClCompile Include="..\fdk-aac\libPCMutils\src\pcm_utils.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\fdk-aac\libSBRenc\src\sbrenc_ram.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\fdk-aac\libSBRenc\src\sbrenc_rom.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\fdk-aac\libSACenc\src\sacenc_bitstream.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\fdk-aac\libSACenc\src\sacenc_delay.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\fdk-aac\libSACenc\src\sacenc_dmx_tdom_enh.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\fdk-aac\libSACenc\src\sacenc_filter.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\fdk-aac\libSACenc\src\sacenc_framewindowing.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\fdk-aac\libSACenc\src\sacenc_huff_tab.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\fdk-aac\libSACenc\src\sacenc_lib.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\fdk-aac\libSACenc\src\sacenc_nlc_enc.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\fdk-aac\libSACenc\src\sacenc_onsetdetect.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\fdk-aac\libSACenc\src\sacenc_paramextract.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\fdk-aac\libSACenc\src\sacenc_staticgain.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\fdk-aac\libSACenc\src\sacenc_tree.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\fdk-aac\libSACenc\src\sacenc_vectorfunctions.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\fdk-aac\libAACenc\src\mps_main.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\fdk-aac\libSYS\src\syslib_channelMapDescr.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\fdk-aac\libFDK\src\FDK_matrixCalloc.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\fdk-aac\libFDK\src\FDK_lpc.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
</ItemGroup>
|
||||
@ -245,9 +290,6 @@
|
||||
<ClInclude Include="..\fdk-aac\libAACenc\src\aacenc.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\fdk-aac\libAACenc\src\aacenc_hcr.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\fdk-aac\libAACenc\src\aacenc_pns.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
|
@ -8,17 +8,27 @@ EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Win32 = Debug|Win32
|
||||
Debug|x64 = Debug|x64
|
||||
Release|Win32 = Release|Win32
|
||||
Release|x64 = Release|x64
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
{E62D32CF-E308-40BD-9FF0-8266C6CAA9AA}.Debug|Win32.ActiveCfg = Debug|Win32
|
||||
{E62D32CF-E308-40BD-9FF0-8266C6CAA9AA}.Debug|Win32.Build.0 = Debug|Win32
|
||||
{E62D32CF-E308-40BD-9FF0-8266C6CAA9AA}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{E62D32CF-E308-40BD-9FF0-8266C6CAA9AA}.Debug|x64.Build.0 = Debug|x64
|
||||
{E62D32CF-E308-40BD-9FF0-8266C6CAA9AA}.Release|Win32.ActiveCfg = Release|Win32
|
||||
{E62D32CF-E308-40BD-9FF0-8266C6CAA9AA}.Release|Win32.Build.0 = Release|Win32
|
||||
{E62D32CF-E308-40BD-9FF0-8266C6CAA9AA}.Release|x64.ActiveCfg = Release|x64
|
||||
{E62D32CF-E308-40BD-9FF0-8266C6CAA9AA}.Release|x64.Build.0 = Release|x64
|
||||
{D7D4B982-8B16-4A10-8B1C-9527BD789709}.Debug|Win32.ActiveCfg = Debug|Win32
|
||||
{D7D4B982-8B16-4A10-8B1C-9527BD789709}.Debug|Win32.Build.0 = Debug|Win32
|
||||
{D7D4B982-8B16-4A10-8B1C-9527BD789709}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{D7D4B982-8B16-4A10-8B1C-9527BD789709}.Debug|x64.Build.0 = Debug|x64
|
||||
{D7D4B982-8B16-4A10-8B1C-9527BD789709}.Release|Win32.ActiveCfg = Release|Win32
|
||||
{D7D4B982-8B16-4A10-8B1C-9527BD789709}.Release|Win32.Build.0 = Release|Win32
|
||||
{D7D4B982-8B16-4A10-8B1C-9527BD789709}.Release|x64.ActiveCfg = Release|x64
|
||||
{D7D4B982-8B16-4A10-8B1C-9527BD789709}.Release|x64.Build.0 = Release|x64
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
|
@ -5,93 +5,83 @@
|
||||
<Configuration>Debug</Configuration>
|
||||
<Platform>Win32</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Debug|x64">
|
||||
<Configuration>Debug</Configuration>
|
||||
<Platform>x64</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Release|Win32">
|
||||
<Configuration>Release</Configuration>
|
||||
<Platform>Win32</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Release|x64">
|
||||
<Configuration>Release</Configuration>
|
||||
<Platform>x64</Platform>
|
||||
</ProjectConfiguration>
|
||||
</ItemGroup>
|
||||
<PropertyGroup Label="Globals">
|
||||
<ProjectGuid>{E62D32CF-E308-40BD-9FF0-8266C6CAA9AA}</ProjectGuid>
|
||||
<Keyword>Win32Proj</Keyword>
|
||||
<RootNamespace>fdkaac</RootNamespace>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup>
|
||||
<PlatformToolset Condition="'$(PlatformToolset)' == '' and '$(MSBuildToolsVersion)' == '17.0'">v143</PlatformToolset>
|
||||
<PlatformToolset Condition="'$(PlatformToolset)' == '' and '$(MSBuildToolsVersion)' == '16.0'">v142</PlatformToolset>
|
||||
<PlatformToolset Condition="'$(PlatformToolset)' == '' and '$(MSBuildToolsVersion)' == '15.0'">v141_xp</PlatformToolset>
|
||||
<PlatformToolset Condition="'$(PlatformToolset)' == '' and '$(MSBuildToolsVersion)' == '14.0'">v140_xp</PlatformToolset>
|
||||
<PlatformToolset Condition="'$(PlatformToolset)' == '' and '$(MSBuildToolsVersion)' == '12.0'">v120_xp</PlatformToolset>
|
||||
<PlatformToolset Condition="'$(PlatformToolset)' == '' and '$(MSBuildToolsVersion)' == '11.0'">v110_xp</PlatformToolset>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
||||
<PropertyGroup Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<UseDebugLibraries>true</UseDebugLibraries>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<PropertyGroup Condition="'$(Configuration)'=='Debug'" Label="Configuration">
|
||||
<UseDebugLibraries>true</UseDebugLibraries>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)'=='Release'" Label="Configuration">
|
||||
<UseDebugLibraries>false</UseDebugLibraries>
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||
<ImportGroup Label="ExtensionSettings">
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<ImportGroup Label="PropertySheets">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<PropertyGroup Label="UserMacros" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<LinkIncremental>true</LinkIncremental>
|
||||
<IntDir>cli_$(Configuration)\</IntDir>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<LinkIncremental>false</LinkIncremental>
|
||||
<IntDir>$(Configuration)Cli\</IntDir>
|
||||
</PropertyGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<ItemDefinitionGroup>
|
||||
<ClCompile>
|
||||
<PrecompiledHeader>
|
||||
</PrecompiledHeader>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<Optimization>Disabled</Optimization>
|
||||
<PreprocessorDefinitions>HAVE_STDINT_H;inline=__inline;_CRT_SECURE_NO_WARNINGS;WIN32;_CONSOLE;_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<PreprocessorDefinitions>HAVE_STDINT_H;inline=__inline;_CRT_SECURE_NO_WARNINGS;WIN32;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<AdditionalIncludeDirectories>./include;../missings;.;..</AdditionalIncludeDirectories>
|
||||
<StringPooling>true</StringPooling>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>Console</SubSystem>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
</Link>
|
||||
<Manifest>
|
||||
<AdditionalManifestFiles>..\fdkaac.manifest %(AdditionalManifestFiles)</AdditionalManifestFiles>
|
||||
</Manifest>
|
||||
<PreBuildEvent>
|
||||
<Command>copy ..\fdk-aac\libAACdec\include\aacdecoder_lib.h include\fdk-aac\
|
||||
copy ..\fdk-aac\libAACenc\include\aacenc_lib.h include\fdk-aac\
|
||||
<Command>copy ..\fdk-aac\libAACdec\include\aacdecoder_lib.h include\fdk-aac\
|
||||
copy ..\fdk-aac\libAACenc\include\aacenc_lib.h include\fdk-aac\
|
||||
copy ..\fdk-aac\libSYS\include\FDK_Audio.h include\fdk-aac\
|
||||
copy ..\fdk-aac\libSYS\include\genericStds.h include\fdk-aac\
|
||||
copy ..\fdk-aac\libSYS\include\machine_type.h include\fdk-aac\ </Command>
|
||||
copy ..\fdk-aac\libSYS\include\genericStds.h include\fdk-aac\
|
||||
copy ..\fdk-aac\libSYS\include\machine_type.h include\fdk-aac\
|
||||
copy ..\fdk-aac\libSYS\include\syslib_channelMapDescr.h include\fdk-aac\
|
||||
</Command>
|
||||
</PreBuildEvent>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)'=='Debug'">
|
||||
<ClCompile>
|
||||
<Optimization>Disabled</Optimization>
|
||||
</ClCompile>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)'=='Release'">
|
||||
<ClCompile>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<PrecompiledHeader>
|
||||
</PrecompiledHeader>
|
||||
<Optimization>MaxSpeed</Optimization>
|
||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||
<PreprocessorDefinitions>HAVE_STDINT_H;inline=__inline;_CRT_SECURE_NO_WARNINGS;WIN32;_CONSOLE;NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<AdditionalIncludeDirectories>./include;../missings;.;..</AdditionalIncludeDirectories>
|
||||
<StringPooling>true</StringPooling>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>Console</SubSystem>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||
<OptimizeReferences>true</OptimizeReferences>
|
||||
</Link>
|
||||
<PreBuildEvent>
|
||||
<Command>copy ..\fdk-aac\libAACdec\include\aacdecoder_lib.h include\fdk-aac\
|
||||
copy ..\fdk-aac\libAACenc\include\aacenc_lib.h include\fdk-aac\
|
||||
copy ..\fdk-aac\libSYS\include\FDK_Audio.h include\fdk-aac\
|
||||
copy ..\fdk-aac\libSYS\include\genericStds.h include\fdk-aac\
|
||||
copy ..\fdk-aac\libSYS\include\machine_type.h include\fdk-aac\ </Command>
|
||||
</PreBuildEvent>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="..\missings\getopt.c" />
|
||||
|
@ -23,7 +23,10 @@ fdkaac_SOURCES = \
|
||||
dist_man_MANS = man/fdkaac.1
|
||||
|
||||
fdkaac_LDADD = \
|
||||
@LIBICONV@ -lfdk-aac -lm
|
||||
@LIBICONV@ @CHARSET_LIB@ -lfdk-aac -lm
|
||||
|
||||
.rc.o:
|
||||
$(RC) $< -o $@
|
||||
|
||||
if FDK_PLATFORM_POSIX
|
||||
fdkaac_SOURCES += \
|
||||
@ -33,6 +36,7 @@ endif
|
||||
if FDK_PLATFORM_WIN32
|
||||
fdkaac_SOURCES += \
|
||||
src/compat_win32.c
|
||||
fdkaac_SOURCES += fdkaac.rc
|
||||
endif
|
||||
|
||||
if FDK_NO_GETOPT_LONG
|
||||
|
9
README
9
README
@ -52,15 +52,6 @@ OPTIONS
|
||||
39
|
||||
: MPEG-4 AAC ELD
|
||||
|
||||
129
|
||||
: MPEG-2 AAC LC
|
||||
|
||||
132
|
||||
: MPEG-2 HE-AAC (SBR)
|
||||
|
||||
156
|
||||
: MPEG-2 HE-AAC v2 (SBR+PS)
|
||||
|
||||
-b, --bitrate \<n\>
|
||||
: Target bitrate (for CBR)
|
||||
|
||||
|
@ -11,9 +11,10 @@ AM_INIT_AUTOMAKE
|
||||
|
||||
AC_PROG_CC
|
||||
AM_PROG_CC_C_O
|
||||
AC_CHECK_TOOL(RC, windres,)
|
||||
|
||||
AC_CHECK_HEADERS([sys/time.h])
|
||||
AC_CHECK_HEADERS([localcharset.h langinfo.h endian.h byteswap.h])
|
||||
AC_CHECK_HEADERS([libcharset.h langinfo.h endian.h byteswap.h])
|
||||
AC_CHECK_HEADERS([fdk-aac/aacenc_lib.h], ,
|
||||
AC_MSG_ERROR([libfdk-aac is required]))
|
||||
|
||||
@ -38,6 +39,12 @@ AC_CHECK_FUNC(getopt_long)
|
||||
AM_CONDITIONAL([FDK_NO_GETOPT_LONG],[test "$ac_cv_func_getopt_long" != "yes"])
|
||||
AC_SEARCH_LIBS([aacEncOpen],[fdk-aac],[],[],[])
|
||||
|
||||
CHARSET_LIB=
|
||||
AC_CHECK_LIB([iconv], [locale_charset],
|
||||
[CHARSET_LIB=-liconv],
|
||||
[AC_CHECK_LIB([charset], [locale_charset], [CHARSET_LIB=-lcharset])])
|
||||
AC_SUBST([CHARSET_LIB])
|
||||
|
||||
AC_CANONICAL_HOST
|
||||
|
||||
X_PLATFORM=posix
|
||||
|
8
fdkaac.manifest
Normal file
8
fdkaac.manifest
Normal file
@ -0,0 +1,8 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
|
||||
<application xmlns="urn:schemas-microsoft-com:asm.v3">
|
||||
<windowsSettings xmlns:ws2="http://schemas.microsoft.com/SMI/2016/WindowsSettings">
|
||||
<ws2:longPathAware>true</ws2:longPathAware>
|
||||
</windowsSettings>
|
||||
</application>
|
||||
</assembly>
|
3
fdkaac.rc
Normal file
3
fdkaac.rc
Normal file
@ -0,0 +1,3 @@
|
||||
#include <winresrc.h>
|
||||
|
||||
CREATEPROCESS_MANIFEST_RESOURCE_ID RT_MANIFEST "fdkaac.manifest"
|
22
man/fdkaac.1
22
man/fdkaac.1
@ -1,10 +1,13 @@
|
||||
.TH FDKAAC 1 "November, 2013"
|
||||
.\" Automatically generated by Pandoc 1.17.1
|
||||
.\"
|
||||
.TH "FDKAAC" "1" "November, 2013" "" ""
|
||||
.hy
|
||||
.SH NAME
|
||||
.PP
|
||||
fdkaac \- command line frontend for libfdk\-aac encoder
|
||||
.SH SYNOPSIS
|
||||
.PP
|
||||
\f[B]fdkaac\f[] [OPTIONS][FILE]
|
||||
\f[B]fdkaac\f[] [OPTIONS] [FILE]
|
||||
.SH DESCRIPTION
|
||||
.PP
|
||||
\f[B]fdkaac\f[] reads linear PCM audio in either WAV, raw PCM, or CAF
|
||||
@ -56,21 +59,6 @@ MPEG\-4 AAC LD
|
||||
MPEG\-4 AAC ELD
|
||||
.RS
|
||||
.RE
|
||||
.TP
|
||||
.B 129
|
||||
MPEG\-2 AAC LC
|
||||
.RS
|
||||
.RE
|
||||
.TP
|
||||
.B 132
|
||||
MPEG\-2 HE\-AAC (SBR)
|
||||
.RS
|
||||
.RE
|
||||
.TP
|
||||
.B 156
|
||||
MPEG\-2 HE\-AAC v2 (SBR+PS)
|
||||
.RS
|
||||
.RE
|
||||
.RE
|
||||
.TP
|
||||
.B \-b, \-\-bitrate <n>
|
||||
|
88
src/aacenc.c
88
src/aacenc.c
@ -13,6 +13,13 @@
|
||||
#include <string.h>
|
||||
#include "aacenc.h"
|
||||
|
||||
int aacenc_is_explicit_bw_compatible_sbr_signaling_available()
|
||||
{
|
||||
LIB_INFO lib_info;
|
||||
aacenc_get_lib_info(&lib_info);
|
||||
return lib_info.version > 0x03040900;
|
||||
}
|
||||
|
||||
int aacenc_is_sbr_ratio_available()
|
||||
{
|
||||
#if AACENCODER_LIB_VL0 < 3 || (AACENCODER_LIB_VL0==3 && AACENCODER_LIB_VL1<4)
|
||||
@ -20,15 +27,14 @@ int aacenc_is_sbr_ratio_available()
|
||||
#else
|
||||
LIB_INFO lib_info;
|
||||
aacenc_get_lib_info(&lib_info);
|
||||
return lib_info.version > 0x03040000;
|
||||
return lib_info.version > 0x03040800;
|
||||
#endif
|
||||
}
|
||||
|
||||
int aacenc_is_sbr_active(const aacenc_param_t *params)
|
||||
{
|
||||
switch (params->profile) {
|
||||
case AOT_SBR: case AOT_PS: case AOT_MP2_SBR: case AOT_MP2_PS:
|
||||
case AOT_DABPLUS_SBR: case AOT_DABPLUS_PS:
|
||||
case AOT_SBR: case AOT_PS:
|
||||
case AOT_DRM_SBR: case AOT_DRM_MPEG_PS:
|
||||
return 1;
|
||||
}
|
||||
@ -39,9 +45,9 @@ int aacenc_is_sbr_active(const aacenc_param_t *params)
|
||||
|
||||
int aacenc_is_dual_rate_sbr(const aacenc_param_t *params)
|
||||
{
|
||||
if (params->profile == AOT_PS || params->profile == AOT_MP2_PS)
|
||||
if (params->profile == AOT_PS)
|
||||
return 1;
|
||||
else if (params->profile == AOT_SBR || params->profile == AOT_MP2_SBR)
|
||||
else if (params->profile == AOT_SBR)
|
||||
return params->sbr_ratio == 0 || params->sbr_ratio == 2;
|
||||
else if (params->profile == AOT_ER_AAC_ELD && params->lowdelay_sbr)
|
||||
return params->sbr_ratio == 2;
|
||||
@ -64,6 +70,70 @@ void aacenc_get_lib_info(LIB_INFO *info)
|
||||
free(lib_info);
|
||||
}
|
||||
|
||||
static const unsigned aacenc_sampling_freq_tab[] = {
|
||||
96000, 88200, 64000, 48000, 44100, 32000, 24000, 22050,
|
||||
16000, 12000, 11025, 8000, 7350, 0, 0, 0
|
||||
};
|
||||
|
||||
static
|
||||
unsigned sampling_freq_index(unsigned rate)
|
||||
{
|
||||
unsigned i;
|
||||
for (i = 0; aacenc_sampling_freq_tab[i]; ++i)
|
||||
if (aacenc_sampling_freq_tab[i] == rate)
|
||||
return i;
|
||||
return 0xf;
|
||||
}
|
||||
|
||||
/*
|
||||
* Append backward compatible SBR/PS signaling to implicit signaling ASC,
|
||||
* if SBR/PS is present.
|
||||
*/
|
||||
int aacenc_mp4asc(const aacenc_param_t *params,
|
||||
const uint8_t *asc, uint32_t ascsize,
|
||||
uint8_t *outasc, uint32_t *outsize)
|
||||
{
|
||||
unsigned asc_sfreq = aacenc_sampling_freq_tab[(asc[0]&0x7)<<1 |asc[1]>>7];
|
||||
unsigned shift = aacenc_is_dual_rate_sbr(params);
|
||||
|
||||
switch (params->profile) {
|
||||
case AOT_SBR:
|
||||
case AOT_PS:
|
||||
if (!shift)
|
||||
break;
|
||||
if (*outsize < ascsize + 3)
|
||||
return -1;
|
||||
memcpy(outasc, asc, ascsize);
|
||||
/* syncExtensionType:11 (value:0x2b7) */
|
||||
outasc[ascsize+0] = 0x2b << 1;
|
||||
outasc[ascsize+1] = 0x7 << 5;
|
||||
/* extensionAudioObjectType:5 (value:5)*/
|
||||
outasc[ascsize+1] |= 5;
|
||||
/* sbrPresentFlag:1 (value:1) */
|
||||
outasc[ascsize+2] = 0x80;
|
||||
/* extensionSamplingFrequencyIndex:4 */
|
||||
outasc[ascsize+2] |= sampling_freq_index(asc_sfreq << shift) << 3;
|
||||
if (params->profile == AOT_SBR) {
|
||||
*outsize = ascsize + 3;
|
||||
return 0;
|
||||
}
|
||||
if (*outsize < ascsize + 5)
|
||||
return -1;
|
||||
/* syncExtensionType:11 (value:0x548) */
|
||||
outasc[ascsize+2] |= 0x5;
|
||||
outasc[ascsize+3] = 0x48;
|
||||
/* psPresentFlag:1 (value:1) */
|
||||
outasc[ascsize+4] = 0x80;
|
||||
*outsize = ascsize + 5;
|
||||
return 0;
|
||||
}
|
||||
if (*outsize < ascsize)
|
||||
return -1;
|
||||
memcpy(outasc, asc, ascsize);
|
||||
*outsize = ascsize;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static
|
||||
int aacenc_channel_mode(const pcm_sample_description_t *format)
|
||||
{
|
||||
@ -140,7 +210,7 @@ int aacenc_init(HANDLE_AACENCODER *encoder, const aacenc_param_t *params,
|
||||
aacEncoder_SetParam(*encoder, AACENC_SBR_MODE, params->lowdelay_sbr);
|
||||
|
||||
#if AACENCODER_LIB_VL0 > 3 || (AACENCODER_LIB_VL0==3 && AACENCODER_LIB_VL1>=4)
|
||||
if (lib_info.version > 0x03040000)
|
||||
if (lib_info.version > 0x03040800)
|
||||
aacEncoder_SetParam(*encoder, AACENC_SBR_RATIO, params->sbr_ratio);
|
||||
#endif
|
||||
|
||||
@ -177,7 +247,7 @@ FAIL:
|
||||
|
||||
int aac_encode_frame(HANDLE_AACENCODER encoder,
|
||||
const pcm_sample_description_t *format,
|
||||
const int16_t *input, unsigned iframes,
|
||||
const INT_PCM *input, unsigned iframes,
|
||||
aacenc_frame_t *output)
|
||||
{
|
||||
uint32_t ilen = iframes * format->channels_per_frame;
|
||||
@ -188,9 +258,9 @@ int aac_encode_frame(HANDLE_AACENCODER encoder,
|
||||
void *obufs[1];
|
||||
INT ibuf_ids[] = { IN_AUDIO_DATA };
|
||||
INT obuf_ids[] = { OUT_BITSTREAM_DATA };
|
||||
INT ibuf_sizes[] = { ilen * sizeof(int16_t) };
|
||||
INT ibuf_sizes[] = { ilen * sizeof(INT_PCM) };
|
||||
INT obuf_sizes[1];
|
||||
INT ibuf_el_sizes[] = { sizeof(int16_t) };
|
||||
INT ibuf_el_sizes[] = { sizeof(INT_PCM) };
|
||||
INT obuf_el_sizes[] = { 1 };
|
||||
AACENC_ERROR err;
|
||||
unsigned channel_mode, obytes;
|
||||
|
@ -30,6 +30,8 @@ typedef struct aacenc_frame_t {
|
||||
uint32_t size, capacity;
|
||||
} aacenc_frame_t;
|
||||
|
||||
int aacenc_is_explicit_bw_compatible_sbr_signaling_available();
|
||||
|
||||
int aacenc_is_sbr_ratio_available();
|
||||
|
||||
int aacenc_is_sbr_active(const aacenc_param_t *params);
|
||||
@ -38,13 +40,17 @@ int aacenc_is_dual_rate_sbr(const aacenc_param_t *params);
|
||||
|
||||
void aacenc_get_lib_info(LIB_INFO *info);
|
||||
|
||||
int aacenc_mp4asc(const aacenc_param_t *params,
|
||||
const uint8_t *asc, uint32_t ascsize,
|
||||
uint8_t *outasc, uint32_t *outsize);
|
||||
|
||||
int aacenc_init(HANDLE_AACENCODER *encoder, const aacenc_param_t *params,
|
||||
const pcm_sample_description_t *format,
|
||||
AACENC_InfoStruct *info);
|
||||
|
||||
int aac_encode_frame(HANDLE_AACENCODER encoder,
|
||||
const pcm_sample_description_t *format,
|
||||
const int16_t *input, unsigned iframes,
|
||||
const INT_PCM *input, unsigned iframes,
|
||||
aacenc_frame_t *output);
|
||||
|
||||
#endif
|
||||
|
@ -172,6 +172,7 @@ int caf_parse(caf_reader_t *reader, int64_t *data_length)
|
||||
{
|
||||
uint32_t fcc;
|
||||
int64_t chunk_size;
|
||||
int desc_seen = 0;
|
||||
|
||||
*data_length = 0;
|
||||
|
||||
@ -181,9 +182,10 @@ int caf_parse(caf_reader_t *reader, int64_t *data_length)
|
||||
TRY_IO(pcm_skip(&reader->io, 4)); /* mFileVersion, mFileFlags */
|
||||
|
||||
while ((fcc = caf_next_chunk(reader, &chunk_size)) != 0) {
|
||||
if (fcc == M4AF_FOURCC('d','e','s','c'))
|
||||
if (fcc == M4AF_FOURCC('d','e','s','c')) {
|
||||
desc_seen = 1;
|
||||
TRY_IO(caf_desc(reader, chunk_size));
|
||||
else if (fcc == M4AF_FOURCC('i','n','f','o'))
|
||||
} else if (fcc == M4AF_FOURCC('i','n','f','o'))
|
||||
TRY_IO(caf_info(reader, chunk_size));
|
||||
else if (fcc == M4AF_FOURCC('c','h','a','n')) {
|
||||
ENSURE(reader->sample_format.channels_per_frame);
|
||||
@ -199,7 +201,7 @@ int caf_parse(caf_reader_t *reader, int64_t *data_length)
|
||||
TRY_IO(pcm_skip(&reader->io, chunk_size));
|
||||
}
|
||||
ENSURE(reader->sample_format.channels_per_frame);
|
||||
ENSURE(fcc == M4AF_FOURCC('d','a','t','a'));
|
||||
ENSURE(desc_seen && fcc == M4AF_FOURCC('d','a','t','a'));
|
||||
return 0;
|
||||
FAIL:
|
||||
return -1;
|
||||
|
@ -20,9 +20,18 @@
|
||||
|
||||
int64_t aacenc_timer(void);
|
||||
FILE *aacenc_fopen(const char *name, const char *mode);
|
||||
#ifdef _WIN32
|
||||
void aacenc_getmainargs(int *argc, char ***argv);
|
||||
#else
|
||||
#define aacenc_getmainargs(argc, argv) (void)0
|
||||
#endif
|
||||
char *aacenc_to_utf8(const char *s);
|
||||
#ifdef _WIN32
|
||||
int aacenc_fprintf(FILE *fp, const char *fmt, ...);
|
||||
#else
|
||||
#define aacenc_fprintf fprintf
|
||||
#endif
|
||||
const char *aacenc_basename(const char *path);
|
||||
int aacenc_seekable(FILE *fp);
|
||||
|
||||
#endif
|
||||
|
@ -32,20 +32,9 @@ FILE *aacenc_fopen(const char *name, const char *mode)
|
||||
return fp;
|
||||
}
|
||||
|
||||
void aacenc_getmainargs(int *argc, char ***argv)
|
||||
int aacenc_seekable(FILE *fp)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
int aacenc_fprintf(FILE *fp, const char *fmt, ...)
|
||||
{
|
||||
va_list ap;
|
||||
int cnt;
|
||||
|
||||
va_start(ap, fmt);
|
||||
cnt = vfprintf(fp, fmt, ap);
|
||||
va_end(ap);
|
||||
return cnt;
|
||||
return fseek(fp, 0, SEEK_CUR) == 0;
|
||||
}
|
||||
|
||||
/*
|
||||
@ -70,8 +59,8 @@ char *aacenc_to_utf8(const char *s)
|
||||
#include <errno.h>
|
||||
#include <iconv.h>
|
||||
|
||||
#if HAVE_LOCALCHARSET_H
|
||||
#include <localcharset.h>
|
||||
#if HAVE_LIBCHARSET_H
|
||||
#include <libcharset.h>
|
||||
#elif HAVE_LANGINFO_H
|
||||
#include <langinfo.h>
|
||||
static const char *locale_charset(void)
|
||||
|
@ -20,14 +20,7 @@
|
||||
#include "compat.h"
|
||||
#define WIN32_LEAN_AND_MEAN
|
||||
#include <windows.h>
|
||||
|
||||
typedef struct
|
||||
{
|
||||
int newmode;
|
||||
} _startupinfo;
|
||||
|
||||
extern
|
||||
int __wgetmainargs(int *, wchar_t ***, wchar_t ***, int, _startupinfo *);
|
||||
#include <shellapi.h>
|
||||
|
||||
int64_t aacenc_timer(void)
|
||||
{
|
||||
@ -41,6 +34,11 @@ int64_t aacenc_timer(void)
|
||||
return (int64_t)tv.time * 1000 + tv.millitm;
|
||||
}
|
||||
|
||||
int aacenc_seekable(FILE *fp)
|
||||
{
|
||||
return GetFileType((HANDLE)_get_osfhandle(_fileno(fp))) == FILE_TYPE_DISK;
|
||||
}
|
||||
|
||||
static
|
||||
int codepage_decode_wchar(int codepage, const char *from, wchar_t **to)
|
||||
{
|
||||
@ -98,13 +96,13 @@ void aacenc_free_mainargs(void)
|
||||
void aacenc_getmainargs(int *argc, char ***argv)
|
||||
{
|
||||
int i;
|
||||
wchar_t **wargv, **envp;
|
||||
_startupinfo si = { 0 };
|
||||
wchar_t **wargv;
|
||||
|
||||
__wgetmainargs(argc, &wargv, &envp, 1, &si);
|
||||
wargv = CommandLineToArgvW(GetCommandLineW(), argc);
|
||||
*argv = malloc((*argc + 1) * sizeof(char*));
|
||||
for (i = 0; i < *argc; ++i)
|
||||
codepage_encode_wchar(CP_UTF8, wargv[i], &(*argv)[i]);
|
||||
LocalFree(wargv);
|
||||
(*argv)[*argc] = 0;
|
||||
__aacenc_argv__ = *argv;
|
||||
atexit(aacenc_free_mainargs);
|
||||
|
21
src/m4af.c
21
src/m4af.c
@ -39,6 +39,14 @@ typedef struct m4af_chunk_entry_t {
|
||||
uint32_t duration;
|
||||
} m4af_chunk_entry_t;
|
||||
|
||||
typedef struct m4af_itmf_entry_t {
|
||||
uint32_t fcc;
|
||||
char *name;
|
||||
uint32_t type_code;
|
||||
char *data;
|
||||
uint32_t data_size;
|
||||
} m4af_itmf_entry_t;
|
||||
|
||||
typedef struct m4af_track_t {
|
||||
uint32_t codec;
|
||||
uint32_t timescale;
|
||||
@ -215,7 +223,7 @@ void m4af_write32_at(m4af_ctx_t *ctx, int64_t pos, uint32_t value)
|
||||
}
|
||||
|
||||
m4af_ctx_t *m4af_create(uint32_t codec, uint32_t timescale,
|
||||
m4af_io_callbacks_t *io, void *io_cookie)
|
||||
m4af_io_callbacks_t *io, void *io_cookie, int no_timestamp)
|
||||
{
|
||||
m4af_ctx_t *ctx;
|
||||
int64_t timestamp;
|
||||
@ -229,7 +237,7 @@ m4af_ctx_t *m4af_create(uint32_t codec, uint32_t timescale,
|
||||
memcpy(&ctx->io, io, sizeof(m4af_io_callbacks_t));
|
||||
ctx->io_cookie = io_cookie;
|
||||
ctx->timescale = timescale;
|
||||
timestamp = m4af_timestamp();
|
||||
timestamp = no_timestamp ? 0 : m4af_timestamp();
|
||||
ctx->creation_time = timestamp;
|
||||
ctx->modification_time = timestamp;
|
||||
ctx->num_tracks = 1;
|
||||
@ -1095,8 +1103,10 @@ void m4af_write_tkhd_box(m4af_ctx_t *ctx, uint32_t track_idx)
|
||||
{
|
||||
m4af_track_t *track = &ctx->track[track_idx];
|
||||
int64_t pos = m4af_tell(ctx);
|
||||
int64_t duration =
|
||||
(double)track->duration / track->timescale * ctx->timescale + .5;
|
||||
int64_t duration = track->duration;
|
||||
if (ctx->priming_mode & M4AF_PRIMING_MODE_EDTS)
|
||||
duration -= (track->encoder_delay + track->padding);
|
||||
duration = (double)duration / track->timescale * ctx->timescale + .5;
|
||||
uint8_t version = (track->creation_time > UINT32_MAX ||
|
||||
track->modification_time > UINT32_MAX ||
|
||||
duration > UINT32_MAX);
|
||||
@ -1161,6 +1171,8 @@ int64_t m4af_movie_duration(m4af_ctx_t *ctx)
|
||||
unsigned i;
|
||||
for (i = 0; i < ctx->num_tracks; ++i) {
|
||||
double x = ctx->track[i].duration;
|
||||
if (ctx->priming_mode & M4AF_PRIMING_MODE_EDTS)
|
||||
x -= (ctx->track[i].encoder_delay + ctx->track[i].padding);
|
||||
int64_t duration = x / ctx->track[i].timescale * ctx->timescale + .5;
|
||||
if (duration > movie_duration)
|
||||
movie_duration = duration;
|
||||
@ -1374,7 +1386,6 @@ uint64_t m4af_patch_moov(m4af_ctx_t *ctx, uint32_t moov_size, uint32_t offset)
|
||||
static
|
||||
void m4af_shift_mdat_pos(m4af_ctx_t *ctx, uint32_t offset)
|
||||
{
|
||||
unsigned i, j;
|
||||
int64_t begin, end;
|
||||
char *buf;
|
||||
|
||||
|
10
src/m4af.h
10
src/m4af.h
@ -71,19 +71,11 @@ typedef struct m4af_io_callbacks_t {
|
||||
m4af_tell_callback tell;
|
||||
} m4af_io_callbacks_t;
|
||||
|
||||
typedef struct m4af_itmf_entry_t {
|
||||
uint32_t fcc;
|
||||
char *name;
|
||||
uint32_t type_code;
|
||||
char *data;
|
||||
uint32_t data_size;
|
||||
} m4af_itmf_entry_t;
|
||||
|
||||
typedef struct m4af_ctx_t m4af_ctx_t;
|
||||
|
||||
|
||||
m4af_ctx_t *m4af_create(uint32_t codec, uint32_t timescale,
|
||||
m4af_io_callbacks_t *io, void *io_cookie);
|
||||
m4af_io_callbacks_t *io, void *io_cookie, int no_timestamp);
|
||||
|
||||
int m4af_begin_write(m4af_ctx_t *ctx);
|
||||
|
||||
|
119
src/main.c
119
src/main.c
@ -117,9 +117,6 @@ PROGNAME " %s\n"
|
||||
" 29: MPEG-4 HE-AAC v2 (SBR+PS)\n"
|
||||
" 23: MPEG-4 AAC LD\n"
|
||||
" 39: MPEG-4 AAC ELD\n"
|
||||
" 129: MPEG-2 AAC LC\n"
|
||||
" 132: MPEG-2 HE-AAC (SBR)\n"
|
||||
" 156: MPEG-2 HE-AAC v2 (SBR+PS)\n"
|
||||
" -b, --bitrate <n> Bitrate in bits per seconds (for CBR)\n"
|
||||
" -m, --bitrate-mode <n> Bitrate configuration\n"
|
||||
" 0: CBR (default)\n"
|
||||
@ -162,6 +159,7 @@ PROGNAME " %s\n"
|
||||
" -I, --ignorelength Ignore length of WAV header\n"
|
||||
" -S, --silent Don't print progress messages\n"
|
||||
" --moov-before-mdat Place moov box before mdat box on m4a output\n"
|
||||
" --no-timestamp Don't inject timestamp in the file\n"
|
||||
"\n"
|
||||
"Options for raw (headerless) input:\n"
|
||||
" -R, --raw Treat input as raw (by default WAV is\n"
|
||||
@ -224,6 +222,8 @@ typedef struct aacenc_param_ex_t {
|
||||
unsigned raw_rate;
|
||||
const char *raw_format;
|
||||
|
||||
int no_timestamp;
|
||||
|
||||
aacenc_tag_store_t tags;
|
||||
aacenc_tag_store_t source_tags;
|
||||
aacenc_translate_generic_text_tag_ctx_t source_tag_ctx;
|
||||
@ -247,7 +247,7 @@ int parse_options(int argc, char **argv, aacenc_param_ex_t *params)
|
||||
#define OPT_LONG_TAG M4AF_FOURCC('l','t','a','g')
|
||||
#define OPT_TAG_FROM_JSON M4AF_FOURCC('t','f','j','s')
|
||||
|
||||
static struct option long_options[] = {
|
||||
static const struct option long_options[] = {
|
||||
{ "help", no_argument, 0, 'h' },
|
||||
{ "profile", required_argument, 0, 'p' },
|
||||
{ "bitrate", required_argument, 0, 'b' },
|
||||
@ -287,12 +287,14 @@ int parse_options(int argc, char **argv, aacenc_param_ex_t *params)
|
||||
{ "tag-from-file", required_argument, 0, OPT_SHORT_TAG_FILE },
|
||||
{ "long-tag", required_argument, 0, OPT_LONG_TAG },
|
||||
{ "tag-from-json", required_argument, 0, OPT_TAG_FROM_JSON },
|
||||
|
||||
{ "no-timestamp", no_argument, 0, '#' },
|
||||
{ 0, 0, 0, 0 },
|
||||
};
|
||||
params->afterburner = 1;
|
||||
|
||||
aacenc_getmainargs(&argc, &argv);
|
||||
while ((ch = getopt_long(argc, argv, "hp:b:m:w:a:Ls:f:CP:G:Io:SR",
|
||||
while ((ch = getopt_long(argc, argv, "hp:b:m:w:a:L:s:f:CP:G:Io:SR",
|
||||
long_options, 0)) != EOF) {
|
||||
switch (ch) {
|
||||
case 'h':
|
||||
@ -459,6 +461,9 @@ int parse_options(int argc, char **argv, aacenc_param_ex_t *params)
|
||||
case OPT_TAG_FROM_JSON:
|
||||
params->json_filename = optarg;
|
||||
break;
|
||||
case '#':
|
||||
params->no_timestamp = 1;
|
||||
break;
|
||||
default:
|
||||
return usage(), -1;
|
||||
}
|
||||
@ -506,12 +511,17 @@ int write_sample(FILE *ofp, m4af_ctx_t *m4af, aacenc_frame_t *frame)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int do_smart_padding(int profile)
|
||||
{
|
||||
return profile == 2 || profile == 5 || profile == 29;
|
||||
}
|
||||
|
||||
static
|
||||
int encode(aacenc_param_ex_t *params, pcm_reader_t *reader,
|
||||
HANDLE_AACENCODER encoder, uint32_t frame_length,
|
||||
m4af_ctx_t *m4af)
|
||||
{
|
||||
int16_t *ibuf = 0, *ip;
|
||||
INT_PCM *ibuf = 0, *ip;
|
||||
aacenc_frame_t obuf[2] = {{ 0 }}, *obp;
|
||||
unsigned flip = 0;
|
||||
int nread = 1;
|
||||
@ -520,15 +530,12 @@ int encode(aacenc_param_ex_t *params, pcm_reader_t *reader,
|
||||
int frames_written = 0, encoded = 0;
|
||||
aacenc_progress_t progress = { 0 };
|
||||
const pcm_sample_description_t *fmt = pcm_get_format(reader);
|
||||
const int is_padding = do_smart_padding(params->profile);
|
||||
|
||||
ibuf = malloc(frame_length * fmt->bytes_per_frame);
|
||||
aacenc_progress_init(&progress, pcm_get_length(reader), fmt->sample_rate);
|
||||
|
||||
for (;;) {
|
||||
/*
|
||||
* Since we delay the write, we cannot just exit loop when interrupted.
|
||||
* Instead, we regard it as EOF.
|
||||
*/
|
||||
if (g_interrupted)
|
||||
nread = 0;
|
||||
if (nread > 0) {
|
||||
@ -551,7 +558,7 @@ int encode(aacenc_param_ex_t *params, pcm_reader_t *reader,
|
||||
|
||||
remaining -= consumed;
|
||||
ip += consumed * fmt->channels_per_frame;
|
||||
flip ^= 1;
|
||||
if (is_padding) {
|
||||
/*
|
||||
* As we pad 1 frame at beginning and ending by our extrapolator,
|
||||
* we want to drop them.
|
||||
@ -560,25 +567,26 @@ int encode(aacenc_param_ex_t *params, pcm_reader_t *reader,
|
||||
* Since sbr_header is included in the first frame (in case of
|
||||
* SBR), we cannot discard first frame. So we pick second instead.
|
||||
*/
|
||||
++encoded;
|
||||
if (encoded == 1 || encoded == 3)
|
||||
continue;
|
||||
|
||||
flip ^= 1;
|
||||
++encoded;
|
||||
if (encoded == 1 || encoded == 3)
|
||||
continue;
|
||||
}
|
||||
if (write_sample(params->output_fp, m4af, &obuf[flip]) < 0)
|
||||
goto END;
|
||||
++frames_written;
|
||||
} while (remaining > 0);
|
||||
/*
|
||||
* When interrupted, we haven't pulled out last extrapolated frames
|
||||
* from the reader. Therefore, we have to write the final outcome.
|
||||
*/
|
||||
if (g_interrupted) {
|
||||
if (write_sample(params->output_fp, m4af, &obp[flip^1]) < 0)
|
||||
goto END;
|
||||
++frames_written;
|
||||
}
|
||||
}
|
||||
DONE:
|
||||
/*
|
||||
* When interrupted, we haven't pulled out last extrapolated frames
|
||||
* from the reader. Therefore, we have to write the final outcome.
|
||||
*/
|
||||
if (g_interrupted) {
|
||||
if (write_sample(params->output_fp, m4af, &obp[flip^1]) < 0)
|
||||
goto END;
|
||||
++frames_written;
|
||||
}
|
||||
if (!params->silent)
|
||||
aacenc_progress_finish(&progress, pcm_get_position(reader));
|
||||
rc = frames_written;
|
||||
@ -702,7 +710,6 @@ pcm_reader_t *open_input(aacenc_param_ex_t *params)
|
||||
{
|
||||
pcm_io_context_t io = { 0 };
|
||||
pcm_reader_t *reader = 0;
|
||||
struct stat stb = { 0 };
|
||||
|
||||
if ((params->input_fp = aacenc_fopen(params->input_filename, "rb")) == 0) {
|
||||
aacenc_fprintf(stderr, "ERROR: %s: %s\n", params->input_filename,
|
||||
@ -710,8 +717,7 @@ pcm_reader_t *open_input(aacenc_param_ex_t *params)
|
||||
goto FAIL;
|
||||
}
|
||||
io.cookie = params->input_fp;
|
||||
if (fstat(fileno(params->input_fp), &stb) == 0
|
||||
&& (stb.st_mode & S_IFMT) == S_IFREG)
|
||||
if (aacenc_seekable(params->input_fp))
|
||||
io.vtbl = &pcm_io_vtbl;
|
||||
else
|
||||
io.vtbl = &pcm_io_vtbl_noseek;
|
||||
@ -760,8 +766,10 @@ pcm_reader_t *open_input(aacenc_param_ex_t *params)
|
||||
reader = pcm_open_native_converter(reader);
|
||||
if (reader && PCM_IS_FLOAT(pcm_get_format(reader)))
|
||||
reader = limiter_open(reader);
|
||||
if (reader && (reader = pcm_open_sint16_converter(reader)) != 0)
|
||||
reader = extrapolater_open(reader);
|
||||
if (reader && (reader = pcm_open_sint16_converter(reader)) != 0) {
|
||||
if (do_smart_padding(params->profile))
|
||||
reader = extrapolater_open(reader);
|
||||
}
|
||||
return reader;
|
||||
FAIL:
|
||||
return 0;
|
||||
@ -803,12 +811,14 @@ int main(int argc, char **argv)
|
||||
params.sbr_ratio = 2;
|
||||
}
|
||||
scale_shift = aacenc_is_dual_rate_sbr((aacenc_param_t*)¶ms);
|
||||
params.sbr_signaling =
|
||||
(params.transport_format == TT_MP4_LOAS) ? 2 :
|
||||
(params.transport_format == TT_MP4_RAW) ? 1 : 0;
|
||||
if (sbr_mode && !scale_shift)
|
||||
params.sbr_signaling = 2;
|
||||
|
||||
params.sbr_signaling = 0;
|
||||
if (sbr_mode) {
|
||||
if (params.transport_format == TT_MP4_LOAS || !scale_shift)
|
||||
params.sbr_signaling = 2;
|
||||
if (params.transport_format == TT_MP4_RAW &&
|
||||
aacenc_is_explicit_bw_compatible_sbr_signaling_available())
|
||||
params.sbr_signaling = 1;
|
||||
}
|
||||
if (aacenc_init(&encoder, (aacenc_param_t*)¶ms, sample_format,
|
||||
&aacinfo) < 0)
|
||||
goto END;
|
||||
@ -831,39 +841,40 @@ int main(int argc, char **argv)
|
||||
unsigned framelen = aacinfo.frameLength;
|
||||
scale = sample_format->sample_rate >> scale_shift;
|
||||
if ((m4af = m4af_create(M4AF_CODEC_MP4A, scale, &m4af_io,
|
||||
params.output_fp)) < 0)
|
||||
params.output_fp, params.no_timestamp)) < 0)
|
||||
goto END;
|
||||
m4af_set_num_channels(m4af, 0, sample_format->channels_per_frame);
|
||||
m4af_set_decoder_specific_info(m4af, 0,
|
||||
aacinfo.confBuf, aacinfo.confSize);
|
||||
m4af_set_fixed_frame_duration(m4af, 0, framelen >> scale_shift);
|
||||
if (aacenc_is_explicit_bw_compatible_sbr_signaling_available())
|
||||
m4af_set_decoder_specific_info(m4af, 0,
|
||||
aacinfo.confBuf, aacinfo.confSize);
|
||||
else {
|
||||
uint8_t mp4asc[32];
|
||||
uint32_t ascsize = sizeof(mp4asc);
|
||||
aacenc_mp4asc((aacenc_param_t*)¶ms, aacinfo.confBuf,
|
||||
aacinfo.confSize, mp4asc, &ascsize);
|
||||
m4af_set_decoder_specific_info(m4af, 0, mp4asc, ascsize);
|
||||
}
|
||||
m4af_set_vbr_mode(m4af, 0, params.bitrate_mode);
|
||||
m4af_set_priming_mode(m4af, params.gapless_mode + 1);
|
||||
m4af_begin_write(m4af);
|
||||
}
|
||||
if (scale_shift && (aacinfo.encoderDelay & 1)) {
|
||||
/*
|
||||
* Since odd delay cannot be exactly expressed in downsampled scale,
|
||||
* we push one zero frame to the encoder here, to make delay even
|
||||
*/
|
||||
int16_t zero[8] = { 0 };
|
||||
aacenc_frame_t frame = { 0 };
|
||||
aac_encode_frame(encoder, sample_format, zero, 1, &frame);
|
||||
free(frame.data);
|
||||
}
|
||||
frame_count = encode(¶ms, reader, encoder, aacinfo.frameLength, m4af);
|
||||
if (frame_count < 0)
|
||||
goto END;
|
||||
if (m4af) {
|
||||
uint32_t delay = aacinfo.encoderDelay;
|
||||
uint32_t padding;
|
||||
#if AACENCODER_LIB_VL0 < 4
|
||||
uint32_t delay = aacinfo.encoderDelay;
|
||||
if (sbr_mode && params.profile != AOT_ER_AAC_ELD
|
||||
&& !params.include_sbr_delay)
|
||||
delay -= 481 << scale_shift;
|
||||
#else
|
||||
uint32_t delay = params.include_sbr_delay ? aacinfo.nDelay
|
||||
: aacinfo.nDelayCore;
|
||||
#endif
|
||||
int64_t frames_read = pcm_get_position(reader);
|
||||
|
||||
if (sbr_mode && params.profile != AOT_ER_AAC_ELD &&
|
||||
!params.include_sbr_delay)
|
||||
delay -= 481 << scale_shift;
|
||||
if (scale_shift && (delay & 1))
|
||||
++delay;
|
||||
padding = frame_count * aacinfo.frameLength - frames_read - delay;
|
||||
m4af_set_priming(m4af, 0, delay >> scale_shift, padding >> scale_shift);
|
||||
if (finalize_m4a(m4af, ¶ms, encoder) < 0)
|
||||
|
@ -41,7 +41,6 @@ static int64_t get_position(pcm_reader_t *reader)
|
||||
|
||||
static int read_frames(pcm_reader_t *reader, void *buffer, unsigned nframes)
|
||||
{
|
||||
unsigned i;
|
||||
pcm_float_converter_t *self = (pcm_float_converter_t *)reader;
|
||||
const pcm_sample_description_t *sfmt = pcm_get_format(self->src);
|
||||
nframes = pcm_read_frames(self->src, buffer, nframes);
|
||||
|
@ -10,6 +10,8 @@
|
||||
#if HAVE_STDINT_H
|
||||
# include <stdint.h>
|
||||
#endif
|
||||
#include <assert.h>
|
||||
#include <fdk-aac/aacenc_lib.h>
|
||||
#include "pcm_reader.h"
|
||||
|
||||
typedef struct pcm_sint16_converter_t {
|
||||
@ -57,12 +59,18 @@ static int read_frames(pcm_reader_t *reader, void *buffer, unsigned nframes)
|
||||
count = nframes * sfmt->channels_per_frame;
|
||||
if (PCM_IS_FLOAT(sfmt)) {
|
||||
float *ip = self->pivot;
|
||||
int16_t *op = buffer;
|
||||
INT_PCM *op = buffer;
|
||||
#if SAMPLE_BITS == 16
|
||||
for (i = 0; i < count; ++i)
|
||||
op[i] = pcm_clip(ip[i] * 32768.0, -32768.0, 32767.0);
|
||||
op[i] = (int16_t)pcm_clip(ip[i] * 32768.0, -32768.0, 32767.0);
|
||||
#else
|
||||
for (i = 0; i < count; ++i)
|
||||
op[i] = (int32_t)pcm_clip(ip[i] * 2147483648.0, -2147483648.0, 2147483647.0);
|
||||
#endif
|
||||
} else {
|
||||
int32_t *ip = self->pivot;
|
||||
int16_t *op = buffer;
|
||||
INT_PCM *op = buffer;
|
||||
#if SAMPLE_BITS == 16
|
||||
if (sfmt->bits_per_channel <= 16) {
|
||||
for (i = 0; i < count; ++i)
|
||||
op[i] = ip[i] >> 16;
|
||||
@ -72,6 +80,10 @@ static int read_frames(pcm_reader_t *reader, void *buffer, unsigned nframes)
|
||||
op[i] = (n == 0x8000) ? 0x7fff : n;
|
||||
}
|
||||
}
|
||||
#else
|
||||
for (i = 0; i < count; ++i)
|
||||
op[i] = ip[i];
|
||||
#endif
|
||||
}
|
||||
return nframes;
|
||||
}
|
||||
@ -94,14 +106,16 @@ pcm_reader_t *pcm_open_sint16_converter(pcm_reader_t *reader)
|
||||
pcm_sint16_converter_t *self = 0;
|
||||
pcm_sample_description_t *fmt;
|
||||
|
||||
assert((SAMPLE_BITS>>3) == sizeof(INT_PCM));
|
||||
|
||||
if ((self = calloc(1, sizeof(pcm_sint16_converter_t))) == 0)
|
||||
return 0;
|
||||
self->src = reader;
|
||||
self->vtbl = &my_vtable;
|
||||
memcpy(&self->format, pcm_get_format(reader), sizeof(self->format));
|
||||
fmt = &self->format;
|
||||
fmt->bits_per_channel = 16;
|
||||
fmt->bits_per_channel = SAMPLE_BITS;
|
||||
fmt->sample_type = PCM_TYPE_SINT;
|
||||
fmt->bytes_per_frame = 2 * fmt->channels_per_frame;
|
||||
fmt->bytes_per_frame = sizeof(INT_PCM) * fmt->channels_per_frame;
|
||||
return (pcm_reader_t *)self;
|
||||
}
|
||||
|
@ -155,6 +155,7 @@ static
|
||||
int wav_parse(wav_reader_t *reader, int64_t *data_length)
|
||||
{
|
||||
uint32_t container, fcc, chunk_size;
|
||||
int fmt_seen = 0;
|
||||
|
||||
*data_length = 0;
|
||||
container = riff_next_chunk(reader, &chunk_size);
|
||||
@ -167,6 +168,7 @@ int wav_parse(wav_reader_t *reader, int64_t *data_length)
|
||||
riff_ds64(reader, data_length);
|
||||
while ((fcc = riff_next_chunk(reader, &chunk_size)) != 0) {
|
||||
if (fcc == RIFF_FOURCC('f','m','t',' ')) {
|
||||
fmt_seen = 1;
|
||||
if (wav_fmt(reader, chunk_size) < 0)
|
||||
goto FAIL;
|
||||
} else if (fcc == RIFF_FOURCC('d','a','t','a')) {
|
||||
@ -178,8 +180,8 @@ int wav_parse(wav_reader_t *reader, int64_t *data_length)
|
||||
TRY_IO(pcm_skip(&reader->io, (chunk_size + 1) & ~1));
|
||||
}
|
||||
}
|
||||
if (fcc == RIFF_FOURCC('d','a','t','a'))
|
||||
return 0;
|
||||
ENSURE(fmt_seen && fcc == RIFF_FOURCC('d', 'a', 't', 'a'));
|
||||
return 0;
|
||||
FAIL:
|
||||
return -1;
|
||||
}
|
||||
|
Reference in New Issue
Block a user