Compare commits

...

57 Commits

Author SHA1 Message Date
nu774 98d90e76d6 fix ci again: s/PKG_CONFIG_LIBPATH/PKG_CONFIG_LIBDIR/ 2024-05-06 01:03:58 +09:00
nu774 2dd2b3c61b ci: use sudo on make install for Mac 2024-05-06 00:58:29 +09:00
nu774 746e85538b fix ci: specify PKG_CONFIG_LIBPATH for MinGW cross 2024-05-06 00:55:17 +09:00
nu774 594c26b960 bump 2024-05-06 00:45:37 +09:00
nu774 a71453bc9a use PKG_CHECK_MODULES for fdk-aac
https://github.com/nu774/fdkaac/issues/60
2024-05-06 00:45:37 +09:00
nu774 11f6ac1665 add support for recent apple channel layout tags 2024-05-06 00:45:37 +09:00
nu774 7291661fdc condifure.ac: add AC_CONFIG_AUX_DIR()
fix https://github.com/nu774/fdkaac/issues/53
2024-05-06 00:45:37 +09:00
nu774 2dc1ef46e1 github workflow: make: use -j2 or -j3 2024-01-11 13:04:25 +09:00
nu774 f95566ee8e update help message regarding vbr mode 2023-03-14 00:24:51 +09:00
nu774 d705c888cf github workflow: add msys2 2023-03-10 00:18:58 +09:00
nu774 31e62aa51c update .gitignore 2023-03-09 23:56:31 +09:00
nu774 2ed6139278 github workflow: add mac 2023-03-08 23:43:23 +09:00
nu774 4037c42577 update github workflow 2023-03-08 23:10:19 +09:00
nu774 4f35b8ad7c add github workflow 2023-03-08 09:46:45 +09:00
nu774 3bf454a5a3 bump 2023-02-15 20:57:33 +09:00
nu774 22dbf72491 fixes https://github.com/nu774/fdkaac/issues/55 2023-02-15 20:56:33 +09:00
nu774 03c3c60191 updateChangeLog 2022-08-04 21:16:14 +09:00
nu774 59455af10a bump 2022-08-04 21:14:35 +09:00
nu774 ae1f4c3afd fdk-aac.vcxproj: support vs2022 2022-08-04 21:13:18 +09:00
nu774 0ce71d066a extrapolater: don't return more samples than required
fixes https://github.com/nu774/fdkaac/issues/54
2022-08-04 21:11:53 +09:00
nu774 ecddb7d633 wav/caf parser: add format checks
fixes https://github.com/nu774/fdkaac/issues/54
2022-08-04 21:06:10 +09:00
nu774 1a1ee2924f update ChangeLog 2022-07-13 21:03:53 +09:00
nu774 cdfb81d7c6 bump 2022-07-13 20:59:03 +09:00
nu774 4ec1422bd9 wav/caf parser: ensure fmt/desc chunk
fixes https://github.com/nu774/fdkaac/issues/52
2022-07-13 20:56:49 +09:00
nu774 53fe239bf6 vcxproj: support Visual Studio 2022 2021-11-15 01:18:51 +09:00
nu774 347e995cfc bump 2021-04-23 22:57:27 +09:00
nu774 9d65d3b3bf m4af: fix mvhd/tkhd duration
According to 14496-12, duration of mvhd/tkhd shall be the sum of
duration of edits
2021-04-23 22:53:46 +09:00
nu774 fdf5c2f251 bump 2020-09-21 22:41:03 +09:00
nu774 ef17c9436e add Windows 10 long pathname manifest 2020-09-21 22:41:03 +09:00
nu774 c0919b049a fix indent 2019-09-27 21:05:12 +09:00
Dima 353e4fcd7a process 32-bit input if possible (i.e. respect aac:INT_PCM type)
switch AAC-FDK from pcm16 to pcm32:
    typedef LONG INT_PCM;
    #define SAMPLE_BITS 32
2019-09-27 12:10:30 +03:00
nu774 130e249ebf vcxproj: support visual studio 2019 2019-04-04 19:55:18 +09:00
tico-tico 65ee26fb61 don't inject timestamp 2018-12-10 14:59:48 +03:00
nu774 f2f9c1b4bb bump version 1.0.0 2018-09-04 02:04:36 +09:00
nu774 836367a7fe Fix LD/ELD issue: priming samples are too short to be discarded
When discarded, cannot reconstruct the beginning.
Now we changed to activate smartpadding only for LC/HE/HEv2.
(padding is not nice for low delay codec anyway)

LD and ELD are two short
2018-09-04 01:30:08 +09:00
nu774 ca65cffdd3 FDKv2 API change: encoderDelay -> nDelay/nDelayCore 2018-09-03 22:59:24 +09:00
nu774 36424b121c update MSVC projects for FDKv2 2018-09-03 20:58:17 +09:00
nu774 2329b4b1eb use different IntDir for fdk-aac build 2018-09-03 20:27:42 +09:00
nu774 4c963ef139 remove zombies from fdk-aac.vcxproj.filters 2018-09-03 20:26:32 +09:00
nu774 3f7b6abd20 fix: -L option was not working (resulted in segfault) 2018-09-03 20:25:28 +09:00
nu774 4571d9d76a MSVC projects: update for VS2017 2017-03-16 20:51:30 +09:00
nu774 4682fe4961 address issue#26
try to link with libcharset when locale_charset() is not present in
libiconv
2017-01-16 15:20:09 +09:00
nu774 c37edc6051 remove aacenc_hcr.* from MSVC project 2016-08-27 23:51:48 +09:00
nu774 07c06b4c3e update ChangeLog 2016-08-26 21:47:20 +09:00
nu774 4242ad726f bump 2016-08-26 21:45:05 +09:00
nu774 c8cc3fb57e Ticket #23: quit supporting MPEG-2 AOT
Macro definitions for those AOT have gone from FDK_audio.h
2016-08-26 21:19:03 +09:00
nu774 622e065bd8 fix libfdkaac encoder version check for SBR_RATIO availability 2016-08-25 21:22:33 +09:00
nu774 cf200f9563 Use our SBR signaling implementation on old libfdkaac 2016-08-25 21:02:41 +09:00
nu774 fd2a1e77b3 improve MSVC project
- simplify conditions
- autodetect highest available PlatformToolset
- x64 platform support
2015-10-10 17:44:11 +09:00
nu774 17799e39b9 fix indents 2015-09-21 15:24:02 +09:00
nu774 19a6b7f10c update compat layer, mainly for MSVC14 issue 2015-09-21 15:19:15 +09:00
nu774 80b476bad9 add platformtoolset in vcxproj 2015-07-22 22:14:08 +09:00
nu774 e403976bf6 fix build issue on MSVC14 2015-07-22 22:14:00 +09:00
nu774 4080ab21e6 remove an unused variable decl 2015-06-12 21:07:59 +09:00
nu774 be991a6abe remove an unused variable decl 2015-06-12 21:06:45 +09:00
nu774 4c9167c1cb m4af: move internal struct m4af_itmf_entry_t from header 2015-06-12 21:04:49 +09:00
nu774 c77dae004d update ChangeLog 2015-02-14 19:35:05 +09:00
30 changed files with 821 additions and 282 deletions

109
.github/workflows/ci.yml vendored Normal file
View File

@ -0,0 +1,109 @@
name: CI
on: [push, pull_request]
jobs:
linux:
strategy:
matrix:
version: [20.04, 22.04]
runs-on: ubuntu-${{ matrix.version }}
steps:
- name: Install libfdk-aac
run: |
sudo apt install libfdk-aac-dev
- name: Checkout sources
uses: actions/checkout@v3
- name: Build
run: |
autoreconf -fiv
./configure
make -j2
sudo make install
- name: Test
run: |
fdkaac -b 128 -R -o /dev/null /dev/null
mingw-cross:
strategy:
matrix:
arch: [i686, x86_64]
include:
- arch: i686
os: mingw32
- arch: x86_64
os: mingw64
runs-on: ubuntu-latest
steps:
- name: Install cross compiler
run: |
ARCH=${{ matrix.arch }}
sudo apt-get install g++-mingw-w64-${ARCH//_/-}
- name: Install libfdk-aac binary from repo.msys.org
run: |
wget https://repo.msys2.org/mingw/${{ matrix.os }}/${{ matrix.os }}.db.tar.zst
DESCFILE=$(tar xvf ${{ matrix.os }}.db.tar.zst --wildcards '*-fdk-aac*/desc')
PKGFILE=$(sed -n '/%FILENAME%/{n;p;q}' $DESCFILE)
wget https://repo.msys2.org/mingw/${{ matrix.os }}/${PKGFILE}
sudo tar xvf ${PKGFILE} -C /usr/${{ matrix.arch }}-w64-mingw32 --strip-component=1
- name: Checkout
uses: actions/checkout@v3
- name: Build
run: |
autoreconf -fiv
PKG_CONFIG_LIBDIR=/usr/${{ matrix.arch }}-w64-mingw32/lib/pkgconfig ./configure --host=${{ matrix.arch }}-w64-mingw32 --prefix=/usr/${{ matrix.arch }}-w64-mingw32
make -j2
sudo make install
macos:
runs-on: macos-latest
steps:
- name: Install dependencies
run: |
brew install autoconf automake libtool pkg-config
brew install fdk-aac
- name: Checkout sources
uses: actions/checkout@v3
- name: Build
run: |
autoreconf -fiv
./configure
make -j3
sudo make install
- name: Test
run: |
fdkaac -b 128 -R -o /dev/null /dev/null
msys2:
runs-on: windows-latest
strategy:
matrix:
sys: [ clang32, clang64, mingw32, mingw64, ucrt64 ]
defaults:
run:
shell: msys2 {0}
steps:
- name: Setup msys2
uses: msys2/setup-msys2@v2
with:
msystem: ${{ matrix.sys }}
update: true
install: git
pacboy: >-
autoconf:
automake:
libtool:
make:
cc:p
pkg-config:p
fdk-aac:p
- name: Checkout
uses: actions/checkout@v3
- name: Build
run: |
autoreconf -fiv
./configure
make -j2
make install
- name: Test
run: |
fdkaac -b 128 -R -o /dev/null /dev/null

8
.gitignore vendored
View File

@ -20,3 +20,11 @@ src/.deps/
src/.dirstamp
stamp-h1
fdkaac
.vscode
fdk-aac
MSVC/Release
MSVC/Debug
MSVC/x64/Release
MSVC/x64/Debug
MSVC/fdk-aac
MSVC/*.vcxproj.user

132
ChangeLog
View File

@ -1,6 +1,134 @@
2022-08-04 nu774 <honeycomb77@gmail.com>
* bump [HEAD -> master]
* fdk-aac.vcxproj: support vs2022
* extrapolater: don't return more samples than required
* wav/caf parser: add format checks
2022-07-13 nu774 <honeycomb77@gmail.com>
* update ChangeLog [origin/master]
* bump [v1.0.3]
* wav/caf parser: ensure fmt/desc chunk
2021-11-15 nu774 <honeycomb77@gmail.com>
* vcxproj: support Visual Studio 2022
2021-04-23 nu774 <honeycomb77@gmail.com>
* bump [v1.0.2]
* m4af: fix mvhd/tkhd duration
2020-09-21 nu774 <honeycomb77@gmail.com>
* bump [v1.0.1]
* add Windows 10 long pathname manifest
2019-09-27 nu774 <honeycomb77@gmail.com>
* fix indent
2019-09-19 Dima <yudind@gmail.com>
* process 32-bit input if possible (i.e. respect aac:INT_PCM type)
2019-04-04 nu774 <honeycomb77@gmail.com>
* vcxproj: support visual studio 2019
2018-12-10 tico-tico <sergei.ivn@gmx.com>
* don't inject timestamp
2018-09-04 nu774 <honeycomb77@gmail.com>
* bump version 1.0.0 [1.0.0]
* Fix LD/ELD issue: priming samples are too short to be discarded
2018-09-03 nu774 <honeycomb77@gmail.com>
* FDKv2 API change: encoderDelay -> nDelay/nDelayCore
* update MSVC projects for FDKv2
* use different IntDir for fdk-aac build
* remove zombies from fdk-aac.vcxproj.filters
* fix: -L option was not working (resulted in segfault)
2017-03-16 nu774 <honeycomb77@gmail.com>
* MSVC projects: update for VS2017
2017-01-16 nu774 <honeycomb77@gmail.com>
* address issue#26
2016-08-27 nu774 <honeycomb77@gmail.com>
* remove aacenc_hcr.* from MSVC project
2016-08-26 nu774 <honeycomb77@gmail.com>
* update ChangeLog
* bump [v0.6.3]
* 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 +138,7 @@
2014-08-17 nu774 <honeycomb77@gmail.com>
* update INSTALL [origin/master]
* update INSTALL
* add m4 macros

View File

@ -1,83 +1,81 @@
<?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)' == '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>
<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 +95,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 +114,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 +129,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 +156,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" />

View File

@ -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>

View File

@ -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

View File

@ -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" />

View File

@ -22,8 +22,13 @@ fdkaac_SOURCES = \
dist_man_MANS = man/fdkaac.1
fdkaac_CFLAGS = @CFLAGS@ @FDK_AAC_CFLAGS@
fdkaac_LDADD = \
@LIBICONV@ -lfdk-aac -lm
@LIBICONV@ @CHARSET_LIB@ @FDK_AAC_LIBS@ -lm
.rc.o:
$(RC) $< -o $@
if FDK_PLATFORM_POSIX
fdkaac_SOURCES += \
@ -33,6 +38,7 @@ endif
if FDK_PLATFORM_WIN32
fdkaac_SOURCES += \
src/compat_win32.c
fdkaac_SOURCES += fdkaac.rc
endif
if FDK_NO_GETOPT_LONG

9
README
View File

@ -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)

View File

@ -6,16 +6,17 @@ changequote([,])dnl
AC_INIT([fdkaac], [XX_VERSION], [honeycomb77@gmail.com])
AC_CONFIG_HEADERS([config.h])
AC_CONFIG_MACRO_DIR([m4])
AC_CONFIG_AUX_DIR([.])
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([fdk-aac/aacenc_lib.h], ,
AC_MSG_ERROR([libfdk-aac is required]))
AC_CHECK_HEADERS([libcharset.h langinfo.h endian.h byteswap.h])
PKG_CHECK_MODULES([FDK_AAC],[fdk-aac])
AC_C_INLINE
AC_C_BIGENDIAN
@ -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
View 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
View File

@ -0,0 +1,3 @@
#include <winresrc.h>
CREATEPROCESS_MANIFEST_RESOURCE_ID RT_MANIFEST "fdkaac.manifest"

View File

@ -1,4 +1,4 @@
#!/usr/bin/env python
#!/usr/bin/env python3
# Copyright (C) 2013 nu774
# For conditions of distribution and use, see copyright notice in COPYING
@ -39,6 +39,6 @@ with Popen(GITLOG_CMD, shell=False, stdout=PIPE).stdout as pipe:
commits = parse_gitlog(pipe)
commits_by_date_author = groupby(commits, key=lambda x: (x.date, x.author))
for (date, author), commits in commits_by_date_author:
output(u'{0} {1}\n\n'.format(date, author).encode('utf-8'))
output(f'{date} {author}\n\n')
for c in commits:
output(u' * {0}{1}\n\n'.format(c.subject, c.ref).encode('utf-8'))
output(f' * {c.subject}{c.ref}\n\n')

View File

@ -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>

View File

@ -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;

View File

@ -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

View File

@ -75,8 +75,10 @@ int caf_desc(caf_reader_t *reader, int64_t chunk_size)
ENSURE(mFormatID == M4AF_FOURCC('l','p','c','m'));
ENSURE(mSampleRate && mBytesPerPacket &&
mChannelsPerFrame >= 1 && mChannelsPerFrame <= 8 &&
mBitsPerChannel && mFramesPerPacket == 1 &&
mBitsPerChannel > 0 && mBitsPerChannel < 256 &&
mFramesPerPacket == 1 &&
mBytesPerPacket % mChannelsPerFrame == 0 &&
mBytesPerPacket < 256 &&
mBytesPerPacket >= mChannelsPerFrame * ((mBitsPerChannel + 7) / 8));
desc->sample_rate = mSampleRate;
@ -103,10 +105,14 @@ int caf_info(caf_reader_t *reader, int64_t chunk_size)
{
char *buf, *key, *val, *end;
size_t len;
int n;
if (chunk_size < 4 || (buf = malloc(chunk_size)) == 0)
if (chunk_size < 4 || (buf = malloc(chunk_size+1)) == 0)
return -1;
pcm_read(&reader->io, buf, chunk_size);
n = pcm_read(&reader->io, buf, chunk_size);
if (n != chunk_size)
return -1;
buf[n] = 0;
key = buf + 4;
end = buf + chunk_size;
do {
@ -172,6 +178,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 +188,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 +207,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;

View File

@ -207,7 +207,6 @@ enum
kAudioChannelLayoutTag_AudioUnit_5_0 = kAudioChannelLayoutTag_MPEG_5_0_B, // L R Ls Rs C
kAudioChannelLayoutTag_AudioUnit_6_0 = (139L<<16) | 6, // L R Ls Rs C Cs
kAudioChannelLayoutTag_AudioUnit_7_0 = (140L<<16) | 7, // L R Ls Rs C Rls Rrs
kAudioChannelLayoutTag_AudioUnit_7_0_Front = (148L<<16) | 7, // L R Ls Rs C Lc Rc
kAudioChannelLayoutTag_AudioUnit_5_1 = kAudioChannelLayoutTag_MPEG_5_1_A, // L R C LFE Ls Rs
kAudioChannelLayoutTag_AudioUnit_6_1 = kAudioChannelLayoutTag_MPEG_6_1_A, // L R C LFE Ls Rs Cs
kAudioChannelLayoutTag_AudioUnit_7_1 = kAudioChannelLayoutTag_MPEG_7_1_C, // L R C LFE Ls Rs Rls Rrs
@ -227,6 +226,10 @@ enum
kAudioChannelLayoutTag_TMH_10_2_std = (145L<<16) | 16, // L R C Vhc Lsd Rsd Ls Rs Vhl Vhr Lw Rw Csd Cs LFE1 LFE2
kAudioChannelLayoutTag_TMH_10_2_full = (146L<<16) | 21, // TMH_10_2_std plus: Lc Rc HI VI Haptic
kAudioChannelLayoutTag_DiscreteInOrder = (147L<<16) | 0, // needs to be ORed with the actual number of channels
kAudioChannelLayoutTag_AudioUnit_7_0_Front = (148L<<16) | 7, // L R Ls Rs C Lc Rc
kAudioChannelLayoutTag_AC3_1_0_1 = (149L<<16) | 2, // C LFE
kAudioChannelLayoutTag_AC3_3_0 = (150L<<16) | 3, // L C R
kAudioChannelLayoutTag_AC3_3_1 = (151L<<16) | 4, // L C R Cs
@ -234,7 +237,53 @@ enum
kAudioChannelLayoutTag_AC3_2_1_1 = (153L<<16) | 4, // L R Cs LFE
kAudioChannelLayoutTag_AC3_3_1_1 = (154L<<16) | 5, // L C R Cs LFE
kAudioChannelLayoutTag_DiscreteInOrder = (147L<<16) | 0, // needs to be ORed with the actual number of channels
kAudioChannelLayoutTag_EAC_6_0_A = (155<<16) | 6, // L C R Ls Rs Cs
kAudioChannelLayoutTag_EAC_7_0_A = (156<<16) | 7, // L C R Ls Rs Rls Rrs
kAudioChannelLayoutTag_EAC3_6_1_A = (157<<16) | 7, // L C R Ls Rs LFE Cs
kAudioChannelLayoutTag_EAC3_6_1_B = (158<<16) | 7, // L C R Ls Rs LFE Ts
kAudioChannelLayoutTag_EAC3_6_1_C = (159<<16) | 7, // L C R Ls Rs LFE Vhc
kAudioChannelLayoutTag_EAC3_7_1_A = (160<<16) | 8, // L C R Ls Rs LFE Rls Rrs
kAudioChannelLayoutTag_EAC3_7_1_B = (161<<16) | 8, // L C R Ls Rs LFE Lc Rc
kAudioChannelLayoutTag_EAC3_7_1_C = (162<<16) | 8, // L C R Ls Rs LFE Lsd Rsd
kAudioChannelLayoutTag_EAC3_7_1_D = (163<<16) | 8, // L C R Ls Rs LFE Lw Rw
kAudioChannelLayoutTag_EAC3_7_1_E = (164<<16) | 8, // L C R Ls Rs LFE Vhl Vhr
kAudioChannelLayoutTag_EAC3_7_1_F = (165<<16) | 8, // L C R Ls Rs LFE Cs Ts
kAudioChannelLayoutTag_EAC3_7_1_G = (166<<16) | 8, // L C R Ls Rs LFE Cs Vhc
kAudioChannelLayoutTag_EAC3_7_1_H = (167<<16) | 8, // L C R Ls Rs LFE Ts Vhc
kAudioChannelLayoutTag_DTS_3_1 = (168<<16) | 4, // C L R LFE
kAudioChannelLayoutTag_DTS_4_1 = (169<<16) | 5, // C L R Cs LFE
kAudioChannelLayoutTag_DTS_6_0_A = (170<<16) | 6, // Lc Rc L R Ls Rs
kAudioChannelLayoutTag_DTS_6_0_B = (171<<16) | 6, // C L R Rls Rrs Ts
kAudioChannelLayoutTag_DTS_6_0_C = (172<<16) | 6, // C Cs L R Rls Rrs
kAudioChannelLayoutTag_DTS_6_1_A = (173<<16) | 7, // Lc Rc L R Ls Rs LFE
kAudioChannelLayoutTag_DTS_6_1_B = (174<<16) | 7, // C L R Rls Rrs Ts LFE
kAudioChannelLayoutTag_DTS_6_1_C = (175<<16) | 7, // C Cs L R Rls Rrs LFE
kAudioChannelLayoutTag_DTS_7_0 = (176<<16) | 7, // Lc C Rc L R Ls Rs
kAudioChannelLayoutTag_DTS_7_1 = (177<<16) | 8, // Lc C Rc L R Ls Rs LFE
kAudioChannelLayoutTag_DTS_8_0_A = (178<<16) | 8, // Lc Rc L R Ls Rs Rls Rrs
kAudioChannelLayoutTag_DTS_8_0_B = (179<<16) | 8, // Lc C Rc L R Ls Cs Rs
kAudioChannelLayoutTag_DTS_8_1_A = (180<<16) | 9, // Lc Rc L R Ls Rs Rls Rrs LFE
kAudioChannelLayoutTag_DTS_8_1_B = (181<<16) | 9, // Lc C Rc L R Ls Cs Rs LFE
kAudioChannelLayoutTag_DTS_6_1_D = (182<<16) | 7, // C L R Ls Rs LFE Cs
kAudioChannelLayoutTag_AAC_7_1_B = (183<<16) | 8, // C L R Ls Rs Rls Rrs LFE
kAudioChannelLayoutTag_AAC_7_1_C = (184<<16) | 8, // C L R Ls Rs LFE Vhl Vhr
kAudioChannelLayoutTag_WAVE_4_0_B = (185<<16) | 4, // L R Rls Rrs
kAudioChannelLayoutTag_WAVE_5_0_B = (186<<16) | 5, // L R C Rls Rrs
kAudioChannelLayoutTag_WAVE_5_1_B = (187<<16) | 6, // L R C LFE Rls Rrs
kAudioChannelLayoutTag_WAVE_6_1 = (188<<16) | 7, // L R C LFE Cs Ls Rs
kAudioChannelLayoutTag_WAVE_7_1 = (189<<16) | 8, // L R C LFE Rls Rrs Ls Rs
kAudioChannelLayoutTag_Logic_4_0_C = (197U<<16) | 4, // L R Cs C
kAudioChannelLayoutTag_Logic_6_0_B = (198U<<16) | 6, // L R Ls Rs Cs C
kAudioChannelLayoutTag_Logic_6_1_B = (199U<<16) | 7, // L R Ls Rs Cs C LFE
kAudioChannelLayoutTag_Logic_6_1_D = (200U<<16) | 7, // L C R Ls Cs Rs LFE
kAudioChannelLayoutTag_Logic_7_1_B = (201U<<16) | 8, // L R Ls Rs Rls Rrs C LFE
kAudioChannelLayoutTag_Unknown = 0xFFFF0000 // needs to be ORed with the actual number of channels
};

View File

@ -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

View File

@ -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)

View File

@ -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);

View File

@ -144,17 +144,22 @@ static int process1(extrapolater_t *self, void *buffer, unsigned nframes)
assert(bp->count <= nframes);
memcpy(buffer, bp->data, bp->count * sfmt->bytes_per_frame);
if (!fetch(self, nframes)) {
// got EOF
buffer_t *bbp = &self->buffer[self->nbuffer];
if (bp->count < 2 * LPC_ORDER) {
// final frame is too short, so we join with the pre-final frame
size_t total = bp->count + bbp->count;
if (bbp->count &&
realloc_buffer(bbp, total * sfmt->bytes_per_frame) == 0 &&
realloc_buffer(bp, total * sfmt->bytes_per_frame) == 0)
{
memcpy(bbp->data + bbp->count * sfmt->channels_per_frame,
bp->data, bp->count * sfmt->bytes_per_frame);
memcpy(bp->data, bbp->data, total * sfmt->bytes_per_frame);
bp->count = total;
bp->data,
bp->count * sfmt->bytes_per_frame);
memcpy(bp->data,
bbp->data + bp->count * sfmt->channels_per_frame,
bbp->count * sfmt->bytes_per_frame);
bp->count = bbp->count;
}
}
if (bp->count >= 2 * LPC_ORDER)

View File

@ -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;

View File

@ -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);

View File

@ -117,17 +117,13 @@ 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"
" 1-5: VBR\n"
" (VBR mode is not officially supported, and\n"
" works only on a certain combination of\n"
" parameter settings, sample rate, and\n"
" channel configuration)\n"
" (VBR mode 1 is tuned for HE-AAC v2\n"
" VBR mode 2 is tuned for HE-AAC\n"
" VBR mode 3 or greater is for AAC LC)\n"
" -w, --bandwidth <n> Frequency bandwidth in Hz (AAC LC only)\n"
" -a, --afterburner <n> Afterburner\n"
" 0: Off\n"
@ -162,6 +158,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 +221,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 +246,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 +286,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 +460,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 +510,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 +529,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 +557,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 +566,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 +709,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 +716,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 +765,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 +810,14 @@ int main(int argc, char **argv)
params.sbr_ratio = 2;
}
scale_shift = aacenc_is_dual_rate_sbr((aacenc_param_t*)&params);
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*)&params, sample_format,
&aacinfo) < 0)
goto END;
@ -831,39 +840,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*)&params, 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(&params, 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, &params, encoder) < 0)

View File

@ -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);

View File

@ -60,6 +60,8 @@ int pcm_skip(pcm_io_context_t *io, int64_t count)
if (count == 0 || pcm_seek(io, count, SEEK_CUR) >= 0)
return 0;
if (count < 0)
return -1;
do {
if ((rc = vp->read(io->cookie, buff, count > 8192 ? 8192 : count)) > 0)
count -= rc;
@ -293,6 +295,10 @@ int apple_chan_chunk(pcm_io_context_t *io, uint32_t chunk_size,
layout = "\x03\x01\x02\x09"; break;
case kAudioChannelLayoutTag_AC3_3_1:
layout = "\x01\x03\x02\x09"; break;
case kAudioChannelLayoutTag_WAVE_4_0_B:
layout = "\x01\x02\x05\x06"; break;
case kAudioChannelLayoutTag_Logic_4_0_C:
layout = "\x01\x02\x09\x03"; break;
/* 4.1ch */
case kAudioChannelLayoutTag_DVD_6:
layout = "\x01\x02\x04\x0A\x0B"; break;
@ -302,6 +308,8 @@ int apple_chan_chunk(pcm_io_context_t *io, uint32_t chunk_size,
layout = "\x01\x02\x03\x04\x09"; break;
case kAudioChannelLayoutTag_AC3_3_1_1:
layout = "\x01\x03\x02\x09\x04"; break;
case kAudioChannelLayoutTag_DTS_4_1:
layout = "\x03\x01\x02\x09\x04"; break;
/* 5ch */
case kAudioChannelLayoutTag_MPEG_5_0_A:
layout = "\x01\x02\x03\x0A\x0B"; break;
@ -312,6 +320,8 @@ int apple_chan_chunk(pcm_io_context_t *io, uint32_t chunk_size,
layout = "\x01\x03\x02\x0A\x0B"; break;
case kAudioChannelLayoutTag_MPEG_5_0_D:
layout = "\x03\x01\x02\x0A\x0B"; break;
case kAudioChannelLayoutTag_WAVE_5_0_B:
layout = "\x01\x02\x03\x05\x06"; break;
/* 5.1ch */
case kAudioChannelLayoutTag_MPEG_5_1_A:
layout = "\x01\x02\x03\x04\x0A\x0B"; break;
@ -321,17 +331,49 @@ int apple_chan_chunk(pcm_io_context_t *io, uint32_t chunk_size,
layout = "\x01\x03\x02\x0A\x0B\x04"; break;
case kAudioChannelLayoutTag_MPEG_5_1_D:
layout = "\x03\x01\x02\x0A\x0B\x04"; break;
case kAudioChannelLayoutTag_WAVE_5_1_B:
layout = "\x01\x02\x03\x04\x05\x06"; break;
/* 6ch */
case kAudioChannelLayoutTag_Hexagonal:
case kAudioChannelLayoutTag_AudioUnit_6_0:
layout = "\x01\x02\x0A\x0B\x03\x09"; break;
case kAudioChannelLayoutTag_AAC_6_0:
layout = "\x03\x01\x02\x0A\x0B\x09"; break;
case kAudioChannelLayoutTag_EAC_6_0_A:
layout = "\x01\x03\x02\x0A\x0B\x09"; break;
case kAudioChannelLayoutTag_DTS_6_0_A:
layout = "\x07\x08\x01\x02\x0A\x0B"; break;
case kAudioChannelLayoutTag_DTS_6_0_B:
layout = "\x03\x01\x02\x05\x06\x0C"; break;
case kAudioChannelLayoutTag_DTS_6_0_C:
layout = "\x03\x09\x01\x02\x05\x06"; break;
case kAudioChannelLayoutTag_Logic_6_0_B:
layout = "\x01\x02\x0A\x0B\x09\x03"; break;
/* 6.1ch */
case kAudioChannelLayoutTag_MPEG_6_1_A:
layout = "\x01\x02\x03\x04\x0A\x0B\x09"; break;
case kAudioChannelLayoutTag_AAC_6_1:
layout = "\x03\x01\x02\x0A\x0B\x09\x04"; break;
case kAudioChannelLayoutTag_EAC3_6_1_A:
layout = "\x01\x03\x02\x0A\x0B\x04\x09"; break;
case kAudioChannelLayoutTag_EAC3_6_1_B:
layout = "\x01\x03\x02\x0A\x0B\x04\x0C"; break;
case kAudioChannelLayoutTag_EAC3_6_1_C:
layout = "\x01\x03\x02\x0A\x0B\x04\x0E"; break;
case kAudioChannelLayoutTag_DTS_6_1_A:
layout = "\x07\x08\x01\x02\x0A\x0B\x04"; break;
case kAudioChannelLayoutTag_DTS_6_1_B:
layout = "\x03\x01\x02\x05\x06\x0C\x04"; break;
case kAudioChannelLayoutTag_DTS_6_1_C:
layout = "\x03\x09\x01\x02\x05\x06\x04"; break;
case kAudioChannelLayoutTag_DTS_6_1_D:
layout = "\x03\x01\x02\x0A\x0B\x04\x09"; break;
case kAudioChannelLayoutTag_WAVE_6_1:
layout = "\x01\x02\x03\x04\x09\x0A\x0B"; break;
case kAudioChannelLayoutTag_Logic_6_1_B:
layout = "\x01\x02\x0A\x0B\x09\x03\x04"; break;
case kAudioChannelLayoutTag_Logic_6_1_D:
layout = "\x01\x03\x02\x0A\x09\x0B\x04"; break;
/* 7ch */
case kAudioChannelLayoutTag_AudioUnit_7_0:
layout = "\x01\x02\x0A\x0B\x03\x05\x06"; break;
@ -339,6 +381,10 @@ int apple_chan_chunk(pcm_io_context_t *io, uint32_t chunk_size,
layout = "\x01\x02\x0A\x0B\x03\x07\x08"; break;
case kAudioChannelLayoutTag_AAC_7_0:
layout = "\x03\x01\x02\x0A\x0B\x05\x06"; break;
case kAudioChannelLayoutTag_EAC_7_0_A:
layout = "\x01\x03\x02\x0A\x0B\x05\x06"; break;
case kAudioChannelLayoutTag_DTS_7_0:
layout = "\x07\x03\x08\x01\x02\x0A\x0B"; break;
/* 7.1ch */
case kAudioChannelLayoutTag_MPEG_7_1_A:
layout = "\x01\x02\x03\x04\x0A\x0B\x07\x08"; break;
@ -348,11 +394,37 @@ int apple_chan_chunk(pcm_io_context_t *io, uint32_t chunk_size,
layout = "\x01\x02\x03\x04\x0A\x0B\x05\x06"; break;
case kAudioChannelLayoutTag_Emagic_Default_7_1:
layout = "\x01\x02\x0A\x0B\x03\x04\x07\x08"; break;
case kAudioChannelLayoutTag_AAC_7_1_B:
layout = "\x03\x01\x02\x0A\x0B\x05\x06\x04"; break;
case kAudioChannelLayoutTag_AAC_7_1_C:
layout = "\x03\x01\x02\x0A\x0B\x04\x0D\x0F"; break;
case kAudioChannelLayoutTag_EAC3_7_1_A:
layout = "\x01\x03\x02\x0A\x0B\x04\x05\x06"; break;
case kAudioChannelLayoutTag_EAC3_7_1_B:
layout = "\x01\x03\x02\x0A\x0B\x04\x07\x08"; break;
case kAudioChannelLayoutTag_EAC3_7_1_E:
layout = "\x01\x03\x02\x0A\x0B\x04\x0D\x0F"; break;
case kAudioChannelLayoutTag_EAC3_7_1_F:
layout = "\x01\x03\x02\x0A\x0B\x04\x09\x0C"; break;
case kAudioChannelLayoutTag_EAC3_7_1_G:
layout = "\x01\x03\x02\x0A\x0B\x04\x09\x0E"; break;
case kAudioChannelLayoutTag_EAC3_7_1_H:
layout = "\x01\x03\x02\x0A\x0B\x04\x0C\x0E"; break;
case kAudioChannelLayoutTag_DTS_7_1:
layout = "\x07\x03\x08\x01\x02\x0A\x0B\x04"; break;
case kAudioChannelLayoutTag_WAVE_7_1:
layout = "\x01\x02\x03\x04\x05\x06\x0A\x0B"; break;
case kAudioChannelLayoutTag_Logic_7_1_B:
layout = "\x01\x02\x0A\x0B\x05\x06\x03\x04"; break;
/* 8ch */
case kAudioChannelLayoutTag_Octagonal:
layout = "\x01\x02\x05\x06\x03\x09\x0A\x0B"; break;
case kAudioChannelLayoutTag_AAC_Octagonal:
layout = "\x03\x01\x02\x0A\x0B\x05\x06\x09"; break;
case kAudioChannelLayoutTag_DTS_8_0_A:
layout = "\x07\x08\x01\x02\x0A\x0B\x05\x06"; break;
case kAudioChannelLayoutTag_DTS_8_0_B:
layout = "\x07\x03\x08\x01\x02\x0A\x09\x0B"; break;
default:
goto FAIL;
}

View File

@ -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;
}

View File

@ -113,8 +113,10 @@ int wav_fmt(wav_reader_t *reader, uint32_t size)
wValidBitsPerSample = wBitsPerSample;
ENSURE(wFormatTag == 1 || wFormatTag == 3 || wFormatTag == 0xfffe);
ENSURE(nChannels && nSamplesPerSec && nAvgBytesPerSec &&
nBlockAlign && wBitsPerSample && !(wBitsPerSample & 7) &&
ENSURE(nChannels > 0 && nChannels <= 8 &&
nSamplesPerSec && nAvgBytesPerSec &&
nBlockAlign && nBlockAlign < 256 &&
wBitsPerSample && wBitsPerSample < 256 && !(wBitsPerSample & 7) &&
nBlockAlign == nChannels * wBitsPerSample / 8);
if (wFormatTag == 3)
@ -155,6 +157,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 +170,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 +182,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;
}

View File

@ -1,4 +1,4 @@
#ifndef VERSION_H
#define VERSION_H
const char *fdkaac_version = "0.6.2";
const char *fdkaac_version = "1.0.6";
#endif