mirror of
https://github.com/nu774/fdkaac.git
synced 2025-06-05 23:29:14 +02:00
Compare commits
17 Commits
Author | SHA1 | Date | |
---|---|---|---|
4242ad726f | |||
c8cc3fb57e | |||
622e065bd8 | |||
cf200f9563 | |||
fd2a1e77b3 | |||
17799e39b9 | |||
19a6b7f10c | |||
80b476bad9 | |||
e403976bf6 | |||
4080ab21e6 | |||
be991a6abe | |||
4c9167c1cb | |||
c77dae004d | |||
8c47bcc8dc | |||
1703d1f8cf | |||
4140443408 | |||
a1b4f691f5 |
30
ChangeLog
30
ChangeLog
@ -1,7 +1,33 @@
|
|||||||
2014-08-13 nu774 <honeycomb77@gmail.com>
|
2015-02-14 nu774 <honeycomb77@gmail.com>
|
||||||
|
|
||||||
* update ChangeLog [HEAD]
|
* update ChangeLog [HEAD]
|
||||||
|
|
||||||
|
* 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 [origin/master]
|
||||||
|
|
||||||
|
* bump version
|
||||||
|
|
||||||
|
2014-09-12 nu774 <honeycomb77@gmail.com>
|
||||||
|
|
||||||
|
* write actual number of channels to mp4a box
|
||||||
|
|
||||||
|
2014-08-17 nu774 <honeycomb77@gmail.com>
|
||||||
|
|
||||||
|
* update INSTALL
|
||||||
|
|
||||||
|
* add m4 macros
|
||||||
|
|
||||||
|
2014-08-13 nu774 <honeycomb77@gmail.com>
|
||||||
|
|
||||||
|
* update ChangeLog
|
||||||
|
|
||||||
* bump version [v0.6.0]
|
* bump version [v0.6.0]
|
||||||
|
|
||||||
2014-08-12 nu774 <honeycomb77@gmail.com>
|
2014-08-12 nu774 <honeycomb77@gmail.com>
|
||||||
@ -12,7 +38,7 @@
|
|||||||
|
|
||||||
2014-07-30 nu774 <honeycomb77@gmail.com>
|
2014-07-30 nu774 <honeycomb77@gmail.com>
|
||||||
|
|
||||||
* update ChangeLog [origin/master]
|
* update ChangeLog
|
||||||
|
|
||||||
* win32compat: fix aacenc_printf() not to write junk characters [v0.5.4]
|
* win32compat: fix aacenc_printf() not to write junk characters [v0.5.4]
|
||||||
|
|
||||||
|
@ -5,75 +5,69 @@
|
|||||||
<Configuration>Debug</Configuration>
|
<Configuration>Debug</Configuration>
|
||||||
<Platform>Win32</Platform>
|
<Platform>Win32</Platform>
|
||||||
</ProjectConfiguration>
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="Debug|x64">
|
||||||
|
<Configuration>Debug</Configuration>
|
||||||
|
<Platform>x64</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
<ProjectConfiguration Include="Release|Win32">
|
<ProjectConfiguration Include="Release|Win32">
|
||||||
<Configuration>Release</Configuration>
|
<Configuration>Release</Configuration>
|
||||||
<Platform>Win32</Platform>
|
<Platform>Win32</Platform>
|
||||||
</ProjectConfiguration>
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="Release|x64">
|
||||||
|
<Configuration>Release</Configuration>
|
||||||
|
<Platform>x64</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<PropertyGroup Label="Globals">
|
<PropertyGroup Label="Globals">
|
||||||
<ProjectGuid>{D7D4B982-8B16-4A10-8B1C-9527BD789709}</ProjectGuid>
|
<ProjectGuid>{D7D4B982-8B16-4A10-8B1C-9527BD789709}</ProjectGuid>
|
||||||
<Keyword>Win32Proj</Keyword>
|
<Keyword>Win32Proj</Keyword>
|
||||||
<RootNamespace>fdkaac</RootNamespace>
|
<RootNamespace>fdk-aac</RootNamespace>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup>
|
||||||
|
<PlatformToolset Condition="'$(PlatformToolset)' == '' and '$(VCTargetsPath14)' != ''">v140_xp</PlatformToolset>
|
||||||
|
<PlatformToolset Condition="'$(PlatformToolset)' == '' and '$(VCTargetsPath12)' != ''">v120_xp</PlatformToolset>
|
||||||
|
<PlatformToolset Condition="'$(PlatformToolset)' == '' and '$(VCTargetsPath11)' != ''">v110_xp</PlatformToolset>
|
||||||
|
<PlatformToolset Condition="'$(PlatformToolset)' == ''">v100</PlatformToolset>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
<PropertyGroup Label="Configuration">
|
||||||
<ConfigurationType>StaticLibrary</ConfigurationType>
|
<ConfigurationType>StaticLibrary</ConfigurationType>
|
||||||
<UseDebugLibraries>true</UseDebugLibraries>
|
|
||||||
<CharacterSet>Unicode</CharacterSet>
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
<PropertyGroup Condition="'$(Configuration)'=='Debug'" Label="Configuration">
|
||||||
<ConfigurationType>StaticLibrary</ConfigurationType>
|
<UseDebugLibraries>true</UseDebugLibraries>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)'=='Release'" Label="Configuration">
|
||||||
<UseDebugLibraries>false</UseDebugLibraries>
|
<UseDebugLibraries>false</UseDebugLibraries>
|
||||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
|
||||||
<CharacterSet>Unicode</CharacterSet>
|
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||||
<ImportGroup Label="ExtensionSettings">
|
<ImportGroup Label="PropertySheets">
|
||||||
</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'">
|
|
||||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
</ImportGroup>
|
</ImportGroup>
|
||||||
<PropertyGroup Label="UserMacros" />
|
<PropertyGroup Label="UserMacros" />
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
<ItemDefinitionGroup>
|
||||||
<IntDir>$(Configuration)Lib\</IntDir>
|
|
||||||
</PropertyGroup>
|
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
|
||||||
<IntDir>$(Configuration)Lib\</IntDir>
|
|
||||||
</PropertyGroup>
|
|
||||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
|
||||||
<ClCompile>
|
<ClCompile>
|
||||||
<PrecompiledHeader>NotUsing</PrecompiledHeader>
|
<PrecompiledHeader>NotUsing</PrecompiledHeader>
|
||||||
<WarningLevel>Level3</WarningLevel>
|
<WarningLevel>Level3</WarningLevel>
|
||||||
<Optimization>Disabled</Optimization>
|
<PreprocessorDefinitions>WIN32;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
<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>
|
<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>
|
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<Link>
|
|
||||||
<SubSystem>Windows</SubSystem>
|
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
|
||||||
</Link>
|
|
||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
<ItemDefinitionGroup Condition="'$(Configuration)'=='Debug'">
|
||||||
<ClCompile>
|
<ClCompile>
|
||||||
<WarningLevel>Level3</WarningLevel>
|
<Optimization>Disabled</Optimization>
|
||||||
<PrecompiledHeader>NotUsing</PrecompiledHeader>
|
</ClCompile>
|
||||||
<Optimization>MaxSpeed</Optimization>
|
</ItemDefinitionGroup>
|
||||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
<ItemDefinitionGroup Condition="'$(Configuration)'=='Release'">
|
||||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
<ClCompile>
|
||||||
<PreprocessorDefinitions>WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
<Optimization>MaxSpeed</Optimization>
|
||||||
<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>
|
<AdditionalOptions>/Qvec-report:1 %(AdditionalOptions)</AdditionalOptions>
|
||||||
<StringPooling>true</StringPooling>
|
</ClCompile>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Platform)'=='x64'">
|
||||||
|
<ClCompile>
|
||||||
|
<PreprocessorDefinitions>__x86_64__;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<Link>
|
|
||||||
<SubSystem>Windows</SubSystem>
|
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
|
||||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
|
||||||
<OptimizeReferences>true</OptimizeReferences>
|
|
||||||
</Link>
|
|
||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClCompile Include="..\fdk-aac\libAACenc\src\aacenc.cpp" />
|
<ClCompile Include="..\fdk-aac\libAACenc\src\aacenc.cpp" />
|
||||||
|
@ -8,17 +8,27 @@ EndProject
|
|||||||
Global
|
Global
|
||||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
Debug|Win32 = Debug|Win32
|
Debug|Win32 = Debug|Win32
|
||||||
|
Debug|x64 = Debug|x64
|
||||||
Release|Win32 = Release|Win32
|
Release|Win32 = Release|Win32
|
||||||
|
Release|x64 = Release|x64
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||||
{E62D32CF-E308-40BD-9FF0-8266C6CAA9AA}.Debug|Win32.ActiveCfg = Debug|Win32
|
{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|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.ActiveCfg = Release|Win32
|
||||||
{E62D32CF-E308-40BD-9FF0-8266C6CAA9AA}.Release|Win32.Build.0 = 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.ActiveCfg = Debug|Win32
|
||||||
{D7D4B982-8B16-4A10-8B1C-9527BD789709}.Debug|Win32.Build.0 = 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.ActiveCfg = Release|Win32
|
||||||
{D7D4B982-8B16-4A10-8B1C-9527BD789709}.Release|Win32.Build.0 = 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
|
EndGlobalSection
|
||||||
GlobalSection(SolutionProperties) = preSolution
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
HideSolutionNode = FALSE
|
HideSolutionNode = FALSE
|
||||||
|
@ -5,55 +5,50 @@
|
|||||||
<Configuration>Debug</Configuration>
|
<Configuration>Debug</Configuration>
|
||||||
<Platform>Win32</Platform>
|
<Platform>Win32</Platform>
|
||||||
</ProjectConfiguration>
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="Debug|x64">
|
||||||
|
<Configuration>Debug</Configuration>
|
||||||
|
<Platform>x64</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
<ProjectConfiguration Include="Release|Win32">
|
<ProjectConfiguration Include="Release|Win32">
|
||||||
<Configuration>Release</Configuration>
|
<Configuration>Release</Configuration>
|
||||||
<Platform>Win32</Platform>
|
<Platform>Win32</Platform>
|
||||||
</ProjectConfiguration>
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="Release|x64">
|
||||||
|
<Configuration>Release</Configuration>
|
||||||
|
<Platform>x64</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<PropertyGroup Label="Globals">
|
<PropertyGroup Label="Globals">
|
||||||
<ProjectGuid>{E62D32CF-E308-40BD-9FF0-8266C6CAA9AA}</ProjectGuid>
|
<ProjectGuid>{E62D32CF-E308-40BD-9FF0-8266C6CAA9AA}</ProjectGuid>
|
||||||
<Keyword>Win32Proj</Keyword>
|
<Keyword>Win32Proj</Keyword>
|
||||||
<RootNamespace>fdkaac</RootNamespace>
|
<RootNamespace>fdkaac</RootNamespace>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
<PropertyGroup>
|
||||||
|
<PlatformToolset Condition="'$(PlatformToolset)' == '' and '$(VCTargetsPath14)' != ''">v140_xp</PlatformToolset>
|
||||||
|
<PlatformToolset Condition="'$(PlatformToolset)' == '' and '$(VCTargetsPath12)' != ''">v120_xp</PlatformToolset>
|
||||||
|
<PlatformToolset Condition="'$(PlatformToolset)' == '' and '$(VCTargetsPath11)' != ''">v110_xp</PlatformToolset>
|
||||||
|
<PlatformToolset Condition="'$(PlatformToolset)' == ''">v100</PlatformToolset>
|
||||||
|
</PropertyGroup>
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
<PropertyGroup Label="Configuration">
|
||||||
<ConfigurationType>Application</ConfigurationType>
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
<UseDebugLibraries>true</UseDebugLibraries>
|
|
||||||
<CharacterSet>Unicode</CharacterSet>
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
<PropertyGroup Condition="'$(Configuration)'=='Debug'" Label="Configuration">
|
||||||
<ConfigurationType>Application</ConfigurationType>
|
<UseDebugLibraries>true</UseDebugLibraries>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)'=='Release'" Label="Configuration">
|
||||||
<UseDebugLibraries>false</UseDebugLibraries>
|
<UseDebugLibraries>false</UseDebugLibraries>
|
||||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
|
||||||
<CharacterSet>Unicode</CharacterSet>
|
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||||
<ImportGroup Label="ExtensionSettings">
|
<ImportGroup Label="PropertySheets">
|
||||||
</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" />
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
</ImportGroup>
|
</ImportGroup>
|
||||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
<ItemDefinitionGroup>
|
||||||
<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'">
|
|
||||||
<ClCompile>
|
<ClCompile>
|
||||||
<PrecompiledHeader>
|
|
||||||
</PrecompiledHeader>
|
|
||||||
<WarningLevel>Level3</WarningLevel>
|
<WarningLevel>Level3</WarningLevel>
|
||||||
<Optimization>Disabled</Optimization>
|
<PreprocessorDefinitions>HAVE_STDINT_H;inline=__inline;_CRT_SECURE_NO_WARNINGS;WIN32;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
<PreprocessorDefinitions>HAVE_STDINT_H;inline=__inline;_CRT_SECURE_NO_WARNINGS;WIN32;_CONSOLE;_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
|
||||||
<AdditionalIncludeDirectories>./include;../missings;.;..</AdditionalIncludeDirectories>
|
<AdditionalIncludeDirectories>./include;../missings;.;..</AdditionalIncludeDirectories>
|
||||||
<StringPooling>true</StringPooling>
|
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<Link>
|
<Link>
|
||||||
<SubSystem>Console</SubSystem>
|
<SubSystem>Console</SubSystem>
|
||||||
@ -67,31 +62,19 @@ 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\machine_type.h include\fdk-aac\ </Command>
|
||||||
</PreBuildEvent>
|
</PreBuildEvent>
|
||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
<ItemDefinitionGroup Condition="'$(Configuration)'=='Debug'">
|
||||||
|
<ClCompile>
|
||||||
|
<Optimization>Disabled</Optimization>
|
||||||
|
</ClCompile>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)'=='Release'">
|
||||||
<ClCompile>
|
<ClCompile>
|
||||||
<WarningLevel>Level3</WarningLevel>
|
|
||||||
<PrecompiledHeader>
|
|
||||||
</PrecompiledHeader>
|
|
||||||
<Optimization>MaxSpeed</Optimization>
|
<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>
|
</ClCompile>
|
||||||
<Link>
|
<Link>
|
||||||
<SubSystem>Console</SubSystem>
|
|
||||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
|
||||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
<OptimizeReferences>true</OptimizeReferences>
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
</Link>
|
</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>
|
</ItemDefinitionGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClCompile Include="..\missings\getopt.c" />
|
<ClCompile Include="..\missings\getopt.c" />
|
||||||
|
9
README
9
README
@ -52,15 +52,6 @@ OPTIONS
|
|||||||
39
|
39
|
||||||
: MPEG-4 AAC ELD
|
: 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\>
|
-b, --bitrate \<n\>
|
||||||
: Target bitrate (for CBR)
|
: Target bitrate (for CBR)
|
||||||
|
|
||||||
|
20
man/fdkaac.1
20
man/fdkaac.1
@ -1,4 +1,7 @@
|
|||||||
.TH FDKAAC 1 "November, 2013"
|
.\" Automatically generated by Pandoc 1.17.1
|
||||||
|
.\"
|
||||||
|
.TH "FDKAAC" "1" "November, 2013" "" ""
|
||||||
|
.hy
|
||||||
.SH NAME
|
.SH NAME
|
||||||
.PP
|
.PP
|
||||||
fdkaac \- command line frontend for libfdk\-aac encoder
|
fdkaac \- command line frontend for libfdk\-aac encoder
|
||||||
@ -56,21 +59,6 @@ MPEG\-4 AAC LD
|
|||||||
MPEG\-4 AAC ELD
|
MPEG\-4 AAC ELD
|
||||||
.RS
|
.RS
|
||||||
.RE
|
.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
|
.RE
|
||||||
.TP
|
.TP
|
||||||
.B \-b, \-\-bitrate <n>
|
.B \-b, \-\-bitrate <n>
|
||||||
|
82
src/aacenc.c
82
src/aacenc.c
@ -13,6 +13,13 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include "aacenc.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()
|
int aacenc_is_sbr_ratio_available()
|
||||||
{
|
{
|
||||||
#if AACENCODER_LIB_VL0 < 3 || (AACENCODER_LIB_VL0==3 && AACENCODER_LIB_VL1<4)
|
#if AACENCODER_LIB_VL0 < 3 || (AACENCODER_LIB_VL0==3 && AACENCODER_LIB_VL1<4)
|
||||||
@ -20,15 +27,14 @@ int aacenc_is_sbr_ratio_available()
|
|||||||
#else
|
#else
|
||||||
LIB_INFO lib_info;
|
LIB_INFO lib_info;
|
||||||
aacenc_get_lib_info(&lib_info);
|
aacenc_get_lib_info(&lib_info);
|
||||||
return lib_info.version > 0x03040000;
|
return lib_info.version > 0x03040800;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
int aacenc_is_sbr_active(const aacenc_param_t *params)
|
int aacenc_is_sbr_active(const aacenc_param_t *params)
|
||||||
{
|
{
|
||||||
switch (params->profile) {
|
switch (params->profile) {
|
||||||
case AOT_SBR: case AOT_PS: case AOT_MP2_SBR: case AOT_MP2_PS:
|
case AOT_SBR: case AOT_PS:
|
||||||
case AOT_DABPLUS_SBR: case AOT_DABPLUS_PS:
|
|
||||||
case AOT_DRM_SBR: case AOT_DRM_MPEG_PS:
|
case AOT_DRM_SBR: case AOT_DRM_MPEG_PS:
|
||||||
return 1;
|
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)
|
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;
|
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;
|
return params->sbr_ratio == 0 || params->sbr_ratio == 2;
|
||||||
else if (params->profile == AOT_ER_AAC_ELD && params->lowdelay_sbr)
|
else if (params->profile == AOT_ER_AAC_ELD && params->lowdelay_sbr)
|
||||||
return params->sbr_ratio == 2;
|
return params->sbr_ratio == 2;
|
||||||
@ -64,6 +70,70 @@ void aacenc_get_lib_info(LIB_INFO *info)
|
|||||||
free(lib_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
|
static
|
||||||
int aacenc_channel_mode(const pcm_sample_description_t *format)
|
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);
|
aacEncoder_SetParam(*encoder, AACENC_SBR_MODE, params->lowdelay_sbr);
|
||||||
|
|
||||||
#if AACENCODER_LIB_VL0 > 3 || (AACENCODER_LIB_VL0==3 && AACENCODER_LIB_VL1>=4)
|
#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);
|
aacEncoder_SetParam(*encoder, AACENC_SBR_RATIO, params->sbr_ratio);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -30,6 +30,8 @@ typedef struct aacenc_frame_t {
|
|||||||
uint32_t size, capacity;
|
uint32_t size, capacity;
|
||||||
} aacenc_frame_t;
|
} aacenc_frame_t;
|
||||||
|
|
||||||
|
int aacenc_is_explicit_bw_compatible_sbr_signaling_available();
|
||||||
|
|
||||||
int aacenc_is_sbr_ratio_available();
|
int aacenc_is_sbr_ratio_available();
|
||||||
|
|
||||||
int aacenc_is_sbr_active(const aacenc_param_t *params);
|
int aacenc_is_sbr_active(const aacenc_param_t *params);
|
||||||
@ -38,6 +40,10 @@ int aacenc_is_dual_rate_sbr(const aacenc_param_t *params);
|
|||||||
|
|
||||||
void aacenc_get_lib_info(LIB_INFO *info);
|
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,
|
int aacenc_init(HANDLE_AACENCODER *encoder, const aacenc_param_t *params,
|
||||||
const pcm_sample_description_t *format,
|
const pcm_sample_description_t *format,
|
||||||
AACENC_InfoStruct *info);
|
AACENC_InfoStruct *info);
|
||||||
|
@ -20,9 +20,18 @@
|
|||||||
|
|
||||||
int64_t aacenc_timer(void);
|
int64_t aacenc_timer(void);
|
||||||
FILE *aacenc_fopen(const char *name, const char *mode);
|
FILE *aacenc_fopen(const char *name, const char *mode);
|
||||||
|
#ifdef _WIN32
|
||||||
void aacenc_getmainargs(int *argc, char ***argv);
|
void aacenc_getmainargs(int *argc, char ***argv);
|
||||||
|
#else
|
||||||
|
#define aacenc_getmainargs(argc, argv) (void)0
|
||||||
|
#endif
|
||||||
char *aacenc_to_utf8(const char *s);
|
char *aacenc_to_utf8(const char *s);
|
||||||
|
#ifdef _WIN32
|
||||||
int aacenc_fprintf(FILE *fp, const char *fmt, ...);
|
int aacenc_fprintf(FILE *fp, const char *fmt, ...);
|
||||||
|
#else
|
||||||
|
#define aacenc_fprintf fprintf
|
||||||
|
#endif
|
||||||
const char *aacenc_basename(const char *path);
|
const char *aacenc_basename(const char *path);
|
||||||
|
int aacenc_seekable(FILE *fp);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -32,20 +32,9 @@ FILE *aacenc_fopen(const char *name, const char *mode)
|
|||||||
return fp;
|
return fp;
|
||||||
}
|
}
|
||||||
|
|
||||||
void aacenc_getmainargs(int *argc, char ***argv)
|
int aacenc_seekable(FILE *fp)
|
||||||
{
|
{
|
||||||
return;
|
return fseek(fp, 0, SEEK_CUR) == 0;
|
||||||
}
|
|
||||||
|
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -20,14 +20,7 @@
|
|||||||
#include "compat.h"
|
#include "compat.h"
|
||||||
#define WIN32_LEAN_AND_MEAN
|
#define WIN32_LEAN_AND_MEAN
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
|
#include <shellapi.h>
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
int newmode;
|
|
||||||
} _startupinfo;
|
|
||||||
|
|
||||||
extern
|
|
||||||
int __wgetmainargs(int *, wchar_t ***, wchar_t ***, int, _startupinfo *);
|
|
||||||
|
|
||||||
int64_t aacenc_timer(void)
|
int64_t aacenc_timer(void)
|
||||||
{
|
{
|
||||||
@ -41,6 +34,11 @@ int64_t aacenc_timer(void)
|
|||||||
return (int64_t)tv.time * 1000 + tv.millitm;
|
return (int64_t)tv.time * 1000 + tv.millitm;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int aacenc_seekable(FILE *fp)
|
||||||
|
{
|
||||||
|
return GetFileType((HANDLE)_get_osfhandle(_fileno(fp))) == FILE_TYPE_DISK;
|
||||||
|
}
|
||||||
|
|
||||||
static
|
static
|
||||||
int codepage_decode_wchar(int codepage, const char *from, wchar_t **to)
|
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)
|
void aacenc_getmainargs(int *argc, char ***argv)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
wchar_t **wargv, **envp;
|
wchar_t **wargv;
|
||||||
_startupinfo si = { 0 };
|
|
||||||
|
|
||||||
__wgetmainargs(argc, &wargv, &envp, 1, &si);
|
wargv = CommandLineToArgvW(GetCommandLineW(), argc);
|
||||||
*argv = malloc((*argc + 1) * sizeof(char*));
|
*argv = malloc((*argc + 1) * sizeof(char*));
|
||||||
for (i = 0; i < *argc; ++i)
|
for (i = 0; i < *argc; ++i)
|
||||||
codepage_encode_wchar(CP_UTF8, wargv[i], &(*argv)[i]);
|
codepage_encode_wchar(CP_UTF8, wargv[i], &(*argv)[i]);
|
||||||
|
LocalFree(wargv);
|
||||||
(*argv)[*argc] = 0;
|
(*argv)[*argc] = 0;
|
||||||
__aacenc_argv__ = *argv;
|
__aacenc_argv__ = *argv;
|
||||||
atexit(aacenc_free_mainargs);
|
atexit(aacenc_free_mainargs);
|
||||||
|
82
src/m4af.c
82
src/m4af.c
@ -39,6 +39,14 @@ typedef struct m4af_chunk_entry_t {
|
|||||||
uint32_t duration;
|
uint32_t duration;
|
||||||
} m4af_chunk_entry_t;
|
} 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 {
|
typedef struct m4af_track_t {
|
||||||
uint32_t codec;
|
uint32_t codec;
|
||||||
uint32_t timescale;
|
uint32_t timescale;
|
||||||
@ -103,12 +111,37 @@ typedef struct m4af_box_parser_t {
|
|||||||
int (*handler)(m4af_ctx_t *ctx, uint32_t name, uint64_t size);
|
int (*handler)(m4af_ctx_t *ctx, uint32_t name, uint64_t size);
|
||||||
} m4af_box_parser_t;
|
} m4af_box_parser_t;
|
||||||
|
|
||||||
|
static
|
||||||
|
int m4af_write_null_cb(void *cookie, const void *data, uint32_t size)
|
||||||
|
{
|
||||||
|
int64_t *pos = cookie;
|
||||||
|
*pos += size;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
static
|
||||||
|
int m4af_seek_null_cb(void *cookie, int64_t off, int whence)
|
||||||
|
{
|
||||||
|
int64_t *pos = cookie;
|
||||||
|
*pos = off; /* XXX: we use only SEEK_SET */
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
static
|
||||||
|
int64_t m4af_tell_null_cb(void *cookie)
|
||||||
|
{
|
||||||
|
return *((int64_t*)cookie);
|
||||||
|
}
|
||||||
|
|
||||||
|
static m4af_io_callbacks_t m4af_null_io_callbacks = {
|
||||||
|
0, m4af_write_null_cb, m4af_seek_null_cb, m4af_tell_null_cb
|
||||||
|
};
|
||||||
|
|
||||||
static
|
static
|
||||||
int64_t m4af_timestamp(void)
|
int64_t m4af_timestamp(void)
|
||||||
{
|
{
|
||||||
return (int64_t)(time(0)) + (((1970 - 1904) * 365) + 17) * 24 * 60 * 60;
|
return (int64_t)(time(0)) + (((1970 - 1904) * 365) + 17) * 24 * 60 * 60;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* http://graphics.stanford.edu/~seander/bithacks.html#RoundUpPowerOf2
|
* http://graphics.stanford.edu/~seander/bithacks.html#RoundUpPowerOf2
|
||||||
*/
|
*/
|
||||||
@ -664,7 +697,7 @@ void m4af_write_stco_box(m4af_ctx_t *ctx, uint32_t track_idx)
|
|||||||
m4af_track_t *track = &ctx->track[track_idx];
|
m4af_track_t *track = &ctx->track[track_idx];
|
||||||
uint32_t i;
|
uint32_t i;
|
||||||
m4af_chunk_entry_t *index = track->chunk_table;
|
m4af_chunk_entry_t *index = track->chunk_table;
|
||||||
int is_co64 = (ctx->mdat_pos + ctx->mdat_size > UINT32_MAX);
|
int is_co64 = index[track->num_chunks - 1].offset > 0xffffffff;
|
||||||
int64_t pos = m4af_tell(ctx);
|
int64_t pos = m4af_tell(ctx);
|
||||||
|
|
||||||
m4af_write32(ctx, 0); /* size */
|
m4af_write32(ctx, 0); /* size */
|
||||||
@ -1012,7 +1045,7 @@ void m4af_write_hdlr_box(m4af_ctx_t *ctx, uint32_t track_idx, const char *type)
|
|||||||
/* reserved[0] */
|
/* reserved[0] */
|
||||||
m4af_write(ctx, !strcmp(type, "mdir") ? "appl" : "\0\0\0\0", 4);
|
m4af_write(ctx, !strcmp(type, "mdir") ? "appl" : "\0\0\0\0", 4);
|
||||||
/* reserved[1], reserved[2], name */
|
/* reserved[1], reserved[2], name */
|
||||||
m4af_write(ctx, reserved_and_name, (pos & 1) ? 9 : 10);
|
m4af_write(ctx, reserved_and_name, 9);
|
||||||
m4af_update_box_size(ctx, pos);
|
m4af_update_box_size(ctx, pos);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1317,28 +1350,58 @@ void m4af_finalize_mdat(m4af_ctx_t *ctx)
|
|||||||
m4af_set_pos(ctx, ctx->mdat_pos + ctx->mdat_size);
|
m4af_set_pos(ctx, ctx->mdat_pos + ctx->mdat_size);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static
|
||||||
|
uint64_t m4af_patch_moov(m4af_ctx_t *ctx, uint32_t moov_size, uint32_t offset)
|
||||||
|
{
|
||||||
|
int64_t pos = 0;
|
||||||
|
uint32_t moov_size2;
|
||||||
|
int i, j;
|
||||||
|
m4af_io_callbacks_t io_reserve = ctx->io;
|
||||||
|
void *io_cookie_reserve = ctx->io_cookie;
|
||||||
|
|
||||||
|
for (i = 0; i < ctx->num_tracks; ++i)
|
||||||
|
for (j = 0; j < ctx->track[i].num_chunks; ++j)
|
||||||
|
ctx->track[i].chunk_table[j].offset += offset;
|
||||||
|
|
||||||
|
ctx->io = m4af_null_io_callbacks;
|
||||||
|
ctx->io_cookie = &pos;
|
||||||
|
moov_size2 = m4af_write_moov_box(ctx);
|
||||||
|
|
||||||
|
if (moov_size2 != moov_size) {
|
||||||
|
/* stco -> co64 switching */
|
||||||
|
for (i = 0; i < ctx->num_tracks; ++i)
|
||||||
|
for (j = 0; j < ctx->track[i].num_chunks; ++j)
|
||||||
|
ctx->track[i].chunk_table[j].offset += moov_size2 - moov_size;
|
||||||
|
moov_size2 = m4af_write_moov_box(ctx);
|
||||||
|
}
|
||||||
|
ctx->io = io_reserve;
|
||||||
|
ctx->io_cookie = io_cookie_reserve;
|
||||||
|
return moov_size2;
|
||||||
|
}
|
||||||
|
|
||||||
static
|
static
|
||||||
void m4af_shift_mdat_pos(m4af_ctx_t *ctx, uint32_t offset)
|
void m4af_shift_mdat_pos(m4af_ctx_t *ctx, uint32_t offset)
|
||||||
{
|
{
|
||||||
unsigned i, j;
|
|
||||||
int64_t begin, end;
|
int64_t begin, end;
|
||||||
char buf[8192];
|
char *buf;
|
||||||
|
|
||||||
|
buf = malloc(1024*1024*2);
|
||||||
|
|
||||||
end = ctx->mdat_pos + ctx->mdat_size;
|
end = ctx->mdat_pos + ctx->mdat_size;
|
||||||
for (; (begin = m4af_max(ctx->mdat_pos, end - 8192)) < end; end = begin) {
|
for (; (begin = m4af_max(ctx->mdat_pos, end - 1024*1024*2)) < end;
|
||||||
|
end = begin) {
|
||||||
m4af_set_pos(ctx, begin);
|
m4af_set_pos(ctx, begin);
|
||||||
ctx->io.read(ctx->io_cookie, buf, end - begin);
|
ctx->io.read(ctx->io_cookie, buf, end - begin);
|
||||||
m4af_set_pos(ctx, begin + offset);
|
m4af_set_pos(ctx, begin + offset);
|
||||||
m4af_write(ctx, buf, end - begin);
|
m4af_write(ctx, buf, end - begin);
|
||||||
}
|
}
|
||||||
for (i = 0; i < ctx->num_tracks; ++i)
|
|
||||||
for (j = 0; j < ctx->track[i].num_chunks; ++j)
|
|
||||||
ctx->track[i].chunk_table[j].offset += offset;
|
|
||||||
ctx->mdat_pos += offset;
|
ctx->mdat_pos += offset;
|
||||||
m4af_set_pos(ctx, ctx->mdat_pos - 16);
|
m4af_set_pos(ctx, ctx->mdat_pos - 16);
|
||||||
m4af_write_free_box(ctx, 0);
|
m4af_write_free_box(ctx, 0);
|
||||||
m4af_write(ctx, "\0\0\0\0mdat", 8);
|
m4af_write(ctx, "\0\0\0\0mdat", 8);
|
||||||
m4af_finalize_mdat(ctx);
|
m4af_finalize_mdat(ctx);
|
||||||
|
|
||||||
|
free(buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
int m4af_finalize(m4af_ctx_t *ctx, int optimize)
|
int m4af_finalize(m4af_ctx_t *ctx, int optimize)
|
||||||
@ -1367,7 +1430,8 @@ int m4af_finalize(m4af_ctx_t *ctx, int optimize)
|
|||||||
moov_size = m4af_write_moov_box(ctx);
|
moov_size = m4af_write_moov_box(ctx);
|
||||||
if (optimize) {
|
if (optimize) {
|
||||||
int64_t pos;
|
int64_t pos;
|
||||||
m4af_shift_mdat_pos(ctx, moov_size + 1024);
|
uint32_t moov_size2 = m4af_patch_moov(ctx, moov_size, moov_size + 1024);
|
||||||
|
m4af_shift_mdat_pos(ctx, moov_size2 + 1024);
|
||||||
m4af_set_pos(ctx, 32);
|
m4af_set_pos(ctx, 32);
|
||||||
m4af_write_moov_box(ctx);
|
m4af_write_moov_box(ctx);
|
||||||
pos = m4af_tell(ctx);
|
pos = m4af_tell(ctx);
|
||||||
|
@ -71,14 +71,6 @@ typedef struct m4af_io_callbacks_t {
|
|||||||
m4af_tell_callback tell;
|
m4af_tell_callback tell;
|
||||||
} m4af_io_callbacks_t;
|
} 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;
|
typedef struct m4af_ctx_t m4af_ctx_t;
|
||||||
|
|
||||||
|
|
||||||
|
42
src/main.c
42
src/main.c
@ -117,9 +117,6 @@ PROGNAME " %s\n"
|
|||||||
" 29: MPEG-4 HE-AAC v2 (SBR+PS)\n"
|
" 29: MPEG-4 HE-AAC v2 (SBR+PS)\n"
|
||||||
" 23: MPEG-4 AAC LD\n"
|
" 23: MPEG-4 AAC LD\n"
|
||||||
" 39: MPEG-4 AAC ELD\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"
|
" -b, --bitrate <n> Bitrate in bits per seconds (for CBR)\n"
|
||||||
" -m, --bitrate-mode <n> Bitrate configuration\n"
|
" -m, --bitrate-mode <n> Bitrate configuration\n"
|
||||||
" 0: CBR (default)\n"
|
" 0: CBR (default)\n"
|
||||||
@ -563,11 +560,20 @@ int encode(aacenc_param_ex_t *params, pcm_reader_t *reader,
|
|||||||
++encoded;
|
++encoded;
|
||||||
if (encoded == 1 || encoded == 3)
|
if (encoded == 1 || encoded == 3)
|
||||||
continue;
|
continue;
|
||||||
obp = &obuf[flip];
|
|
||||||
if (write_sample(params->output_fp, m4af, obp) < 0)
|
if (write_sample(params->output_fp, m4af, &obuf[flip]) < 0)
|
||||||
goto END;
|
goto END;
|
||||||
++frames_written;
|
++frames_written;
|
||||||
} while (remaining > 0);
|
} 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:
|
DONE:
|
||||||
if (!params->silent)
|
if (!params->silent)
|
||||||
@ -693,7 +699,6 @@ pcm_reader_t *open_input(aacenc_param_ex_t *params)
|
|||||||
{
|
{
|
||||||
pcm_io_context_t io = { 0 };
|
pcm_io_context_t io = { 0 };
|
||||||
pcm_reader_t *reader = 0;
|
pcm_reader_t *reader = 0;
|
||||||
struct stat stb = { 0 };
|
|
||||||
|
|
||||||
if ((params->input_fp = aacenc_fopen(params->input_filename, "rb")) == 0) {
|
if ((params->input_fp = aacenc_fopen(params->input_filename, "rb")) == 0) {
|
||||||
aacenc_fprintf(stderr, "ERROR: %s: %s\n", params->input_filename,
|
aacenc_fprintf(stderr, "ERROR: %s: %s\n", params->input_filename,
|
||||||
@ -701,8 +706,7 @@ pcm_reader_t *open_input(aacenc_param_ex_t *params)
|
|||||||
goto FAIL;
|
goto FAIL;
|
||||||
}
|
}
|
||||||
io.cookie = params->input_fp;
|
io.cookie = params->input_fp;
|
||||||
if (fstat(fileno(params->input_fp), &stb) == 0
|
if (aacenc_seekable(params->input_fp))
|
||||||
&& (stb.st_mode & S_IFMT) == S_IFREG)
|
|
||||||
io.vtbl = &pcm_io_vtbl;
|
io.vtbl = &pcm_io_vtbl;
|
||||||
else
|
else
|
||||||
io.vtbl = &pcm_io_vtbl_noseek;
|
io.vtbl = &pcm_io_vtbl_noseek;
|
||||||
@ -794,12 +798,14 @@ int main(int argc, char **argv)
|
|||||||
params.sbr_ratio = 2;
|
params.sbr_ratio = 2;
|
||||||
}
|
}
|
||||||
scale_shift = aacenc_is_dual_rate_sbr((aacenc_param_t*)¶ms);
|
scale_shift = aacenc_is_dual_rate_sbr((aacenc_param_t*)¶ms);
|
||||||
params.sbr_signaling =
|
params.sbr_signaling = 0;
|
||||||
(params.transport_format == TT_MP4_LOAS) ? 2 :
|
if (sbr_mode) {
|
||||||
(params.transport_format == TT_MP4_RAW) ? 1 : 0;
|
if (params.transport_format == TT_MP4_LOAS || !scale_shift)
|
||||||
if (sbr_mode && !scale_shift)
|
|
||||||
params.sbr_signaling = 2;
|
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,
|
if (aacenc_init(&encoder, (aacenc_param_t*)¶ms, sample_format,
|
||||||
&aacinfo) < 0)
|
&aacinfo) < 0)
|
||||||
goto END;
|
goto END;
|
||||||
@ -825,9 +831,17 @@ int main(int argc, char **argv)
|
|||||||
params.output_fp)) < 0)
|
params.output_fp)) < 0)
|
||||||
goto END;
|
goto END;
|
||||||
m4af_set_num_channels(m4af, 0, sample_format->channels_per_frame);
|
m4af_set_num_channels(m4af, 0, sample_format->channels_per_frame);
|
||||||
|
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,
|
m4af_set_decoder_specific_info(m4af, 0,
|
||||||
aacinfo.confBuf, aacinfo.confSize);
|
aacinfo.confBuf, aacinfo.confSize);
|
||||||
m4af_set_fixed_frame_duration(m4af, 0, framelen >> scale_shift);
|
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_vbr_mode(m4af, 0, params.bitrate_mode);
|
||||||
m4af_set_priming_mode(m4af, params.gapless_mode + 1);
|
m4af_set_priming_mode(m4af, params.gapless_mode + 1);
|
||||||
m4af_begin_write(m4af);
|
m4af_begin_write(m4af);
|
||||||
|
@ -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)
|
static int read_frames(pcm_reader_t *reader, void *buffer, unsigned nframes)
|
||||||
{
|
{
|
||||||
unsigned i;
|
|
||||||
pcm_float_converter_t *self = (pcm_float_converter_t *)reader;
|
pcm_float_converter_t *self = (pcm_float_converter_t *)reader;
|
||||||
const pcm_sample_description_t *sfmt = pcm_get_format(self->src);
|
const pcm_sample_description_t *sfmt = pcm_get_format(self->src);
|
||||||
nframes = pcm_read_frames(self->src, buffer, nframes);
|
nframes = pcm_read_frames(self->src, buffer, nframes);
|
||||||
|
Reference in New Issue
Block a user