initial commit from tarball

This commit is contained in:
Adam Peter Burns 2021-07-04 10:00:20 +02:00
commit ad5143f78d
41 changed files with 5859 additions and 0 deletions

5
AUTHORS Normal file
View File

@ -0,0 +1,5 @@
Reference implementation: 3GPP TS 26.410 V8.0.0
Wrapper and library code: Stanislav Brabec <utx@penguin.cz>,
Adopted for aac+: Sergiy Guriev <piratfm@ua.fm>,
Encoder code: Matteo Croce
Patches and fixes: Rafael Diniz, Edwin van den Oetelaar

5
COPYING Normal file
View File

@ -0,0 +1,5 @@
The 3GPP TS 26.410 V8.0.0 reference code has a commercial license.
To use package compiled by this code, you may need a license from 3GPP.
The wrapper code is released under GNU Library General Public License.

31
ChangeLog Normal file
View File

@ -0,0 +1,31 @@
2010-11-10 Sergiy Guriev <piratfm@ua.fm>
* Added AOT_SBR as extra object type to codec config (now ffplay works fine).
2010-11-04 Sergiy Guriev <piratfm@ua.fm>
* Fixed aac config creation.
* Add floating point samples as supported input format.
* Decreased export symbols
2010-10-12 Sergiy Guriev <piratfm@ua.fm>
* New API, incompatible with older libs.
* Removed static data, supported multiple instances in one application.
2010-10-04 Sergiy Guriev <piratfm@ua.fm>
* fix 64 bit support for SBR+PS encoding.
2009-08-10 Sergiy Guriev <piratfm@ua.fm>
* update to 8.0.0 core
2009-03-22 Sergiy Guriev <piratfm@ua.fm>
* added pkg-config file
2008-11-06 Rafael Diniz
* small namespaces changes (not colide w/ faad ones)
2008-11-06 Sergiy Guriev <piratfm@ua.fm>
* Autogen added.
* _FFTW3 define is not needed any more.
* adts code moved to c-file (based on faac)
2008-11-04 Sergiy Guriev <piratfm@ua.fm>
* New package.

13
Makefile.am Normal file
View File

@ -0,0 +1,13 @@
SUBDIRS = src include patches frontend
if HAVE_PKGCONFIG
pkgconfigdir = $(libdir)/pkgconfig
pkgconfig_DATA = aacplus.pc
else
bin_SCRIPTS = aacplus-config
endif
EXTRA_DIST = autogen.sh aacplus.pc aacplus.spec
ACLOCAL_AMFLAGS = -I m4

36
NEWS Normal file
View File

@ -0,0 +1,36 @@
News in version 1.0.0
=====================
* Repackaged sources from 3GPP.
* Build as shared library.
News in version 1.0.2
=====================
* Compatible with FAAC
News in version 1.0.3
=====================
* Compatible with ffmpeg
* package-config files added
News in version 1.0.4
=====================
* implemented buffer_fullness bits in ADTS header
News in version 1.0.5
=====================
* update to 8.0.0 core
News in version 1.1.0
=====================
* 64bit systems now supports SBR+PS
News in version 2.0.0
=====================
* New API, incompatible with older libs.
* Removed static data, supported multiple instances in one application.
News in version 2.0.1
=====================
* Fixed aac config creation.
* Add floating point samples as supported input format.
* Decreased export symbols

58
README Normal file
View File

@ -0,0 +1,58 @@
3GPP AAC+ High Efficiency Advanced Audio Codec v2 (HE-AAC+) Encoder Shared Library
3GPP released reference implementation of 3GPP AAC Advanced Audio -
(HE-AAC+) Encoder (3GPP TS 26.410 V8.0.0).
http://www.3gpp.org/ftp/Specs/html-info/26410.htm
Reference implementation is available as a source code, but the code uses
#define to choose code options. In world of GNU-Linux, there is a common
practice to compile such code as a shared library.
Due to restrictive license, the reference implementation is not part of
this package and it is dowloaded from 3GPP during build. If you want to
build this package without network access, you either have to put the
original source code ZIP file to the unpacked wrapper code directory or
you have to use full source core (see below).
This package converts 3GPP TS 26.410 V8.0.0 reference implementation of HE-AAC+
encoder to a shared library. It has exactly the same API, but some calls
are wrapped by macros to call proper variant of the function.
For more see readme.txt and 26410-800.doc, which comes with the original code.
This wrapper fixes some bugs of original code.
I will accept patches for it, if 3GPP will not release fixed implementation.
To use package compiled by this code, you may need a license from 3GPP.
It is possible to distribute these packages in three source forms:
1. As a wrapper-only source (as you can build by "make extradist").
2. As a full source code including 3GPP code (as you can build by "make dist").
3. As a wrapper-only source accompanied by the original zip file.
Package home page: http://217.20.164.161/~tipok/aacplus
For problems with the shared library wrapper or building code please contact
Sergiy Guriev <piratfm@ua.fm>
For problems with the implementation, contact 3GPP.
Technical notes:
The code has only one branch with stereo implementation.
In addition to "make dist", you can also call "make extradist", which
builds distribution package containing LGPL wrapper only.
Known bugs:
- Not known yet
Dependencies:
- fftw3 (can be skipped)
To compile library do:
# ./autogen.sh
# ./configure
# make
# make install

1
TODO Normal file
View File

@ -0,0 +1 @@

255
aacplus-config.in Normal file
View File

@ -0,0 +1,255 @@
! /bin/sh
# aacplus-config library configuration script
# generated by ac_config_libconfig_in.m4
template_version="1.0.0"
package="@PACKAGE@"
# usage instructions if no options given
if test "$#" -eq 0; then
cat <<EOF
Usage: aacplus-config [OPTIONS]
Options:
[--prefix[=DIR]]
[--exec-prefix[=DIR]]
[--package]
[--version]
[--cppflags]
[--cflags-only]
[--cflags]
[--libs]
[--help]
EOF
fi
# parse options
o=""
h=""
for i
do
case $i in
--prefix=*) prefix=`echo $i | sed -e "s/--prefix=//"` ;;
--exec-prefix=*) exec_prefix=`echo $i | sed -e "s/--exec-prefix=//"` ;;
--eprefix=*) exec_prefix=`echo $i | sed -e "s/--eprefix=//"` ;;
--prefix) echo_prefix="yes" ;;
--exec-prefix) echo_exec_prefix="yes" ;;
--eprefix) echo_eprefix="yes" ;;
--package) echo_package="yes" ;;
--version) echo_version="yes" ;;
--cppflags) echo_cppflags="yes" ;;
--cflags-only) echo_cflags_only="yes" ;;
--cflags) echo_cflags="yes" ;;
--libs) echo_libs="yes" ;;
--bindir) echo_bindir="yes" ;;
--sbindir) echo_sbindir="yes" ;;
--libexecdir) echo_libexecdir="yes" ;;
--datadir) echo_datadir="yes" ;;
--sysconfdir) echo_sysconfdir="yes" ;;
--sharedstatedir) echo_sharedstatedir="yes" ;;
--localstatedir) echo_localstatedir="yes" ;;
--libdir) echo_libdir="yes" ;;
--infodir) echo_infodir="yes" ;;
--mandir) echo_mandir="yes" ;;
--target) echo_target="yes" ;;
--host) echo_host="yes" ;;
--build) echo_build="yes" ;;
--pkgdatadir) echo_pkgdatadir="yes" ;;
--pkglibdir) echo_pkglibdir="yes" ;;
--pkgincludedir) echo_pkgincludedir="yes" ;;
--template-version) echo_template_version="yes" ;;
--help) echo_help="yes" ;;
//*|/*//*|./*//*) echo_extra="yes" ;;
*) eval "echo Unknown option: $i" ; exit 1 ;;
esac
done
# defaults from configure; set only if not set previously
if test -z "$prefix" ; then
prefix="@prefix@"
fi
if test -z "$exec_prefix" ; then
exec_prefix="@exec_prefix@"
fi
if test -z "$bindir" ; then
bindir="@bindir@"
fi
if test -z "$sbindir" ; then
sbindir="@sbindir@"
fi
if test -z "$libexecdir" ; then
libexecdir="@libexecdir@"
fi
if test -z "$datadir" ; then
datadir="@datadir@"
fi
if test -z "$sysconfdir" ; then
sysconfdir="@sysconfdir@"
fi
if test -z "$sharedstatedir" ; then
sharedstatedir="@sharedstatedir@"
fi
if test -z "$localstatedir" ; then
localstatedir="@localstatedir@"
fi
if test -z "$libdir" ; then
libdir="@libdir@"
fi
if test -z "$infodir" ; then
infodir="@infodir@"
fi
if test -z "$mandir" ; then
mandir="@mandir@"
fi
if test -z "$includedir" ; then
includedir="@includedir@"
fi
if test -z "$target" ; then
target="@target@"
fi
if test -z "$host" ; then
host="@host@"
fi
if test -z "$build" ; then
build="@build@"
fi
# generate output
if test x$echo_module != xyes ; then
echo_module_aacplus="yes"
fi
if test x$echo_module_aacplus = xyes ; then
cppflags="$cppflags @aacplus_cppflags@"
cflags="$cflags @aacplus_cflags@"
libs="$libs @aacplus_libs@"
version="$version @AACPLUS_VERSION@"
fi
if test x$echo_prefix = xyes ; then
o=" $prefix"
fi
if test x$echo_exec_prefix = xyes ; then
o="$o $exec_prefix"
fi
if test x$echo_eprefix = xyes ; then
o="$o $exec_prefix"
fi
if test x$echo_package = xyes ; then
o=" $package"
fi
if test x$echo_version = xyes ; then
o=" $version"
fi
if test x$echo_cppflags = xyes ; then
o="$o $cppflags"
fi
if test x$echo_cflags_only = xyes ; then
o="$o $cflags"
fi
if test x$echo_cflags = xyes ; then
o="$o $cppflags $cflags"
fi
if test x$echo_libs = xyes ; then
o="$o -L$libdir $libs"
fi
if test x$echo_bindir = xyes ; then
o=" $bindir"
fi
if test x$echo_sbindir = xyes ; then
o=" $sbindir"
fi
if test x$echo_libexecdir = xyes ; then
o=" $libexecdir"
fi
if test x$echo_datadir = xyes ; then
o=" $datadir"
fi
if test x$echo_sysconfdir = xyes ; then
o=" $sysconfdir"
fi
if test x$echo_sharedstatedir = xyes ; then
o=" $sharedstatedir"
fi
if test x$echo_localstatedir = xyes ; then
o=" $localstatedir"
fi
if test x$echo_libdir = xyes ; then
o=" $libdir"
fi
if test x$echo_infodir = xyes ; then
o=" $infodir"
fi
if test x$echo_mandir = xyes ; then
o=" $mandir"
fi
if test x$echo_target = xyes ; then
o=" $target"
fi
if test x$echo_host = xyes ; then
o=" $host"
fi
if test x$echo_build = xyes ; then
o=" $build"
fi
if test x$echo_pkgdatadir = xyes ; then
o=" ${datadir}/${package}"
fi
if test x$echo_pkglibdir = xyes ; then
o=" ${libdir}/${package}"
fi
if test x$echo_pkgincludedir = xyes ; then
o=" ${includedir}/${package}"
fi
if test x$echo_template_version = xyes ; then
o="$o $template_version"
fi
if test x$echo_help = xyes ; then
h="1"
fi
if test x$echo_extra = xyes ; then
v=`echo $i | sed -e s://:\$:g`
v=`eval "echo $v"`
o="$o $v"
fi
# output data
o=`eval "echo $o"`
o=`eval "echo $o"`
if test -n "$o" ; then
eval "echo $o"
fi
# help text
if test ! -z "$h" ; then
cat <<EOF
All available options:
--prefix=DIR and change \$prefix and \$exec-prefix
--exec-prefix=DIR (affects all other options)
--prefix \$prefix $prefix
--exec_prefix or...
--eprefix \$exec_prefix $exec_prefix
--version \$version $version
--cppflags C preprocessor flags
--cflags-only C compiler flags
--cflags C preprocessor and compiler flags
--libs -L\$libdir \$LIBS $libs
--package \$package $package
--bindir \$bindir $bindir
--sbindir \$sbindir $sbindir
--libexecdir \$libexecdir $libexecdir
--datadir \$datadir $datadir
--sysconfdir \$sysconfdir $sysconfdir
--sharedstatedir \$sharedstatedir$sharedstatedir
--localstatedir \$localstatedir $localstatedir
--libdir \$libdir $libdir
--infodir \$infodir $infodir
--mandir \$mandir $mandir
--target \$target $target
--host \$host $host
--build \$build $build
--pkgdatadir \$datadir/\$package ${datadir}/${package}
--pkglibdir \$libdir/\$package ${libdir}/${package}
--pkgincludedir \$includedir/\$package ${includedir}/${package}
--template-version \$template_version $template_version
--help
EOF
fi

15
aacplus.pc.in Normal file
View File

@ -0,0 +1,15 @@
prefix=@prefix@
exec_prefix=@exec_prefix@
libdir=@libdir@
includedir=@includedir@/aacplus
toolsdir=${exec_prefix}/bin
cppflags=@AACPLUS_CPPFLAGS@
cflags_only=@AACPLUS_CFLAGS@
Name: aacplus
Description: AAC+ encoder library
Requires: @AACPLUS_REQUIRES@
Version: @VERSION@
Libs: @AACPLUS_LIBS@
Cflags: -I${includedir} @AACPLUS_CFLAGS@

59
aacplus.spec.in Normal file
View File

@ -0,0 +1,59 @@
Name: libaacplus
Version: @VERSION@
Release: 0
URL: http://217.20.164.161/~tipok/aacplus
Group: System/Libraries
License: Commercial
Summary: High Efficiency Advanced Audio Codec v2 (HE-AAC+)
Source: http://217.20.164.161/~tipok/aacplus/%{name}-%{version}.tar.gz
Autoreqprov: on
BuildRoot: %{_tmppath}/%{name}-%{version}-build
%description
High Efficiency Advanced Audio Codec v2 (he-aac+) encoder library.
(3GPP TS 26.410 V8.0.0)
http://www.3gpp.org/ftp/Specs/html-info/26410.htm
%package devel
Group: System/Libraries
Summary: High Efficiency Advanced Audio Codec v2
Requires: %{name} = %{version} glibc-devel
%description devel
High Efficiency Advanced Audio Codec v2 (he-aac+) encoder library.
(3GPP TS 26.410 V8.0.0)
http://www.3gpp.org/ftp/Specs/html-info/26410.htm
%prep
%setup -q
%build
%configure
make %{?jobs:-j %jobs}
#make distcheck
%install
%makeinstall
%clean
rm -rf $RPM_BUILD_ROOT
%post
%run_ldconfig
%postun
%run_ldconfig
%files
%defattr (-, root, root)
%doc AUTHORS ChangeLog COPYING NEWS README TODO
%{_bindir}/*
%{_libdir}/*.so.*
%files devel
%defattr (-, root, root)
%{_includedir}/aacplus.h
%{_libdir}/*.so
%{_libdir}/*.*a

69
autogen.sh Executable file
View File

@ -0,0 +1,69 @@
#!/bin/sh
# Run this to set up the build system: configure, makefiles, etc.
# (based on the version in enlightenment's cvs)
package="libaacplus"
srcdir=`dirname $0`
test -z "$srcdir" && srcdir=.
cd "$srcdir"
DIE=0
(autoheader --version) < /dev/null > /dev/null 2>&1 || {
echo
echo "You must have autoconf installed to compile $package."
echo "Download the appropriate package for your distribution,"
echo "or get the source tarball at ftp://ftp.gnu.org/pub/gnu/"
DIE=1
}
(autoreconf --version) < /dev/null > /dev/null 2>&1 || {
echo
echo "You must have autoreconf installed to compile $package."
echo "Download the appropriate package for your distribution,"
echo "or get the source tarball at ftp://ftp.gnu.org/pub/gnu/"
DIE=1
}
(automake --version) < /dev/null > /dev/null 2>&1 || {
echo
echo "You must have automake installed to compile $package."
echo "Download the appropriate package for your system,"
echo "or get the source from one of the GNU ftp sites"
echo "listed in http://www.gnu.org/order/ftp.html"
DIE=1
}
(libtool --help) < /dev/null > /dev/null 2>&1 || {
echo
echo "You must have libtool installed to compile $package."
echo "Download the appropriate package for your system,"
echo "or get the source from one of the GNU ftp sites"
echo "listed in http://www.gnu.org/order/ftp.html"
DIE=1
}
if test "$DIE" -eq 1; then
exit 1
fi
if test -z "$*"; then
echo "I am going to run ./configure with no arguments - if you wish "
echo "to pass any to it, please specify them on the $0 command line."
fi
echo "Generating configuration files for $package, please wait...."
echo " aclocal $ACLOCAL_FLAGS"
aclocal $ACLOCAL_FLAGS
echo " autoheader"
autoheader
echo " libtoolize --automake"
libtoolize --automake
echo " automake --add-missing $AUTOMAKE_FLAGS"
automake --add-missing $AUTOMAKE_FLAGS
echo " autoreconf"
autoreconf
$srcdir/configure "$@" && echo

90
config.bitrate Normal file
View File

@ -0,0 +1,90 @@
src/aacplusenc.c: AacInitDefaultConfig(&aacp->config);
src/aacplusenc.c: aacp->config.nChannelsIn = numChannels;
src/aacplusenc.c: aacp->config.sampleRate = sampleRate;
src/aacplusenc.c: aacp->writeOffset = INPUT_DELAY*MAX_CHANNELS;
src/aacplusenc.c: aacplusEncInitSBRAACRam(&aacp->aacEnc);
src/aacplusenc.c: init_plans(&aacp->fftctx);
src/aacplusenc.c: return &aacp->config;
src/aacplusenc.c: if(cfg != &aacp->config)
src/aacplusenc.c: memcpy(&aacp->config, cfg, sizeof(aacplusEncConfiguration));
src/aacplusenc.c: int sampleRateAAC = aacp->config.sampleRate;
src/aacplusenc.c: if(!aacp->config.nChannelsOut)
src/aacplusenc.c: aacp->config.nChannelsOut = aacp->config.nChannelsIn;
src/aacplusenc.c: if(!aacp->config.bitRate)
src/aacplusenc.c: if(aacp->config.bandWidth > aacp->config.sampleRate/2)
src/aacplusenc.c: aacp->config.inputSamples = aacp->config.nSamplesPerFrame * 2 * aacp->config.nChannelsIn;
src/aacplusenc.c: if ( (aacp->config.nChannelsOut == 2) && (aacp->config.bitRate >= 16000) && (aacp->config.bitRate < 44001) ) {
src/aacplusenc.c: aacp->config.nChannelsOut=1;
src/aacplusenc.c: aacp->useParametricStereo=1;
src/aacplusenc.c: aacp->envReadOffset = (MAX_DS_FILTER_DELAY + INPUT_DELAY)*MAX_CHANNELS;
src/aacplusenc.c: aacp->coreWriteOffset = CORE_INPUT_OFFSET_PS;
src/aacplusenc.c: aacp->writeOffset = aacp->envReadOffset;
src/aacplusenc.c: InitIIR21_Resampler(&aacp->IIR21_reSampler[0]);
src/aacplusenc.c: InitIIR21_Resampler(&aacp->IIR21_reSampler[1]);
src/aacplusenc.c: assert(aacp->IIR21_reSampler[0].delay <= MAX_DS_FILTER_DELAY);
src/aacplusenc.c: aacp->writeOffset += aacp->IIR21_reSampler[0].delay*MAX_CHANNELS;
src/aacplusenc.c: if(!IsSbrSettingAvail(aacp->config.bitRate, aacp->config.nChannelsOut, sampleRateAAC, &sampleRateAAC)) {
src/aacplusenc.c: aacp->config.bitRate, aacp->config.nChannelsOut, sampleRateAAC);
src/aacplusenc.c: InitializeSbrDefaults (&aacp->sbrConfig);
src/aacplusenc.c: aacp->sbrConfig.usePs = aacp->useParametricStereo;
src/aacplusenc.c: if(!AdjustSbrSettings( &aacp->sbrConfig, aacp->config.bitRate, aacp->config.nChannelsOut, sampleRateAAC, AACENC_TRANS_FAC, 24000)) {
src/aacplusenc.c: aacp->config.bitRate, aacp->config.nChannelsOut, sampleRateAAC, aacp->sbrConfig.usePs);
src/aacplusenc.c: if(EnvOpen(aacp->aacEnc.sbr_ram,
src/aacplusenc.c: &aacp->hEnvEnc,
src/aacplusenc.c: &aacp->inBuf[aacp->coreWriteOffset],
src/aacplusenc.c: &aacp->sbrConfig,
src/aacplusenc.c: &aacp->config.bandWidth) != 0){
src/aacplusenc.c: EnvClose (&aacp->hEnvEnc);
src/aacplusenc.c: aacp->hEnvEnc.fftctx = &aacp->fftctx;
src/aacplusenc.c: aacp->config.sampleRate = sampleRateAAC;
src/aacplusenc.c: if (AacEncOpen( &aacp->aacEnc, &aacp->config) != 0){
src/aacplusenc.c: AacEncClose(&aacp->aacEnc);
src/aacplusenc.c: aacp->aacEnc.fftctx = &aacp->fftctx;
src/aacplusenc.c: aacp->adts = calloc(1, sizeof(ADTSContext_t));
src/aacplusenc.c: if(!aacp->adts) {
src/aacplusenc.c: adts_hdr_init(aacp->adts, &aacp->config, &aacp->aacEnc.bitStream);
src/aacplusenc.c: if(aacp->useParametricStereo)
src/aacplusenc.c: srate_idx = FindSRIndex(aacp->config.sampleRate);
src/aacplusenc.c: ch_idx = FindCHIndex(aacp->config.nChannelsOut);
src/aacplusenc.c: if(aacp->config.nSamplesPerFrame != AACENC_BLOCKSIZE)
src/aacplusenc.c: srate_idx = FindSRIndex(aacp->config.sampleRate * 2);
src/aacplusenc.c: if(samplesInput > aacp->config.inputSamples)
src/aacplusenc.c: switch (aacp->config.inputFormat){
src/aacplusenc.c: aacp->inBuf[(2/aacp->config.nChannelsIn)*i+aacp->writeOffset+aacp->writtenSamples] = (float) inbuff[i];
src/aacplusenc.c: aacp->inBuf[(2/aacp->config.nChannelsIn)*i+aacp->writeOffset+aacp->writtenSamples] = inbuff[i] * SHRT_MAX;
src/aacplusenc.c: if((aacp->config.nChannelsIn == 2) &&
src/aacplusenc.c: (aacp->config.nChannelsOut == 1) && !aacp->useParametricStereo) {
src/aacplusenc.c: aacp->inBuf[i+aacp->writeOffset+aacp->writtenSamples] = (aacp->inBuf[i+aacp->writeOffset+aacp->writtenSamples]
src/aacplusenc.c: + aacp->inBuf[i+aacp->writeOffset+aacp->writtenSamples+1])*0.5f;
src/aacplusenc.c: aacp->writtenSamples+=samplesInput;
src/aacplusenc.c: if (aacp->writtenSamples < aacp->config.inputSamples)
src/aacplusenc.c: if(aacp->adts) adts_offset=ADTS_HEADER_SIZE;
src/aacplusenc.c: EnvEncodeFrame( &aacp->hEnvEnc,
src/aacplusenc.c: &aacp->inBuf[aacp->envReadOffset],
src/aacplusenc.c: &aacp->inBuf[aacp->coreWriteOffset],
src/aacplusenc.c: &aacp->numAncDataBytes,
src/aacplusenc.c: aacp->ancDataBytes);
src/aacplusenc.c: if (!aacp->useParametricStereo)
src/aacplusenc.c: for( ch=0; ch<aacp->config.nChannelsIn; ch++ )
src/aacplusenc.c: IIR21_Downsample( &aacp->IIR21_reSampler[ch],
src/aacplusenc.c: &aacp->inBuf[aacp->writeOffset+ch],
src/aacplusenc.c: aacp->config.nSamplesPerFrame * 2, //aacp->writtenSamples,
src/aacplusenc.c: &aacp->inBuf[ch],
src/aacplusenc.c: AacEncEncode( &aacp->aacEnc,
src/aacplusenc.c: aacp->inBuf,
src/aacplusenc.c: aacp->useParametricStereo ? 1 : MAX_CHANNELS, /* stride (step) */
src/aacplusenc.c: aacp->ancDataBytes,
src/aacplusenc.c: &aacp->numAncDataBytes,
src/aacplusenc.c: if (aacp->useParametricStereo) {
src/aacplusenc.c: memcpy( aacp->inBuf,&aacp->inBuf[aacp->config.nSamplesPerFrame],CORE_INPUT_OFFSET_PS*sizeof(float));
src/aacplusenc.c: memmove( aacp->inBuf,&aacp->inBuf[aacp->config.nSamplesPerFrame*2*MAX_CHANNELS],
src/aacplusenc.c: aacp->writeOffset*sizeof(float));
src/aacplusenc.c: if(numOutBytes > 0 && aacp->adts) {
src/aacplusenc.c: adts_hdr_up(aacp->adts, outputBuffer, numOutBytes);
src/aacplusenc.c: aacp->writtenSamples=0;
src/aacplusenc.c: AacEncClose(&aacp->aacEnc);
src/aacplusenc.c: EnvClose(&aacp->hEnvEnc);
src/aacplusenc.c: destroy_plans(&aacp->fftctx);
src/aacplusenc.c: aacplusEncFreeSBRAACRam(&aacp->aacEnc);
src/aacplusenc.c: if(aacp->adts)
src/aacplusenc.c: free(aacp->adts);

144
configure.ac Normal file
View File

@ -0,0 +1,144 @@
# -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.
AC_INIT([libaacplus],[2.0.2],[Sergiy Guriev <piratfm@ua.fm>])
#AM_INIT_AUTOMAKE([dist-bzip2])
AM_INIT_AUTOMAKE
AM_CONFIG_HEADER(config.h)
AC_CONFIG_MACRO_DIR([m4])
# Checks for programs.
AC_PROG_CC
AM_PROG_CC_C_O
AC_PROG_CPP
AC_PROG_INSTALL
AC_PROG_LN_S
AC_PROG_MAKE_SET
AC_LIBTOOL_WIN32_DLL
AM_PROG_LIBTOOL
AC_PATH_PROG([UNZIP],[unzip])
if test x"$UNZIP" = x -a ! -f "aacenc.c" ; then
AC_MSG_ERROR([You need unzip utility to prepare sources.])
fi
AC_PATH_PROG([PATCH],[patch])
if test x"$PATCH" = x -a ! -f "aacenc.c" ; then
AC_MSG_ERROR([You need patch utility to prepare sources.])
fi
AC_PARAMETER_EXPANSION_STRING_REPLACE_CAPABLE_SHELL
if test x"$PARAMETER_EXPANSION_STRING_REPLACE_CAPABLE_SHELL" = x -a ! "(" -f"26410-800.zip" -o -f "aacenc.c" ")" ; then
dnl number sigh cannot be a part of AC_MSG_ERROR
NUMBER_SIGN="#"
AC_MSG_ERROR([You need parameter expansion string replace (i. e. \${var%string} and \${var${NUMBER_SIGN}string}) capable shell (bash, ash, better sh).])
fi
AC_CHECK_DOWNLOADER_PROG
if test x"$DOWNLOADER_PROG" = x -a ! "(" -f "26410-800.zip" -o -f "aacenc.c" ")" ; then
AC_MSG_ERROR([You need downloader utility to download sources (wget, fetch or curl).])
fi
# Checks for libraries.
AC_SEARCH_LIBS([sqrt],[m])
# Checks for header files.
AC_HEADER_STDC
AC_CHECK_HEADERS([float.h memory.h stdint.h stdlib.h string.h],[],[
AC_MSG_ERROR([You need standard header files.])
])
# Checks for typedefs, structures, and compiler characteristics.
AC_C_CONST
AC_TYPE_INT16_T
AC_TYPE_INT32_T
AC_TYPE_INT8_T
AC_TYPE_UINT16_T
# Checks for library functions.
AC_FUNC_MALLOC
AC_FUNC_MEMCMP
AC_CHECK_FUNCS([floor memmove memset pow sqrt],[],[
AC_MSG_ERROR([You basic math functions.])
])
dnl-----------------------------------------------------------------------------
dnl link the fftw3 library if requested
dnl-----------------------------------------------------------------------------
AC_SUBST(FFTW3_INCFLAGS)
AC_SUBST(FFTW3_CFLAGS)
AC_SUBST(FFTW3_LIB)
AC_SUBST(FFTW3_LDFLAGS)
AC_ARG_WITH(fftw3,
[ --with-fftw3 use fftw3 for fast fourier conversion ([default=yes]) ],
USE_FFTW3=${withval}, USE_FFTW3="yes" )
AC_ARG_WITH(fftw3-prefix,
[ --with-fftw3-prefix=DIR alternate location for fftw3 ([default=/usr])
look for libraries in FFTW3-PREFIX/lib,
for headers in FFTW3-PREFIX/include],
CONFIG_FFTW3_PREFIX="${withval}", CONFIG_FFTW3_PREFIX="/usr")
if test "x${USE_FFTW3}" = "xyes" ; then
AC_MSG_CHECKING( [for fftw3 library at ${CONFIG_FFTW3_PREFIX}] )
LA_SEARCH_LIB( FFTW3_LIB_LOC, FFTW3_INC_LOC, libfftw3f.a libfftw3f.so, fftw3.h,
${CONFIG_FFTW3_PREFIX})
if test "x${FFTW3_LIB_LOC}" == "x" ; then
AC_MSG_WARN( [not found])
CONFIG_FFTW3_PREFIX="/usr/local"
AC_MSG_CHECKING( [for fftw3 library at ${CONFIG_FFTW3_PREFIX}] )
LA_SEARCH_LIB( FFTW3_LIB_LOC, FFTW3_INC_LOC, libfftw3f.a libfftw3f.so, fftw3.h,
${CONFIG_FFTW3_PREFIX})
fi
if test "x${FFTW3_LIB_LOC}" != "x" ; then
AC_DEFINE( _FFTW3, 1, [build with fftw3 library] )
if test "x${FFTW3_INC_LOC}" != "x${SYSTEM_INCLUDE}" ; then
FFTW3_INCFLAGS="-I${FFTW3_INC_LOC}"
fi
FFTW3_LIB="-lfftw3f"
FFTW3_LDFLAGS="-L${FFTW3_LIB_LOC} ${FFTW3_LIB}"
FFTW3_CFLAGS="-I${FFTW3_LIB_LOC} ${FFTW3_LIB}"
AC_MSG_RESULT( [found at ${CONFIG_FFTW3_PREFIX}] )
else
AC_MSG_WARN( [not found, building without fftw3])
fi
else
AC_MSG_RESULT( [building without fftw3] )
fi
dnl pkgconfig/shout-config.
dnl If pkgconfig is found, use it and disable shout-config, otherwise do the
dnl opposite, unless the user overrides.
AC_ARG_ENABLE([pkgconfig],
AC_HELP_STRING([--disable-pkgconfig],[disable pkgconfig data files (auto)]),
[dopkgconfig="$enableval"], [dopkgconfig="maybe"])
if test "$dopkgconfig" = "maybe"
then
AC_CHECK_PROG([PKGCONFIG], [pkg-config], [yes], [no])
else
AC_MSG_CHECKING([whether pkgconfig should be used])
PKGCONFIG="$dopkgconfig"
AC_MSG_RESULT([$PKGCONFIG])
fi
AM_CONDITIONAL([HAVE_PKGCONFIG], [test "$PKGCONFIG" != "no"])
AACPLUS_VERSION="$VERSION"
AACPLUS_CPPFLAGS="-I$aacplus_includedir $FFTW3_CPPFLAGS"
AACPLUS_CFLAGS+="$FFTW3_CFLAGS"
AACPLUS_LIBS="-laacplus -lm ${FFTW3_LIB}"
AC_SUBST(AACPLUS_LIBS)
AC_SUBST(AACPLUS_REQUIRES)
AC_SUBST(AACPLUS_CPPFLAGS)
AC_SUBST(AACPLUS_CFLAGS)
dnl Make substitutions
AC_SUBST(LIBTOOL_DEPS)
AC_SUBST(OPT)
AC_SUBST(LIBS)
AC_SUBST(DEBUG)
AC_SUBST(CFLAGS)
AC_SUBST(PROFILE)
AC_CONFIG_FILES([ aacplus.spec aacplus-config aacplus.pc ])
AC_OUTPUT([ Makefile src/Makefile patches/Makefile include/Makefile frontend/Makefile ])

46
docs/aacplusenc.1 Normal file
View File

@ -0,0 +1,46 @@
.TH AACPLUSENC 1 "2007-10-11" "1.26" "non-Free High Efficiency Advanced Audio Coder"
.SH NAME
aacplusenc \- proprietary MPEG-4 and MPEG-2 AAC+ encoder
.SH SYNOPSIS
.B aacplusenc
.I < infile >
.RI \-o\ <\fIoutfile\fP>
.RI [-s]
.SH DESCRIPTION
.B aacplusenc
is an 3gpp's implementation of MPEG-4 and MPEG-2 AAC+ encoder, it is need to be licensed by owners (Dolby/VIA).
.SH FEATURES
.TP
* Portable
.TP
* Fast
.TP
* LC support
.SH OPTIONS
.TP
.BR <\fIinfile\fP>
Set Input wave file, can be "\-", which means stdin.
.TP
.BR \-o\ <\fIoutfile\fP>
Set Output aac file, can be "\-", which means stdout.
.TP
.BR \-s\
Set stereo encoding mode
.TP
.SH AUTHORS
.TP
Reference implementation: 3GPP TS 26.410 V8.0.0
.TP
Wrapper and library code: Stanislav Brabec <utx@penguin.cz>,
.TP
Adopted for aac+: Sergiy Guriev <piratfm@ua.fm>,
.TP
Encoder code: Matteo Croce
.TP
Patches and fixes: Rafael Diniz, Edwin van den Oetelaar

9
frontend/Makefile.am Normal file
View File

@ -0,0 +1,9 @@
bin_PROGRAMS = aacplusenc
man_MANS = ../docs/aacplusenc.1
aacplusenc_SOURCES = main.c
INCLUDES = -I$(top_srcdir)/include -I$(top_srcdir)/src
LDADD = $(top_builddir)/src/libaacplus.la -lm
aacplusenc_LDFLAGS = @FFTW3_LDFLAGS@

66
frontend/au_channel.h Normal file
View File

@ -0,0 +1,66 @@
#include <stdio.h>
#include <string.h>
#define WAV_HEADER_SIZE 64
#define WAV_FORMAT_FLOAT 0xFFFE
typedef struct {
int sampleRate;
int nChannels;
long nSamples;
int aFmt;
} WavInfo;
inline FILE* AuChannelOpen (const char* filename, WavInfo* info)
{
unsigned char header[12];
unsigned char data[WAV_HEADER_SIZE];
FILE *handle;
unsigned int chunksize;
if (!strcmp(filename,"-"))
handle = stdin;
else
handle = fopen(filename, "rb");
if(!handle) return NULL;
if(fread(header, 1, 12, handle) != 12) return NULL;
info->nSamples = (header[4] | (header[5] << 8) | (header[6] << 16) | (header[7] << 24)) + 8;
while (memcmp(header, "data", 4) != 0){
if(fread(header, 1, 8, handle) != 8) return NULL;
chunksize = (header[4] | (header[5] << 8) | (header[6] << 16) | (header[7] << 24));
//fprintf(stderr, "%c%c%c%c %d", header[0], header[1], header[2], header[3], chunksize);
if(!memcmp(header, "fmt ", 4)) {
if(chunksize > WAV_HEADER_SIZE) return NULL;
if(fread(data, 1, chunksize, handle) != chunksize) return NULL;
info->aFmt = data[0] | data[1] << 8;
info->nChannels = data[2] | data[3] << 8;
info->sampleRate = data[4] | data[5] << 8 | data[6] << 12 | data[7] << 16;
} else if(memcmp(header, "data", 4) != 0) {
if(fseek(handle, chunksize, SEEK_CUR) != 0) return NULL;
}
}
return handle;
}
inline void AuChannelClose (FILE *audioChannel)
{
fclose(audioChannel);
}
inline size_t AuChannelReadShort(FILE *audioChannel, short *samples, int nSamples, int *readed)
{
*readed = fread(samples, 2, nSamples, audioChannel);
return *readed <= 0;
}
inline size_t AuChannelReadFloat(FILE *audioChannel, float *samples, int nSamples, int *readed)
{
*readed = fread(samples, 4, nSamples, audioChannel);
return *readed <= 0;
}

141
frontend/main.c Normal file
View File

@ -0,0 +1,141 @@
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
#include <string.h>
#include "au_channel.h"
#include "aacplus.h"
int main(int argc, char *argv[])
{
WavInfo inputInfo;
FILE *inputFile = NULL;
FILE *hADTSFile;
int error;
int bEncodeMono = 0;
int frmCnt = 0;
/*
* parse command line arguments
*/
if (argc != 5) {
fprintf(stderr, "\nUsage: %s <wav_file> <bitstream_file> <bitrate> <(m)ono/(s)tereo>\n", argv[0]);
fprintf(stderr, "\nExample: %s input.wav out.aac 24000 s\n", argv[0]);
return 0;
}
if ( strcmp (argv[4],"m") == 0 ) {
bEncodeMono = 1;
}
else {
if ( strcmp (argv[4],"s") != 0 ) {
fprintf(stderr, "\nWrong mode %s, use either (m)ono or (s)tereo\n", argv[4]);
return 0;
}
}
fflush(stdout);
inputFile = AuChannelOpen (argv[1], &inputInfo);
if(inputFile == NULL){
fprintf(stderr,"could not open %s\n",argv[1]);
exit(10);
}
if (inputInfo.nChannels==1 && !bEncodeMono) {
fprintf(stderr,"Need stereo input for stereo coding mode !\n");
exit(10);
}
if (strcmp(argv[2],"-")==0)
hADTSFile=stdout;
else
hADTSFile = fopen(argv[2], "wb");
if(!hADTSFile) {
fprintf(stderr, "\nFailed to create ADTS file\n") ;
exit(10);
}
/*
Be verbose
*/
unsigned long inputSamples=0;
unsigned long maxOutputBytes=0;
aacplusEncHandle hEncoder = aacplusEncOpen(inputInfo.sampleRate,
inputInfo.nChannels,
&inputSamples,
&maxOutputBytes);
aacplusEncConfiguration *cfg = aacplusEncGetCurrentConfiguration(hEncoder);
cfg->bitRate = atoi(argv[3]);
cfg->bandWidth = 0;
cfg->outputFormat = 1;
cfg->nChannelsOut = bEncodeMono ? 1 : inputInfo.nChannels;
if(inputInfo.aFmt == WAV_FORMAT_FLOAT){
cfg->inputFormat = AACPLUS_INPUT_FLOAT;
}
fprintf(stdout,"input file %s: \nsr = %d, nc = %d fmt = %d\n\n",
argv[1], inputInfo.sampleRate, inputInfo.nChannels, inputInfo.aFmt);
fprintf(stdout,"output file %s: \nbr = %d inputSamples = %lu maxOutputBytes = %lu nc = %d m = %d\n\n",
argv[2], cfg->bitRate, inputSamples, maxOutputBytes, cfg->nChannelsOut, bEncodeMono);
fflush(stdout);
int ret = 0;
if((ret = aacplusEncSetConfiguration(hEncoder, cfg)) == 0) {
fprintf(stdout,"setting cfg failed\n", ret);
return -1;
}
uint8_t *outputBuffer = malloc(maxOutputBytes);
int32_t *TimeDataPcm;
if(inputInfo.aFmt == WAV_FORMAT_FLOAT) {
TimeDataPcm = calloc(inputSamples, sizeof(float));
} else {
TimeDataPcm = calloc(inputSamples, sizeof(short));
}
int stopLoop = 0;
int bytes = 0;
do {
int numSamplesRead = 0;
if(inputInfo.aFmt == WAV_FORMAT_FLOAT) {
if ( AuChannelReadFloat(inputFile, (float *) TimeDataPcm, inputSamples, &numSamplesRead) > 0) {
stopLoop = 1;
break;
}
} else {
if ( AuChannelReadShort(inputFile, (short *) TimeDataPcm, inputSamples, &numSamplesRead) > 0) {
stopLoop = 1;
break;
}
}
if(numSamplesRead < inputSamples) {
stopLoop = 1;
break;
}
bytes = aacplusEncEncode(hEncoder, (int32_t *) TimeDataPcm, numSamplesRead,
outputBuffer,
maxOutputBytes);
if(bytes > 0) fwrite(outputBuffer, bytes, 1, hADTSFile);
frmCnt++;
fprintf(stderr,"[%d]\r",frmCnt); fflush(stderr);
} while (!stopLoop && bytes >= 0);
fprintf(stderr,"\n");
fflush(stderr);
printf("\nencoding finished\n");
aacplusEncClose(hEncoder);
fclose(hADTSFile);
free(outputBuffer);
free(TimeDataPcm);
return 0;
}

1
include/Makefile.am Normal file
View File

@ -0,0 +1 @@
include_HEADERS = aacplus.h

60
include/aacplus.h Normal file
View File

@ -0,0 +1,60 @@
#ifndef _AACPLUS_H_
#define _AACPLUS_H_
#include <stdint.h>
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
typedef void *aacplusEncHandle;
typedef enum {
AACPLUS_INPUT_16BIT = 0,
AACPLUS_INPUT_FLOAT,
} aacplusInFormat;
typedef struct {
int sampleRate;
int bitRate; ///< bits per second
int nChannelsIn;
int nChannelsOut;
int bandWidth;
aacplusInFormat inputFormat;
int outputFormat; ///< 0 - raw, 1 - adts
int nSamplesPerFrame; ///< 1024 by default, (960 - for dab+/drm not working yet)
int inputSamples; ///< number of input samples to use, usable after aacplusEncSetConfiguration() call
} aacplusEncConfiguration;
aacplusEncConfiguration *aacplusEncGetCurrentConfiguration(aacplusEncHandle hEncoder);
int aacplusEncSetConfiguration(aacplusEncHandle hEncoder,
aacplusEncConfiguration *cfg);
aacplusEncHandle aacplusEncOpen(unsigned long sampleRate,
unsigned int numChannels,
unsigned long *inputSamples,
unsigned long *maxOutputBytes);
int aacplusEncGetDecoderSpecificInfo(aacplusEncHandle hEncoder, unsigned char **ppBuffer,
unsigned long *pSizeOfDecoderSpecificInfo);
int aacplusEncEncode(aacplusEncHandle hEncoder, int32_t *inputBuffer, unsigned int samplesInput,
unsigned char *outputBuffer,
unsigned int bufferSize);
int aacplusEncClose(aacplusEncHandle hEncoder);
#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif /* _AACPLUS_H_ */

299
m4/acinclude.m4 Normal file
View File

@ -0,0 +1,299 @@
dnl acinclude.m4. Change *this* file to add new or change macros.
dnl When changes have been made, delete aclocal.m4 and run
dnl "aclocal".
dnl
dnl DO NOT change aclocal.m4 !
dnl
dnl-----------------------------------------------------------------------------
dnl LA_SEARCH_FILE(variable, filename, PATH)
dnl Search "filename" in the specified "PATH", "variable" will
dnl contain the full pathname or the empty string
dnl PATH is space-separated list of directories.
dnl by Florian Bomers
dnl-----------------------------------------------------------------------------
AC_DEFUN([LA_SEARCH_FILE],[
$1=
dnl hack: eliminate line feeds in $2
for FILE in $2; do
for DIR in $3; do
dnl use PATH in order
if test ".$1"="." && test -f "$DIR/$FILE"; then
$1=$DIR
fi
done
done
])
dnl-----------------------------------------------------------------------------
dnl LA_SEARCH_LIB(lib-variable, include-variable, lib-filename, header-filename, prefix)
dnl looks for "lib-filename" and "header-filename" in the area of "prefix".
dnl if found, "lib-variable" and "include-variable" are set to the
dnl respective paths.
dnl prefix is a single path
dnl libs are searched in prefix, prefix/lib
dnl headers are searched in prefix, prefix/include,
dnl
dnl If one of them is not found, both "lib-variable", "include-variable" are
dnl set to the empty string.
dnl
dnl TODO: assert function call to verify lib
dnl
dnl by Florian Bomers
dnl-----------------------------------------------------------------------------
AC_DEFUN([LA_SEARCH_LIB],[
dnl look for lib
LA_SEARCH_FILE($1, $3, $5 $5/lib64 $5/lib )
dnl look for header.
LA_SEARCH_FILE($2, $4, $5 $5/include )
if test ".$1" = "." || test ".$2" = "."; then
$1=
$2=
fi
])
dnl-----------------------------------------------------------------------------
dnl funky posix threads checking, thanks to
dnl Steven G. Johnson <stevenj@alum.mit.edu>
dnl and Alejandro Forero Cuervo <bachue@bachue.com>
dnl see http://www.gnu.org/software/ac-archive/htmldoc/acx_pthread.html
dnl-----------------------------------------------------------------------------
dnl @synopsis ACX_PTHREAD([ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]])
dnl
dnl This macro figures out how to build C programs using POSIX
dnl threads. It sets the PTHREAD_LIBS output variable to the threads
dnl library and linker flags, and the PTHREAD_CFLAGS output variable
dnl to any special C compiler flags that are needed. (The user can also
dnl force certain compiler flags/libs to be tested by setting these
dnl environment variables.)
dnl
dnl Also sets PTHREAD_CC to any special C compiler that is needed for
dnl multi-threaded programs (defaults to the value of CC otherwise).
dnl (This is necessary on AIX to use the special cc_r compiler alias.)
dnl
dnl NOTE: You are assumed to not only compile your program with these
dnl flags, but also link it with them as well. e.g. you should link
dnl with $PTHREAD_CC $CFLAGS $PTHREAD_CFLAGS $LDFLAGS ... $PTHREAD_LIBS $LIBS
dnl
dnl If you are only building threads programs, you may wish to
dnl use these variables in your default LIBS, CFLAGS, and CC:
dnl
dnl LIBS="$PTHREAD_LIBS $LIBS"
dnl CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
dnl CC="$PTHREAD_CC"
dnl
dnl In addition, if the PTHREAD_CREATE_JOINABLE thread-attribute
dnl constant has a nonstandard name, defines PTHREAD_CREATE_JOINABLE
dnl to that name (e.g. PTHREAD_CREATE_UNDETACHED on AIX).
dnl
dnl ACTION-IF-FOUND is a list of shell commands to run if a threads
dnl library is found, and ACTION-IF-NOT-FOUND is a list of commands
dnl to run it if it is not found. If ACTION-IF-FOUND is not specified,
dnl the default action will define HAVE_PTHREAD.
dnl
dnl Please let the authors know if this macro fails on any platform,
dnl or if you have any other suggestions or comments. This macro was
dnl based on work by SGJ on autoconf scripts for FFTW (www.fftw.org)
dnl (with help from M. Frigo), as well as ac_pthread and hb_pthread
dnl macros posted by AFC to the autoconf macro repository. We are also
dnl grateful for the helpful feedback of numerous users.
dnl
dnl @version $Id: acinclude.m4,v 1.1 2007-11-02 16:01:16 tipok Exp $
dnl @author Steven G. Johnson <stevenj@alum.mit.edu> and Alejandro Forero Cuervo <bachue@bachue.com>
AC_DEFUN([ACX_PTHREAD], [
AC_REQUIRE([AC_CANONICAL_HOST])
AC_LANG_SAVE
AC_LANG_C
acx_pthread_ok=no
# We used to check for pthread.h first, but this fails if pthread.h
# requires special compiler flags (e.g. on True64 or Sequent).
# It gets checked for in the link test anyway.
# First of all, check if the user has set any of the PTHREAD_LIBS,
# etcetera environment variables, and if threads linking works using
# them:
if test x"$PTHREAD_LIBS$PTHREAD_CFLAGS" != x; then
save_CFLAGS="$CFLAGS"
CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
save_LIBS="$LIBS"
LIBS="$PTHREAD_LIBS $LIBS"
AC_MSG_CHECKING([for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS])
AC_TRY_LINK_FUNC(pthread_join, acx_pthread_ok=yes)
AC_MSG_RESULT($acx_pthread_ok)
if test x"$acx_pthread_ok" = xno; then
PTHREAD_LIBS=""
PTHREAD_CFLAGS=""
fi
LIBS="$save_LIBS"
CFLAGS="$save_CFLAGS"
fi
# We must check for the threads library under a number of different
# names; the ordering is very important because some systems
# (e.g. DEC) have both -lpthread and -lpthreads, where one of the
# libraries is broken (non-POSIX).
# Create a list of thread flags to try. Items starting with a "-" are
# C compiler flags, and other items are library names, except for "none"
# which indicates that we try without any flags at all.
acx_pthread_flags="pthread-config pthreads none -Kthread -kthread lthread -pthread -pthreads -mthreads pthread --thread-safe -mt"
# The ordering *is* (sometimes) important. Some notes on the
# individual items follow:
# pthread-config: use pthread-config program (on NetBSD)
# pthreads: AIX (must check this before -lpthread)
# none: in case threads are in libc; should be tried before -Kthread and
# other compiler flags to prevent continual compiler warnings
# -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h)
# -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able)
# lthread: LinuxThreads port on FreeBSD (also preferred to -pthread)
# -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads)
# -pthreads: Solaris/gcc
# -mthreads: Mingw32/gcc, Lynx/gcc
# -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it
# doesn't hurt to check since this sometimes defines pthreads too;
# also defines -D_REENTRANT)
# pthread: Linux, etcetera
# --thread-safe: KAI C++
case "${host_cpu}-${host_os}" in
*solaris*)
# On Solaris (at least, for some versions), libc contains stubbed
# (non-functional) versions of the pthreads routines, so link-based
# tests will erroneously succeed. (We need to link with -pthread or
# -lpthread.) (The stubs are missing pthread_cleanup_push, or rather
# a function called by this macro, so we could check for that, but
# who knows whether they'll stub that too in a future libc.) So,
# we'll just look for -pthreads and -lpthread first:
acx_pthread_flags="-pthread -pthreads pthread -mt $acx_pthread_flags"
;;
esac
if test x"$acx_pthread_ok" = xno; then
for flag in $acx_pthread_flags; do
case $flag in
none)
AC_MSG_CHECKING([whether pthreads work without any flags])
;;
-*)
AC_MSG_CHECKING([whether pthreads work with $flag])
PTHREAD_CFLAGS="$flag"
;;
pthread-config)
AC_CHECK_PROG(acx_pthread_config, pthread-config, yes, no)
if test x"$acx_pthread_config" = xno; then continue; fi
PTHREAD_CFLAGS="`pthread-config --cflags`"
PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`"
;;
*)
AC_MSG_CHECKING([for the pthreads library -l$flag])
PTHREAD_LIBS="-l$flag"
;;
esac
save_LIBS="$LIBS"
save_CFLAGS="$CFLAGS"
LIBS="$PTHREAD_LIBS $LIBS"
CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
# Check for various functions. We must include pthread.h,
# since some functions may be macros. (On the Sequent, we
# need a special flag -Kthread to make this header compile.)
# We check for pthread_join because it is in -lpthread on IRIX
# while pthread_create is in libc. We check for pthread_attr_init
# due to DEC craziness with -lpthreads. We check for
# pthread_cleanup_push because it is one of the few pthread
# functions on Solaris that doesn't have a non-functional libc stub.
# We try pthread_create on general principles.
AC_TRY_LINK([#include <pthread.h>],
[pthread_t th; pthread_join(th, 0);
pthread_attr_init(0); pthread_cleanup_push(0, 0);
pthread_create(0,0,0,0); pthread_cleanup_pop(0); ],
[acx_pthread_ok=yes])
LIBS="$save_LIBS"
CFLAGS="$save_CFLAGS"
AC_MSG_RESULT($acx_pthread_ok)
if test "x$acx_pthread_ok" = xyes; then
break;
fi
PTHREAD_LIBS=""
PTHREAD_CFLAGS=""
done
fi
# Various other checks:
if test "x$acx_pthread_ok" = xyes; then
save_LIBS="$LIBS"
LIBS="$PTHREAD_LIBS $LIBS"
save_CFLAGS="$CFLAGS"
CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
# Detect AIX lossage: threads are created detached by default
# and the JOINABLE attribute has a nonstandard name (UNDETACHED).
AC_MSG_CHECKING([for joinable pthread attribute])
AC_TRY_LINK([#include <pthread.h>],
[int attr=PTHREAD_CREATE_JOINABLE;],
ok=PTHREAD_CREATE_JOINABLE, ok=unknown)
if test x"$ok" = xunknown; then
AC_TRY_LINK([#include <pthread.h>],
[int attr=PTHREAD_CREATE_UNDETACHED;],
ok=PTHREAD_CREATE_UNDETACHED, ok=unknown)
fi
if test x"$ok" != xPTHREAD_CREATE_JOINABLE; then
AC_DEFINE(PTHREAD_CREATE_JOINABLE, $ok,
[Define to the necessary symbol if this constant
uses a non-standard name on your system.])
fi
AC_MSG_RESULT(${ok})
if test x"$ok" = xunknown; then
AC_MSG_WARN([we do not know how to create joinable pthreads])
fi
AC_MSG_CHECKING([if more special flags are required for pthreads])
flag=no
case "${host_cpu}-${host_os}" in
*-aix* | *-freebsd*) flag="-D_THREAD_SAFE";;
*solaris* | *-osf* | *-hpux*) flag="-D_REENTRANT";;
esac
AC_MSG_RESULT(${flag})
if test "x$flag" != xno; then
PTHREAD_CFLAGS="$flag $PTHREAD_CFLAGS"
fi
LIBS="$save_LIBS"
CFLAGS="$save_CFLAGS"
# More AIX lossage: must compile with cc_r
AC_CHECK_PROG(PTHREAD_CC, cc_r, cc_r, ${CC})
else
PTHREAD_CC="$CC"
fi
AC_SUBST(PTHREAD_LIBS)
AC_SUBST(PTHREAD_CFLAGS)
AC_SUBST(PTHREAD_CC)
# Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND:
if test x"$acx_pthread_ok" = xyes; then
ifelse([$1],,AC_DEFINE(HAVE_PTHREAD,1,[Define if you have POSIX threads libraries and header files.]),[$1])
:
else
acx_pthread_ok=no
$2
fi
AC_LANG_RESTORE
])dnl ACX_PTHREAD

45
m4/advanced_shell.m4 Normal file
View File

@ -0,0 +1,45 @@
# Find for parameter expansion string replace capable shell
# (i. e. shell supporting ${VAR%bc} and ${VAR#ab})
# Result is returned in PARAMETER_EXPANSION_STRING_REPLACE_CAPABLE_SHELL
AC_DEFUN([AC_PARAMETER_EXPANSION_STRING_REPLACE_CAPABLE_SHELL],
[
AC_ARG_WITH([parameter_expansion_string_replace_capable_shell],[AS_HELP_STRING([--with-parameter-expansion-string-replace-capable-shell],[full path to shell that supports parameter expansion string replace (i. e. ${var%string} and ${var#string}) [default=check]])],[
ac_parameter_expansion_string_replace_capable_shell="$withval"
],[
ac_parameter_expansion_string_replace_capable_shell="none"
AC_CHECK_FILE([/bin/bash],[
BASH="/bin/bash"
],[
AC_PATH_PROG([BASH],[bash])
])
if test "x$BASH" != "x" ; then
ac_parameter_expansion_string_replace_capable_shell="$BASH"
else
AC_CHECK_FILE([/bin/ash],[
ASH="/bin/ash"
],[
AC_PATH_PROG([ASH],[ash])
])
if test "x$ASH" != "x" ; then
ac_parameter_expansion_string_replace_capable_shell="$ASH"
fi
fi
])
AC_CACHE_CHECK([for parameter expansion string replace capable shell],
[ac_cv_parameter_expansion_string_replace_capable_shell],[
ac_cv_parameter_expansion_string_replace_capable_shell="none"
if test x"$ac_parameter_expansion_string_replace_capable_shell" = xnone ; then
if test x`/bin/sh -c "exec 2>/dev/null ; VAR=abc ; echo \\${VAR%bc}\\${VAR#ab}"` = xac ; then
ac_cv_parameter_expansion_string_replace_capable_shell="/bin/sh"
fi
else
ac_cv_parameter_expansion_string_replace_capable_shell="$ac_parameter_expansion_string_replace_capable_shell"
fi
])
if test x"$ac_cv_parameter_expansion_string_replace_capable_shell" != "xnone" ; then
PARAMETER_EXPANSION_STRING_REPLACE_CAPABLE_SHELL="$ac_cv_parameter_expansion_string_replace_capable_shell"
else
PARAMETER_EXPANSION_STRING_REPLACE_CAPABLE_SHELL=""
fi
AC_SUBST([PARAMETER_EXPANSION_STRING_REPLACE_CAPABLE_SHELL])
])

42
m4/downloader_prog.m4 Normal file
View File

@ -0,0 +1,42 @@
# Find web downloading utility
# Result is returned in DOWNLOADER_PROG
AC_DEFUN([AC_CHECK_DOWNLOADER_PROG],
[
AC_ARG_WITH([downloader],[AS_HELP_STRING([--with-downloader],[http downloading command [default=check]])],[
ac_downloader_prog="$withval"
],[
AC_PATH_PROGS([DOWNLOADER_PROG_CMD],[wget fetch curl])
ac_downloader_prog="none"
])
AC_CACHE_CHECK([for web downloading command],
[ac_cv_downloader_prog],
[
ac_cv_downloader_prog="$ac_downloader_prog"
ac_downloader_prog_args=""
if test x"$ac_cv_downloader_prog" = "xnone" ; then
case "$DOWNLOADER_PROG_CMD" in
*wget*)
# Does wget does not support -N?
if wget --help 2>/dev/null | grep " -N" >/dev/null ; then
ac_downloader_prog_args=" -N"
else
ac_downloader_prog_args=""
fi
;;
*fetch*)
ac_downloader_prog_args=" -m"
;;
*curl*)
ac_downloader_prog_args=" -OR"
;;
esac
ac_cv_downloader_prog="$DOWNLOADER_PROG_CMD$ac_downloader_prog_args"
fi
])
if test x"$ac_cv_downloader_prog" != xnone ; then
DOWNLOADER_PROG="$ac_cv_downloader_prog"
else
DOWNLOADER_PROG=""
fi
AC_SUBST([DOWNLOADER_PROG])
])

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,459 @@
diff -Nupr src.p1/cfftn.c src.p2/cfftn.c
--- src.p1/cfftn.c 2010-10-21 13:06:37.000000000 +0300
+++ src.p2/cfftn.c 2010-10-21 13:06:37.000000000 +0300
@@ -1,10 +1,19 @@
/*
Complex FFT core for transforms
*/
+#include "cfftn.h"
+#include <stdlib.h>
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#ifdef _FFTW3
+#include <fftw3.h>
+#else
#include <math.h>
#include <string.h>
-#include "cfftn.h"
/* the 3GPP instrumenting tool */
@@ -17,8 +26,29 @@
#define SIN60 0.86602540378443865
#define COS72 0.30901699437494742
#define SIN72 0.95105651629515357
+#endif
+
+#ifdef _FFTW3
+void init_plans(FFTWFContext_t *ctx)
+{
+ fftwf_complex fft_data;
+ ctx->plan4 = fftwf_plan_dft_1d(4, &fft_data, &fft_data, FFTW_BACKWARD, FFTW_ESTIMATE);
+ ctx->plan8 = fftwf_plan_dft_1d(8, &fft_data, &fft_data, FFTW_BACKWARD, FFTW_ESTIMATE);
+ ctx->plan64 = fftwf_plan_dft_1d(64, &fft_data, &fft_data, FFTW_FORWARD, FFTW_ESTIMATE);
+ ctx->plan512 = fftwf_plan_dft_1d(512, &fft_data, &fft_data, FFTW_FORWARD, FFTW_ESTIMATE);
+}
+void destroy_plans(FFTWFContext_t *ctx)
+{
+ fftwf_destroy_plan(ctx->plan512);
+ fftwf_destroy_plan(ctx->plan64);
+ fftwf_destroy_plan(ctx->plan8);
+ fftwf_destroy_plan(ctx->plan4);
+}
+#endif
+
+#ifndef _FFTW3
int cfftn(float Re[],
float Im[],
int nTotal,
@@ -1336,40 +1366,36 @@ Permute_Single_Label:
return 1;
}
+#endif
/*
computes complex fourier transform of length len
returns status
*/
-int CFFTN(float *afftData,int len, int isign)
+int CFFTN(FFTWFContext_t *ctx, float *afftData,int len, int isign)
{
- return(cfftn(afftData,afftData+1,len,len,len,2*isign));
-}
-
-/*
- computes complex fourier transform of length len
-
- returns status
-*/
-int CFFTNRI(float *afftDataReal,float *afftDataImag,int len, int isign)
-{
- return(cfftn(afftDataReal,afftDataImag,len,len,len,isign));
-}
+#ifdef _FFTW3
+ switch(len) {
+ case 4:
+ fftwf_execute_dft(ctx->plan4, (fftwf_complex*)afftData, (fftwf_complex*)afftData);
+ break;
+ case 8:
+ fftwf_execute_dft(ctx->plan8, (fftwf_complex*)afftData, (fftwf_complex*)afftData);
+ break;
+ case 64:
+ fftwf_execute_dft(ctx->plan64, (fftwf_complex*)afftData, (fftwf_complex*)afftData);
+ break;
+ case 512:
+ fftwf_execute_dft(ctx->plan512, (fftwf_complex*)afftData, (fftwf_complex*)afftData);
+ break;
+ default:
+ printf("non standard len for FFT: %d\nWill now die", len);
+ exit(1);
+ }
-/*
- computes complex fourier transform of length len
-
- returns status
-**/
-int CFFTN_NI(float *InRealData,
- float *InImagData,
- float *OutRealData,
- float *OutImagData,
- int len, int isign)
-{
- memcpy ( OutRealData, InRealData, len*sizeof(float) ) ;
- memcpy ( OutImagData, InImagData, len*sizeof(float) ) ;
-
- return cfftn(OutRealData,OutImagData,len,len,len,isign);
+ return 1;
+#else
+ return(cfftn(afftData,afftData+1,len,len,len,2*isign));
+#endif
}
diff -Nupr src.p1/cfftn.h src.p2/cfftn.h
--- src.p1/cfftn.h 2010-10-21 13:06:37.000000000 +0300
+++ src.p2/cfftn.h 2010-10-21 13:06:37.000000000 +0300
@@ -5,30 +5,24 @@
#ifndef __cfftn_h
#define __cfftn_h
-void forwardFFT( float *data, int length );
-
-int cfftn(float Re[],
- float Im[],
- int nTotal,
- int nPass,
- int nSpan,
- int iSign);
-
-int CFFTN(float *afftData,int len, int isign);
-int CFFTNRI(float *afftDataReal,float *afftDataImag,int len, int isign);
-
-int CFFTN_NI(float *InRealData,
- float *InImagData,
- float *OutRealData,
- float *OurImagData,
- int len, int isign);
-
-#ifndef min
-#define min(a, b) ((a) < (b) ? (a) : (b))
+#ifdef HAVE_CONFIG_H
+#include "config.h"
#endif
-#ifndef max
-#define max(a, b) ((a) > (b) ? (a) : (b))
+
+#ifdef _FFTW3
+#include <fftw3.h>
+typedef struct {
+ fftwf_plan plan4, plan8, plan64, plan512;
+} FFTWFContext_t;
+void init_plans(FFTWFContext_t *ctx);
+void destroy_plans(FFTWFContext_t *ctx);
+#else
+#define init_plans(c);
+#define destroy_plans(c);
+typedef int FFTWFContext_t;
#endif
+int CFFTN(FFTWFContext_t *ctx, float *afftData,int len, int isign);
+
#endif
diff -Nupr src.p1/env_est.c src.p2/env_est.c
--- src.p1/env_est.c 2010-10-21 13:06:37.000000000 +0300
+++ src.p2/env_est.c 2010-10-21 13:06:37.000000000 +0300
@@ -582,7 +582,8 @@ calculateSbrEnvelope (float **YBufferLef
****************************************************************************/
void
-extractSbrEnvelope (float *timeInPtr,
+extractSbrEnvelope (FFTWFContext_t *fftctx,
+ float *timeInPtr,
float *pCoreBuffer,
unsigned int timeInStride,
HANDLE_SBR_CONFIG_DATA h_con,
@@ -670,7 +671,7 @@ extractSbrEnvelope (float *timeInPtr,
if (hPsEnc && hSynthesisQmfBank) {
- EncodePsFrame(hPsEnc,
+ EncodePsFrame(fftctx, hPsEnc,
h_envChan[0]->sbrExtractEnvelope.iBuffer,
h_envChan[0]->sbrExtractEnvelope.rBuffer,
h_envChan[1]->sbrExtractEnvelope.iBuffer,
diff -Nupr src.p1/env_est.h src.p2/env_est.h
--- src.p1/env_est.h 2010-10-21 13:06:37.000000000 +0300
+++ src.p2/env_est.h 2010-10-21 13:06:37.000000000 +0300
@@ -51,7 +51,8 @@ struct PS_ENC;
void
-extractSbrEnvelope(float *timeInPtr,
+extractSbrEnvelope(FFTWFContext_t *fftctx,
+ float *timeInPtr,
float *pCoreBuffer,
unsigned int timeInStride,
struct SBR_CONFIG_DATA *h_con,
diff -Nupr src.p1/hybrid.c src.p2/hybrid.c
--- src.p1/hybrid.c 2010-10-21 13:06:37.000000000 +0300
+++ src.p2/hybrid.c 2010-10-21 13:06:37.000000000 +0300
@@ -10,7 +10,8 @@
/* the 3GPP instrumenting tool */
-static void fourChannelFiltering( const float *pQmfReal,
+static void fourChannelFiltering( FFTWFContext_t *fftctx,
+ const float *pQmfReal,
const float *pQmfImag,
float **mHybridReal,
float **mHybridImag,
@@ -77,7 +78,7 @@ static void fourChannelFiltering( const
cum[3] = (real + imag ) * 0.70710678118655f;
- CFFTN(cum, 4, 1);
+ CFFTN(fftctx, cum, 4, 1);
for(n = 0; n < 4; n++) {
@@ -90,7 +91,8 @@ static void fourChannelFiltering( const
}
-static void eightChannelFiltering( const float *pQmfReal,
+static void eightChannelFiltering( FFTWFContext_t *fftctx,
+ const float *pQmfReal,
const float *pQmfImag,
float **mHybridReal,
float **mHybridImag)
@@ -196,7 +198,7 @@ static void eightChannelFiltering( const
cum[3] = real * 0.38268343236509f + imag * 0.92387953251129f;
- CFFTN(cum, 8, 1);
+ CFFTN(fftctx, cum, 8, 1);
for(n = 0; n < 8; n++) {
@@ -219,7 +221,8 @@ static void eightChannelFiltering( const
*/
/**************************************************************************/
void
-HybridAnalysis ( const float **mQmfReal,
+HybridAnalysis ( FFTWFContext_t *fftctx,
+ const float **mQmfReal,
const float **mQmfImag,
float **mHybridReal,
float **mHybridImag,
@@ -270,7 +273,8 @@ HybridAnalysis ( const float **mQmfReal,
/* filtering. */
- fourChannelFiltering( hHybrid->pWorkReal,
+ fourChannelFiltering( fftctx,
+ hHybrid->pWorkReal,
hHybrid->pWorkImag,
mHybridReal,
mHybridImag,
@@ -282,7 +286,8 @@ HybridAnalysis ( const float **mQmfReal,
/* filtering. */
- eightChannelFiltering( hHybrid->pWorkReal,
+ eightChannelFiltering( fftctx,
+ hHybrid->pWorkReal,
hHybrid->pWorkImag,
mHybridReal,
mHybridImag);
diff -Nupr src.p1/hybrid.h src.p2/hybrid.h
--- src.p1/hybrid.h 2010-10-21 13:06:37.000000000 +0300
+++ src.p2/hybrid.h 2010-10-21 13:06:37.000000000 +0300
@@ -31,7 +31,8 @@ typedef struct
typedef HYBRID *HANDLE_HYBRID;
void
-HybridAnalysis ( const float **mQmfReal,
+HybridAnalysis ( FFTWFContext_t *fftctx,
+ const float **mQmfReal,
const float **mQmfImag,
float **mHybridReal,
float **mHybridImag,
diff -Nupr src.p1/ps_enc.c src.p2/ps_enc.c
--- src.p1/ps_enc.c 2010-10-21 13:06:37.000000000 +0300
+++ src.p2/ps_enc.c 2010-10-21 13:06:37.000000000 +0300
@@ -303,7 +303,8 @@ DeletePsEnc(HANDLE_PS_ENC *h_ps_e)
****************************************************************************/
void
-EncodePsFrame(HANDLE_PS_ENC pms,
+EncodePsFrame(FFTWFContext_t *fftctx,
+ HANDLE_PS_ENC pms,
float **iBufferLeft,
float **rBufferLeft,
float **iBufferRight,
@@ -322,14 +323,16 @@ EncodePsFrame(HANDLE_PS_ENC pms,
- HybridAnalysis ( (const float**) rBufferLeft,
+ HybridAnalysis ( fftctx,
+ (const float**) rBufferLeft,
(const float**) iBufferLeft,
pms->mHybridRealLeft,
pms->mHybridImagLeft,
pms->hHybridLeft);
- HybridAnalysis ( (const float**) rBufferRight,
+ HybridAnalysis ( fftctx,
+ (const float**) rBufferRight,
(const float**) iBufferRight,
pms->mHybridRealRight,
pms->mHybridImagRight,
diff -Nupr src.p1/ps_enc.h src.p2/ps_enc.h
--- src.p1/ps_enc.h 2010-10-21 13:06:37.000000000 +0300
+++ src.p2/ps_enc.h 2010-10-21 13:06:37.000000000 +0300
@@ -93,7 +93,8 @@ DeletePsEnc(HANDLE_PS_ENC *h_ps_e);
void
-EncodePsFrame(HANDLE_PS_ENC h_ps_e,
+EncodePsFrame(FFTWFContext_t *fftctx,
+ HANDLE_PS_ENC h_ps_e,
float **iBufferLeft,
float **rBufferLeft,
float **iBufferRight,
diff -Nupr src.p1/psy_main.c src.p2/psy_main.c
--- src.p1/psy_main.c 2010-10-21 13:06:37.000000000 +0300
+++ src.p2/psy_main.c 2010-10-21 13:06:37.000000000 +0300
@@ -230,7 +230,8 @@ int psyMainInit(PSY_KERNEL *hPsy,
*****************************************************************************/
-int psyMain(int timeInStride,
+int psyMain(FFTWFContext_t *fftctx,
+ int timeInStride,
ELEMENT_INFO *elemInfo,
float *timeSignal,
PSY_DATA psyData[MAX_CHANNELS],
@@ -285,7 +286,8 @@ int psyMain(int timeInStride,
if(psyData[ch].blockSwitchingControl.windowSequence != SHORT_WINDOW){
- Transform_Real( psyData[ch].mdctDelayBuffer,
+ Transform_Real( fftctx,
+ psyData[ch].mdctDelayBuffer,
timeSignal+elemInfo->ChannelIndex[ch],
timeInStride,
psyData[ch].mdctSpectrum,
@@ -294,7 +296,8 @@ int psyMain(int timeInStride,
else {
- Transform_Real( psyData[ch].mdctDelayBuffer,
+ Transform_Real( fftctx,
+ psyData[ch].mdctDelayBuffer,
timeSignal+elemInfo->ChannelIndex[ch],
timeInStride,
psyData[ch].mdctSpectrum,
diff -Nupr src.p1/psy_main.h src.p2/psy_main.h
--- src.p1/psy_main.h 2010-10-21 13:06:37.000000000 +0300
+++ src.p2/psy_main.h 2010-10-21 13:06:37.000000000 +0300
@@ -30,7 +30,8 @@ int psyMainInit( PSY_KERNEL *hPsy,
int bandwidth);
-int psyMain(int nChannels, /*! total number of channels */
+int psyMain(FFTWFContext_t *fftctx,
+ int nChannels, /*! total number of channels */
ELEMENT_INFO *elemInfo,
float *timeSignal, /*! interleaved time signal */
PSY_DATA psyData[MAX_CHANNELS],
diff -Nupr src.p1/transform.c src.p2/transform.c
--- src.p1/transform.c 2010-10-21 13:06:37.000000000 +0300
+++ src.p2/transform.c 2010-10-21 13:06:37.000000000 +0300
@@ -111,7 +111,8 @@ static void postModulationDCT(float *x,i
}
-static void mdct(float *dctdata,
+static void mdct(FFTWFContext_t *fftctx,
+ float *dctdata,
const float *trigData,
const float *sineWindow,
int n,
@@ -124,7 +125,7 @@ static void mdct(float *dctdata,
preModulationDCT(dctdata,n,sineWindow);
- CFFTN(dctdata,n/2,-1);
+ CFFTN(fftctx, dctdata,n/2,-1);
assert (LD_FFT_TWIDDLE_TABLE_SIZE >= ld_n-1);
@@ -172,7 +173,7 @@ static void shiftMdctDelayBuffer(
}
-int Transform_Real(float *mdctDelayBuffer,float *timeSignal,int chIncrement,float *realOut,int blockType)
+int Transform_Real(FFTWFContext_t *fftctx, float *mdctDelayBuffer,float *timeSignal,int chIncrement,float *realOut,int blockType)
{
int i,w;
float timeSignalSample;
@@ -245,7 +246,7 @@ int Transform_Real(float *mdctDelayBuffe
}
- mdct(dctIn, fftTwiddleTab, LongWindowSine, FRAME_LEN_LONG, 10);
+ mdct(fftctx, dctIn, fftTwiddleTab, LongWindowSine, FRAME_LEN_LONG, 10);
break;
@@ -323,7 +324,7 @@ int Transform_Real(float *mdctDelayBuffe
}
- mdct(dctIn, fftTwiddleTab, LongWindowSine, FRAME_LEN_LONG, 10);
+ mdct(fftctx, dctIn, fftTwiddleTab, LongWindowSine, FRAME_LEN_LONG, 10);
break;
@@ -402,7 +403,7 @@ int Transform_Real(float *mdctDelayBuffe
}
- mdct(dctIn, fftTwiddleTab, LongWindowSine, FRAME_LEN_LONG, 10);
+ mdct(fftctx, dctIn, fftTwiddleTab, LongWindowSine, FRAME_LEN_LONG, 10);
break;
@@ -458,7 +459,7 @@ int Transform_Real(float *mdctDelayBuffe
}
- mdct(dctIn, fftTwiddleTab, ShortWindowSine, FRAME_LEN_SHORT, 7);
+ mdct(fftctx, dctIn, fftTwiddleTab, ShortWindowSine, FRAME_LEN_SHORT, 7);
}
diff -Nupr src.p1/transform.h src.p2/transform.h
--- src.p1/transform.h 2010-10-21 13:06:37.000000000 +0300
+++ src.p2/transform.h 2010-10-21 13:06:37.000000000 +0300
@@ -4,7 +4,8 @@
#ifndef __TRANSFORM_H__
#define __TRANSFORM_H__
-int Transform_Real(float *mdctDelayBuffer,
+int Transform_Real(FFTWFContext_t *fftctx,
+ float *mdctDelayBuffer,
float *timeSignal,
int chIncrement,
float *realOut,

View File

@ -0,0 +1,94 @@
diff -Nupr src.p2/aacenc.c src.p3/aacenc.c
--- src.p2/aacenc.c 2010-10-21 13:06:37.000000000 +0300
+++ src.p3/aacenc.c 2010-10-21 13:06:37.000000000 +0300
@@ -402,7 +402,7 @@ int AacEncEncode(struct AAC_ENCODER *aac
&aacEnc->qcOut);
- WriteBitstream( aacEnc->hBitStream,
+ WriteBitstreamData( aacEnc->hBitStream,
*elInfo,
&aacEnc->qcOut,
&aacEnc->psyOut,
diff -Nupr src.p2/bitenc.c src.p3/bitenc.c
--- src.p2/bitenc.c 2010-10-21 13:06:37.000000000 +0300
+++ src.p3/bitenc.c 2010-10-21 13:06:37.000000000 +0300
@@ -812,14 +812,14 @@ static void writeFillElement( const unsi
/*****************************************************************************
- functionname: WriteBitStream
+ functionname: WriteBitStreamData
description: main function of write process
returns:
input:
output:
*****************************************************************************/
-int WriteBitstream (HANDLE_BIT_BUF hBitStream,
+int WriteBitstreamData (HANDLE_BIT_BUF hBitStream,
ELEMENT_INFO elInfo,
QC_OUT *qcOut,
PSY_OUT* psyOut,
diff -Nupr src.p2/bitenc.h src.p3/bitenc.h
--- src.p2/bitenc.h 2010-10-21 13:06:37.000000000 +0300
+++ src.p3/bitenc.h 2010-10-21 13:06:37.000000000 +0300
@@ -16,7 +16,7 @@ struct BITSTREAMENCODER_INIT
-int WriteBitstream (HANDLE_BIT_BUF hBitstream,
+int WriteBitstreamData (HANDLE_BIT_BUF hBitstream,
ELEMENT_INFO elInfo,
QC_OUT* qcOut,
PSY_OUT* psyOut,
diff -Nupr src.p2/psy_main.c src.p3/psy_main.c
--- src.p2/psy_main.c 2010-10-21 13:06:37.000000000 +0300
+++ src.p3/psy_main.c 2010-10-21 13:06:37.000000000 +0300
@@ -597,7 +597,7 @@ static int advancePsychLong(PSY_DATA* ps
}
- TnsEncode( &psyOutChannel->tnsInfo,
+ TnsEncodeData( &psyOutChannel->tnsInfo,
tnsData,
psyConfLong->sfbCnt,
psyConfLong->tnsConf,
@@ -826,7 +826,7 @@ static int advancePsychShort(PSY_DATA* p
}
- TnsEncode( &psyOutChannel->tnsInfo,
+ TnsEncodeData( &psyOutChannel->tnsInfo,
tnsData,
psyConfShort->sfbCnt,
psyConfShort->tnsConf,
diff -Nupr src.p2/tns.c src.p3/tns.c
--- src.p2/tns.c 2010-10-21 13:06:37.000000000 +0300
+++ src.p3/tns.c 2010-10-21 13:06:37.000000000 +0300
@@ -463,11 +463,11 @@ void TnsSync(TNS_DATA *tnsDataDest,
/*****************************************************************************
- functionname: TnsEncode
+ functionname: TnsEncodeData
description:
*****************************************************************************/
-int TnsEncode(TNS_INFO* tnsInfo,
+int TnsEncodeData(TNS_INFO* tnsInfo,
TNS_DATA* tnsData,
int numOfSfb,
TNS_CONFIG tC,
diff -Nupr src.p2/tns_func.h src.p3/tns_func.h
--- src.p2/tns_func.h 2010-10-21 13:06:37.000000000 +0300
+++ src.p3/tns_func.h 2010-10-21 13:06:37.000000000 +0300
@@ -33,7 +33,7 @@ void TnsSync(TNS_DATA *tnsDataDest,
const int subBlockNumber,
const int blockType);
-int TnsEncode(TNS_INFO* tnsInfo,
+int TnsEncodeData(TNS_INFO* tnsInfo,
TNS_DATA* tnsData,
int numOfSfb,
TNS_CONFIG tC,

View File

@ -0,0 +1,85 @@
diff -Nupr src.p3/invf_est.c src.p4/invf_est.c
--- src.p3/invf_est.c 2010-10-21 13:06:37.000000000 +0300
+++ src.p4/invf_est.c 2010-10-21 13:06:37.000000000 +0300
@@ -29,11 +29,11 @@
-static float quantStepsSbr[4] = {1, 10, 14, 19};
-static float quantStepsOrig[4] = {0, 3, 7, 10};
-static float nrgBorders[4] = {25.0f, 30.0f, 35.0f, 40.0f};
+static const float quantStepsSbr[4] = {1, 10, 14, 19};
+static const float quantStepsOrig[4] = {0, 3, 7, 10};
+static const float nrgBorders[4] = {25.0f, 30.0f, 35.0f, 40.0f};
-static DETECTOR_PARAMETERS detectorParamsAAC = {
+static const DETECTOR_PARAMETERS detectorParamsAAC = {
quantStepsSbr,
quantStepsOrig,
nrgBorders,
@@ -60,7 +60,7 @@ static DETECTOR_PARAMETERS detectorParam
static const float hysteresis = 1.0f;
-static DETECTOR_PARAMETERS detectorParamsAACSpeech = {
+static const DETECTOR_PARAMETERS detectorParamsAACSpeech = {
quantStepsSbr,
quantStepsOrig,
nrgBorders,
@@ -87,13 +87,13 @@ static DETECTOR_PARAMETERS detectorParam
typedef const float FIR_FILTER[5];
-static FIR_FILTER fir_0 = { 1.0f };
-static FIR_FILTER fir_1 = { 0.3333333f, 0.6666666f };
-static FIR_FILTER fir_2 = { 0.125f, 0.375f, 0.5f };
-static FIR_FILTER fir_3 = { 0.0585786f, 0.2f, 0.3414214f, 0.4f };
-static FIR_FILTER fir_4 = { 0.0318305f, 0.1151638f, 0.2181695f, 0.3015028f, 0.3333333f };
+static const FIR_FILTER fir_0 = { 1.0f };
+static const FIR_FILTER fir_1 = { 0.3333333f, 0.6666666f };
+static const FIR_FILTER fir_2 = { 0.125f, 0.375f, 0.5f };
+static const FIR_FILTER fir_3 = { 0.0585786f, 0.2f, 0.3414214f, 0.4f };
+static const FIR_FILTER fir_4 = { 0.0318305f, 0.1151638f, 0.2181695f, 0.3015028f, 0.3333333f };
-static FIR_FILTER *fir_table[5] = {
+static const FIR_FILTER *fir_table[5] = {
&fir_0,
&fir_1,
&fir_2,
diff -Nupr src.p3/invf_est.h src.p4/invf_est.h
--- src.p3/invf_est.h 2010-10-21 13:06:37.000000000 +0300
+++ src.p4/invf_est.h 2010-10-21 13:06:37.000000000 +0300
@@ -8,9 +8,9 @@
typedef struct
{
- float *quantStepsSbr;
- float *quantStepsOrig;
- float *nrgBorders;
+ const float *quantStepsSbr;
+ const float *quantStepsOrig;
+ const float *nrgBorders;
int numRegionsSbr;
int numRegionsOrig;
int numRegionsNrg;
@@ -46,7 +46,7 @@ typedef struct
int noDetectorBands;
int noDetectorBandsMax;
- DETECTOR_PARAMETERS *detectorParams;
+ const DETECTOR_PARAMETERS *detectorParams;
INVF_MODE prevInvfMode[MAX_NUM_NOISE_VALUES];
DETECTOR_VALUES detectorValues[MAX_NUM_NOISE_VALUES];
diff -Nupr src.p3/psy_configuration.c src.p4/psy_configuration.c
--- src.p3/psy_configuration.c 2010-10-21 13:06:37.000000000 +0300
+++ src.p4/psy_configuration.c 2010-10-21 13:06:37.000000000 +0300
@@ -23,7 +23,7 @@ static const float BARC_THR_QUIET[] = {1
0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 3.0f, 5.0f, 10.0f, 20.0f, 30.0f};
-static SFB_INFO_TAB sfbInfoTab[] ={
+static const SFB_INFO_TAB sfbInfoTab[] ={
{11025, sfb_11025_long_1024, sfb_11025_short_128},
{12000, sfb_12000_long_1024, sfb_12000_short_128},
{16000, sfb_16000_long_1024, sfb_16000_short_128},

View File

@ -0,0 +1,30 @@
diff -Nupr src.p4/bitbuffer.c src.p5/bitbuffer.c
--- src.p4/bitbuffer.c 2010-10-21 13:06:37.000000000 +0300
+++ src.p5/bitbuffer.c 2010-10-21 13:06:37.000000000 +0300
@@ -191,7 +191,7 @@ unsigned long ReadBits(HANDLE_BIT_BUF hB
- /* return value is of type unsigned int, it can hold up to 32 bits
+ /* return value is of type unsigned int, it can hold up to 32 bits OETELAAR TODO wat is dit een 64 platform is??
this optimized code can read upto 25 Bits a time*/
if (noBitsToRead >= 25) {
@@ -235,7 +235,7 @@ unsigned long ReadBits(HANDLE_BIT_BUF hB
}
- returnValue = returnValue << (31 - noBitsToRead - hBitBuf->rBitPos) >> (32 - noBitsToRead);
+ returnValue = returnValue << ((LongSize-1) - noBitsToRead - hBitBuf->rBitPos) >> (LongSize - noBitsToRead);
return (returnValue);
@@ -281,7 +281,7 @@ unsigned char WriteBits(HANDLE_BIT_BUF h
bitsToWrite = min(hBitBuf->wBitPos + 1, noBitsToWrite);
- tmp = (unsigned char) ( writeValue << (32 - noBitsToWrite) >> (32 - bitsToWrite) << (hBitBuf->wBitPos + 1 - bitsToWrite) );
+ tmp = (unsigned char) ( writeValue << (LongSize - noBitsToWrite) >> (LongSize - bitsToWrite) << (hBitBuf->wBitPos + 1 - bitsToWrite) );
/* (hBitBuf->wBitPos + 1 - bitsToWrite) --> already calculated */
msk = ~(((1 << bitsToWrite) - 1) << (hBitBuf->wBitPos + 1 - bitsToWrite));

View File

@ -0,0 +1,21 @@
diff -Nupr src.p5/sbr_main.c src.p6/sbr_main.c
--- src.p5/sbr_main.c 2010-10-21 13:06:37.000000000 +0300
+++ src.p6/sbr_main.c 2010-10-21 13:06:37.000000000 +0300
@@ -57,11 +57,17 @@ static const struct
{ 28000, 36000, 22050, 2, 7, 8, 2, 0, -3, SBR_SWITCH_LRC, 2 }, /* nominal: 32 kbit/s */
{ 36000, 44000, 22050, 2, 10, 9, 2, 0, -3, SBR_SWITCH_LRC, 2 }, /* nominal: 40 kbit/s */
{ 44000, 52000, 22050, 2, 12, 9, 3, 0, -3, SBR_SWITCH_LRC, 2 }, /* nominal: 48 kbit/s */
+ { 52000, 60000, 22050, 2, 12, 9, 3, 0, -3, SBR_SWITCH_LRC, 2 }, /* nominal: 56 kbit/s */
+ { 60000, 68000, 22050, 2, 14, 10, 3, 0, -3, SBR_SWITCH_LRC, 2 }, /* nominal: 64 kbit/s */
+ { 68000, 72001, 22050, 2, 14, 10, 3, 0, -3, SBR_SWITCH_LRC, 2 }, /* nominal: 72 kbit/s */
{ 24000, 28000, 24000, 2, 5, 6, 1, 0, -3, SBR_SWITCH_LRC, 3 }, /* nominal: 24 kbit/s */
{ 28000, 36000, 24000, 2, 7, 8, 2, 0, -3, SBR_SWITCH_LRC, 2 }, /* nominal: 32 kbit/s */
{ 36000, 44000, 24000, 2, 10, 9, 2, 0, -3, SBR_SWITCH_LRC, 2 }, /* nominal: 40 kbit/s */
{ 44000, 52000, 24000, 2, 12, 9, 3, 0, -3, SBR_SWITCH_LRC, 2 }, /* nominal: 48 kbit/s */
+ { 52000, 60000, 24000, 2, 12, 9, 3, 0, -3, SBR_SWITCH_LRC, 2 }, /* nominal: 56 kbit/s */
+ { 60000, 68000, 24000, 2, 14, 10, 3, 0, -3, SBR_SWITCH_LRC, 2 }, /* nominal: 64 kbit/s */
+ { 68000, 72001, 24000, 2, 14, 10, 3, 0, -3, SBR_SWITCH_LRC, 2 }, /* nominal: 72 kbit/s */
};

View File

@ -0,0 +1,60 @@
diff -Nupr src.p6/env_bit.h src.p7/env_bit.h
--- src.p6/env_bit.h 2010-10-21 13:06:37.000000000 +0300
+++ src.p7/env_bit.h 2010-10-21 13:06:37.000000000 +0300
@@ -22,12 +22,24 @@
-#define SI_ID_BITS_AAC 3
-#define SI_FILL_COUNT_BITS 4
-#define SI_FILL_ESC_COUNT_BITS 8
-#define SI_FILL_EXTENTION_BITS 4
-#define ID_FIL 6
-
+//#define SI_ID_BITS_AAC 3
+//#define SI_FILL_COUNT_BITS 4
+//#define SI_FILL_ESC_COUNT_BITS 8
+//#define SI_FILL_EXTENTION_BITS 4
+//#define ID_FIL 6
+typedef enum{
+ SI_ID_BITS =(3),
+ SI_FILL_COUNT_BITS =(4),
+ SI_FILL_ESC_COUNT_BITS =(8),
+ SI_FILL_EXTENTION_BITS =(4),
+ SI_FILL_NIBBLE_BITS =(4),
+ SI_SCE_BITS =(4),
+ SI_CPE_BITS =(5),
+ SI_CPE_MS_MASK_BITS =(2) ,
+ SI_ICS_INFO_BITS_LONG =(1+2+1+6+1),
+ SI_ICS_INFO_BITS_SHORT =(1+2+1+4+7),
+ SI_ICS_BITS =(8+1+1+1),
+}SI_BITS;
diff -Nupr src.p6/stat_bits.c src.p7/stat_bits.c
--- src.p6/stat_bits.c 2010-10-21 13:06:37.000000000 +0300
+++ src.p7/stat_bits.c 2010-10-21 13:06:37.000000000 +0300
@@ -5,22 +5,6 @@
/* the 3GPP instrumenting tool */
-typedef enum{
- SI_ID_BITS =(3),
- SI_FILL_COUNT_BITS =(4),
- SI_FILL_ESC_COUNT_BITS =(8),
- SI_FILL_EXTENTION_BITS =(4),
- SI_FILL_NIBBLE_BITS =(4),
- SI_SCE_BITS =(4),
- SI_CPE_BITS =(5),
- SI_CPE_MS_MASK_BITS =(2) ,
- SI_ICS_INFO_BITS_LONG =(1+2+1+6+1),
- SI_ICS_INFO_BITS_SHORT =(1+2+1+4+7),
- SI_ICS_BITS =(8+1+1+1),
-}SI_BITS;
-
-
-
static int countMsMaskBits(int sfbCnt,
int sfbPerGroup,
int maxSfbPerGroup,

View File

@ -0,0 +1,255 @@
diff -Nupr src.p7/aacenc.c src.p8/aacenc.c
--- src.p7/aacenc.c 2010-10-21 13:06:37.000000000 +0300
+++ src.p8/aacenc.c 2010-10-21 13:06:37.000000000 +0300
@@ -52,22 +52,28 @@ static struct AAC_ENCODER aacEncoder;
returns: ---
------------------------------------------------------------------------------*/
-void AacInitDefaultConfig(AACENC_CONFIG *config)
+void AacInitDefaultConfig(aacplusEncConfiguration *config)
{
/* make the pre initialization of the structs flexible */
- memset(config, 0, sizeof(AACENC_CONFIG));
+ memset(config, 0, sizeof(aacplusEncConfiguration));
/* default configurations */
config->bitRate = 48000;
config->bandWidth = 0;
+ config->nSamplesPerFrame = AACENC_BLOCKSIZE;
}
+
+
+
+
+
/*---------------------------------------------------------------------------
functionname: AacEncOpen
@@ -77,38 +83,26 @@ void AacInitDefaultConfig(AACENC_CONFIG
---------------------------------------------------------------------------*/
int
-AacEncOpen ( struct AAC_ENCODER** phAacEnc, /* pointer to an encoder handle, initialized on return */
- const AACENC_CONFIG config /* pre-initialized config struct */
+AacEncOpen ( struct AAC_ENCODER *hAacEnc, /* pointer to an encoder handle, initialized on return */
+ aacplusEncConfiguration *config /* pre-initialized config struct */
)
{
int error = 0;
int profile = 1;
ELEMENT_INFO* elInfo = NULL;
- struct AAC_ENCODER *hAacEnc ;
-
-
/* counting previous operations */
- hAacEnc = &aacEncoder;
-
-
- if (phAacEnc==0) {
-
- error=1;
- }
-
-
if (!error) {
/* sanity checks on config structure */
- error = (&config == 0 || phAacEnc == 0 ||
- config.nChannelsIn < 1 || config.nChannelsIn > MAX_CHANNELS ||
- config.nChannelsOut < 1 || config.nChannelsOut > MAX_CHANNELS ||
- config.nChannelsIn < config.nChannelsOut ||
- (config.bitRate!=0 && (config.bitRate / config.nChannelsOut < 8000 ||
- config.bitRate / config.nChannelsOut > 160000)));
+ error = (&config == 0 || hAacEnc == 0 ||
+ config->nChannelsIn < 1 || config->nChannelsIn > MAX_CHANNELS ||
+ config->nChannelsOut < 1 || config->nChannelsOut > MAX_CHANNELS ||
+ config->nChannelsIn < config->nChannelsOut ||
+ (config->bitRate!=0 && (config->bitRate / config->nChannelsOut < 8000 ||
+ config->bitRate / config->nChannelsOut > 160000)));
}
/* check sample rate */
@@ -116,7 +110,7 @@ AacEncOpen ( struct AAC_ENCODER** ph
if (!error) {
- switch (config.sampleRate) {
+ switch (config->sampleRate) {
case 8000: case 11025: case 12000:
case 16000: case 22050: case 24000:
case 32000: case 44100: case 48000:
@@ -134,8 +128,8 @@ AacEncOpen ( struct AAC_ENCODER** ph
if (!error) {
- if (config.bitRate > ((float)(MAX_CHANNEL_BITS-744)/FRAME_LEN_LONG*
- config.sampleRate*config.nChannelsOut))
+ if (config->bitRate > ((float)(MAX_CHANNEL_BITS-744)/FRAME_LEN_LONG*
+ config->sampleRate*config->nChannelsOut))
{
error=1;
@@ -153,7 +147,7 @@ AacEncOpen ( struct AAC_ENCODER** ph
if (!error) {
- error = InitElementInfo (config.nChannelsOut,
+ error = InitElementInfo (config->nChannelsOut,
&hAacEnc->elInfo);
}
@@ -179,12 +173,12 @@ AacEncOpen ( struct AAC_ENCODER** ph
/* counting previous operation */
- hAacEnc->bandwidth90dB = (int)hAacEnc->config.bandWidth;
+ hAacEnc->bandwidth90dB = (int)hAacEnc->config->bandWidth;
error = psyMainInit(&hAacEnc->psyKernel,
- config.sampleRate,
- config.bitRate,
+ config->sampleRate,
+ config->bitRate,
elInfo->nChannelsInEl,
tnsMask,
hAacEnc->bandwidth90dB);
@@ -220,20 +214,20 @@ AacEncOpen ( struct AAC_ENCODER** ph
qcInit.bitRes = qcInit.maxBits;
- qcInit.averageBits = (config.bitRate * FRAME_LEN_LONG) / config.sampleRate;
+ qcInit.averageBits = (config->bitRate * FRAME_LEN_LONG) / config->sampleRate;
- qcInit.padding.paddingRest = config.sampleRate;
+ qcInit.padding.paddingRest = config->sampleRate;
- qcInit.meanPe = 10.0f * FRAME_LEN_LONG * hAacEnc->bandwidth90dB/(config.sampleRate/2.0f);
+ qcInit.meanPe = 10.0f * FRAME_LEN_LONG * hAacEnc->bandwidth90dB/(config->sampleRate/2.0f);
qcInit.maxBitFac = (float)((MAX_CHANNEL_BITS-744)*elInfo->nChannelsInEl) /
(float)(qcInit.averageBits?qcInit.averageBits:1);
- qcInit.bitrate = config.bitRate;
+ qcInit.bitrate = config->bitRate;
error = QCInit(&hAacEnc->qcKernel, &qcInit);
@@ -245,8 +239,8 @@ AacEncOpen ( struct AAC_ENCODER** ph
hAacEnc->bseInit.nChannels = elInfo->nChannelsInEl;
- hAacEnc->bseInit.bitrate = config.bitRate;
- hAacEnc->bseInit.sampleRate = config.sampleRate;
+ hAacEnc->bseInit.bitrate = config->bitRate;
+ hAacEnc->bseInit.sampleRate = config->sampleRate;
hAacEnc->bseInit.profile = profile;
}
@@ -256,10 +250,10 @@ AacEncOpen ( struct AAC_ENCODER** ph
if (!error) {
- hAacEnc->downmix = (config.nChannelsIn==2 && config.nChannelsOut==1);
+ hAacEnc->downmix = (config->nChannelsIn==2 && config->nChannelsOut==1);
- hAacEnc->downmixFac = (hAacEnc->downmix) ? config.nChannelsIn : 1;
+ hAacEnc->downmixFac = (hAacEnc->downmix) ? config->nChannelsIn : 1;
}
@@ -273,7 +267,7 @@ AacEncOpen ( struct AAC_ENCODER** ph
if ( elInfo->elType == ID_CPE &&
- (config.sampleRate <= 24000 && (config.bitRate/elInfo->nChannelsInEl*2) < 60000) ) {
+ (config->sampleRate <= 24000 && (config->bitRate/elInfo->nChannelsInEl*2) < 60000) ) {
float scfUsedRatio = (float) hAacEnc->psyKernel.psyConfLong.sfbActive / hAacEnc->psyKernel.psyConfLong.sfbCnt ;
@@ -282,8 +276,8 @@ AacEncOpen ( struct AAC_ENCODER** ph
error = InitStereoPreProcessing(&(hAacEnc->stereoPrePro),
elInfo->nChannelsInEl,
- config.bitRate,
- config.sampleRate,
+ config->bitRate,
+ config->sampleRate,
scfUsedRatio);
}
}
@@ -295,11 +289,9 @@ AacEncOpen ( struct AAC_ENCODER** ph
AacEncClose(hAacEnc);
- hAacEnc=0;
}
- *phAacEnc = hAacEnc;
@@ -361,8 +353,8 @@ int AacEncEncode(struct AAC_ENCODER *aac
AdjustBitrate(&aacEnc->qcKernel,
- aacEnc->config.bitRate,
- aacEnc->config.sampleRate);
+ aacEnc->config->bitRate,
+ aacEnc->config->sampleRate);
/*
aacEnc->qcKernel.elementBits
@@ -456,11 +448,10 @@ void AacEncClose (struct AAC_ENCODER* hA
error = PsyOutDelete(&hAacEnc->psyOut);
-
- DeleteBitBuffer(&hAacEnc->hBitStream);
+ if(hAacEnc->hBitStream)
+ DeleteBitBuffer(&hAacEnc->hBitStream);
- hAacEnc=0;
}
diff -Nupr src.p7/aacenc.h src.p8/aacenc.h
--- src.p7/aacenc.h 2010-10-21 13:06:37.000000000 +0300
+++ src.p8/aacenc.h 2010-10-21 13:06:37.000000000 +0300
@@ -46,7 +46,7 @@ struct AAC_ENCODER;
returns: ---
------------------------------------------------------------------------------*/
-void AacInitDefaultConfig(AACENC_CONFIG *config);
+void AacInitDefaultConfig(aacplusEncConfiguration *config);
/*---------------------------------------------------------------------------
@@ -57,8 +57,8 @@ void AacInitDefaultConfig(AACENC_CONFIG
---------------------------------------------------------------------------*/
int AacEncOpen
-( struct AAC_ENCODER** phAacEnc, /* pointer to an encoder handle, initialized on return */
- const AACENC_CONFIG config /* pre-initialized config struct */
+( struct AAC_ENCODER* hAacEnc, /* pointer to an encoder handle, initialized on return */
+ aacplusEncConfiguration *config /* pre-initialized config struct */
);
int AacEncEncode(struct AAC_ENCODER *hAacEnc,

View File

@ -0,0 +1,190 @@
diff -Nupr src.p8/aacenc.c src.p9/aacenc.c
--- src.p8/aacenc.c 2010-10-21 13:06:37.000000000 +0300
+++ src.p9/aacenc.c 2010-10-21 13:06:37.000000000 +0300
@@ -10,39 +10,7 @@
/* the 3GPP instrumenting tool */
-struct AAC_ENCODER {
- AACENC_CONFIG config;
-
- ELEMENT_INFO elInfo;
-
- QC_STATE qcKernel;
- QC_OUT qcOut;
-
- PSY_OUT psyOut;
- PSY_KERNEL psyKernel;
-
- struct BITSTREAMENCODER_INIT bseInit;
-
- struct STEREO_PREPRO stereoPrePro;
-
- struct BIT_BUF bitStream;
- HANDLE_BIT_BUF hBitStream;
-
- /* lifetime vars */
- int downmix;
- int downmixFac;
- int dualMono;
- int bandwidth90dB;
-};
-
-
-/*
- static AAC encoder instance for one encoder
- all other major static and dynamic memory areas are located
- in module aac_ram.c and aac_rom.c
-*/
-static struct AAC_ENCODER aacEncoder;
/*-----------------------------------------------------------------------------
diff -Nupr src.p8/aacenc.h src.p9/aacenc.h
--- src.p8/aacenc.h 2010-10-21 13:06:37.000000000 +0300
+++ src.p9/aacenc.h 2010-10-21 13:06:37.000000000 +0300
@@ -5,38 +5,36 @@
#ifndef _aacenc_h_
#define _aacenc_h_
-/* here we distinguish between stereo and the mono only encoder */
-#ifdef MONO_ONLY
-#define MAX_CHANNELS 1
-#else
-#define MAX_CHANNELS 2
-#endif
-
-#define AACENC_BLOCKSIZE 1024 /*! encoder only takes BLOCKSIZE samples at a time */
-#define AACENC_TRANS_FAC 8 /*! encoder short long ratio */
-#define AACENC_PCM_LEVEL 1.0 /*! encoder pcm 0db refernence */
-
-
-/*-------------------------- defines --------------------------------------*/
-
-#define BUFFERSIZE 1024 /* anc data */
-
-/*-------------------- structure definitions ------------------------------*/
-
-typedef struct {
- int sampleRate; /* audio file sample rate */
- int bitRate; /* encoder bit rate in bits/sec */
- int nChannelsIn; /* number of channels on input (1,2) */
- int nChannelsOut; /* number of channels on output (1,2) */
- int bandWidth; /* core coder audio bandwidth in Hz */
-} AACENC_CONFIG;
-
-struct AAC_ENCODER;
-
-/*
- * p u b l i c a n c i l l a r y
- *
- */
+struct AAC_ENCODER {
+//#ifdef _FFTW3
+ FFTWFContext_t *fftctx;
+//#endif
+
+ aacplusEncConfiguration *config;
+ AACRam_t *aac_ram;
+ SBRRam_t *sbr_ram;
+
+ ELEMENT_INFO elInfo;
+
+ QC_STATE qcKernel;
+ QC_OUT qcOut;
+
+ PSY_OUT psyOut;
+ PSY_KERNEL psyKernel;
+
+ struct BITSTREAMENCODER_INIT bseInit;
+
+ struct STEREO_PREPRO stereoPrePro;
+
+ struct BIT_BUF bitStream;
+ HANDLE_BIT_BUF hBitStream;
+
+ /* lifetime vars */
+ int downmix;
+ int downmixFac;
+ int dualMono;
+ int bandwidth90dB;
+};
/*-----------------------------------------------------------------------------
diff -Nupr src.p8/sbr_main.c src.p9/sbr_main.c
--- src.p8/sbr_main.c 2010-10-21 13:06:37.000000000 +0300
+++ src.p9/sbr_main.c 2010-10-21 13:06:37.000000000 +0300
@@ -72,28 +72,6 @@ static const struct
};
-struct SBR_ENCODER
-{
-
- struct SBR_CONFIG_DATA sbrConfigData;
- struct SBR_HEADER_DATA sbrHeaderData;
- struct SBR_BITSTREAM_DATA sbrBitstreamData;
- struct ENV_CHANNEL* hEnvChannel[MAX_CHANNELS];
- struct COMMON_DATA CmonData;
- struct PS_ENC *hPsEnc;
- SBR_QMF_FILTER_BANK *hSynthesisQmfBank;
- unsigned int sbrPayloadPrevious[MAX_PAYLOAD_SIZE/(sizeof(int))];
- unsigned int sbrPayload[MAX_PAYLOAD_SIZE/(sizeof(int))];
- int sbrPayloadSize;
-} ;
-
-
-static struct ENV_CHANNEL EnvChannel[MAX_CHANNELS];
-static struct SBR_ENCODER sbrEncoder;
-static SBR_QMF_FILTER_BANK SynthesisQmfBank;
-static struct PS_ENC psEncoder;
-
-
/***************************************************************************/
/*!
@@ -804,21 +782,18 @@ createEnvChannel (int chan,
*****************************************************************************/
int
-EnvOpen (HANDLE_SBR_ENCODER * hEnvEncoder,
+EnvOpen (HANDLE_SBR_ENCODER hEnvEnc,
float *pCoreBuffer,
sbrConfigurationPtr params,
int *coreBandWith)
{
- HANDLE_SBR_ENCODER hEnvEnc ;
int ch;
- *hEnvEncoder=0;
- hEnvEnc = &sbrEncoder;
/* hEnvEnc->hEnvChannel[]
EnvChannel[]
@@ -1085,7 +1060,6 @@ EnvOpen (HANDLE_SBR_ENCODER * hEnvEncode
hEnvEnc->sbrPayloadSize = 0;
- *hEnvEncoder = hEnvEnc;
*coreBandWith = hEnvEnc->sbrConfigData.xOverFreq;
diff -Nupr src.p8/sbr_main.h src.p9/sbr_main.h
--- src.p8/sbr_main.h 2010-10-21 13:06:37.000000000 +0300
+++ src.p9/sbr_main.h 2010-10-21 13:06:37.000000000 +0300
@@ -102,7 +102,7 @@ typedef struct SBR_ENCODER *HANDLE_SBR_E
int
-EnvOpen (HANDLE_SBR_ENCODER* hEnvEncoder,
+EnvOpen (HANDLE_SBR_ENCODER hEnvEnc,
float *pCoreBuffer,
sbrConfigurationPtr params,
int *coreBandWith

View File

@ -0,0 +1,894 @@
diff -Nupr src.p9/aacenc.c src.p10/aacenc.c
--- src.p9/aacenc.c 2010-10-21 13:06:37.000000000 +0300
+++ src.p10/aacenc.c 2010-10-21 13:06:37.000000000 +0300
@@ -130,7 +130,7 @@ AacEncOpen ( struct AAC_ENCODER *hA
if (!error) {
- error = (PsyNew(&hAacEnc->psyKernel, elInfo->nChannelsInEl) ||
+ error = (PsyNew(hAacEnc->aac_ram, hAacEnc->sbr_ram, &hAacEnc->psyKernel, elInfo->nChannelsInEl) ||
PsyOutNew(&hAacEnc->psyOut));
}
@@ -157,7 +157,7 @@ AacEncOpen ( struct AAC_ENCODER *hA
if (!error) {
- error = QCOutNew(&hAacEnc->qcOut,
+ error = QCOutNew(hAacEnc->aac_ram, &hAacEnc->qcOut,
elInfo->nChannelsInEl);
}
@@ -198,7 +198,7 @@ AacEncOpen ( struct AAC_ENCODER *hA
qcInit.bitrate = config->bitRate;
- error = QCInit(&hAacEnc->qcKernel, &qcInit);
+ error = QCInit(hAacEnc->aac_ram, &hAacEnc->qcKernel, &qcInit);
}
/* init bitstream encoder */
@@ -307,7 +307,8 @@ int AacEncEncode(struct AAC_ENCODER *aac
}
- psyMain(timeInStride,
+ psyMain(aacEnc->fftctx,
+ timeInStride,
elInfo,
timeSignal,
&aacEnc->psyKernel.psyData[elInfo->ChannelIndex[0]],
@@ -332,7 +333,8 @@ int AacEncEncode(struct AAC_ENCODER *aac
*/
/* min() */
- QCMain( &aacEnc->qcKernel,
+ QCMain( aacEnc->aac_ram,
+ &aacEnc->qcKernel,
elInfo->nChannelsInEl,
&aacEnc->qcKernel.elementBits,
&aacEnc->qcKernel.adjThr.adjThrStateElem,
diff -Nupr src.p9/dyn_bits.c src.p10/dyn_bits.c
--- src.p9/dyn_bits.c 2010-10-21 13:06:37.000000000 +0300
+++ src.p10/dyn_bits.c 2010-10-21 13:06:37.000000000 +0300
@@ -417,7 +417,7 @@ gmStage2(SECTION_INFO * section,
count bits used by the noiseless coder
*/
static void
-noiselessCounter(SECTION_DATA * sectionData,
+noiselessCounter(AACRam_t *aacram, SECTION_DATA * sectionData,
int mergeGainLookUp[MAX_SFB_LONG],
int bitLookUp[MAX_SFB_LONG][CODE_BOOK_ESC_NDX + 1],
const short *quantSpectrum,
@@ -441,12 +441,12 @@ noiselessCounter(SECTION_DATA * sectionD
case STOP_WINDOW:
- sideInfoTab = sideInfoTabLong;
+ sideInfoTab = aacram->sideInfoTabLong;
break;
case SHORT_WINDOW:
- sideInfoTab = sideInfoTabShort;
+ sideInfoTab = aacram->sideInfoTabShort;
break;
}
@@ -715,7 +715,8 @@ static void scfCount(const short *scalef
typedef int (*lookUpTable)[CODE_BOOK_ESC_NDX + 1];
int
-dynBitCount(const short *quantSpectrum,
+dynBitCount(AACRam_t *aacram,
+ const short *quantSpectrum,
const unsigned short *maxValueInSfb,
const signed short *scalefac,
const int blockType,
@@ -742,7 +743,7 @@ dynBitCount(const short *quantS
sectionData->maxSfbPerGroup = maxSfbPerGroup;
- noiselessCounter(sectionData,
+ noiselessCounter(aacram, sectionData,
mergeGainLookUp,
(lookUpTable)bitLookUp,
quantSpectrum,
@@ -766,7 +767,7 @@ dynBitCount(const short *quantS
int
-BCInit(void)
+BCInit(AACRam_t *aacram)
{
int i;
@@ -777,14 +778,14 @@ BCInit(void)
for (i = 0; i <= MAX_SFB_LONG; i++)
{
- sideInfoTabLong[i] = calcSideInfoBits(i, LONG_WINDOW);
+ aacram->sideInfoTabLong[i] = calcSideInfoBits(i, LONG_WINDOW);
}
/* sideInfoTabShort[] */
for (i = 0; i <= MAX_SFB_SHORT; i++)
{
- sideInfoTabShort[i] = calcSideInfoBits(i, SHORT_WINDOW);
+ aacram->sideInfoTabShort[i] = calcSideInfoBits(i, SHORT_WINDOW);
}
diff -Nupr src.p9/dyn_bits.h src.p10/dyn_bits.h
--- src.p9/dyn_bits.h 2010-10-21 13:06:37.000000000 +0300
+++ src.p10/dyn_bits.h 2010-10-21 13:06:37.000000000 +0300
@@ -36,10 +36,10 @@ typedef struct
}
SECTION_DATA;
+int BCInit(AACRam_t *aacram);
-int BCInit(void);
-
-int dynBitCount(const short *quantSpectrum,
+int dynBitCount(AACRam_t *aacram,
+ const short *quantSpectrum,
const unsigned short *maxValueInSfb,
const signed short *scalefac,
const int blockType,
diff -Nupr src.p9/env_est.c src.p10/env_est.c
--- src.p9/env_est.c 2010-10-21 13:06:37.000000000 +0300
+++ src.p10/env_est.c 2010-10-21 13:06:37.000000000 +0300
@@ -1675,7 +1675,7 @@ extractSbrEnvelope (FFTWFContext_t *fftc
****************************************************************************/
int
-CreateExtractSbrEnvelope (int chan,
+CreateExtractSbrEnvelope (SBRRam_t *sbrram, int chan,
HANDLE_SBR_EXTRACT_ENVELOPE hSbrCut,
int start_index)
{
@@ -1723,7 +1723,7 @@ CreateExtractSbrEnvelope (int chan,
for (i = 0; i < YBufferLength; i++) {
- hSbrCut->YBuffer[i] = &sbr_envYBuffer[chan*YBufferLength*64 + i*QMF_CHANNELS];
+ hSbrCut->YBuffer[i] = &sbrram->sbr_envYBuffer[chan*YBufferLength*64 + i*QMF_CHANNELS];
}
/* hSbrCut->rBuffer[]
@@ -1732,10 +1732,10 @@ CreateExtractSbrEnvelope (int chan,
for (i = 0; i < rBufferLength; i++) {
- hSbrCut->rBuffer[i] = &sbr_envRBuffer[chan*QMF_TIME_SLOTS*QMF_CHANNELS + i*QMF_CHANNELS];
+ hSbrCut->rBuffer[i] = &sbrram->sbr_envRBuffer[chan*QMF_TIME_SLOTS*QMF_CHANNELS + i*QMF_CHANNELS];
- hSbrCut->iBuffer[i] = &sbr_envIBuffer[chan*QMF_TIME_SLOTS*QMF_CHANNELS + i*QMF_CHANNELS];
+ hSbrCut->iBuffer[i] = &sbrram->sbr_envIBuffer[chan*QMF_TIME_SLOTS*QMF_CHANNELS + i*QMF_CHANNELS];
}
diff -Nupr src.p9/env_est.h src.p10/env_est.h
--- src.p9/env_est.h 2010-10-21 13:06:37.000000000 +0300
+++ src.p10/env_est.h 2010-10-21 13:06:37.000000000 +0300
@@ -29,7 +29,7 @@ typedef SBR_EXTRACT_ENVELOPE *HANDLE_SBR
/************ Function Declarations ***************/
int
-CreateExtractSbrEnvelope (int chan,
+CreateExtractSbrEnvelope (SBRRam_t *sbrram, int chan,
HANDLE_SBR_EXTRACT_ENVELOPE hSbr,
diff -Nupr src.p9/mh_det.c src.p10/mh_det.c
--- src.p9/mh_det.c 2010-10-21 13:06:37.000000000 +0300
+++ src.p10/mh_det.c 2010-10-21 13:06:37.000000000 +0300
@@ -1264,7 +1264,8 @@ SbrMissingHarmonicsDetectorQmf(HANDLE_SB
*/
/**************************************************************************/
int
-CreateSbrMissingHarmonicsDetector (int chan,
+CreateSbrMissingHarmonicsDetector (SBRRam_t *sbrram,
+ int chan,
HANDLE_SBR_MISSING_HARMONICS_DETECTOR hSbrMHDet,
int sampleFreq,
unsigned char* freqBandTable,
@@ -1305,7 +1306,7 @@ CreateSbrMissingHarmonicsDetector (int c
hs->noEstPerFrame = noEstPerFrame;
- ptr = &sbr_toncorrBuff[chan*5*NO_OF_ESTIMATES*MAX_FREQ_COEFFS];
+ ptr = &sbrram->sbr_toncorrBuff[chan*5*NO_OF_ESTIMATES*MAX_FREQ_COEFFS];
/* hs->tonalityDiff[i]
hs->sfmOrig[i]
@@ -1347,13 +1348,13 @@ CreateSbrMissingHarmonicsDetector (int c
memset(hs->guideVectors[i].guideVectorOrig,0,sizeof(float)*MAX_FREQ_COEFFS);
- hs->detectionVectors[i] = &(sbr_detectionVectors[chan*NO_OF_ESTIMATES*MAX_FREQ_COEFFS + i*MAX_FREQ_COEFFS]);
+ hs->detectionVectors[i] = &(sbrram->sbr_detectionVectors[chan*NO_OF_ESTIMATES*MAX_FREQ_COEFFS + i*MAX_FREQ_COEFFS]);
memset(hs->detectionVectors[i],0,sizeof(unsigned char)*MAX_FREQ_COEFFS);
- hs->guideVectors[i].guideVectorDetected = &(sbr_guideVectorDetected[chan*NO_OF_ESTIMATES*MAX_FREQ_COEFFS + i*MAX_FREQ_COEFFS]);
+ hs->guideVectors[i].guideVectorDetected = &(sbrram->sbr_guideVectorDetected[chan*NO_OF_ESTIMATES*MAX_FREQ_COEFFS + i*MAX_FREQ_COEFFS]);
memset(hs->guideVectors[i].guideVectorDetected,0,sizeof(unsigned char)*MAX_FREQ_COEFFS);
@@ -1361,13 +1362,13 @@ CreateSbrMissingHarmonicsDetector (int c
}
- hs->prevEnvelopeCompensation = &(sbr_prevEnvelopeCompensation[chan*MAX_FREQ_COEFFS]);
+ hs->prevEnvelopeCompensation = &(sbrram->sbr_prevEnvelopeCompensation[chan*MAX_FREQ_COEFFS]);
memset( hs->prevEnvelopeCompensation,0, sizeof(char)*MAX_FREQ_COEFFS);
- hs->guideScfb = &(sbr_guideScfb[chan*MAX_FREQ_COEFFS]);
+ hs->guideScfb = &(sbrram->sbr_guideScfb[chan*MAX_FREQ_COEFFS]);
memset( hs->guideScfb,0, sizeof(unsigned char)*MAX_FREQ_COEFFS);
@@ -1377,7 +1378,7 @@ CreateSbrMissingHarmonicsDetector (int c
hs->previousTransientFrame = 0;
hs->previousTransientPos = 0;
- assert (ptr-&sbr_toncorrBuff[0] <= 5*MAX_CHANNELS*NO_OF_ESTIMATES*MAX_FREQ_COEFFS);
+ assert (ptr-&sbrram->sbr_toncorrBuff[0] <= 5*MAX_CHANNELS*NO_OF_ESTIMATES*MAX_FREQ_COEFFS);
diff -Nupr src.p9/mh_det.h src.p10/mh_det.h
--- src.p9/mh_det.h 2010-10-21 13:06:37.000000000 +0300
+++ src.p10/mh_det.h 2010-10-21 13:06:37.000000000 +0300
@@ -61,7 +61,8 @@ SbrMissingHarmonicsDetectorQmf(HANDLE_SB
int
-CreateSbrMissingHarmonicsDetector(int chan,
+CreateSbrMissingHarmonicsDetector(SBRRam_t *sbrram,
+ int chan,
HANDLE_SBR_MISSING_HARMONICS_DETECTOR h_sbrMissingHarmonicsDetector,
int sampleFreq,
unsigned char* freqBandTable,
diff -Nupr src.p9/ps_enc.c src.p10/ps_enc.c
--- src.p9/ps_enc.c 2010-10-21 13:06:37.000000000 +0300
+++ src.p10/ps_enc.c 2010-10-21 13:06:37.000000000 +0300
@@ -56,7 +56,8 @@ int GetPsMode(int bitRate)
}
int
-CreatePsEnc(HANDLE_PS_ENC h_ps_e,
+CreatePsEnc(SBRRam_t *sbrram,
+ HANDLE_PS_ENC h_ps_e,
int psMode)
{
int i;
@@ -67,10 +68,10 @@ CreatePsEnc(HANDLE_PS_ENC h_ps_e,
- ptr1 = &sbr_envYBuffer[QMF_TIME_SLOTS * QMF_CHANNELS];
- ptr2 = &PsBuf2[0];
- ptr3 = &PsBuf3[0];
- ptr4 = &PsBuf4[0];
+ ptr1 = &sbrram->sbr_envYBuffer[QMF_TIME_SLOTS * QMF_CHANNELS];
+ ptr2 = &sbrram->PsBuf2[0];
+ ptr3 = &sbrram->PsBuf3[0];
+ ptr4 = &sbrram->PsBuf4[0];
if (h_ps_e == NULL)
diff -Nupr src.p9/ps_enc.h src.p10/ps_enc.h
--- src.p9/ps_enc.h 2010-10-21 13:06:37.000000000 +0300
+++ src.p10/ps_enc.h 2010-10-21 13:06:37.000000000 +0300
@@ -85,7 +85,8 @@ typedef struct PS_ENC *HANDLE_PS_ENC;
int GetPsMode(int bitRate);
int
-CreatePsEnc(HANDLE_PS_ENC h_ps_enc,
+CreatePsEnc(SBRRam_t *sbrram,
+ HANDLE_PS_ENC h_ps_enc,
int psMode);
void
diff -Nupr src.p9/psy_main.c src.p10/psy_main.c
--- src.p9/psy_main.c 2010-10-21 13:06:37.000000000 +0300
+++ src.p10/psy_main.c 2010-10-21 13:06:37.000000000 +0300
@@ -44,7 +44,7 @@ static int advancePsychShortMS (PSY_DATA
input: pointer to a psych handle
*****************************************************************************/
-int PsyNew(PSY_KERNEL *hPsy, int nChan)
+int PsyNew(AACRam_t *aacram, SBRRam_t *sbrram, PSY_KERNEL *hPsy, int nChan)
{
int i;
@@ -60,7 +60,7 @@ int PsyNew(PSY_KERNEL *hPsy, int nChan)
reserve memory for mdct delay buffer
*/
- hPsy->psyData[i].mdctDelayBuffer = &mdctDelayBuffer[i*BLOCK_SWITCHING_OFFSET];
+ hPsy->psyData[i].mdctDelayBuffer = &aacram->mdctDelayBuffer[i*BLOCK_SWITCHING_OFFSET];
/*
@@ -68,12 +68,12 @@ int PsyNew(PSY_KERNEL *hPsy, int nChan)
*/
- hPsy->psyData[i].mdctSpectrum = &sbr_envRBuffer[i*FRAME_LEN_LONG];
+ hPsy->psyData[i].mdctSpectrum = &sbrram->sbr_envRBuffer[i*FRAME_LEN_LONG];
}
- hPsy->pScratchTns = sbr_envIBuffer;
+ hPsy->pScratchTns = sbrram->sbr_envIBuffer;
diff -Nupr src.p9/psy_main.h src.p10/psy_main.h
--- src.p9/psy_main.h 2010-10-21 13:06:37.000000000 +0300
+++ src.p10/psy_main.h 2010-10-21 13:06:37.000000000 +0300
@@ -16,7 +16,7 @@ typedef struct {
}PSY_KERNEL;
-int PsyNew( PSY_KERNEL *hPsy, int nChan);
+int PsyNew( AACRam_t *aacram, SBRRam_t *sbrram, PSY_KERNEL *hPsy, int nChan);
int PsyDelete( PSY_KERNEL *hPsy);
int PsyOutNew( PSY_OUT *hPsyOut);
diff -Nupr src.p9/qc_main.c src.p10/qc_main.c
--- src.p9/qc_main.c 2010-10-21 13:06:37.000000000 +0300
+++ src.p10/qc_main.c 2010-10-21 13:06:37.000000000 +0300
@@ -118,7 +118,7 @@ static int framePadding(int bitRate,
**********************************************************************************/
-int QCOutNew(QC_OUT *hQC, int nChannels)
+int QCOutNew(AACRam_t *aacram, QC_OUT *hQC, int nChannels)
{
int error=0;
int i;
@@ -135,13 +135,13 @@ int QCOutNew(QC_OUT *hQC, int nChannels)
for (i=0; i<nChannels; i++) {
- hQC->qcChannel[i].quantSpec = &quantSpec[i*FRAME_LEN_LONG];
+ hQC->qcChannel[i].quantSpec = &aacram->quantSpec[i*FRAME_LEN_LONG];
- hQC->qcChannel[i].maxValueInSfb = &maxValueInSfb[i*MAX_GROUPED_SFB];
+ hQC->qcChannel[i].maxValueInSfb = &aacram->maxValueInSfb[i*MAX_GROUPED_SFB];
- hQC->qcChannel[i].scf = &scf[i*MAX_GROUPED_SFB];
+ hQC->qcChannel[i].scf = &aacram->scf[i*MAX_GROUPED_SFB];
}
@@ -231,7 +231,7 @@ void QCDelete(QC_STATE *hQC)
return:
**********************************************************************************/
-int QCInit(QC_STATE *hQC,
+int QCInit(AACRam_t *aacram, QC_STATE *hQC,
struct QC_INIT *init)
{
@@ -264,7 +264,7 @@ int QCInit(QC_STATE *hQC,
hQC->elementBits.chBitrate);
- BCInit();
+ BCInit(aacram);
@@ -279,7 +279,8 @@ int QCInit(QC_STATE *hQC,
return:
**********************************************************************************/
-int QCMain(QC_STATE* hQC,
+int QCMain(AACRam_t *aacram,
+ QC_STATE* hQC,
int nChannels,
ELEMENT_BITS* elBits,
ATS_ELEMENT* adjThrStateElement,
@@ -350,7 +351,8 @@ int QCMain(QC_STATE* hQC,
qcOutElement->staticBitsUsed+qcOutElement->ancBitsUsed);
- EstimateScaleFactors(psyOutChannel,
+ EstimateScaleFactors(aacram,
+ psyOutChannel,
qcOutChannel,
sfbFormFactor,
sfbNRelevantLines,
@@ -427,7 +429,8 @@ int QCMain(QC_STATE* hQC,
chDynBits =
- dynBitCount(qcOutChannel[ch].quantSpec,
+ dynBitCount(aacram,
+ qcOutChannel[ch].quantSpec,
qcOutChannel[ch].maxValueInSfb,
qcOutChannel[ch].scf,
psyOutChannel[ch].windowSequence,
diff -Nupr src.p9/qc_main.h src.p10/qc_main.h
--- src.p9/qc_main.h 2010-10-21 13:06:37.000000000 +0300
+++ src.p10/qc_main.h 2010-10-21 13:06:37.000000000 +0300
@@ -4,19 +4,18 @@
#ifndef _QC_MAIN_H
#define _QC_MAIN_H
-
-
-int QCOutNew(QC_OUT *hQC, int nChannels);
+int QCOutNew(AACRam_t *aacram, QC_OUT *hQC, int nChannels);
void QCOutDelete(QC_OUT *hQC);
int QCNew(QC_STATE *hQC);
-int QCInit(QC_STATE *hQC, struct QC_INIT *init);
+int QCInit(AACRam_t *aacram, QC_STATE *hQC, struct QC_INIT *init);
void QCDelete(QC_STATE *hQC);
-int QCMain(QC_STATE *hQC,
+int QCMain(AACRam_t *aacram,
+ QC_STATE *hQC,
int nChannels,
ELEMENT_BITS* elBits,
ATS_ELEMENT* adjThrStateElement,
diff -Nupr src.p9/qmf_enc.c src.p10/qmf_enc.c
--- src.p9/qmf_enc.c 2010-10-21 13:06:37.000000000 +0300
+++ src.p10/qmf_enc.c 2010-10-21 13:06:37.000000000 +0300
@@ -1094,7 +1094,8 @@ getEnergyFromCplxQmfData(float **energyV
*/
int
-createQmfBank (int chan,
+createQmfBank (SBRRam_t *sbrram,
+ int chan,
HANDLE_SBR_QMF_FILTER_BANK h_sbrQmf
@@ -1112,7 +1113,7 @@ createQmfBank (int chan,
h_sbrQmf->p_filter = sbr_qmf_64_640;
- h_sbrQmf->qmf_states_buffer = sbr_QmfStatesAnalysis + chan * 640;
+ h_sbrQmf->qmf_states_buffer = sbrram->sbr_QmfStatesAnalysis + chan * 640;
@@ -1228,14 +1229,14 @@ SynthesisQmfFiltering (float **sbrReal,
*******************************************************************************/
int
-CreateSynthesisQmfBank (HANDLE_SBR_QMF_FILTER_BANK hs)
+CreateSynthesisQmfBank (SBRRam_t *sbrram,HANDLE_SBR_QMF_FILTER_BANK hs)
{
float *ptr;
- ptr = &PsBuf5[0];
+ ptr = &sbrram->PsBuf5[0];
memset (hs, 0, sizeof (SBR_QMF_FILTER_BANK));
diff -Nupr src.p9/qmf_enc.h src.p10/qmf_enc.h
--- src.p9/qmf_enc.h 2010-10-21 13:06:37.000000000 +0300
+++ src.p10/qmf_enc.h 2010-10-21 13:06:37.000000000 +0300
@@ -31,7 +31,7 @@ void sbrAnalysisFiltering (const float *
HANDLE_SBR_QMF_FILTER_BANK qmfBank);
-int createQmfBank (int chan,HANDLE_SBR_QMF_FILTER_BANK h_sbrQmf);
+int createQmfBank (SBRRam_t *sbrram,int chan,HANDLE_SBR_QMF_FILTER_BANK h_sbrQmf);
void deleteQmfBank (HANDLE_SBR_QMF_FILTER_BANK h_sbrQmf);
@@ -52,7 +52,7 @@ SynthesisQmfFiltering (float **sbrReal,
int
-CreateSynthesisQmfBank (HANDLE_SBR_QMF_FILTER_BANK h_sbrQmf);
+CreateSynthesisQmfBank (SBRRam_t *sbrram,HANDLE_SBR_QMF_FILTER_BANK h_sbrQmf);
diff -Nupr src.p9/sbr_main.c src.p10/sbr_main.c
--- src.p9/sbr_main.c 2010-10-21 13:06:37.000000000 +0300
+++ src.p10/sbr_main.c 2010-10-21 13:06:37.000000000 +0300
@@ -377,7 +377,7 @@ EnvClose (HANDLE_SBR_ENCODER hEnvEnc)
deleteEnvChannel (hEnvEnc->hEnvChannel[i]);
-
+ free(hEnvEnc->hEnvChannel[i]);
hEnvEnc->hEnvChannel[i] = NULL;
}
@@ -390,6 +390,7 @@ EnvClose (HANDLE_SBR_ENCODER hEnvEnc)
{
DeleteSynthesisQmfBank ((HANDLE_SBR_QMF_FILTER_BANK*)&hEnvEnc->hSynthesisQmfBank);
+ free(hEnvEnc->hSynthesisQmfBank);
}
@@ -397,6 +398,7 @@ EnvClose (HANDLE_SBR_ENCODER hEnvEnc)
{
DeletePsEnc(&hEnvEnc->hPsEnc);
+ free(hEnvEnc->hPsEnc);
}
#endif /* #ifndef MONO_ONLY */
@@ -535,7 +537,8 @@ EnvEncodeFrame (HANDLE_SBR_ENCODER hEnvE
- extractSbrEnvelope(samples,
+ extractSbrEnvelope(hEnvEncoder->fftctx,
+ samples,
pCoreBuffer,
timeInStride,
&hEnvEncoder->sbrConfigData,
@@ -587,7 +590,8 @@ EnvEncodeFrame (HANDLE_SBR_ENCODER hEnvE
*****************************************************************************/
static int
-createEnvChannel (int chan,
+createEnvChannel (SBRRam_t *sbrram,
+ int chan,
HANDLE_SBR_CONFIG_DATA sbrConfigData,
HANDLE_SBR_HEADER_DATA sbrHeaderData,
HANDLE_ENV_CHANNEL hEnv,
@@ -616,7 +620,7 @@ createEnvChannel (int chan,
- if(createQmfBank (chan, &hEnv->sbrQmf)){
+ if(createQmfBank (sbrram, chan, &hEnv->sbrQmf)){
return (1); /* initialisation failed */
@@ -627,7 +631,8 @@ createEnvChannel (int chan,
- if(CreateTonCorrParamExtr (chan,
+ if(CreateTonCorrParamExtr (sbrram,
+ chan,
&hEnv->TonCorr,
@@ -691,7 +696,8 @@ createEnvChannel (int chan,
- if(CreateExtractSbrEnvelope (chan,
+ if(CreateExtractSbrEnvelope (sbrram,
+ chan,
&hEnv->sbrExtractEnvelope,
startIndex
@@ -742,7 +748,8 @@ createEnvChannel (int chan,
hEnv->encEnvData.freq_res_fixfix);
- if(CreateSbrTransientDetector (chan,
+ if(CreateSbrTransientDetector (sbrram,
+ chan,
&hEnv->sbrTransientDetector,
sbrConfigData->sampleFreq,
@@ -782,7 +789,8 @@ createEnvChannel (int chan,
*****************************************************************************/
int
-EnvOpen (HANDLE_SBR_ENCODER hEnvEnc,
+EnvOpen (SBRRam_t *sbrram,
+ HANDLE_SBR_ENCODER hEnvEnc,
float *pCoreBuffer,
sbrConfigurationPtr params,
int *coreBandWith)
@@ -802,7 +810,7 @@ EnvOpen (HANDLE_SBR_ENCODER hEnvEnc,
for (ch=0; ch<MAX_CHANNELS; ch++)
{
- hEnvEnc->hEnvChannel[ch] = &EnvChannel[ch];
+ hEnvEnc->hEnvChannel[ch] = calloc(1, sizeof(struct ENV_CHANNEL));
}
@@ -817,19 +825,19 @@ EnvOpen (HANDLE_SBR_ENCODER hEnvEnc,
- hEnvEnc->sbrConfigData.freqBandTable[LO] = sbr_freqBandTableLO;
+ hEnvEnc->sbrConfigData.freqBandTable[LO] = sbrram->sbr_freqBandTableLO;
memset(hEnvEnc->sbrConfigData.freqBandTable[LO],0,sizeof(unsigned char)*MAX_FREQ_COEFFS/2+1);
- hEnvEnc->sbrConfigData.freqBandTable[HI] = sbr_freqBandTableHI;
+ hEnvEnc->sbrConfigData.freqBandTable[HI] = sbrram->sbr_freqBandTableHI;
memset(hEnvEnc->sbrConfigData.freqBandTable[HI],0,sizeof(unsigned char)*MAX_FREQ_COEFFS+1);
- hEnvEnc->sbrConfigData.v_k_master = sbr_v_k_master;
+ hEnvEnc->sbrConfigData.v_k_master = sbrram->sbr_v_k_master;
memset(hEnvEnc->sbrConfigData.v_k_master,0,sizeof(unsigned char)*MAX_FREQ_COEFFS+1);
@@ -986,7 +994,8 @@ EnvOpen (HANDLE_SBR_ENCODER hEnvEnc,
for ( ch = 0; ch < hEnvEnc->sbrConfigData.nChannels; ch++ ) {
- if(createEnvChannel(ch,
+ if(createEnvChannel(sbrram,
+ ch,
&hEnvEnc->sbrConfigData,
&hEnvEnc->sbrHeaderData,
hEnvEnc->hEnvChannel[ch],
@@ -1011,12 +1020,13 @@ EnvOpen (HANDLE_SBR_ENCODER hEnvEnc,
if (params->usePs)
{
- if(createQmfBank (1, &hEnvEnc->hEnvChannel[1]->sbrQmf)){
+ if(createQmfBank (sbrram, 1, &hEnvEnc->hEnvChannel[1]->sbrQmf)){
return (1);
}
- if(CreateExtractSbrEnvelope (1,
+ if(CreateExtractSbrEnvelope (sbrram,
+ 1,
&hEnvEnc->hEnvChannel[1]->sbrExtractEnvelope,
576
)) {
@@ -1025,10 +1035,10 @@ EnvOpen (HANDLE_SBR_ENCODER hEnvEnc,
}
- hEnvEnc->hSynthesisQmfBank = &SynthesisQmfBank;
+ hEnvEnc->hSynthesisQmfBank = calloc(1, sizeof(SBR_QMF_FILTER_BANK));
- if(CreateSynthesisQmfBank (hEnvEnc->hSynthesisQmfBank)){
+ if(CreateSynthesisQmfBank (sbrram, hEnvEnc->hSynthesisQmfBank)){
DeleteSynthesisQmfBank ((HANDLE_SBR_QMF_FILTER_BANK*)&hEnvEnc->hSynthesisQmfBank);
@@ -1038,10 +1048,11 @@ EnvOpen (HANDLE_SBR_ENCODER hEnvEnc,
}
- hEnvEnc->hPsEnc = &psEncoder;
+ hEnvEnc->hPsEnc = calloc(1, sizeof(struct PS_ENC));
- if(CreatePsEnc (hEnvEnc->hPsEnc,
+ if(CreatePsEnc (sbrram,
+ hEnvEnc->hPsEnc,
params->psMode)){
diff -Nupr src.p9/sbr_main.h src.p10/sbr_main.h
--- src.p9/sbr_main.h 2010-10-21 13:06:37.000000000 +0300
+++ src.p10/sbr_main.h 2010-10-21 13:06:37.000000000 +0300
@@ -102,7 +102,8 @@ typedef struct SBR_ENCODER *HANDLE_SBR_E
int
-EnvOpen (HANDLE_SBR_ENCODER hEnvEnc,
+EnvOpen (SBRRam_t *sbrram,
+ HANDLE_SBR_ENCODER hEnvEnc,
float *pCoreBuffer,
sbrConfigurationPtr params,
int *coreBandWith
diff -Nupr src.p9/sf_estim.c src.p10/sf_estim.c
--- src.p9/sf_estim.c 2010-10-21 13:06:37.000000000 +0300
+++ src.p10/sf_estim.c 2010-10-21 13:06:37.000000000 +0300
@@ -1035,7 +1035,8 @@ static void assimilateMultipleScf(PSY_OU
static void
-estimateScaleFactorsChannel(PSY_OUT_CHANNEL *psyOutChan,
+estimateScaleFactorsChannel(AACRam_t *aacram,
+ PSY_OUT_CHANNEL *psyOutChan,
short *scf,
int *globalGain,
float *sfbFormFactor,
@@ -1062,7 +1063,7 @@ estimateScaleFactorsChannel(PSY_OUT_CHAN
for (i=0; i<FRAME_LEN_LONG; i++) {
- expSpec[i] = 0.0f;
+ aacram->expSpec[i] = 0.0f;
quantSpec[i] = 0;
}
@@ -1124,15 +1125,15 @@ estimateScaleFactorsChannel(PSY_OUT_CHAN
/* find better scalefactor with analysis by synthesis */
- calcExpSpec(expSpec+psyOutChan->sfbOffsets[i],
+ calcExpSpec(aacram->expSpec+psyOutChan->sfbOffsets[i],
psyOutChan->mdctSpectrum+psyOutChan->sfbOffsets[i],
psyOutChan->sfbOffsets[i+1]-psyOutChan->sfbOffsets[i]);
scfInt = improveScf(psyOutChan->mdctSpectrum+psyOutChan->sfbOffsets[i],
- expSpec+psyOutChan->sfbOffsets[i],
+ aacram->expSpec+psyOutChan->sfbOffsets[i],
quantSpec+psyOutChan->sfbOffsets[i],
- quantSpecTmp+psyOutChan->sfbOffsets[i],
+ aacram->quantSpecTmp+psyOutChan->sfbOffsets[i],
psyOutChan->sfbOffsets[i+1]-psyOutChan->sfbOffsets[i],
thresh, scfInt, minSfMaxQuant[i],
&sfbDist[i], &minScfCalculated[i]);
@@ -1155,12 +1156,12 @@ estimateScaleFactorsChannel(PSY_OUT_CHAN
}
- assimilateSingleScf(psyOutChan, expSpec, quantSpec, quantSpecTmp, scf,
+ assimilateSingleScf(psyOutChan, aacram->expSpec, quantSpec, aacram->quantSpecTmp, scf,
minSfMaxQuant, sfbDist, sfbConstPePart,
sfbFormFactor, sfbNRelevantLines, minScfCalculated, 1);
- assimilateMultipleScf(psyOutChan, expSpec, quantSpec, quantSpecTmp, scf,
+ assimilateMultipleScf(psyOutChan, aacram->expSpec, quantSpec, aacram->quantSpecTmp, scf,
minSfMaxQuant, sfbDist, sfbConstPePart,
sfbFormFactor, sfbNRelevantLines);
}
@@ -1204,7 +1205,7 @@ estimateScaleFactorsChannel(PSY_OUT_CHAN
/* ??? */
sfbDist[i] =
calcSfbDist(psyOutChan->mdctSpectrum+psyOutChan->sfbOffsets[i],
- expSpec+psyOutChan->sfbOffsets[i],
+ aacram->expSpec+psyOutChan->sfbOffsets[i],
quantSpec+psyOutChan->sfbOffsets[i],
psyOutChan->sfbOffsets[i+1]-psyOutChan->sfbOffsets[i],
scf[i]);
@@ -1301,7 +1302,8 @@ CalcFormFactor(float sfbFormFactor[MAX_C
void
-EstimateScaleFactors(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS],
+EstimateScaleFactors(AACRam_t *aacram,
+ PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS],
QC_OUT_CHANNEL qcOutChannel[MAX_CHANNELS],
float sfbFormFactor[MAX_CHANNELS][MAX_GROUPED_SFB],
float sfbNRelevantLines[MAX_CHANNELS][MAX_GROUPED_SFB],
@@ -1315,7 +1317,8 @@ EstimateScaleFactors(PSY_OUT_CHANNEL psy
for (j=0; j<nChannels; j++) {
- estimateScaleFactorsChannel(&psyOutChannel[j],
+ estimateScaleFactorsChannel(aacram,
+ &psyOutChannel[j],
qcOutChannel[j].scf,
&(qcOutChannel[j].globalGain),
sfbFormFactor[j],
diff -Nupr src.p9/sf_estim.h src.p10/sf_estim.h
--- src.p9/sf_estim.h 2010-10-21 13:06:37.000000000 +0300
+++ src.p10/sf_estim.h 2010-10-21 13:06:37.000000000 +0300
@@ -13,7 +13,8 @@ CalcFormFactor(float sfbFormFactor[MAX_C
const int nChannels);
void
-EstimateScaleFactors(PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS],
+EstimateScaleFactors(AACRam_t *aacram,
+ PSY_OUT_CHANNEL psyOutChannel[MAX_CHANNELS],
QC_OUT_CHANNEL qcOutChannel[MAX_CHANNELS],
float sfbFormFactor[MAX_CHANNELS][MAX_GROUPED_SFB],
float sfbNRelevantLines[MAX_CHANNELS][MAX_GROUPED_SFB],
diff -Nupr src.p9/ton_corr.c src.p10/ton_corr.c
--- src.p9/ton_corr.c 2010-10-21 13:06:37.000000000 +0300
+++ src.p10/ton_corr.c 2010-10-21 13:06:37.000000000 +0300
@@ -712,7 +712,8 @@ resetPatch(HANDLE_SBR_TON_CORR_EST hTonC
*/
/**************************************************************************/
int
-CreateTonCorrParamExtr (int chan,
+CreateTonCorrParamExtr (SBRRam_t *sbrram,
+ int chan,
HANDLE_SBR_TON_CORR_EST hTonCorr,
int fs,
int usb,
@@ -762,7 +763,7 @@ CreateTonCorrParamExtr (int chan,
for(i=0;i<hTonCorr->numberOfEstimates;i++) {
- hTonCorr->quotaMatrix[i] = &(sbr_quotaMatrix[chan* NO_OF_ESTIMATES*QMF_CHANNELS + i*noQmfChannels]);
+ hTonCorr->quotaMatrix[i] = &(sbrram->sbr_quotaMatrix[chan* NO_OF_ESTIMATES*QMF_CHANNELS + i*noQmfChannels]);
memset(hTonCorr->quotaMatrix[i] ,0, sizeof(float)*QMF_CHANNELS);
@@ -815,7 +816,8 @@ CreateTonCorrParamExtr (int chan,
- if(CreateSbrMissingHarmonicsDetector (chan,
+ if(CreateSbrMissingHarmonicsDetector (sbrram,
+ chan,
&hTonCorr->sbrMissingHarmonicsDetector,
fs,
freqBandTable[HI],
diff -Nupr src.p9/ton_corr.h src.p10/ton_corr.h
--- src.p9/ton_corr.h 2010-10-21 13:06:37.000000000 +0300
+++ src.p10/ton_corr.h 2010-10-21 13:06:37.000000000 +0300
@@ -72,7 +72,8 @@ TonCorrParamExtr(HANDLE_SBR_TON_CORR_EST
int
-CreateTonCorrParamExtr (int chan,
+CreateTonCorrParamExtr (SBRRam_t *sbrram,
+ int chan,
HANDLE_SBR_TON_CORR_EST hTonCorr,
int fs,
int usb,
diff -Nupr src.p9/tran_det.c src.p10/tran_det.c
--- src.p9/tran_det.c 2010-10-21 13:06:37.000000000 +0300
+++ src.p10/tran_det.c 2010-10-21 13:06:37.000000000 +0300
@@ -489,7 +489,8 @@ transientDetect (float **Energies,
int
-CreateSbrTransientDetector (int chan,
+CreateSbrTransientDetector (SBRRam_t *sbrram,
+ int chan,
HANDLE_SBR_TRANSIENT_DETECTOR h_sbrTransientDetector,
int sampleFreq,
@@ -555,13 +556,13 @@ CreateSbrTransientDetector (int chan,
h_sbrTransientDetector->prevLowBandEnergy = 0;
- h_sbrTransientDetector->thresholds = &sbr_thresholds[chan*QMF_CHANNELS];
+ h_sbrTransientDetector->thresholds = &sbrram->sbr_thresholds[chan*QMF_CHANNELS];
memset(h_sbrTransientDetector->thresholds,0,sizeof(float)*QMF_CHANNELS);
- h_sbrTransientDetector->transients = &sbr_transients[chan*h_sbrTransientDetector->buffer_length];
+ h_sbrTransientDetector->transients = &sbrram->sbr_transients[chan*h_sbrTransientDetector->buffer_length];
memset(h_sbrTransientDetector->transients,0,sizeof(float)*h_sbrTransientDetector->buffer_length);
diff -Nupr src.p9/tran_det.h src.p10/tran_det.h
--- src.p9/tran_det.h 2010-10-21 13:06:37.000000000 +0300
+++ src.p10/tran_det.h 2010-10-21 13:06:37.000000000 +0300
@@ -36,7 +36,8 @@ void transientDetect (float **Energies,
);
int
-CreateSbrTransientDetector (int chan,
+CreateSbrTransientDetector (SBRRam_t *sbrram,
+ int chan,
HANDLE_SBR_TRANSIENT_DETECTOR h_sbrTransientDetector,
int sampleFreq,

11
patches/Makefile.am Normal file
View File

@ -0,0 +1,11 @@
EXTRA_DIST = \
0001-move_headers_at_one_place.patch \
0002-cfftn-add-fftw3f.patch \
0003-faac_compatible.patch \
0004-const_where_possible.patch \
0005-fix_bitbuff_64bit.patch \
0006-add_bitrates.patch \
0007-fix_si_bits_dup.patch \
0008-enchance_config.patch \
0009-move_aac_sbr_enc_2_hdr.patch \
0010-use_dynamic_alloc.patch

237
src/Makefile.am Normal file
View File

@ -0,0 +1,237 @@
DISTCLEANFILES = 26410-800.zip $(top_srcdir)/26410-800.doc 26410-800-ANSI-C_source_code.zip $(library_sources_used) $(library_headers_used)
EXTRA_DIST = libaacplus.sym
INCLUDES = @FFTW3_INCFLAGS@ -I$(top_srcdir)/include
LDADD = @FFTW3_LDFLAGS@
lib_LTLIBRARIES = \
libaacplus.la
library_sources_used = \
aacenc.c \
aac_rom.c \
adj_thr.c \
band_nrg.c \
bitbuffer.c \
bit_cnt.c \
bitenc.c \
bit_sbr.c \
block_switch.c \
cfftn.c \
channel_map.c \
code_env.c \
dyn_bits.c \
env_bit.c \
env_est.c \
fram_gen.c \
freq_sca.c \
grp_data.c \
hybrid.c \
interface.c \
invf_est.c \
line_pe.c \
mh_det.c \
ms_stereo.c \
nf_est.c \
pre_echo_control.c \
ps_bitenc.c \
ps_enc.c \
psy_configuration.c \
psy_main.c \
qc_main.c \
qmf_enc.c \
quantize.c \
resampler.c \
sbr_main.c \
sbr_misc.c \
sbr_rom.c \
sf_estim.c \
spreading.c \
stat_bits.c \
stprepro.c \
tns.c \
tns_param.c \
ton_corr.c \
tran_det.c \
transcendent.c \
transform.c
libaacplus_la_SOURCES = $(library_sources_used) aacplusenc.c adts.c
libaacplus_la_LDFLAGS = \
-export-symbols libaacplus.sym -no-undefined -version-info 2:2:0 @FFTW3_LDFLAGS@
libaacplusdir = \
$(includedir)/libaacplus
#counters.h
library_headers_used = \
aacenc.h \
aac_rom.h \
adj_thr_data.h \
adj_thr.h \
band_nrg.h \
bit_cnt.h \
bitenc.h \
bit_sbr.h \
block_switch.h \
cfftn.h \
channel_map.h \
cmondata.h \
code_env.h \
dyn_bits.h \
env_bit.h \
env_est.h \
FFR_bitbuffer.h \
FloatFR.h \
fram_gen.h \
freq_sca.h \
grp_data.h \
hybrid.h \
interface.h \
invf_est.h \
line_pe.h \
mh_det.h \
minmax.h \
ms_stereo.h \
nf_est.h \
pre_echo_control.h \
ps_bitenc.h \
ps_enc.h \
psy_configuration.h \
psy_const.h \
psy_data.h \
psy_main.h \
qc_data.h \
qc_main.h \
qmf_enc.h \
quantize.h \
resampler.h \
sbr_def.h \
sbr.h \
sbr_main.h \
sbr_misc.h \
sbr_rom.h \
sf_estim.h \
spreading.h \
stat_bits.h \
stprepro.h \
tns_func.h \
tns.h \
tns_param.h \
ton_corr.h \
tran_det.h \
transform.h
noinst_HEADERS = $(library_headers_used) aacplusenc.h adts.h aac_ram.h sbr_ram.h
sources_delete:
@echo echo "Deleting headers..."
for source in $(library_headers_used); \
do \
rm -f $$source; \
done
@echo echo "Deleting sources..."
for source in $(library_sources_used); \
do \
rm -f $$source; \
done
sources_copy:
@echo echo "Copying headers..."
for source in $(library_headers_used); \
do \
find $(srcdir)/FloatFR_aacPlusenc -name $$source -type f -exec cp {} $(srcdir) \; ; \
done
@echo echo "Copying sources..."
for source in $(library_sources_used); \
do \
find $(srcdir)/FloatFR_aacPlusenc -name $$source -type f -exec cp {} $(srcdir) \; ; \
done
patch_all:
@echo echo "Patching sources and headers..."
find $(top_srcdir)/patches -name *.patch -type f -print | sort | xargs cat | $(PATCH)
remove_debugging_symbols:
@echo echo "Removeing debugging symbols..."
for source in $(library_sources_used); \
do \
sed -e 's/ADD\ *([\ 0-9\*]*)\ *;//g;' $$source | \
sed -e 's/BRANCH\ *([\ 0-9]*)\ *;//g;' | \
sed -e 's/DIV\ *([\ 0-9]*)\ *;//g;' | \
sed -e 's/FUNC\ *([\ 0-9]*)\ *;//g;' | \
sed -e 's/INDIRECT\ *([\ 0-9]*)\ *;//g;' | \
sed -e 's/LOGIC\ *([0-9\ ]*)\ *;//g;' | \
sed -e 's/LOOP\ *([0-9\ ]*)\ *;//g;' | \
sed -e 's/MAC\ *([0-9\ ]*)\ *;//g;' | \
sed -e 's/MOVE\ *([a-zA-Z_0-9\ \+\*]*)\ *;//g;' | \
sed -e 's/MISC\ *([0-9\ ]*)\ *;//g;' | \
sed -e 's/MULT\ *([0-9\ \*\+]*)\ *;//g;' | \
sed -e 's/PTR_INIT\ *([0-9\ ]*)\ *;*//g;' | \
sed -e 's/STORE.*[^;];//g;' | \
sed -e 's/SHIFT\ *([a-zA-Z0-9\ \+]*)\ *;//g;' | \
sed -e 's/SQRT\ *([0-9\ ]*)\ *;//g;' | \
sed -e 's/TRANS\ *([0-9\ ]*)\ *;//g;' | \
sed -e 's/COUNT_init\ *(.*)\ *;//g;' | \
sed -e 's/COUNT_end\ *(.*)\ *;//g;' | \
sed -e 's/COUNT_sub_start\ *(.*)\ *;//g;' | \
sed -e 's/COUNT_sub_end\ *(.*)\ *;//g;' | \
sed -e 's/COUNT_frame_update\ *(.*)\ *;//g;' | \
sed -e 's/COUNT_ops\ *(.*)\ *;//g;' | \
sed -e 's/COUNT_mem\ *(.*)\ *;//g;' | \
sed -e 's/^#include\ *"counters.h"//g;' > $${source#*/}.new; \
mv $${source#*/}.new $${source#*/}; \
done
unpack_3gp_sources:
if ! [ -e $(srcdir)/aacenc.c ]; \
then \
$(MAKE) $(srcdir)/26410-800-ANSI-C_source_code.zip; \
$(MAKE) $(srcdir)/FloatFR_aacPlusenc; \
rm -f $(srcdir)/26410-800-ANSI-C_source_code.zip; \
$(MAKE) sources_delete; \
$(MAKE) sources_copy; \
rm -rf $(srcdir)/FloatFR_aacPlusenc; \
chmod -x-x-x *.c *.h; \
$(MAKE) remove_debugging_symbols; \
$(MAKE) patch_all; \
fi
$(library_sources_used):
$(MAKE) unpack_3gp_sources
$(srcdir)/FloatFR_aacPlusenc:
cd $(srcdir) && $(UNZIP) 26410-800-ANSI-C_source_code.zip
mv -f $(srcdir)/3GPP_enhanced_aacPlus_src_*/FloatFR_aacPlusenc $(srcdir)
rm -rf $(srcdir)/3GPP_enhanced_aacPlus_src_*
$(srcdir)/26410-800-ANSI-C_source_code.zip: $(srcdir)/26410-800.zip
rm -f $(srcdir)/26410-800-ANSI-C_source_code.zip $(srcdir)/26410-800.doc
cd $(srcdir) && $(UNZIP) 26410-800.zip
mv $(srcdir)/26410-800.doc $(top_srcdir)/26410-800.doc
chmod og-w $(top_srcdir)/26410-800.doc
$(srcdir)/26410-800.zip:
cd $(srcdir) && $(DOWNLOADER_PROG) http://www.3gpp.org/ftp/Specs/archive/26_series/26.410/26410-800.zip
extraclean:
rm -f $(distdir)/($(library_sources_used)) $(distdir)/($(library_headers_used)) $(distdir)/26410-800.zip $(distdir)/../26410-800.doc $(distdir)/26410-800_ANSI-C_source_code.zip
# WARNING: These commands use internal automake command and may fail in future version.
extradist-gzip: distdir extraclean
tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
$(am__remove_distdir)
extradist-bzip2: distdir extraclean
tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2
$(am__remove_distdir)
extradist extradist-all: distdir extraclean
tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2
$(am__remove_distdir)

33
src/aac_ram.h Normal file
View File

@ -0,0 +1,33 @@
/*
* aac_ram.h
*
* Created on: 7 окт. 2010
* Author: tipok
*/
#ifndef AAC_RAM_H_
#define AAC_RAM_H_
#include <stdio.h>
typedef struct {
/* Static memory areas, must not be overwritten in other sections of the encoder */
/* aac Encoder mdct delay buffer */
float mdctDelayBuffer[MAX_CHANNELS*BLOCK_SWITCHING_OFFSET];
/* these tables are initialized once at application start
and are not touched thereafter */
int sideInfoTabLong[MAX_SFB_LONG + 1];
int sideInfoTabShort[MAX_SFB_SHORT + 1];
/* Dynamic memory areas, might be reused in other algorithm sections, */
/* quantized spectrum */
short *quantSpec;
/* scratch space for quantization */
float *expSpec; /* FRAME_LEN_LONG values */
short *quantSpecTmp;
/* scalefactors */
short *scf; /*[MAX_CHANNELS*MAX_GROUPED_SFB];*/
/* max spectral values pre sfb */
unsigned short *maxValueInSfb; /* [MAX_CHANNELS*MAX_GROUPED_SFB]; */
} AACRam_t;
#endif /* AAC_RAM_H_ */

392
src/aacplusenc.c Normal file
View File

@ -0,0 +1,392 @@
/*
* aacplusenc.c
*
* Created on: 6 окт. 2010
* Author: tipok
*/
#include <stdlib.h>
#include <string.h>
#include <limits.h>
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include "aacplus.h"
#include "aacplusenc.h"
const int mpeg4audio_sample_rates[16] = {
96000, 88200, 64000, 48000, 44100, 32000,
24000, 22050, 16000, 12000, 11025, 8000, 7350
};
const uint8_t mpeg4audio_channels[8] = {
0, 1, 2, 3, 4, 5, 6, 8
};
int aacplusEncInitSBRAACRam(struct AAC_ENCODER *aacenc)
{
SBRRam_t *sbr = calloc(1, sizeof(SBRRam_t));
AACRam_t *aac = calloc(1, sizeof(AACRam_t));
if(!sbr || !aac) return -1;
sbr->PsBuf2= &aac->mdctDelayBuffer[BLOCK_SWITCHING_OFFSET];
/* Overlay PsBuf4 and PsBuf5 with sbr_toncorrBuff of 2nd channel, since SBR only works in mono */
sbr->PsBuf4 = &sbr->sbr_toncorrBuff[5*NO_OF_ESTIMATES*MAX_FREQ_COEFFS];
sbr->PsBuf5 = &sbr->sbr_toncorrBuff[5*NO_OF_ESTIMATES*MAX_FREQ_COEFFS + PS_BUF4_SIZE];
aacenc->sbr_ram = sbr;
/* aac_ram.c */
aac->quantSpec = (short*) sbr->PsBuf3;
aac->expSpec = sbr->sbr_envIBuffer; /* FRAME_LEN_LONG values */
aac->quantSpecTmp = (short*) &sbr->sbr_envIBuffer[FRAME_LEN_LONG];
aac->scf= (short*) &sbr->sbr_envIBuffer[2*FRAME_LEN_LONG]; /*[MAX_CHANNELS*MAX_GROUPED_SFB];*/
aac->maxValueInSfb = (unsigned short*) &sbr->sbr_envIBuffer[2*FRAME_LEN_LONG+MAX_CHANNELS*MAX_GROUPED_SFB]; /* [MAX_CHANNELS*MAX_GROUPED_SFB]; */
aacenc->aac_ram = aac;
return 1;
}
int aacplusEncFreeSBRAACRam(struct AAC_ENCODER *aacenc)
{
free(aacenc->sbr_ram);
free(aacenc->aac_ram);
return 1;
}
aacplusEncHandle aacplusEncOpen(unsigned long sampleRate,
unsigned int numChannels,
unsigned long *inputSamples,
unsigned long *maxOutputBytes) {
AACPContext *aacp = NULL;
assert(numChannels <= MAX_CHANNELS);
aacp = calloc(1, sizeof(AACPContext));
if(!aacp)
return aacp;
/* set up basic parameters for aacPlus codec */
AacInitDefaultConfig(&aacp->config);
aacp->config.nChannelsIn = numChannels;
aacp->config.sampleRate = sampleRate;
aacp->writeOffset = INPUT_DELAY*MAX_CHANNELS;
aacplusEncInitSBRAACRam(&aacp->aacEnc);
//#ifdef _FFTW3
init_plans(&aacp->fftctx);
//#endif
*inputSamples = AACENC_BLOCKSIZE*2 * numChannels;
*maxOutputBytes = (6144/8)*MAX_CHANNELS+ADTS_HEADER_SIZE;
return (aacplusEncHandle ) aacp;
}
aacplusEncConfiguration *aacplusEncGetCurrentConfiguration(aacplusEncHandle hEncoder)
{
AACPContext *aacp = (AACPContext *) hEncoder;
if(!aacp) return NULL;
return &aacp->config;
}
int aacplusEncSetConfiguration(aacplusEncHandle hEncoder,
aacplusEncConfiguration *cfg) {
AACPContext *aacp = (AACPContext *) hEncoder;
assert(cfg);
if(cfg != &aacp->config)
memcpy(&aacp->config, cfg, sizeof(aacplusEncConfiguration));
int sampleRateAAC = aacp->config.sampleRate;
if(!aacp->config.nChannelsOut)
aacp->config.nChannelsOut = aacp->config.nChannelsIn;
if(!aacp->config.bitRate)
return 0;
if(aacp->config.bandWidth > aacp->config.sampleRate/2)
return 0;
/* set input samples for not only 1024 framesize */
aacp->config.inputSamples = aacp->config.nSamplesPerFrame * 2 * aacp->config.nChannelsIn;
if ( (aacp->config.nChannelsOut == 2) && (aacp->config.bitRate >= 16000) && (aacp->config.bitRate < 44001) ) {
aacp->config.nChannelsOut=1;
aacp->useParametricStereo=1;
aacp->envReadOffset = (MAX_DS_FILTER_DELAY + INPUT_DELAY)*MAX_CHANNELS;
aacp->coreWriteOffset = CORE_INPUT_OFFSET_PS;
aacp->writeOffset = aacp->envReadOffset;
} else {
/* set up 2:1 downsampling */
InitIIR21_Resampler(&aacp->IIR21_reSampler[0]);
InitIIR21_Resampler(&aacp->IIR21_reSampler[1]);
assert(aacp->IIR21_reSampler[0].delay <= MAX_DS_FILTER_DELAY);
aacp->writeOffset += aacp->IIR21_reSampler[0].delay*MAX_CHANNELS;
}
/* set up SBR configuration */
if(!IsSbrSettingAvail(aacp->config.bitRate, aacp->config.nChannelsOut, sampleRateAAC, &sampleRateAAC)) {
fprintf(stderr, "libaacplus: bad aac setting: br:%d, AACch:%d, AACsr:%d\n",
aacp->config.bitRate, aacp->config.nChannelsOut, sampleRateAAC);
return 0;
}
InitializeSbrDefaults (&aacp->sbrConfig);
aacp->sbrConfig.usePs = aacp->useParametricStereo;
if(!AdjustSbrSettings( &aacp->sbrConfig, aacp->config.bitRate, aacp->config.nChannelsOut, sampleRateAAC, AACENC_TRANS_FAC, 24000)) {
fprintf(stderr, "libaacplus: bad sbr setting: br:%d, AACch:%d, AACsr:%d PS:%d\n",
aacp->config.bitRate, aacp->config.nChannelsOut, sampleRateAAC, aacp->sbrConfig.usePs);
return 0;
}
if(EnvOpen(aacp->aacEnc.sbr_ram,
&aacp->hEnvEnc,
&aacp->inBuf[aacp->coreWriteOffset],
&aacp->sbrConfig,
&aacp->config.bandWidth) != 0){
EnvClose (&aacp->hEnvEnc);
fprintf(stderr, "libaacplus: can't open sbr encoder\n");
return 0;
}
//#ifdef _FFTW3
aacp->hEnvEnc.fftctx = &aacp->fftctx;
//#endif
/* set up AAC encoder, now that samling rate is known */
aacp->config.sampleRate = sampleRateAAC;
if (AacEncOpen( &aacp->aacEnc, &aacp->config) != 0){
AacEncClose(&aacp->aacEnc);
fprintf(stderr, "libaacplus: can't open aac encoder\n");
return 0;
}
//#ifdef _FFTW3
aacp->aacEnc.fftctx = &aacp->fftctx;
//#endif
/* create the ADTS header */
if(cfg->outputFormat==1) {
aacp->adts = calloc(1, sizeof(ADTSContext_t));
if(!aacp->adts) {
fprintf(stderr, "libaacplus: can't create adts context\n");
return 0;
}
adts_hdr_init(aacp->adts, &aacp->config, &aacp->aacEnc.bitStream);
}
return 1;
}
int FindSRIndex(int sr)
{
int i;
for (i = 0; i < 16; i++) {
if (sr == mpeg4audio_sample_rates[i])
return i;
}
return 16 - 1;
}
int FindCHIndex(int ch)
{
int i;
for (i = 0; i < 16; i++) {
if (ch == mpeg4audio_channels[i])
return i;
}
return 16 - 1;
}
/*
object_type (AOT_AAC_LC) = || 0001 | 0
sr_idx (6 = 24000) = 011 || 0
chan_cfg (1 = 1) = 000 | 1
(specific_config_bitindex = 27 bits)
blablabla = 000
sync_extension = || 0101 | 0110 || 111
object_type (AOT_SBR) = 0 | 0101
have_new_sr? = || 1
sr_idx (3 = 48000) = 001 | 1
000 ||
///////////////////////////
PS:
101 || 0100 1000 || x... .... ||
7
*/
/* create extradata for aac+ */
#define AACPLUS_AOT_AAC_LC 2
#define AACPLUS_AOT_SBR 5
#define AACPLUS_LOAS_SYNC 0x2b7
#define AACPLUS_PS_EXT 0x548
int aacplusEncGetDecoderSpecificInfo(aacplusEncHandle hEncoder, unsigned char **ppBuffer,
unsigned long *pSizeOfDecoderSpecificInfo){
AACPContext *aacp = (AACPContext *) hEncoder;
int srate_idx, ch_idx;
int window_size = 0;
int loas_sync = AACPLUS_LOAS_SYNC;
int ps_extension = 0;
uint8_t *extradata = calloc(1, MAX_EXTRADATA_SIZE);
if(!extradata)
return -3;
if(aacp->useParametricStereo)
ps_extension = AACPLUS_PS_EXT;
srate_idx = FindSRIndex(aacp->config.sampleRate);
ch_idx = FindCHIndex(aacp->config.nChannelsOut);
if(aacp->config.nSamplesPerFrame != AACENC_BLOCKSIZE)
window_size = 1;
extradata[0] = AACPLUS_AOT_AAC_LC << 3 | srate_idx >> 1;
extradata[1] = srate_idx << 7 | ch_idx << 3 | window_size << 2;
srate_idx = FindSRIndex(aacp->config.sampleRate * 2);
extradata[2] = loas_sync >> 3; //sync extension
extradata[3] = (loas_sync << 5) & 0xe0 | AACPLUS_AOT_SBR; //sync extension + sbr hdr
extradata[4] = 1 << 7 | srate_idx << 3 | ps_extension >> 8;
if(ps_extension) {
extradata[5] = ps_extension & 0xff;
extradata[6] = 1 << 7;
*pSizeOfDecoderSpecificInfo = 7;
} else {
*pSizeOfDecoderSpecificInfo = 5;
}
// fprintf(stderr, "libaacplus: codec config(%d): %02x %02x %02x %02x %02x %02x %02x\n", *pSizeOfDecoderSpecificInfo,
// extradata[0], extradata[1], extradata[2], extradata[3], extradata[4], extradata[5], extradata[6]);
*ppBuffer = extradata;
return 1;
}
int aacplusEncEncode(aacplusEncHandle hEncoder, int32_t *inputBuffer, unsigned int samplesInput,
unsigned char *outputBuffer,
unsigned int bufferSize) {
AACPContext *aacp = (AACPContext *) hEncoder;
unsigned int i;
int ch, outSamples=0, numOutBytes = 0;
int adts_offset = 0;
assert(outputBuffer);
if(samplesInput > aacp->config.inputSamples)
return -1;
switch (aacp->config.inputFormat){
case AACPLUS_INPUT_16BIT: {
int16_t *inbuff = (int16_t *) inputBuffer;
for (i=0; i<samplesInput; i++)
aacp->inBuf[(2/aacp->config.nChannelsIn)*i+aacp->writeOffset+aacp->writtenSamples] = (float) inbuff[i];
break;
}
case AACPLUS_INPUT_FLOAT: {
float *inbuff = (float *) inputBuffer;
for (i=0; i<samplesInput; i++)
aacp->inBuf[(2/aacp->config.nChannelsIn)*i+aacp->writeOffset+aacp->writtenSamples] = inbuff[i] * SHRT_MAX;
break;
}
default:
return -1;
break;
}
/* Simple stereo to mono conversion: L = (L+R)/2 */
if((aacp->config.nChannelsIn == 2) &&
(aacp->config.nChannelsOut == 1) && !aacp->useParametricStereo) {
for (i=0; i<samplesInput/2; i++)
aacp->inBuf[i+aacp->writeOffset+aacp->writtenSamples] = (aacp->inBuf[i+aacp->writeOffset+aacp->writtenSamples]
+ aacp->inBuf[i+aacp->writeOffset+aacp->writtenSamples+1])*0.5f;
}
aacp->writtenSamples+=samplesInput;
if (aacp->writtenSamples < aacp->config.inputSamples)
return 0;
if(aacp->adts) adts_offset=ADTS_HEADER_SIZE;
if (bufferSize < (6144/8)*MAX_CHANNELS+adts_offset)
return -1;
/* encode one SBR frame */
EnvEncodeFrame( &aacp->hEnvEnc,
&aacp->inBuf[aacp->envReadOffset],
&aacp->inBuf[aacp->coreWriteOffset],
MAX_CHANNELS,
&aacp->numAncDataBytes,
aacp->ancDataBytes);
/* 2:1 downsampling for AAC core */
if (!aacp->useParametricStereo)
for( ch=0; ch<aacp->config.nChannelsIn; ch++ )
IIR21_Downsample( &aacp->IIR21_reSampler[ch],
&aacp->inBuf[aacp->writeOffset+ch],
aacp->config.nSamplesPerFrame * 2, //aacp->writtenSamples,
MAX_CHANNELS,
&aacp->inBuf[ch],
&outSamples,
MAX_CHANNELS);
AacEncEncode( &aacp->aacEnc,
aacp->inBuf,
aacp->useParametricStereo ? 1 : MAX_CHANNELS, /* stride (step) */
aacp->ancDataBytes,
&aacp->numAncDataBytes,
(unsigned *) (outputBuffer+adts_offset),
&numOutBytes);
if (aacp->useParametricStereo) {
memcpy( aacp->inBuf,&aacp->inBuf[aacp->config.nSamplesPerFrame],CORE_INPUT_OFFSET_PS*sizeof(float));
} else {
memmove( aacp->inBuf,&aacp->inBuf[aacp->config.nSamplesPerFrame*2*MAX_CHANNELS],
aacp->writeOffset*sizeof(float));
}
/* Write one frame of encoded audio */
if(numOutBytes > 0 && aacp->adts) {
adts_hdr_up(aacp->adts, outputBuffer, numOutBytes);
numOutBytes+=adts_offset;
}
aacp->writtenSamples=0;
return numOutBytes;
}
int aacplusEncClose(aacplusEncHandle hEncoder) {
AACPContext *aacp = (AACPContext *) hEncoder;
if(!aacp) return 0;
AacEncClose(&aacp->aacEnc);
EnvClose(&aacp->hEnvEnc);
//#ifdef _FFTW3
destroy_plans(&aacp->fftctx);
//#endif
aacplusEncFreeSBRAACRam(&aacp->aacEnc);
if(aacp->adts)
free(aacp->adts);
free(aacp);
return 1;
}

166
src/aacplusenc.h Normal file
View File

@ -0,0 +1,166 @@
/*
* aacplusenc.h
*
* Created on: 7 окт. 2010
* Author: tipok
*/
#ifndef AACPLUSENC_H_
#define AACPLUSENC_H_
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
/*-------------------------- defines --------------------------------------*/
/* here we distinguish between stereo and the mono only encoder */
#ifdef MONO_ONLY
#define MAX_CHANNELS 1
#else
#define MAX_CHANNELS 2
#endif
#define AACENC_BLOCKSIZE 1024 /*! encoder only takes BLOCKSIZE samples at a time */
#define AACENC_TRANS_FAC 8 /*! encoder short long ratio */
#define AACENC_PCM_LEVEL 1.0 /*! encoder pcm 0db refernence */
#define MAX_EXTRADATA_SIZE 7 /* LC + SBR + PS config */
#define BUFFERSIZE 1024 /* anc data */
#include "aacplus.h"
#include "minmax.h"
#include "sbr_def.h"
#include "psy_const.h"
#include "cfftn.h"
#include "hybrid.h"
#include "sbr_ram.h"
#include "sbr_main.h"
#include "fram_gen.h"
#include "tran_det.h"
#include "code_env.h"
#include "qmf_enc.h"
#include "env_est.h"
#include "mh_det.h"
#include "nf_est.h"
#include "invf_est.h"
#include "ton_corr.h"
#include "tns.h"
#include "sbr.h"
#include "aac_ram.h"
#include "tns_param.h"
#include "aac_rom.h"
#include "dyn_bits.h"
#include "adj_thr_data.h"
#include "qc_data.h"
#include "block_switch.h"
#include "psy_data.h"
#include "interface.h"
#include "psy_configuration.h"
#include "psy_main.h"
#include "FFR_bitbuffer.h"
#include "bitenc.h"
#include "stprepro.h"
#include "aacenc.h"
#include "adj_thr.h"
#include "adts.h"
#include "band_nrg.h"
#include "bit_cnt.h"
#include "bit_sbr.h"
#include "channel_map.h"
#include "env_bit.h"
#include "FloatFR.h"
#include "freq_sca.h"
#include "grp_data.h"
#include "line_pe.h"
#include "ms_stereo.h"
#include "pre_echo_control.h"
#include "ps_bitenc.h"
#include "ps_enc.h"
#include "cmondata.h"
#include "qc_main.h"
#include "quantize.h"
#include "resampler.h"
#include "sbr_misc.h"
#include "sbr_rom.h"
#include "sf_estim.h"
#include "spreading.h"
#include "stat_bits.h"
#include "tns_func.h"
#include "transform.h"
struct SBR_ENCODER
{
FFTWFContext_t *fftctx;
struct SBR_CONFIG_DATA sbrConfigData;
struct SBR_HEADER_DATA sbrHeaderData;
struct SBR_BITSTREAM_DATA sbrBitstreamData;
struct ENV_CHANNEL* hEnvChannel[MAX_CHANNELS];
struct COMMON_DATA CmonData;
struct PS_ENC *hPsEnc;
SBR_QMF_FILTER_BANK *hSynthesisQmfBank;
unsigned int sbrPayloadPrevious[MAX_PAYLOAD_SIZE/(sizeof(int))];
unsigned int sbrPayload[MAX_PAYLOAD_SIZE/(sizeof(int))];
int sbrPayloadSize;
} ;
#define CORE_DELAY (1600)
/* (96-64) makes AAC still some 64 core samples too early wrt SBR ... maybe -32 would be even more correct, but 1024-32 would need additional SBR bitstream delay by one frame */
#define CORE_INPUT_OFFSET_PS (0)
/* ((1600 (core codec)*2 (multi rate) + 6*64 (sbr dec delay) - 2048 (sbr enc delay) + magic*/
#define INPUT_DELAY ((CORE_DELAY)*2 +6*64-(AACENC_BLOCKSIZE*2)+1)
/* the additional max resampler filter delay (source fs)*/
#define MAX_DS_FILTER_DELAY 16
typedef struct {
/* adts stuff */
ADTSContext_t *adts;
/* AAC encoder instance for one encoder */
aacplusEncConfiguration config;
struct AAC_ENCODER aacEnc;
sbrConfiguration sbrConfig;
struct SBR_ENCODER hEnvEnc;
SBR_QMF_FILTER_BANK SynthesisQmfBank;
struct PS_ENC psEncoder;
/* 2x => 1x samplerate converter instance */
IIR21_RESAMPLER IIR21_reSampler[MAX_CHANNELS];
//#ifdef _FFTW3
FFTWFContext_t fftctx;
//#endif
float inBuf[(AACENC_BLOCKSIZE*2 + MAX_DS_FILTER_DELAY + INPUT_DELAY)*MAX_CHANNELS];
//char outBuf[(6144/8)*MAX_CHANNELS+ADTS_HEADER_SIZE];
unsigned int numAncDataBytes;
unsigned char ancDataBytes[MAX_PAYLOAD_SIZE];
int useParametricStereo;
unsigned int inSamples;
unsigned int writtenSamples;
unsigned int writeOffset;
int envReadOffset;
int coreWriteOffset;
} AACPContext;
int FindSRIndex(int sr);
#endif /* AACPLUSENC_H_ */

70
src/adts.c Normal file
View File

@ -0,0 +1,70 @@
/*
adts
Original work by Matteo Croce
Small changes and fixes by Rafael Diniz
Copyright (C) Matteo Croce and Rafael Diniz
*/
#include <string.h>
#include "aacplusenc.h"
void adts_hdr_init(ADTSContext_t *ctx, aacplusEncConfiguration *config, HANDLE_BIT_BUF bitBuffer)
{
ctx->adts_size = ADTS_HEADER_SIZE;
int mpeg_id = ADTS_MPEG_ID;
int profile = ADTS_MPEG_PROFILE;
int srate_idx = FindSRIndex(config->sampleRate);
ctx->bitBuffer = bitBuffer;
/* adts use only 1024 samples window */
assert(config->nSamplesPerFrame == AACENC_BLOCKSIZE);
/* SOURCE: http://blog.olivierlanglois.net/index.php/2008/09/12/aac_adts_header_buffer_fullness_field */
unsigned short min_dec_in_size = (6144*config->nChannelsOut);
ctx->mean_framelength = (unsigned short)((float) config->bitRate/config->sampleRate*1024);
ctx->max_bit_reservoir = min_dec_in_size - ctx->mean_framelength;
ctx->frl_divider = 32*config->nChannelsOut;
memset(ctx->const_hdr, 0, 4);
ctx->const_hdr[0] = 0xFF; /* 8bits: syncword */
ctx->const_hdr[1] = 0xF0; /* 4bits: syncword */
ctx->const_hdr[1] |= mpeg_id << 3; /* 1bit: mpeg id = 0 */
/* 2bits: layer = 00 */
ctx->const_hdr[1] |= 1; /* 1bit: protection absent (1 - means "no protection")*/
ctx->const_hdr[2] = ((profile << 6) & 0xC0); /* 2bits: profile */
ctx->const_hdr[2] |= ((srate_idx << 2) & 0x3C); /* 4b: sampling_frequency_index */
/* 1b: private = 0 */
ctx->const_hdr[2] |= ((config->nChannelsOut >> 2) & 0x1); /* 1b: channel_configuration */
ctx->const_hdr[3] = ((config->nChannelsOut << 6) & 0xC0); /* 2b: channel_configuration */
}
void adts_hdr_up(ADTSContext_t *ctx, char *buff, int size)
{
unsigned short len = size + ADTS_HEADER_SIZE;
unsigned short buffer_fullness = 0x07FF;
memcpy(buff, ctx->const_hdr, 4);
//#ifdef ENABLE_BIT_RESERVOIR
ctx->bit_reservoir_state += ctx->mean_framelength - GetBitsAvail(ctx->bitBuffer);
if (ctx->bit_reservoir_state < 0) {
ctx->bit_reservoir_state = 0;
} else if (ctx->bit_reservoir_state > ctx->max_bit_reservoir) {
ctx->bit_reservoir_state = ctx->max_bit_reservoir;
}
buffer_fullness = ctx->bit_reservoir_state/ctx->frl_divider;
//#endif
/* frame length, 13 bits */
buff[3] &= 0xFC;
buff[3] |= ((len >> 11) & 0x03); /* 2b: aac_frame_length */
buff[4] = len >> 3; /* 8b: aac_frame_length */
buff[5] = (len << 5) & 0xE0; /* 3b: aac_frame_length */
/* buffer fullness, 11 bits */
buff[5] |= ((buffer_fullness >> 6) & 0x1F); /* 5b: adts_buffer_fullness */
buff[6] = (buffer_fullness << 2) & 0xFC; /* 6b: adts_buffer_fullness */
/* 2b: num_raw_data_blocks */
}

33
src/adts.h Normal file
View File

@ -0,0 +1,33 @@
/*
adts
Original work by Matteo Croce
Small changes and fixes by Rafael Diniz
Copyright (C) Matteo Croce and Rafael Diniz
*/
#ifndef adts_h_
#define adts_h_
#include <stdint.h>
#include "aacplusenc.h"
#define ADTS_HEADER_SIZE 7
#define ADTS_MPEG_ID 1 /* 0: MPEG-4, 1: MPEG-2 */
#define ADTS_MPEG_PROFILE 1
typedef struct {
HANDLE_BIT_BUF bitBuffer;
uint8_t const_hdr[4];
int bit_reservoir_state;
unsigned short mean_framelength;
unsigned short frl_divider;
unsigned short max_bit_reservoir;
int adts_size;
int window_size;
} ADTSContext_t;
void adts_hdr_init(ADTSContext_t *ctx, aacplusEncConfiguration *config, HANDLE_BIT_BUF bitBuffer);
void adts_hdr_up(ADTSContext_t *ctx, char *buff, int size);
#endif

6
src/libaacplus.sym Normal file
View File

@ -0,0 +1,6 @@
aacplusEncGetCurrentConfiguration
aacplusEncSetConfiguration
aacplusEncOpen
aacplusEncGetDecoderSpecificInfo
aacplusEncEncode
aacplusEncClose

123
src/sbr_ram.h Normal file
View File

@ -0,0 +1,123 @@
/*
* sbr_ram.h
*
* Created on: 7 окт. 2010
* Author: tipok
*/
#ifndef SBR_RAM_H_
#define SBR_RAM_H_
#include <stdio.h>
#include <assert.h>
#define PS_BUF4_SIZE (4*(QMF_TIME_SLOTS + QMF_BUFFER_MOVE) + 4*(NO_QMF_BANDS_IN_HYBRID + NO_QMF_BANDS_IN_HYBRID*QMF_BUFFER_MOVE))
#define PS_BUF5_SIZE (QMF_FILTER_LENGTH/2 + QMF_CHANNELS)
typedef struct {
/* sbr_ram.c */
/* Overlay with mdctDelayBuffer of 2nd channel since AAC only works in mono */
float *PsBuf2;
/* Overlay PsBuf4 and PsBuf5 with sbr_toncorrBuff of 2nd channel, since SBR only works in mono */
float *PsBuf4;
float *PsBuf5;
float PsBuf3[MAX_CHANNELS*FRAME_LEN_LONG*sizeof(short)/sizeof(float)];
/*!
\name StaticSbrData
Static memory areas, must not be overwritten in other sections of the encoder
*/
/*! Filter states for QMF-analysis. <br>
Dimension: #MAXNRSBRCHANNELS * #SBR_QMF_FILTER_LENGTH */
float sbr_QmfStatesAnalysis[MAX_CHANNELS * QMF_FILTER_LENGTH];
/*! Energy buffer for envelope extraction <br>
Dimension #MAXNRSBRCHANNELS * +#SBR_QMF_SLOTS*2 * #SBR_QMF_CHANNELS
*/
float sbr_envYBuffer[MAX_CHANNELS * QMF_TIME_SLOTS * QMF_CHANNELS];
/*! Matrix holding the quota values for all estimates, all channels
Dimension #MAXNRSBRCHANNELS * +#SBR_QMF_CHANNELS* #NO_OF_ESTIMATES
*/
float sbr_quotaMatrix[MAX_CHANNELS * NO_OF_ESTIMATES*QMF_CHANNELS];
/*! Thresholds for transient detection <br>
Dimension #MAXNRSBRCHANNELS * #SBR_QMF_CHANNELS
*/
float sbr_thresholds[MAX_CHANNELS *QMF_CHANNELS];
/*! Frequency band table (low res) <br>
Dimension #MAX_FREQ_COEFFS/2+1
*/
unsigned char sbr_freqBandTableLO[MAX_FREQ_COEFFS/2+1];
/*! Frequency band table (high res) <br>
Dimension #MAX_FREQ_COEFFS +1
*/
unsigned char sbr_freqBandTableHI[MAX_FREQ_COEFFS+1];
/*! vk matser table <br>
Dimension #MAX_FREQ_COEFFS +1
*/
unsigned char sbr_v_k_master[MAX_FREQ_COEFFS +1];
/*
Missing harmonics detection
*/
/*! sbr_detectionVectors <br>
Dimension #MAX_CHANNELS*#NO_OF_ESTIMATES*#MAX_FREQ_COEFFS]
*/
unsigned char sbr_detectionVectors[MAX_CHANNELS*NO_OF_ESTIMATES*MAX_FREQ_COEFFS];
/*!
The following tonality correclation buffers are allocated in
one non-reusable buffer
sbr_tonalityDiff <br>
Dimension #MAX_CHANNELS*#NO_OF_ESTIMATES*#MAX_FREQ_COEFFS]
sbr_sfmOrig <br>
Dimension #MAX_CHANNELS*#NO_OF_ESTIMATES*#MAX_FREQ_COEFFS]
sbr_sfmSbr <br>
Dimension #MAX_CHANNELS*#NO_OF_ESTIMATES*#MAX_FREQ_COEFFS]
sbr_guideVectorDiff <br>
Dimension #MAX_CHANNELS*#NO_OF_ESTIMATES*#MAX_FREQ_COEFFS]
sbr_guideVectorOrig <br>
Dimension #MAX_CHANNELS*#NO_OF_ESTIMATES*#MAX_FREQ_COEFFS]
*/
/* To overlay 2nd half of sbr_toncorrBuff with PS-Buffers, the 2nd half
must not fall below a minium size */
float sbr_toncorrBuff[max( /* two channels or... */
(MAX_CHANNELS*5*NO_OF_ESTIMATES*MAX_FREQ_COEFFS),
(
/* 1st half */
(5*NO_OF_ESTIMATES*MAX_FREQ_COEFFS)+
PS_BUF4_SIZE + PS_BUF5_SIZE
)
)];
/*! sbr_prevCompVec[ <br>
Dimension #MAX_CHANNELS*#MAX_FREQ_COEFFS]
*/
char sbr_prevEnvelopeCompensation[MAX_CHANNELS*MAX_FREQ_COEFFS];
/*! sbr_guideScfb[ <br>
Dimension #MAX_CHANNELS*#MAX_FREQ_COEFFS]
*/
unsigned char sbr_guideScfb[MAX_CHANNELS*MAX_FREQ_COEFFS];
/*! sbr_guideVectorDiff <br>
Dimension #MAX_CHANNELS*#NO_OF_ESTIMATES*#MAX_FREQ_COEFFS]
*/
/*! sbr_guideVectorDetected <br>
Dimension #MAX_CHANNELS*#NO_OF_ESTIMATES*#MAX_FREQ_COEFFS]
*/
unsigned char sbr_guideVectorDetected[MAX_CHANNELS*NO_OF_ESTIMATES*MAX_FREQ_COEFFS];
/*!
\name DynamicSbrData
Dynamic memory areas, might be reused in other algorithm sections,
e.g. the core decoder
*/
/*! Real buffer for envelope extraction <br>
Dimension #SBR_QMF_SLOTS * #SBR_QMF_CHANNELS
*/
float sbr_envRBuffer [MAX_CHANNELS * QMF_TIME_SLOTS * QMF_CHANNELS];
/*! Imag buffer for envelope extraction <br>
Dimension #SBR_QMF_SLOTS * #SBR_QMF_CHANNELS
*/
float sbr_envIBuffer [MAX_CHANNELS * QMF_TIME_SLOTS * QMF_CHANNELS];
/*! Transients for transient detection <br>
Dimension MAX_CHANNELS*3* #QMF_TIME_SLOTS
*/
float sbr_transients[MAX_CHANNELS*3*QMF_TIME_SLOTS];
} SBRRam_t;
#endif /* SBR_RAM_H_ */