initial commit from tarball
This commit is contained in:
commit
ad5143f78d
|
@ -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
|
|
@ -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.
|
|
@ -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.
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -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@
|
|
@ -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
|
|
@ -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
|
|
@ -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);
|
|
@ -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 ])
|
|
@ -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
|
|
@ -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@
|
|
@ -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;
|
||||
}
|
|
@ -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;
|
||||
}
|
|
@ -0,0 +1 @@
|
|||
include_HEADERS = aacplus.h
|
|
@ -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_ */
|
|
@ -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
|
|
@ -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])
|
||||
])
|
|
@ -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
|
@ -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,
|
|
@ -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,
|
|
@ -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},
|
|
@ -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));
|
|
@ -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 */
|
||||
|
||||
};
|
||||
|
|
@ -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,
|
|
@ -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,
|
|
@ -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
|
|
@ -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,
|
|
@ -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
|
|
@ -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)
|
|
@ -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_ */
|
|
@ -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;
|
||||
}
|
|
@ -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_ */
|
|
@ -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 */
|
||||
}
|
|
@ -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
|
|
@ -0,0 +1,6 @@
|
|||
aacplusEncGetCurrentConfiguration
|
||||
aacplusEncSetConfiguration
|
||||
aacplusEncOpen
|
||||
aacplusEncGetDecoderSpecificInfo
|
||||
aacplusEncEncode
|
||||
aacplusEncClose
|
|
@ -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_ */
|
Loading…
Reference in New Issue